From: lordmulder Date: Mon, 29 Nov 2010 13:00:27 +0000 (+0100) Subject: Improve installer: Make installer UAC aware. X-Git-Tag: Release_400~177 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=00a05d44c2d6bd9b147964675380ccba2c147b0a;p=lamexp%2FLameXP.git Improve installer: Make installer UAC aware. --- diff --git a/etc/Deployment/_deploy.bat b/etc/Deployment/_deploy.bat index 97c51969..746cfde1 100644 --- a/etc/Deployment/_deploy.bat +++ b/etc/Deployment/_deploy.bat @@ -120,6 +120,11 @@ REM ------------------------------------------ attrib +R "%OUT_FILE%.zip" attrib +R "%OUT_FILE%.exe" REM ------------------------------------------ +REM :: CREATE SIGNATURE :: +REM ------------------------------------------ +"%PATH_GNUPG1%\gpg.exe" --detach-sign "%OUT_FILE%.exe" +attrib +R "%OUT_FILE%.exe.sig" +REM ------------------------------------------ echo. echo BUIDL COMPLETED SUCCESSFULLY :-) echo. diff --git a/etc/Deployment/_paths.bat b/etc/Deployment/_paths.bat index 4f2dba2a..c0c6ec11 100644 --- a/etc/Deployment/_paths.bat +++ b/etc/Deployment/_paths.bat @@ -7,6 +7,7 @@ set "PATH_UPXBIN=" set "PATH_MKNSIS=" set "PATH_MSVC90=" set "PATH_QTMSVC=" +set "PATH_GNUPG1=" REM ------------------------------------------ for /f "tokens=2,*" %%s in (buildenv.txt) do ( if "%%s"=="PATH_SEVENZ" set "PATH_SEVENZ=%%~t" @@ -15,6 +16,7 @@ for /f "tokens=2,*" %%s in (buildenv.txt) do ( if "%%s"=="PATH_MKNSIS" set "PATH_MKNSIS=%%~t" if "%%s"=="PATH_MSVC90" set "PATH_MSVC90=%%~t" if "%%s"=="PATH_QTMSVC" set "PATH_QTMSVC=%%~t" + if "%%s"=="PATH_GNUPG1" set "PATH_GNUPG1=%%~t" ) REM ------------------------------------------ :: echo PATH_SEVENZ=%PATH_SEVENZ% @@ -36,5 +38,6 @@ if not exist "%PATH_QTMSVC%\bin\qtvars.bat" GOTO:EOF if not exist "%PATH_QTMSVC%\bin\uic.exe" GOTO:EOF if not exist "%PATH_QTMSVC%\bin\moc.exe" GOTO:EOF if not exist "%PATH_QTMSVC%\bin\rcc.exe" GOTO:EOF +if not exist "%PATH_GNUPG1%\gpg.exe" GOTO:EOF REM ------------------------------------------ set "LAMEXP_ERROR=0" diff --git a/etc/Deployment/buildenv.txt b/etc/Deployment/buildenv.txt index 628cc822..48a36187 100644 --- a/etc/Deployment/buildenv.txt +++ b/etc/Deployment/buildenv.txt @@ -4,3 +4,4 @@ #define PATH_MKNSIS "E:\NSIS" #define PATH_MSVC90 "D:\Microsoft Visual Studio 9.0" #define PATH_QTMSVC "E:\Qt\MSVC\4.7.1" +#define PATH_GNUPG1 "E:\GnuPG" diff --git a/etc/NSIS/parameters.nsh b/etc/NSIS/parameters.nsh new file mode 100644 index 00000000..72c175bd --- /dev/null +++ b/etc/NSIS/parameters.nsh @@ -0,0 +1,215 @@ +Function StrStr +/*After this point: + ------------------------------------------ + $R0 = SubString (input) + $R1 = String (input) + $R2 = SubStringLen (temp) + $R3 = StrLen (temp) + $R4 = StartCharPos (temp) + $R5 = TempStr (temp)*/ + + ;Get input from user + Exch $R0 + Exch + Exch $R1 + Push $R2 + Push $R3 + Push $R4 + Push $R5 + + ;Get "String" and "SubString" length + StrLen $R2 $R0 + StrLen $R3 $R1 + ;Start "StartCharPos" counter + StrCpy $R4 0 + + ;Loop until "SubString" is found or "String" reaches its end + loop: + ;Remove everything before and after the searched part ("TempStr") + StrCpy $R5 $R1 $R2 $R4 + + ;Compare "TempStr" with "SubString" + StrCmp $R5 $R0 done + ;If not "SubString", this could be "String"'s end + IntCmp $R4 $R3 done 0 done + ;If not, continue the loop + IntOp $R4 $R4 + 1 + Goto loop + done: + +/*After this point: + ------------------------------------------ + $R0 = ResultVar (output)*/ + + ;Remove part before "SubString" on "String" (if there has one) + StrCpy $R0 $R1 `` $R4 + + ;Return output to user + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 +FunctionEnd + + + +; GetParameters + ; input, none + ; output, top of stack (replaces, with e.g. whatever) + ; modifies no other variables. + +Function GetParameters + Push $R0 + Push $R1 + Push $R2 + Push $R3 + + StrCpy $R2 1 + StrLen $R3 $CMDLINE + + ;Check for quote or space + StrCpy $R0 $CMDLINE $R2 + StrCmp $R0 '"' 0 +3 + StrCpy $R1 '"' + Goto loop + StrCpy $R1 " " + + loop: + IntOp $R2 $R2 + 1 + StrCpy $R0 $CMDLINE 1 $R2 + StrCmp $R0 $R1 get + StrCmp $R2 $R3 get + Goto loop + + get: + IntOp $R2 $R2 + 1 + StrCpy $R0 $CMDLINE 1 $R2 + StrCmp $R0 " " get + StrCpy $R0 $CMDLINE "" $R2 + + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 +FunctionEnd + + + +; GetParameterValue +; Chris Morgan 5/10/2004 +; -Updated 4/7/2005 to add support for retrieving a command line switch +; and additional documentation +; +; Searches the command line input, retrieved using GetParameters, for the +; value of an option given the option name. If no option is found the +; default value is placed on the top of the stack upon function return. +; +; This function can also be used to detect the existence of just a +; command line switch like /OUTPUT Pass the default and "OUTPUT" +; on the stack like normal. An empty return string "" will indicate +; that the switch was found, the default value indicates that +; neither a parameter or switch was found. +; +; Inputs - Top of stack is default if parameter isn't found, +; second in stack is parameter to search for, ex. "OUTPUT" +; Outputs - Top of the stack contains the value of this parameter +; So if the command line contained /OUTPUT=somedirectory, "somedirectory" +; will be on the top of the stack when this function returns +; +; Register usage +;$R0 - default return value if the parameter isn't found +;$R1 - input parameter, for example OUTPUT from the above example +;$R2 - the length of the search, this is the search parameter+2 +; as we have '/OUTPUT=' +;$R3 - the command line string +;$R4 - result from StrStr calls +;$R5 - search for ' ' or '"' + +Function GetParameterValue + Exch $R0 ; get the top of the stack(default parameter) into R0 + Exch ; exchange the top of the stack(default) with + ; the second in the stack(parameter to search for) + Exch $R1 ; get the top of the stack(search parameter) into $R1 + + ;Preserve on the stack the registers used in this function + Push $R2 + Push $R3 + Push $R4 + Push $R5 + + Strlen $R2 $R1+2 ; store the length of the search string into R2 + + Call GetParameters ; get the command line parameters + Pop $R3 ; store the command line string in R3 + + # search for quoted search string + StrCpy $R5 '"' ; later on we want to search for a open quote + Push $R3 ; push the 'search in' string onto the stack + Push '"/$R1=' ; push the 'search for' + Call StrStr ; search for the quoted parameter value + Pop $R4 + StrCpy $R4 $R4 "" 1 ; skip over open quote character, "" means no maxlen + StrCmp $R4 "" "" next ; if we didn't find an empty string go to next + + # search for non-quoted search string + StrCpy $R5 ' ' ; later on we want to search for a space since we + ; didn't start with an open quote '"' we shouldn't + ; look for a close quote '"' + Push $R3 ; push the command line back on the stack for searching + Push '/$R1=' ; search for the non-quoted search string + Call StrStr + Pop $R4 + + ; $R4 now contains the parameter string starting at the search string, + ; if it was found +next: + StrCmp $R4 "" check_for_switch ; if we didn't find anything then look for + ; usage as a command line switch + # copy the value after /$R1= by using StrCpy with an offset of $R2, + # the length of '/OUTPUT=' + StrCpy $R0 $R4 "" $R2 ; copy commandline text beyond parameter into $R0 + # search for the next parameter so we can trim this extra text off + Push $R0 + Push $R5 ; search for either the first space ' ', or the first + ; quote '"' + ; if we found '"/output' then we want to find the + ; ending ", as in '"/output=somevalue"' + ; if we found '/output' then we want to find the first + ; space after '/output=somevalue' + Call StrStr ; search for the next parameter + Pop $R4 + StrCmp $R4 "" done ; if 'somevalue' is missing, we are done + StrLen $R4 $R4 ; get the length of 'somevalue' so we can copy this + ; text into our output buffer + StrCpy $R0 $R0 -$R4 ; using the length of the string beyond the value, + ; copy only the value into $R0 + goto done ; if we are in the parameter retrieval path skip over + ; the check for a command line switch + +; See if the parameter was specified as a command line switch, like '/output' +check_for_switch: + Push $R3 ; push the command line back on the stack for searching + Push '/$R1' ; search for the non-quoted search string + Call StrStr + Pop $R4 + StrCmp $R4 "" done ; if we didn't find anything then use the default + StrCpy $R0 "" ; otherwise copy in an empty string since we found the + ; parameter, just didn't find a value + +done: + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 ; put the value in $R0 at the top of the stack +FunctionEnd + +!macro GetCommandlineParameter param default var + Push "${param}" ; push the search string onto the stack + Push "${default}" ; push a default value onto the stack + Call GetParameterValue + Pop ${var} +!macroend diff --git a/etc/NSIS/setup.nsi b/etc/NSIS/setup.nsi index 86029b58..40a3baaa 100644 --- a/etc/NSIS/setup.nsi +++ b/etc/NSIS/setup.nsi @@ -1,12 +1,63 @@ -RequestExecutionLevel admin !define ZIP2EXE_NAME `LameXP v${LAMEXP_VERSION} ${LAMEXP_SUFFIX} [Build #${LAMEXP_BUILD}]` !define ZIP2EXE_OUTFILE `${LAMEXP_OUTPUT_FILE}` !define ZIP2EXE_COMPRESSOR_LZMA !define ZIP2EXE_COMPRESSOR_SOLID !define ZIP2EXE_INSTALLDIR `$PROGRAMFILES\${ZIP2EXE_NAME}` + +RequestExecutionLevel user BrandingText `Date created: ${LAMEXP_DATE}` +ShowInstDetails show + +!define MUI_PAGE_CUSTOMFUNCTION_SHOW CheckForUpdate + +!include `UAC.nsh` +!include `parameters.nsh` !include `${NSISDIR}\Contrib\zip2exe\Base.nsh` !include `${NSISDIR}\Contrib\zip2exe\Modern.nsh` + +Function .onInit + UAC_TryAgain: + !insertmacro UAC_RunElevated + ${Switch} $0 + ${Case} 0 + ${IfThen} $1 = 1 ${|} Quit ${|} + ${IfThen} $3 <> 0 ${|} ${Break} ${|} + ${If} $1 = 3 + MessageBox MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND "This installer requires admin access, please try again!" /SD IDNO IDOK UAC_TryAgain IDNO 0 + ${EndIf} + ${Case} 1223 + MessageBox MB_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND "This installer requires admin privileges, please try again!" /SD IDNO IDOK UAC_TryAgain IDNO 0 + Quit + ${Case} 1062 + MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Logon service not running, aborting!" + Quit + ${Default} + MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND "Unable to elevate installer! (Error code: $0)" + Quit + ${EndSwitch} +FunctionEnd + +Function .onInstSuccess + !insertmacro UAC_AsUser_ExecShell "open" "$INSTDIR\LameXP.exe" "" "$INSTDIR" SW_SHOWNORMAL +FunctionEnd + !insertmacro SECTION_BEGIN -File /r `${LAMEXP_SOURCE_PATH}\*.*` + File /r `${LAMEXP_SOURCE_PATH}\*.*` !insertmacro SECTION_END + +Function CheckForUpdate + !insertmacro GetCommandlineParameter "Update" "error" $R0 + StrCmp $R0 "error" 0 +2 + Return + + FindWindow $R0 "#32770" "" $HWNDPARENT + GetDlgItem $R1 $R0 1019 + SendMessage $R1 ${EM_SETREADONLY} 1 0 + + FindWindow $R0 "#32770" "" $HWNDPARENT + GetDlgItem $R1 $R0 1001 + EnableWindow $R1 0 + + GetDlgItem $R1 $HWNDPARENT 1 + SendMessage $R1 ${WM_SETTEXT} 0 "STR:Update" +FunctionEnd diff --git a/src/Config.h b/src/Config.h index 4154444e..3378b896 100644 --- a/src/Config.h +++ b/src/Config.h @@ -25,7 +25,7 @@ #define VER_LAMEXP_MAJOR 4 #define VER_LAMEXP_MINOR_HI 0 #define VER_LAMEXP_MINOR_LO 0 -#define VER_LAMEXP_BUILD 97 +#define VER_LAMEXP_BUILD 99 #define VER_LAMEXP_SUFFIX TechPreview /*