diff -r 000000000000 -r d5ce4c64ef88 Contrib/ExperienceUI/Utils/Source/Patcher.nsi --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Contrib/ExperienceUI/Utils/Source/Patcher.nsi Tue Oct 16 00:07:41 2007 -0400 @@ -0,0 +1,383 @@ +; ExperienceUI Patch Installer +; Rewritten as of ExperienceUI 1.11 +; Copyright © 2006 Dan Fuhry + +; Licensed under the zlib/libpng license + +; Written during Bush's State of the Union address on Jan 31, 2006 (also my birthday) + +; Dependencies: +; * DcryptDll +; * ZipDLL +; * SigVerify.exe (closed-source application that does the actual signature verification) +; * ExperienceUI +; * System.dll + +Name "ExperienceUI Patch/Skin Installer" +Caption "ExperienceUI Patch/Skin Installer" +OutFile ..\PatchInstaller.exe + +SetCompressor /FINAL /SOLID lzma +Var TYPE +Var CURRENT +Var TOTAL +Var NAME +Var SILENT +Var SIGSTAT +Var APPEND +Var SRCFILE +Var BHWND + +!define XPUI_ICON patcher.ico +!define XPUI_UNICON patcher.ico + +!define XPUI_WELCOMEPAGE_TEXT_TOP "Welcome to the $(^Name)" +!define XPUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of the patch you opened.\r\n\r\nClick Next to start." +!define XPUI_WELCOMEPAGE_TITLE "Welcome" +!define XPUI_WELCOMEPAGE_SUBTITLE "Welcome to the $(^Name)." + +!define XPUI_INSTFILESPAGE_TITLE "Installing" +!define XPUI_INSTFILESPAGE_SUBTITLE "Please wait while the $TYPE you opened is being installed." +!define XPUI_INSTFILESPAGE_DONE_SUBTITLE "The $TYPE you opened was installed successfully." + +!define XPUI_INSTCONFIRMPAGE_TEXT_TOP "The $(^Name) is ready to install the $TYPE." + +!define XPUI_FINISHPAGE_TITLE "Installation Complete" +!define XPUI_FINISHPAGE_SUBTITLE "The $(^Name) has successfully applied the $TYPE to your ExperienceUI installation." +!define XPUI_FINISHPAGE_TEXT_TOP "Completing the ExperienceUI Patch/Skin installation wizard" +!define XPUI_FINISHPAGE_TEXT "The $(^Name) has finished installing the $TYPE you opened.\r\n\r\nPlease click $(^CloseBtn) to exit the $(^Name)." + +InstallDirRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ExperienceUI for NSIS" UninstallString +SetPluginUnload alwaysoff +!include system.nsh + +!define SOUND_DEFAULT "${MB_OK}" +!define SOUND_STOP "${MB_ICONHAND}" +!define SOUND_ASTERISK "${MB_ICONASTERISK}" +!define SOUND_ERROR "${MB_ICONEXCLAMATION}" +!define SOUND_QUESTION "${MB_ICONQUESTION}" + +!macro AboutDlg + System::Call '${sysMessageBeep} (${SOUND_ASTERISK})' + !insertmacro smMessageBox '`$EXEDIR\XPUIRes.dll`' 'ExperienceUI for NSIS$\nPatch/Skin Installer (version ${VERSION})$\nCopyright © 2005 Dan Fuhry.$\n$\nTo install a skin or patch, double-click the file in Windows Explorer.$\nTo see this About dialog, run this program with the /ABOUT switch.$\n$\nThis program is a component of the ExperienceUI for NSIS. Copyright © 2004-2005 Dan Fuhry.$\nThe ExperienceUI was written to provide a pretty alternative to the huge, slow InstallShield®* installers. The default skin contains colors used by the NVidia® ForceWare™ Setup Program.$\n$\nMore information about the ExperienceUI can be found at http://forums.winamp.com/showthread.php?threadid=204836.$\n$\n*InstallShield is a registered trademark of MacroVision, Inc. ForceWare is a registered trademark of NVidia, Inc.' 'About the ExperienceUI for NSIS Patch/Skin Installer' '${MB_OK}' 'i 5' +!macroend + +!macro VERIFY FILE HASH + Push $1 + Push $OUTDIR + Push $0 + WriteINIStr $TEMP\Sigdata.ini SigVerify Append $APPEND + ExecWait '"$PLUGINSDIR\SigVerify.exe" ${FILE} /Hash=${HASH}' $0 + StrCmp $0 0 +3 + StrCpy $1 "Bad" + Goto +2 + StrCpy $1 "Good" + Pop $0 + Pop $OUTDIR + Exch $1 +!macroend + +!macro CLS +Push $9 +FindWindow $9 "#32770" "" $HWNDPARENT +GetDlgItem $9 $9 1016 +SendMessage $9 0x1009 0 0 +Pop $9 +!macroend + +!macro ERROR TITLE MSG + !insertmacro XPUI_HEADER_TEXT "Installation Failed" "The $TYPE installation failed." + System::Call '${sysMessageBeep} (${SOUND_STOP})' + !insertmacro smMessageBox `$\`$EXEDIR\XPUIRes.dll$\`` `${MSG}` `${TITLE}` `${MB_OK}` `i 1` +!macroend + +!include XPUI.nsh + +!insertmacro XPUI_PAGE_WELCOME +!insertmacro XPUI_PAGE_INSTCONFIRM +!insertmacro XPUI_PAGE_INSTFILES +!insertmacro XPUI_PAGE_FINISH + +!insertmacro XPUI_LANGUAGE English + +VIProductVersion "1.1.0.0" +VIAddVersionKey /LANG=1033 "FileVersion" "${VERSION}" +VIAddVersionKey /LANG=1033 "ProductVersion" "${VERSION}" +VIAddVersionKey /LANG=1033 "ProductName" "ExperienceUI for NSIS" +VIAddVersionKey /LANG=1033 "Comments" "This program was written by Dan Fuhry using Nullsoft Scriptable Install System (http://nsis.sourceforge.net)" +VIAddVersionKey /LANG=1033 "CompanyName" "Dan Fuhry a. k. a. dandaman32" +VIAddVersionKey /LANG=1033 "LegalTrademarks" "ExperienceUI for NSIS by Dan Fuhry. Copyright © 2004-2006 Dan Fuhry" +VIAddVersionKey /LANG=1033 "LegalCopyright" "Copyright © Dan Fuhry" +VIAddVersionKey /LANG=1033 "FileDescription" "ExperienceUI for NSIS Patch/Skin Installer" +VIAddVersionKey /LANG=1033 "SpecialBuild" "ExperienceUI for NSIS Patching/Skinning Engine, version ${VERSION}, built on ${__TIMESTAMP__}" + +!macro DO_INSTALL + BringToFront + StrCpy $CURRENT 0 + StrCmp $SILENT 1 "" loop + Banner::show /NOUNLOAD "" + Banner::getWindow + Pop $BHWND + GetDlgItem $BHWND $BHWND 1030 + Loop: + IntOp $CURRENT $CURRENT + 1 + ReadINIStr $2 $TEMP\EUI-Setup\Content.dat "EUI-$TYPE" "File$CURRENT" + StrCmp $SILENT 1 0 +2 + SendMessage $BHWND 0xC 0 "STR:Installing $TYPE: $NAME$\nCurrent file: $2" + ReadINIStr $SRCFILE $TEMP\EUI-Setup\Content.dat "EUI-$TYPE" "File$CURRENT SName" + StrCmp $SRCFILE "" "" +2 + StrCpy $SRCFILE $2 + IfFileExists $TEMP\EUI-Setup\$SRCFILE FoundIt + !insertmacro ERROR "Cannot find file" "The $TYPE was opened, extracted, and parsed successfully, but the file $2 could not be found in the archive. Please contact the author of this $TYPE with the following error code:$\n$\nError: F-PI009 Cannot find source file $2" + Call .onGUIend + RMDir /r $TEMP\EUI-Setup + SetErrorLevel 1 + Quit + FoundIt: + ReadINIStr $4 $TEMP\EUI-Setup\Content.dat EUI-$TYPE "File$CURRENT Sig" + StrCmp $4 "" NoSig + SetDetailsPrint none + !insertmacro VERIFY $TEMP\EUI-Setup\$SRCFILE $4 + Pop $0 + StrCmp $0 Good NoSig + StrCmp $SIGSTAT "Signed and verified" Forged + !insertmacro ERROR "Invalid Signature" "The ExperienceUI Patch Installer has found a digital signature assigned to one of the patch files, but the signature was checked and found to be invalid. This is a fatal error. Please contact the author of this $TYPE with the following error code:$\n$\nError: F-PI010 Invalid signature hash for file $2$\nAdditional information:$\n hash value: $4$\n Return value: $0" + Call .onGUIend + RMDir /r $TEMP\EUI-Setup + SetErrorLevel 1 + Quit + Forged: + !insertmacro ERROR "Unsigned file" "The patch installer has found that though the patch itself is signed, one of the files within it is not. This is a fatal error. Please contact the author of this patch with the following information:$\n$\nError: F-PI013 Unsigned file in signed patch$\nAdditional information:$\n File name: $2" + Call .onGUIend + RMDir /r $TEMP\EUI-Setup + SetErrorLevel 1 + Quit + NoSig: + StrCmp $4 "" 0 +2 + StrCmp $SIGSTAT "Signed and verified" Forged ; a backup check + ReadINIStr $4 $TEMP\EUI-Setup\Content.dat EUI-$TYPE "File$CURRENT Desc" + StrCmp $4 "" NoDesc + SetDetailsPrint listonly + DetailPrint "Install: $4 - $2 to $INSTDIR\$3" + SetDetailsPrint textonly + DetailPrint "Installing file: $2 ($4) to $INSTDIR\$3" + SetDetailsPrint none + Goto cont + NoDesc: + ReadINIStr $SRCFILE $TEMP\EUI-Setup\Content.dat "EUI-$TYPE" "File$CURRENT SName" + StrCmp $SRCFILE "" 0 +2 + StrCpy $SRCFILE $2 + SetDetailsPrint listonly + DetailPrint "Install: $2 to $3" + SetDetailsPrint textonly + DetailPrint "Installing file: $2 to $INSTDIR\$3" + SetDetailsPrint none + cont: + ReadINIStr $3 $TEMP\EUI-Setup\Content.dat "EUI-$TYPE" "File$CURRENT Path" + CreateDirectory $INSTDIR\$3 + CopyFiles $TEMP\EUI-Setup\$SRCFILE $INSTDIR\$3\$2 + IntCmp $CURRENT $TOTAL 0 Loop + ; We are done + StrCmp $SILENT 1 "" ns1 + Banner::destroy + ns1: + RMDir /r $TEMP\EUI-Setup + SetAutoClose false + SetDetailsPrint both +!macroend + +Function .onInit + ; Get rid of compiler warnings + ;Goto +4 + ; Call GetInstallerEXEName + ; Call systemGetFileSysTime + ; Call systemSplash + + Call GetParameters + Pop $0 + StrCmp $0 "" 0 NotBlank + !insertmacro ERROR "Invalid Command Line" "You need to specify the patch/skin file on the command line.$\n$\nError: F-PI001 No parameters on command line" + RMDir /r $TEMP\EUI-Setup + Quit + NotBlank: + StrCpy $SILENT 0 + Push $0 + Push "/Silent" + Call StrStr + Pop $1 + StrCmp $1 "/Silent" "" NoSilent + StrCpy $SILENT 1 + StrLen $2 $1 + StrLen $3 $0 + IntOp $2 $3 - $2 + IntOp $2 $2 - 1 + StrCpy $0 $0 $2 + NoSilent: + IfFileExists $0 FoundTarget + !insertmacro ERROR "Missing File" "The file specified on the command line cannot be found.$\n$\nError: F-PI002 Missing file" + RMDir /r $TEMP\EUI-Setup + Quit + FoundTarget: + IfFileExists $INSTDIR\XPUI.nsh FoundXPUI + !insertmacro ERROR "Corrupt XPUI Installation" "The ExperienceUI cannot be found on this computer. It can be downloaded from http://xpui.sourceforge.net/.$\n$\nError: F-PI003 Cannot find XPUI installation" + RMDir /r $TEMP\EUI-Setup + Quit + FoundXPUI: + StrLen $1 $0 + IntOp $1 $1 - 3 + StrCpy $1 $0 3 $1 + StrCmp $1 "eup" validext-p + StrCmp $1 "eus" validext-s + !insertmacro ERROR "Invalid file extension" "The file '$0' was found and the command line was correct, but the extension is not EUP (ExperienceUI Patch) or EUS (ExperienceUI Skin). Setup will treat this file as a patch.$\n$\nThis is a non-fatal error.$\n$\nError: N-PI004 Invalid file extension $1" + validext-s: + StrCpy $TYPE "skin" + Goto valid + validext-p: + StrCpy $TYPE "patch" + Goto valid + valid: + RMDir /r $TEMP\EUI-Setup + CreateDirectory "$TEMP\EUI-Setup" + ClearErrors + ZipDLL::extractall "$0" "$TEMP\EUI-Setup" + Pop $2 + StrCmp $2 "success" goodZip + !insertmacro ERROR "Zip extract error" "The file '$0' was found and the command line was correct, but the ZIP file extraction module failed.$\n$\nThe following error string was returned by ZipDLL: $2$\n$\nError: F-PI005 ZIP file extraction error" + RMDir /r $TEMP\EUI-Setup + Quit + goodZip: + IfFileExists $TEMP\EUI-Setup\Content.dat FoundScript + !insertmacro ERROR "Missing script" "The installation script could not be found in the patch/skin file's root directory. This is a fatal error. Please contact the author of this patch with the following error code.$\n$\nError: F-PI006 Cannot find installation script" + RMDir /r $TEMP\EUI-Setup + Quit + FoundScript: + ClearErrors + ReadINIStr $TOTAL $TEMP\EUI-Setup\Content.dat "EUI-$TYPE" NumFiles + IntCmp $TOTAL 1 FilesGood 0 FilesGood + !insertmacro ERROR "Corrupt script" "The installation script in this patch file is corrupt. Please redownload the patch file, or contact the author of this patch with the following error code:$\n$\nError: F-PI008 Cannot find INI key NumFiles under section EUI-$TYPE in $$TEMP\EUI-Setup\CONTENT.dat, or NumFiles !>=1" + RMDir /r $TEMP\EUI-Setup + Quit + FilesGood: + ; Check for a digital signature + + ; Extract the verification utility + SetOutPath $PLUGINSDIR + File SigVerify.exe + + IfFileExists $TEMP\EUI-Setup\content.sig "" Unsigned + FileOpen $R1 $TEMP\EUI-Setup\content.sig r + FileRead $R1 $R0 32 + FileClose $R1 + StrCmp $SILENT 1 nob1 + Banner::show /NOUNLOAD "Validating $TYPE digital signature..." + nob1: + StrCpy $SIGSTAT "Signed and verified" + !insertmacro VERIFY $TEMP\EUI-Setup\content.dat $R0 + StrCmp $SILENT 1 nob2 + Banner::destroy + nob2: + Pop $R1 + StrCmp $R1 Good GoodSig + !insertmacro ERROR "Corrupt Signature" "The author who packaged the $TYPE has specified that the file be signed with a digital signature, but after thorough testing, the patch's installation script was found to have an invalid signature. This is a fatal error. Please report the following information to the author of this patch:$\n$\nError: F-PI011 Master signature corrupt$\nAdditional information:$\n BAD signature hash: $R0" + RMDir /r $TEMP\EUI-Setup + Quit + Unsigned: + StrCmp $SILENT 1 "" NoS1 + !insertmacro ERROR "Signature required for silent install" "The ExperienceUI patch installer does not allow silent installations of unsigned patch files.$\n$\nError: F-PI012 Signature required for silent install" + RMDir /r $TEMP\EUI-Setup + Quit + NoS1: + StrCpy $SIGSTAT "Unsigned" + System::Call '${sysMessageBeep} (${SOUND_QUESTION})' + !insertmacro smMessageBox `$\`$EXEDIR\XPUIRes.dll$\`` `The file you are opening is a valid $TYPE, but the Patch Installer has detected that it has not been signed with any digital signature. While you may continue installing this $TYPE, it is important to remember that ExperienceUI $TYPE files are really just glorified ZIP files, and it is possible to put malicious code into them. You should only continue if you trust the source of this $TYPE.$\n$\nDo you really want to continue?` `Unsigned $TYPE` `${MB_YESNO}` `i 1` + StrCmp $R0 6 SigDone + RMDir /r $TEMP\EUI-Setup + Quit + GoodSig: + ReadINIStr $R0 $TEMP\EUI-Setup\Content.dat SigInfo PN + ReadINIStr $R1 $TEMP\EUI-Setup\Content.dat SigInfo PE + ReadINIStr $R2 $TEMP\EUI-Setup\Content.dat SigInfo CN + ReadINIStr $R3 $TEMP\EUI-Setup\Content.dat SigInfo CE + StrCmp $R0 "" SigDone + StrCpy $APPEND ";PN=$R0;PE=$R1;CN=$R2;CE=$R3" + StrCpy $SIGSTAT "$SIGSTAT$\n Signed by: $R2$\n Signer's E-mail: $R3" + SigDone: + ReadINIStr $NAME $TEMP\EUI-Setup\Content.dat "EUI-$TYPE" Name + StrCmp $SILENT 1 "" NoS2 + !insertmacro DO_INSTALL + SetErrorLevel 0 + Quit + NoS2: +FunctionEnd + +Section + StrCmp $NAME "" NoName + HideWindow + System::Call '${sysMessageBeep} (${SOUND_QUESTION})' + !insertmacro smMessageBox '`$EXEDIR\XPUIRes.dll`' 'You are about to install a $TYPE from the following location:$\n$\n Name: $NAME$\n File location: $0$\n Signature status: $SIGSTAT$\n$\nContinue?' 'ExperienceUI Setup' '${MB_YESNO}' 'i 2' + StrCmp $R0 7 0 NoName + Call .onGUIEnd + RMDir /r $TEMP\EUI-Setup + Quit + NoName: + !insertmacro DO_INSTALL +SectionEnd + +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 + + Function StrStr + Exch $R1 ; st=haystack,old$R1, $R1=needle + Exch ; st=old$R1,haystack + Exch $R2 ; st=old$R1,old$R2, $R2=haystack + Push $R3 + Push $R4 + Push $R5 + StrLen $R3 $R1 + StrCpy $R4 0 + ; $R1=needle + ; $R2=haystack + ; $R3=len(needle) + ; $R4=cnt + ; $R5=tmp + loop: + StrCpy $R5 $R2 $R3 $R4 + StrCmp $R5 $R1 done + StrCmp $R5 "" done + IntOp $R4 $R4 + 1 + Goto loop + done: + StrCpy $R1 $R2 "" $R4 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Exch $R1 + FunctionEnd \ No newline at end of file