OSDN Git Service

Improve installer: Make installer UAC aware.
authorlordmulder <mulder2@gmx.de>
Mon, 29 Nov 2010 13:00:27 +0000 (14:00 +0100)
committerlordmulder <mulder2@gmx.de>
Mon, 29 Nov 2010 13:00:27 +0000 (14:00 +0100)
etc/Deployment/_deploy.bat
etc/Deployment/_paths.bat
etc/Deployment/buildenv.txt
etc/NSIS/parameters.nsh [new file with mode: 0644]
etc/NSIS/setup.nsi
src/Config.h

index 97c5196..746cfde 100644 (file)
@@ -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.
index 4f2dba2..c0c6ec1 100644 (file)
@@ -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"
index 628cc82..48a3618 100644 (file)
@@ -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 (file)
index 0000000..72c175b
--- /dev/null
@@ -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<cmorgan@alum.wpi.edu> 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
index 86029b5..40a3baa 100644 (file)
@@ -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
index 4154444..3378b89 100644 (file)
@@ -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
 
 /*