;_____________________________________________________________________________ ; ; 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" !insertmacro Locate !insertmacro GetSize !insertmacro DriveSpace !insertmacro GetDrives !insertmacro GetTime !insertmacro GetFileAttributes !insertmacro GetFileVersion !insertmacro GetExeName !insertmacro GetExePath !insertmacro GetParameters !insertmacro GetOptions !insertmacro GetOptionsS !insertmacro GetRoot !insertmacro GetParent !insertmacro GetFileName !insertmacro GetBaseName !insertmacro GetFileExt !insertmacro BannerTrimPath !insertmacro DirState !insertmacro RefreshShellIcons !insertmacro un.Locate !insertmacro un.GetSize !insertmacro un.GetDrives !insertmacro un.DriveSpace !insertmacro un.GetTime !insertmacro un.GetFileAttributes !insertmacro un.GetFileVersion !insertmacro un.GetExeName !insertmacro un.GetExePath !insertmacro un.GetParameters !insertmacro un.GetOptions !insertmacro un.GetOptionsS !insertmacro un.GetRoot !insertmacro un.GetParent !insertmacro un.GetFileName !insertmacro un.GetBaseName !insertmacro un.GetFileExt !insertmacro un.BannerTrimPath !insertmacro un.DirState !insertmacro un.RefreshShellIcons ;############### 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 ${un.Locate} '$DOCUMENTS' '/L=FD /M=*.* /S=0B /G=0' 'un.LocateCallback' ${un.GetSize} '$WINDIR' '/M=Explorer.exe /S=0K /G=0' $OUT1 $OUT2 $OUT3 ${un.DriveSpace} 'C:\' '/D=F /S=M' $OUT1 ${un.GetDrives} 'FDD+CDROM' 'un.GetDrivesCallback' ${un.GetTime} '' 'L' $OUT1 $OUT2 $OUT3 $OUT4 $OUT5 $OUT6 $OUT7 ${un.GetFileAttributes} '$WINDIR\explorer.exe' 'ALL' $OUT1 ${un.GetFileVersion} '$WINDIR\explorer.exe' $OUT1 ${un.GetExeName} $OUT1 ${un.GetExePath} $OUT1 ${un.GetParameters} $OUT1 ${un.GetOptions} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1 ${un.GetOptionsS} '/INSTDIR=C:\Program Files\Common Files /SILENT=yes' '/INSTDIR=' $OUT1 ${un.GetRoot} 'C:\Program Files\NSIS' $OUT1 ${un.GetParent} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 ${un.GetFileName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 ${un.GetBaseName} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 ${un.GetFileExt} 'C:\Program Files\Winamp\uninstwa.exe' $OUT1 ${un.BannerTrimPath} 'C:\Server\Documents\Terminal\license.htm' '35A' $OUT1 ${un.DirState} '$TEMP' $OUT1 ${un.RefreshShellIcons} SectionEnd Function un.LocateCallback Push $0 FunctionEnd Function un.GetDrivesCallback Push $0 FunctionEnd