;_____________________________________________________________________________ ; ; File Functions Test ;_____________________________________________________________________________ ; ; 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) Name "File Functions Test" OutFile "FileFuncTest.exe" Caption "$(^Name)" ShowInstDetails show XPStyle on RequestExecutionLevel user Var FUNCTION Var OUT1 Var OUT2 Var OUT3 Var OUT4 Var OUT5 Var OUT6 Var OUT7 !include "FileFunc.nsh" !include "LogicLib.nsh" ;############### INSTALL ############### !define StackVerificationStart `!insertmacro StackVerificationStart` !macro StackVerificationStart _FUNCTION StrCpy $FUNCTION ${_FUNCTION} Call StackVerificationStart !macroend !define StackVerificationEnd `!insertmacro StackVerificationEnd` !macro StackVerificationEnd Call StackVerificationEnd !macroend Function StackVerificationStart StrCpy $0 !0 StrCpy $1 !1 StrCpy $2 !2 StrCpy $3 !3 StrCpy $4 !4 StrCpy $5 !5 StrCpy $6 !6 StrCpy $7 !7 StrCpy $8 !8 StrCpy $9 !9 StrCpy $R0 !R0 StrCpy $R1 !R1 StrCpy $R2 !R2 StrCpy $R3 !R3 StrCpy $R4 !R4 StrCpy $R5 !R5 StrCpy $R6 !R6 StrCpy $R7 !R7 StrCpy $R8 !R8 StrCpy $R9 !R9 FunctionEnd Function StackVerificationEnd IfErrors +3 DetailPrint 'PASSED $FUNCTION no errors' goto +2 DetailPrint 'FAILED $FUNCTION error' StrCmp $0 '!0' 0 error StrCmp $1 '!1' 0 error StrCmp $2 '!2' 0 error StrCmp $3 '!3' 0 error StrCmp $4 '!4' 0 error StrCmp $5 '!5' 0 error StrCmp $6 '!6' 0 error StrCmp $7 '!7' 0 error StrCmp $8 '!8' 0 error StrCmp $9 '!9' 0 error StrCmp $R0 '!R0' 0 error StrCmp $R1 '!R1' 0 error StrCmp $R2 '!R2' 0 error StrCmp $R3 '!R3' 0 error StrCmp $R4 '!R4' 0 error StrCmp $R5 '!R5' 0 error StrCmp $R6 '!R6' 0 error StrCmp $R7 '!R7' 0 error StrCmp $R8 '!R8' 0 error StrCmp $R9 '!R9' 0 error DetailPrint 'PASSED $FUNCTION stack' goto end error: DetailPrint 'FAILED $FUNCTION stack' ; MessageBox MB_OKCANCEL '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}' IDOK +2 ; quit end: FunctionEnd Section Locate ${StackVerificationStart} Locate ${Locate} '$DOCUMENTS' '/L=FD /M=*.* /S=0B /G=0' 'LocateCallback' ${StackVerificationEnd} SectionEnd Function LocateCallback ; MessageBox MB_YESNO '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}$\n$\nContinue?' IDYES +2 ; StrCpy $0 StopLocate Push $0 FunctionEnd Section GetSize ${StackVerificationStart} GetSize ${GetSize} '$WINDIR' '/M=Explorer.exe /S=0K /G=0' $OUT1 $OUT2 $OUT3 ${StackVerificationEnd} SectionEnd Section DriveSpace ${StackVerificationStart} DriveSpace ${DriveSpace} 'C:\' '/D=F /S=M' $OUT1 ${StackVerificationEnd} SectionEnd Section GetDrives ${StackVerificationStart} GetDrives ${GetDrives} 'FDD+CDROM' 'GetDrivesCallback' ${StackVerificationEnd} SectionEnd Function GetDrivesCallback ; MessageBox MB_YESNO '$$0={$0}$\n$$1={$1}$\n$$2={$2}$\n$$3={$3}$\n$$4={$4}$\n$$5={$5}$\n$$6={$6}$\n$$7={$7}$\n$$8={$8}$\n$$9={$9}$\n$$R0={$R0}$\n$$R1={$R1}$\n$$R2={$R2}$\n$$R3={$R3}$\n$$R4={$R4}$\n$$R5={$R5}$\n$$R6={$R6}$\n$$R7={$R7}$\n$$R8={$R8}$\n$$R9={$R9}$\n$\nContinue?' IDYES +2 ; StrCpy $0 StopGetDrives Push $0 FunctionEnd Section GetTime ${StackVerificationStart} GetTime ${GetTime} '' 'L' $OUT1 $OUT2 $OUT3 $OUT4 $OUT5 $OUT6 $OUT7 ${StackVerificationEnd} SectionEnd Section GetFileAttributes ${StackVerificationStart} GetFileAttributes ${GetFileAttributes} '$WINDIR\explorer.exe' 'ALL' $OUT1 ${StackVerificationEnd} SectionEnd Section GetFileVersion ${StackVerificationStart} GetFileVersion ${GetFileVersion} '$WINDIR\explorer.exe' $OUT1 ${StackVerificationEnd} SectionEnd Section GetExeName ${StackVerificationStart} GetExeName ${GetExeName} $OUT1 ${StackVerificationEnd} SectionEnd Section GetExePath ${StackVerificationStart} GetExePath ${GetExePath} $OUT1 ${StackVerificationEnd} SectionEnd Section GetParameters ${StackVerificationStart} GetParameters # basic stuff StrCpy $CMDLINE '"$PROGRAMFILES\Something\Hello.exe"' ${GetParameters} $OUT1 StrCpy $CMDLINE '"$PROGRAMFILES\Something\Hello.exe" test' ${GetParameters} $OUT2 StrCpy $CMDLINE '"$PROGRAMFILES\Something\Hello.exe" "test"' ${GetParameters} $OUT3 StrCpy $CMDLINE 'C:\Hello.exe' ${GetParameters} $OUT4 StrCpy $CMDLINE 'C:\Hello.exe test' ${GetParameters} $OUT5 StrCpy $CMDLINE 'C:\Hello.exe "test"' ${GetParameters} $OUT6 StrCpy $CMDLINE 'C:\Hello.exe test test ' ${GetParameters} $OUT7 ${If} $OUT1 != "" ${OrIf} $OUT2 != "test" ${OrIf} $OUT3 != '"test"' ${OrIf} $OUT4 != "" ${OrIf} $OUT5 != "test" ${OrIf} $OUT6 != '"test"' ${OrIf} $OUT7 != 'test test' SetErrors ${EndIf} # some corner cases StrCpy $CMDLINE '' ${GetParameters} $OUT1 StrCpy $CMDLINE '"' ${GetParameters} $OUT2 StrCpy $CMDLINE '""' ${GetParameters} $OUT3 StrCpy $CMDLINE '"" test' ${GetParameters} $OUT4 StrCpy $CMDLINE ' test' ${GetParameters} $OUT5 StrCpy $CMDLINE ' test' # left over bug(?) from old GetParameters # it starts looking for ' ' from the third char ${GetParameters} $OUT6 StrCpy $CMDLINE ' ' ${GetParameters} $OUT7 ${If} $OUT1 != "" ${OrIf} $OUT2 != "" ${OrIf} $OUT3 != "" ${OrIf} $OUT4 != "" ${OrIf} $OUT5 != "" ${OrIf} $OUT6 != "" ${OrIf} $OUT7 != "" SetErrors ${EndIf} ${StackVerificationEnd} SectionEnd Section GetOptions ${StackVerificationStart} GetOptions ${GetOptions} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1 StrCmp $OUT1 'C:\Program Files\Common Files' 0 error ${GetOptions} '-TMP=temp.tmp -INSTDIR="C:/Program Files/Common Files" -SILENT=yes' '-INSTDIR=' $OUT1 StrCmp $OUT1 'C:/Program Files/Common Files' 0 error ${GetOptions} "/INSTDIR='C:/Program Files/Common Files' /SILENT=yes" '/INSTDIR=' $OUT1 StrCmp $OUT1 'C:/Program Files/Common Files' 0 error StrCpy $OUT1 '/INSTDIR=`C:/Program Files/Common Files` /SILENT=yes' ${GetOptions} '$OUT1' '/INSTDIR=' $OUT1 StrCmp $OUT1 'C:/Program Files/Common Files' 0 error ${GetOptions} '/SILENT=yes /INSTDIR=C:\Program Files\Common Files' '/INSTDIR=' $OUT1 StrCmp $OUT1 'C:\Program Files\Common Files' 0 error ${GetOptions} "/INSTDIR=common directory: 'C:\Program Files\Common Files' /SILENT=yes" '/INSTDIR=' $OUT1 StrCmp $OUT1 "common directory: 'C:\Program Files\Common Files'" 0 error ${GetOptions} '/INSTDIR=WxxxW /SILENT=yes' '/INSTDIR=' $OUT1 StrCmp $OUT1 'WxxxW' 0 error ${GetOptions} "/Prm='/D=True' /D=1" '/D=' $OUT1 StrCmp $OUT1 "1" 0 error ${GetOptions} "/D=1 /Prm='/D=True'" '/Prm=' $OUT1 StrCmp $OUT1 "/D=True" 0 error ${GetOptions} `/D=1 /Prm='/D="True" /S="/Temp"'` '/Prm=' $OUT1 StrCmp $OUT1 '/D="True" /S="/Temp"' 0 error ${GetOptions} `/INSTDIR='"C:/Program Files/Common Files"' /SILENT=yes` '/INSTDIR=' $OUT1 StrCmp $OUT1 '"C:/Program Files/Common Files"' 0 error ${GetOptions} `/INSTDIR='"C:/Program Files/Common Files"' /SILENT=yes` '/INSTDIR*=' $OUT1 IfErrors 0 error StrCmp $OUT1 '' 0 error ${GetOptions} `/INSTDIR="C:/Program Files/Common Files" /SILENT=yes` '' $OUT1 IfErrors 0 error StrCmp $OUT1 '' 0 error ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT' '/SILENT' $OUT1 IfErrors error StrCmp $OUT1 '' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section GetOptionsS ${StackVerificationStart} GetOptionsS ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1 IfErrors error StrCmp $OUT1 'C:\Program Files\Common Files' 0 error ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/Instdir=' $OUT1 IfErrors 0 error StrCmp $OUT1 '' 0 error ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT' '/SILENT' $OUT1 IfErrors error StrCmp $OUT1 '' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section GetRoot ${StackVerificationStart} GetRoot ${GetRoot} 'C:\Program Files\NSIS' $OUT1 StrCmp $OUT1 'C:' 0 error ${GetRoot} '\\SuperPimp\NSIS\Source\exehead\Ui.c' $OUT1 StrCmp $OUT1 '\\SuperPimp\NSIS' 0 error ${GetRoot} '\\Program Files\NSIS' $OUT1 StrCmp $OUT1 '\\Program Files\NSIS' 0 error ${GetRoot} '\\Program Files\NSIS\' $OUT1 StrCmp $OUT1 '\\Program Files\NSIS' 0 error ${GetRoot} '\\Program Files\NSIS\Source\exehead\Ui.c' $OUT1 StrCmp $OUT1 '\\Program Files\NSIS' 0 error ${GetRoot} '\Program Files\NSIS' $OUT1 StrCmp $OUT1 '' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section GetParent ${StackVerificationStart} GetParent ${GetParent} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 StrCmp $OUT1 'C:\Program Files\Winamp' 0 error ${GetParent} 'C:\Program Files\Winamp\plugins' $OUT1 StrCmp $OUT1 'C:\Program Files\Winamp' 0 error ${GetParent} 'C:\Program Files\Winamp\plugins\' $OUT1 StrCmp $OUT1 'C:\Program Files\Winamp' 0 error ${GetParent} 'C:\' $OUT1 StrCmp $OUT1 '' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section GetFileName ${StackVerificationStart} GetFileName ${GetFileName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 StrCmp $OUT1 'uninstwa.exe' 0 error ${GetFileName} 'uninstwa.exe' $OUT1 StrCmp $OUT1 'uninstwa.exe' 0 error ${GetFileName} 'C:\Program Files\Winamp\plugins' $OUT1 StrCmp $OUT1 'plugins' 0 error ${GetFileName} 'C:\Program Files\Winamp\plugins\' $OUT1 StrCmp $OUT1 'plugins' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section GetBaseName ${StackVerificationStart} GetBaseName ${GetBaseName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 StrCmp $OUT1 'uninstwa' 0 error ${GetBaseName} 'uninstwa.exe' $OUT1 StrCmp $OUT1 'uninstwa' 0 error ${GetBaseName} 'C:\Program Files\Winamp\plugins' $OUT1 StrCmp $OUT1 'plugins' 0 error ${GetBaseName} 'C:\Program Files\Winamp\plugins\' $OUT1 StrCmp $OUT1 '' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section GetFileExt ${StackVerificationStart} GetFileExt ${GetFileExt} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 StrCmp $OUT1 'exe' 0 error ${GetFileExt} 'uninstwa.exe' $OUT1 StrCmp $OUT1 'exe' 0 error ${GetFileExt} 'C:\Program Files\Winamp\plugins' $OUT1 StrCmp $OUT1 '' 0 error ${GetFileExt} 'C:\Program Files\Winamp\plugins\' $OUT1 StrCmp $OUT1 '' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section BannerTrimPath ${StackVerificationStart} BannerTrimPath ${BannerTrimPath} 'C:\Server\Documents\Terminal\license.htm' '35A' $OUT1 StrCmp $OUT1 'C:\Server\...\Terminal\license.htm' 0 error ${BannerTrimPath} 'C:\12\3456\789' '3A' $OUT1 StrCmp $OUT1 '' 0 error ${BannerTrimPath} 'C:\12\3456\789' '4A' $OUT1 StrCmp $OUT1 'C...' 0 error ${BannerTrimPath} 'C:\12\3456\789' '11A' $OUT1 StrCmp $OUT1 'C:\12\...' 0 error ${BannerTrimPath} 'C:\12\3456\789' '13A' $OUT1 StrCmp $OUT1 'C:\12\...\789' 0 error ${BannerTrimPath} 'C:\12\3456\789' '14A' $OUT1 StrCmp $OUT1 'C:\12\3456\789' 0 error ${BannerTrimPath} 'C:\12\3456\789' '14A' $OUT1 StrCmp $OUT1 'C:\12\3456\789' 0 error ${BannerTrimPath} 'C:\12\3456\789' '11B' $OUT1 StrCmp $OUT1 'C:\12\...' 0 error ${BannerTrimPath} 'C:\12\3456\789' '5B' $OUT1 StrCmp $OUT1 'C:...' 0 error ${BannerTrimPath} 'C:\12\3456\789' '5B' $OUT1 StrCmp $OUT1 'C:...' 0 error ${BannerTrimPath} 'C:\12\3456\789' '11C' $OUT1 StrCmp $OUT1 'C:\12\34...' 0 error ${BannerTrimPath} 'C:\12\3456\789' '9D' $OUT1 StrCmp $OUT1 'C:\12\...' 0 error ${BannerTrimPath} 'C:\12\3456\789' '10D' $OUT1 StrCmp $OUT1 'C:\...\789' 0 error ${BannerTrimPath} 'C:\12\3456\789' '11D' $OUT1 StrCmp $OUT1 'C:\1...\789' 0 error ${BannerTrimPath} '123456789' '5D' $OUT1 StrCmp $OUT1 '12...' 0 error goto +2 error: SetErrors ${StackVerificationEnd} SectionEnd Section DirState ${StackVerificationStart} DirState ${DirState} '$TEMP' $OUT1 ${StackVerificationEnd} SectionEnd Section RefreshShellIcons ${StackVerificationStart} RefreshShellIcons ${RefreshShellIcons} ${StackVerificationEnd} SectionEnd Section WriteUninstaller goto +2 WriteUninstaller '$EXEDIR\un.FileFuncTest.exe' SectionEnd ;############### UNINSTALL ############### Section un.Uninstall ${Locate} '$DOCUMENTS' '/L=FD /M=*.* /S=0B /G=0' 'un.LocateCallback' ${GetSize} '$WINDIR' '/M=Explorer.exe /S=0K /G=0' $OUT1 $OUT2 $OUT3 ${DriveSpace} 'C:\' '/D=F /S=M' $OUT1 ${GetDrives} 'FDD+CDROM' 'un.GetDrivesCallback' ${GetTime} '' 'L' $OUT1 $OUT2 $OUT3 $OUT4 $OUT5 $OUT6 $OUT7 ${GetFileAttributes} '$WINDIR\explorer.exe' 'ALL' $OUT1 ${GetFileVersion} '$WINDIR\explorer.exe' $OUT1 ${GetExeName} $OUT1 ${GetExePath} $OUT1 ${GetParameters} $OUT1 ${GetOptions} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1 ${GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1 ${GetRoot} 'C:\Program Files\NSIS' $OUT1 ${GetParent} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 ${GetFileName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 ${GetBaseName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 ${GetFileExt} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 ${BannerTrimPath} 'C:\Server\Documents\Terminal\license.htm' '35A' $OUT1 ${DirState} '$TEMP' $OUT1 ${RefreshShellIcons} SectionEnd Function un.LocateCallback Push $0 FunctionEnd Function un.GetDrivesCallback Push $0 FunctionEnd