--- /dev/null
+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
-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