1784 lines
57 KiB
INI
1784 lines
57 KiB
INI
;
|
|
; KEYED SECTIONS. These sections are provided for files where a selection
|
|
; is made from a set of files and the chosen one is copied under a generic
|
|
; name. This can be used to update the hal.dll, ntoskrnl.exe, ntbootdd.sys,
|
|
; ntdetect.com.
|
|
;
|
|
|
|
|
|
[FileKeyedClasses]
|
|
Hal = hal.dll
|
|
Ntoskrnl = ntoskrnl.exe
|
|
; Ntdetect = ntdetect.com
|
|
|
|
[FilesKeyedSections]
|
|
FilesHal = $(STF_HALDEST)
|
|
FilesNtoskrnl = $(STF_WINDOWSSYSPATH)
|
|
; FilesNtdetect = $(STF_OSLDEST)
|
|
|
|
[FilesHal]
|
|
|
|
; for x86
|
|
|
|
; hal = 1, hal.dll , RENAME=$(NEWFILE)
|
|
; halast = 1, halast.dll , RENAME=$(NEWFILE)
|
|
; halcbus = 1, halcbus.dll , RENAME=$(NEWFILE)
|
|
; hal486c = 1, hal486c.dll , RENAME=$(NEWFILE)
|
|
; halmca = 1, halmca.dll , RENAME=$(NEWFILE)
|
|
; halncr = 1, halncr.dll , RENAME=$(NEWFILE)
|
|
; haloli = 1, haloli.dll , RENAME=$(NEWFILE)
|
|
; halsp = 1, halsp.dll , RENAME=$(NEWFILE)
|
|
; halwyse7 = 1, halwyse7.dll , RENAME=$(NEWFILE)
|
|
|
|
; for mips
|
|
|
|
; hal = 1, hal.dll , RENAME=$(NEWFILE)
|
|
; haldti = 1, haldti.dll , RENAME=$(NEWFILE)
|
|
; halduomp = 1, halduomp.dll , RENAME=$(NEWFILE)
|
|
; halfxs = 1, halfxs.dll , RENAME=$(NEWFILE)
|
|
; halacr = 1, halacr.dll , RENAME=$(NEWFILE)
|
|
; halsgi = 1, halsgi.dll , RENAME=$(NEWFILE)
|
|
|
|
; for ppc
|
|
|
|
; hal = 1, hal.dll , RENAME=$(NEWFILE)
|
|
; halppc = 1, halppc.dll , RENAME=$(NEWFILE)
|
|
; halpolo = 1, halpolo.dll , RENAME=$(NEWFILE)
|
|
; halwood = 1, halwood.dll , RENAME=$(NEWFILE)
|
|
|
|
; for alpha
|
|
|
|
[FilesNtoskrnl]
|
|
|
|
; for ppc, x86, mips, alpha
|
|
|
|
; ntoskrnl = 1, ntoskrnl.exe , RENAME=$(NEWFILE)
|
|
; ntkrnlmp = 1, ntkrnlmp.exe , RENAME=$(NEWFILE)
|
|
|
|
; [FilesNtdetect]
|
|
|
|
; for x86
|
|
|
|
; ntdetect = 1, ntdetect.com , RENAME=$(NEWFILE)
|
|
|
|
|
|
;
|
|
; REGULAR SECTIONS. These sections are provided for files where the file
|
|
; just needs to be copied to a known destination.
|
|
;
|
|
|
|
[FileSections]
|
|
FilesPrimary = C:
|
|
FilesOsLoader = $(STF_OSLDEST)
|
|
FilesPal = $(STF_HALDEST)
|
|
FilesWinnt = $(STF_WINDOWSPATH)
|
|
FilesSystem32 = $(STF_WINDOWSSYSPATH)
|
|
FilesSystem = $(STF_WINDOWSPATH)\system
|
|
FilesDrivers = $(STF_WINDOWSSYSPATH)\drivers
|
|
FilesConfig = $(STF_WINDOWSSYSPATH)\config
|
|
FilesWinspool = $(STF_WINDOWSSYSPATH)\spool
|
|
FilesPrnDriver = $(STF_WINDOWSSYSPATH)\spool\drivers\$(!STF_PRNPLATFORM)
|
|
FilesPrnProc = $(STF_WINDOWSSYSPATH)\spool\prtprocs\$(!STF_PRNPLATFORM)
|
|
FilesDbgCom = $(STF_WINDOWSPATH)\symbols\com
|
|
FilesDbgCpl = $(STF_WINDOWSPATH)\symbols\cpl
|
|
FilesDbgDll = $(STF_WINDOWSPATH)\symbols\dll
|
|
FilesDbgDrv = $(STF_WINDOWSPATH)\symbols\drv
|
|
FilesDbgExe = $(STF_WINDOWSPATH)\symbols\exe
|
|
FilesDbgScr = $(STF_WINDOWSPATH)\symbols\scr
|
|
FilesDbgSys = $(STF_WINDOWSPATH)\symbols\sys
|
|
|
|
|
|
[FileSectionsCopyAlways]
|
|
FilesSystem32CopyAlways = $(STF_WINDOWSSYSPATH)
|
|
FilesDriversCopyAlways = $(STF_WINDOWSSYSPATH)\drivers
|
|
|
|
;
|
|
; product specific sections
|
|
;
|
|
|
|
[FileSectionsWINNT]
|
|
FilesInfWinnt = $(STF_WINDOWSSYSPATH)
|
|
|
|
[FileSectionsLANMANNT]
|
|
FilesInfLanmanNT = $(STF_WINDOWSSYSPATH)
|
|
|
|
;
|
|
; FilesPrimary only covers ntldr. For ntbootddd, a keyed section needs to
|
|
; be created. Also this section is relevant only for x86.
|
|
;
|
|
[FilesPrimary]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
;
|
|
; FilesOsLoader only covers osloader.exe. This is only relevant
|
|
;
|
|
[FilesOsLoader]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesPal]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesWinnt]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesSystem32]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesSystem]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesDrivers]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesConfig]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesWinspool]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesPrnDriver]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesPrnProc]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesDbgCom]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesDbgCpl]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesDbgDll]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesDbgDrv]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesDbgExe]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesDbgScr]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesDbgSys]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesInfWinnt]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesInfLanmanNT]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesSystem32CopyAlways]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FilesDriversCopyAlways]
|
|
; 1 = 1, file1, RENAME=$(NEWFILE)
|
|
; 2 = 1, file2, RENAME=$(NEWFILE)
|
|
|
|
[FileAttributes]
|
|
;1=1, NTLDR, $(FilesPrimary), SHR
|
|
;2=1, BOOT.INI, $(FilesPrimary), SHR
|
|
|
|
|
|
[ProcessorID]
|
|
ProcessorID_I386 = I386
|
|
ProcessorID_I486 = I486
|
|
ProcessorID_I586 = I586
|
|
ProcessorID_R4000 = R4000
|
|
|
|
[UiVars]
|
|
STF_PLATFORMDET = "" ? $(!LIBHANDLE) GetPlatform
|
|
STF_CSDVER = 256
|
|
STF_BUILDVER = 807
|
|
STF_CSD1_NT35 = 256
|
|
STF_NT31_BUILDVER = 528
|
|
STF_NT35_BUILDVER = 807
|
|
|
|
STF_PRIMARY = "C:"
|
|
STF_NTDRIVE = ""
|
|
STF_WINDOWSPATH = "" ? $(!LIBHANDLE) GetWindowsNtDir
|
|
STF_WINDOWSSYSPATH = "" ? $(!LIBHANDLE) GetWindowsNtSysDir
|
|
STF_CONTROLSET = CurrentControlSet
|
|
VolumeList = {} ? $(!LIBHANDLE) GetHardDriveLetters
|
|
VolumeFSList = {} ? $(!LIBHANDLE) GetHardDriveFileSystems
|
|
VolumeFreeList = {} ? $(!LIBHANDLE) GetHardDriveFreeSpace
|
|
DisketteList = {} ? $(!LIBHANDLE) GetFloppyDriveLetters
|
|
|
|
;
|
|
; Amount of free space (in MB) required on the winnt drive
|
|
; before we'll do the upgrade patch.
|
|
;
|
|
[FreeSpaceI386]
|
|
RequiredFreeWinnt = 25
|
|
[FreeSpaceMips]
|
|
RequiredFreeWinnt = 32
|
|
[FreeSpaceppc]
|
|
RequiredFreeWinnt = 32
|
|
[FreeSpaceAlpha]
|
|
RequiredFreeWinnt = 27
|
|
|
|
|
|
[NVRAMVars]
|
|
SystemPartition = "" ? $(!LIBHANDLE) GetNVRAMVar SYSTEMPARTITION
|
|
OsLoader = "" ? $(!LIBHANDLE) GetNVRAMVar OSLOADER
|
|
OsLoadPartition = "" ? $(!LIBHANDLE) GetNVRAMVar OSLOADPARTITION
|
|
OsLoadFilename = "" ? $(!LIBHANDLE) GetNVRAMVar OSLOADFILENAME
|
|
|
|
;
|
|
; INF LOGIC
|
|
;
|
|
|
|
[Shell Commands]
|
|
|
|
set-title "Windows NT Setup"
|
|
set-subst CR = "\r"
|
|
set-subst LF = "\n"
|
|
set STF_LANGUAGE = ENG
|
|
read-syms Strings
|
|
shell "subroutn.inf" PushBillboard STATUSDLG $(Billboard1)
|
|
set BillboardPushed = TRUE
|
|
|
|
set !LIBHANDLE = ""
|
|
set !PATCHLIBHANDLE = ""
|
|
|
|
;
|
|
; Initialize Library support for the inf
|
|
;
|
|
|
|
install LoadSetupLibrary
|
|
|
|
;
|
|
; find out the essential information about the installed hardware and
|
|
; software
|
|
;
|
|
|
|
read-syms ProductType
|
|
ifstr(i) $(!STF_PLATFORM) == I386
|
|
set STF_PRNPLATFORM = "w32x86"
|
|
else-ifstr(i) $(!STF_PLATFORM) == Mips
|
|
set STF_PRNPLATFORM = "w32mips"
|
|
else-ifstr(i) $(!STF_PLATFORM) == ppc
|
|
set STF_PRNPLATFORM = "w32ppc"
|
|
else-ifstr(i) $(!STF_PLATFORM) == Alpha
|
|
set STF_PRNPLATFORM = "w32alpha"
|
|
endif
|
|
|
|
read-syms UiVars
|
|
detect UiVars
|
|
read-syms FreeSpace$(!STF_PLATFORM)
|
|
|
|
;
|
|
; if the Platform is not the same as the one supported by this patch
|
|
; diskette, inform the user and quit
|
|
;
|
|
ifstr(i) $(STF_PLATFORM) != $(STF_PLATFORMDET)
|
|
ifstr(i) $(BillboardPushed) == TRUE
|
|
shell "subroutn.inf" PopBillboard
|
|
set BillboardPushed = FALSE
|
|
endif
|
|
shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "FATAL" $(String1)
|
|
goto patchnotdone
|
|
endif
|
|
|
|
;
|
|
; Check to make sure we have admin privileges, if not print fatal error
|
|
;
|
|
|
|
shell "registry.inf" CheckSetupModify
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
; DEBUG
|
|
;
|
|
;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Failed to shell CheckSetupModify"
|
|
;
|
|
; DEBUG END
|
|
ifstr(i) $(BillboardPushed) == TRUE
|
|
shell "subroutn.inf" PopBillboard
|
|
set BillboardPushed = FALSE
|
|
endif
|
|
|
|
Debug-Output "shelling CheckSetupModify failed"
|
|
goto patchnotdone
|
|
else-ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
ifstr(i) $(BillboardPushed) == TRUE
|
|
shell "subroutn.inf" PopBillboard
|
|
set BillboardPushed = FALSE
|
|
endif
|
|
shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) "FATAL" $(String4)
|
|
goto patchnotdone
|
|
endif
|
|
|
|
|
|
;
|
|
; Initialize the patch library support for the inf
|
|
;
|
|
|
|
install LoadPatchLibrary
|
|
|
|
;
|
|
; find out if the system we are patching is checked / free using GetCheckedFree
|
|
; and fail if we find a checked system. ignore any errors in getting
|
|
; checked/free status since this is not important.
|
|
;
|
|
shell "" GetCheckedFree
|
|
ifint $($ShellCode) == $(!SHELL_CODE_OK)
|
|
ifstr(i) $($R0) == "STATUS_SUCCESSFUL"
|
|
ifstr(i) $($R1) == "checked"
|
|
shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) "FATAL" $(String15)
|
|
goto patchnotdone
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
;
|
|
; Get the build and patch version for the system. If this is more than our patch
|
|
; version warn the user, allowing him to exit
|
|
;
|
|
|
|
LibraryProcedure STATUS,$(!PATCHLIBHANDLE), CheckBuildVersion
|
|
ifint $(STATUS) <= $(STF_NT31_BUILDVER)
|
|
shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) FATAL $(String16)
|
|
goto patchnotdone
|
|
else-ifint $(STATUS) < $(STF_NT35_BUILDVER)
|
|
shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) FATAL $(String17)
|
|
goto patchnotdone
|
|
endif
|
|
|
|
;
|
|
; Version is 807 or greater (assuming NT 3.5)
|
|
; Find out whether or not the system was updated in the past
|
|
;
|
|
shell "" GetCSDVersion
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
ifstr(i) $(BillboardPushed) == TRUE
|
|
shell "subroutn.inf" PopBillboard
|
|
set BillboardPushed = FALSE
|
|
endif
|
|
Debug-Output "PATCH.INF: Shelling GetCSDVersion failed"
|
|
goto patchnotdone
|
|
endif
|
|
|
|
ifstr(i) $($R0) != "STATUS_SUCCESSFUL"
|
|
;
|
|
; CSD for NT 3.5 was never applied to this system.
|
|
; If this is not the first CSD for NT 3.5, then inform the user
|
|
; that he must apply CSD1 for Daytona before applying the current CSD
|
|
;
|
|
Debug-Output "PATCH.INF: GetCSDVersion failed to return a value"
|
|
;
|
|
; There is no CSD 1 for PowerPC
|
|
;
|
|
ifstr(i) $(!STF_PLATFORM) != ppc
|
|
ifint $(!STF_CSDVER) >= $(STF_CSD1_NT35)
|
|
else
|
|
shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) FATAL $(String18)
|
|
goto patchnotdone
|
|
endif
|
|
endif
|
|
else
|
|
;
|
|
; A CSD for NT 3.5 was applied in the past.
|
|
;
|
|
ifint $($R1) > $(!STF_CSDVER)
|
|
ifstr(i) $(BillboardPushed) == TRUE
|
|
shell "subroutn.inf" PopBillboard
|
|
set BillboardPushed = FALSE
|
|
endif
|
|
shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) WARNING $(String8)
|
|
ifstr(i) $($R1) == "OK"
|
|
else
|
|
goto patchnotdone
|
|
endif
|
|
endif
|
|
|
|
endif
|
|
|
|
skip_patchvercheck = +
|
|
|
|
;
|
|
; Get the NT DRIVE
|
|
;
|
|
|
|
GetDriveInPath !STF_NTDRIVE $(!STF_WINDOWSSYSPATH)
|
|
|
|
;
|
|
; Check for enough disk space.
|
|
;
|
|
|
|
ifint *($(VolumeFreeList), ~($(VolumeList), $(!STF_NTDRIVE))) < $(RequiredFreeWinnt)
|
|
shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) FATAL $(String13a)$(RequiredFreeWinnt)$(String13b)$(!STF_NTDRIVE)$(String13c)
|
|
goto patchnotdone
|
|
endif
|
|
|
|
;
|
|
; get the product type we are running on
|
|
;
|
|
|
|
set STF_PRODUCT = ""
|
|
OpenRegKey $(!REG_H_LOCAL) "" "System\CurrentControlSet\Control\ProductOptions" 33554432 KeyProductOption
|
|
ifstr(i) $(KeyProductOption) != ""
|
|
GetRegValue $(KeyProductOption) "ProductType" ProductTypeList
|
|
set TempProductType = *($(ProductTypeList),4)
|
|
ifstr(i) $(TempProductType) == "winnt"
|
|
set !STF_PRODUCT = WINNT
|
|
set !PRODUCT_DIR = WINNT
|
|
else-ifstr(i) $(TempProductType) == "lanmannt"
|
|
set !STF_PRODUCT = LANMANNT
|
|
set !PRODUCT_DIR = NTAS
|
|
else-ifstr(i) $(TempProductType) == "servernt"
|
|
set !STF_PRODUCT = SERVERNT
|
|
set !PRODUCT_DIR = NTAS
|
|
endif
|
|
CloseRegKey $(KeyProductOptions)
|
|
endif
|
|
|
|
;
|
|
; if we are unable to determine the product type print error and exit
|
|
;
|
|
|
|
ifstr(i) $(STF_PRODUCT) == ""
|
|
shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) FATAL $(String14)
|
|
goto patchnotdone
|
|
endif
|
|
|
|
;
|
|
; Find the hal and osloader destination on Mips, Alpha, and PPC
|
|
;
|
|
|
|
ifstr(i) $(!STF_PLATFORM) == I386
|
|
set STF_HALDEST = $(!STF_WINDOWSSYSPATH)
|
|
LibraryProcedure STF_OSLDEST,$(!PATCHLIBHANDLE), GetOsLoaderDest
|
|
|
|
else
|
|
|
|
read-syms NVRAMVars
|
|
detect NVRAMVars
|
|
LibraryProcedure STATUS,$(!PATCHLIBHANDLE), GetOsLoaderDest +
|
|
$(SystemPartition) +
|
|
$(OsLoader) +
|
|
$(OsLoadPartition) +
|
|
$(OsLoadFilename)
|
|
ifstr(i) $(STATUS) == ERROR
|
|
goto patchnotdone
|
|
else
|
|
set STF_OSLDEST = $(STATUS)
|
|
set STF_HALDEST = $(STATUS)
|
|
endif
|
|
endif
|
|
|
|
;
|
|
; Get the required information about keyed files
|
|
;
|
|
|
|
read-syms FilesKeyedSections
|
|
set KeyedClassKeys = ^(FileKeyedClasses, 0)
|
|
set KeyedClassFiles = ^(FileKeyedClasses, 1)
|
|
|
|
set KeyedClassFilesList = {}
|
|
ForListDo $(KeyedClassKeys)
|
|
set TmpKey = Files$($)
|
|
set TmpFile = #(FileKeyedClasses, $($), 1)
|
|
set TmpFilePath = $($(TmpKey))\$(TmpFile)
|
|
set KeyedClassFilesList = >($(KeyedClassFilesList), $(TmpFilePath))
|
|
EndForListDo
|
|
|
|
LibraryProcedure STATUS,$(!PATCHLIBHANDLE), GetFileTypes $(KeyedClassFilesList)
|
|
ifstr(i) $(STATUS) == ERROR
|
|
goto patchnotdone
|
|
else-ifstr(i) $(STATUS) == SETUPLOGNOTPRESENT
|
|
shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) FATAL $(String11)
|
|
goto patchnotdone
|
|
else
|
|
ForListDo $(KeyedClassKeys)
|
|
set $($)Type = *($(STATUS), $(#))
|
|
EndForListDo
|
|
endif
|
|
|
|
;
|
|
; Warn the user about the patch process..
|
|
;
|
|
|
|
ifstr(i) $(BillboardPushed) == TRUE
|
|
shell "subroutn.inf" PopBillboard
|
|
set BillboardPushed = FALSE
|
|
endif
|
|
|
|
shell "" QueryOkCancel $(String9)
|
|
ifstr(i) $($R1) == "OK"
|
|
else
|
|
set String = $(String12)
|
|
goto finish2
|
|
endif
|
|
|
|
shell "subroutn.inf" PushBillboard STATUSDLG $(Billboard2)
|
|
set BillboardPushed = TRUE
|
|
|
|
;
|
|
; initialize copy
|
|
;
|
|
|
|
set MoveFileExList = {}
|
|
|
|
|
|
;
|
|
; Run through the directory list adding files to the copy list
|
|
;
|
|
|
|
read-syms FileSections
|
|
set FileSectionsList = ^(FileSections, 0)
|
|
set FileSource = $(!STF_SRCDIR)
|
|
|
|
ForListDo $(FileSectionsList)
|
|
set FileSection = $($)
|
|
set FileDest = $($($))
|
|
set FileList = ^($(FileSection), 0)
|
|
ForListDo $(FileList)
|
|
set FileKey = $($)
|
|
set File = #($(FileSection), $(FileKey), 2)
|
|
set FileDestFullPath = $(FileDest)\$(File)
|
|
|
|
;
|
|
; Check to see if file exists, if it is does not exist, it doesn't
|
|
; need to be copied over
|
|
|
|
LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(FileDestFullPath)
|
|
ifstr(i) $(STATUS) == YES
|
|
|
|
|
|
; DEBUG
|
|
;
|
|
;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Examining to see if file opened excl: "$(FileDestFullPath)
|
|
;
|
|
; DEBUG END
|
|
|
|
LibraryProcedure STATUS, $(!PATCHLIBHANDLE), IsFileOpenedExclusive $(FileDestFullPath)
|
|
ifstr(i) $(STATUS) == ERROR
|
|
goto patchnotdone
|
|
else
|
|
ifstr(i) $(STATUS) == "YES"
|
|
LibraryProcedure NEWFILE, $(!PATCHLIBHANDLE), GenerateTemporary $(FileDest)
|
|
ifstr(i) $(NEWFILE) == ERROR
|
|
goto patchnotdone
|
|
else
|
|
set FileComp = {$(FileDest)\$(NEWFILE), $(FileDestFullPath)}
|
|
|
|
; DEBUG
|
|
;
|
|
;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Adding to movefile ex list: "$(FileComp)
|
|
;
|
|
; DEBUG END
|
|
|
|
set MoveFileExList = >($(MoveFileExList), $(FileComp))
|
|
endif
|
|
else
|
|
set NEWFILE = $(File)
|
|
endif
|
|
|
|
; DEBUG
|
|
;
|
|
;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Copying File Section: "$(FileSection)" : Key: "$(FileKey)" Source: "$(FileSource)" Dest: "$(FileDest)" rename = "$(NEWFILE)
|
|
;
|
|
; DEBUG END
|
|
|
|
install Install-File
|
|
|
|
endif
|
|
endif
|
|
EndForListDo
|
|
EndForListDO
|
|
|
|
;
|
|
; Add the keyed sections to the copy list
|
|
;
|
|
|
|
set FileSource = $(!STF_SRCDIR)
|
|
ForListDo $(KeyedClassKeys)
|
|
set FileSection = Files$($)
|
|
set FileDest = $($(FileSection))
|
|
set FileKey = $($($)Type)
|
|
|
|
set KeyedClassChoices = ^(Files$($), 0)
|
|
ifcontains(i) $(FileKey) in $(KeyedClassChoices)
|
|
set File = #(FileKeyedClasses, $($), 1)
|
|
set FileDestFullPath = $(FileDest)\$(File)
|
|
;
|
|
; Check to see if file exists, if it is does not exist, it doesn't
|
|
; need to be copied over
|
|
|
|
LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(FileDestFullPath)
|
|
ifstr(i) $(STATUS) == YES
|
|
|
|
|
|
; DEBUG
|
|
;
|
|
;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Examining to see if file opened excl: "$(FileDestFullPath)
|
|
;
|
|
; DEBUG END
|
|
|
|
LibraryProcedure STATUS, $(!PATCHLIBHANDLE), IsFileOpenedExclusive $(FileDestFullPath)
|
|
ifstr(i) $(STATUS) == ERROR
|
|
goto patchnotdone
|
|
else
|
|
ifstr(i) $(STATUS) == "YES"
|
|
LibraryProcedure NEWFILE, $(!PATCHLIBHANDLE), GenerateTemporary $(FileDest)
|
|
ifstr(i) $(NEWFILE) == ERROR
|
|
goto patchnotdone
|
|
else
|
|
set FileComp = {$(FileDest)\$(NEWFILE), $(FileDestFullPath)}
|
|
|
|
; DEBUG
|
|
;
|
|
;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Adding to movefile ex list: "$(FileComp)
|
|
;
|
|
; DEBUG END
|
|
|
|
set MoveFileExList = >($(MoveFileExList), $(FileComp))
|
|
endif
|
|
else
|
|
set NEWFILE = $(File)
|
|
endif
|
|
|
|
; DEBUG
|
|
;
|
|
;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Copying File Section: "$(FileSection)" : Key: "$(FileKey)" Source: "$(FileSource)" Dest: "$(FileDest)" rename = "$(NEWFILE)
|
|
;
|
|
; DEBUG END
|
|
|
|
install Install-File
|
|
|
|
endif
|
|
endif
|
|
|
|
|
|
|
|
endif
|
|
EndForListDo
|
|
|
|
;
|
|
; add product specific files to the copy list
|
|
;
|
|
; ServerNT and LanmanNT share the same files
|
|
;
|
|
ifstr(i) $(STF_PRODUCT) == "WINNT"
|
|
set TEMP_PRODUCT = WINNT
|
|
else
|
|
set TEMP_PRODUCT = LANMANNT
|
|
endif
|
|
|
|
read-syms FileSections$(TEMP_PRODUCT)
|
|
set FileSectionsList = ^(FileSections$(TEMP_PRODUCT), 0)
|
|
set FileSource = $(!STF_SRCDIR)$(PRODUCT_DIR)
|
|
ForListDo $(FileSectionsList)
|
|
set FileSection = $($)
|
|
set FileDest = $($($))
|
|
set FileList = ^($(FileSection), 0)
|
|
ForListDo $(FileList)
|
|
set FileKey = $($)
|
|
set File = #($(FileSection), $(FileKey), 2)
|
|
set FileDestFullPath = $(FileDest)\$(File)
|
|
|
|
;
|
|
; Check to see if file exists, if it is does not exist, it doesn't
|
|
; need to be copied over
|
|
|
|
LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(FileDestFullPath)
|
|
ifstr(i) $(STATUS) == YES
|
|
|
|
|
|
; DEBUG
|
|
;
|
|
;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Examining to see if file opened excl: "$(FileDestFullPath)
|
|
;
|
|
; DEBUG END
|
|
|
|
LibraryProcedure STATUS, $(!PATCHLIBHANDLE), IsFileOpenedExclusive $(FileDestFullPath)
|
|
ifstr(i) $(STATUS) == ERROR
|
|
goto patchnotdone
|
|
else
|
|
ifstr(i) $(STATUS) == "YES"
|
|
LibraryProcedure NEWFILE, $(!PATCHLIBHANDLE), GenerateTemporary $(FileDest)
|
|
ifstr(i) $(NEWFILE) == ERROR
|
|
goto patchnotdone
|
|
else
|
|
set FileComp = {$(FileDest)\$(NEWFILE), $(FileDestFullPath)}
|
|
|
|
; DEBUG
|
|
;
|
|
;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Adding to movefile ex list: "$(FileComp)
|
|
;
|
|
; DEBUG END
|
|
|
|
set MoveFileExList = >($(MoveFileExList), $(FileComp))
|
|
endif
|
|
else
|
|
set NEWFILE = $(File)
|
|
endif
|
|
|
|
; DEBUG
|
|
;
|
|
;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Copying File Section: "$(FileSection)" : Key: "$(FileKey)" Source: "$(FileSource)" Dest: "$(FileDest)" rename = "$(NEWFILE)
|
|
;
|
|
; DEBUG END
|
|
|
|
install Install-File
|
|
|
|
endif
|
|
endif
|
|
EndForListDo
|
|
EndForListDO
|
|
|
|
|
|
ifstr(i) $(BillboardPushed) == TRUE
|
|
shell "subroutn.inf" PopBillboard
|
|
set BillboardPushed = FALSE
|
|
endif
|
|
|
|
;
|
|
; add the files which are always copied
|
|
;
|
|
read-syms FileSectionsCopyAlways
|
|
set FileSectionsList = ^(FileSectionsCopyAlways, 0)
|
|
set FileSource = $(!STF_SRCDIR)
|
|
|
|
ForListDo $(FileSectionsList)
|
|
set FileSection = $($)
|
|
set FileDest = $($($))
|
|
set FileList = ^($(FileSection), 0)
|
|
ForListDo $(FileList)
|
|
set FileKey = $($)
|
|
set File = #($(FileSection), $(FileKey), 2)
|
|
set NEWFILE = $(File)
|
|
set FileDestFullPath = $(FileDest)\$(File)
|
|
install Install-File
|
|
EndForListDo
|
|
EndForListDO
|
|
|
|
;
|
|
; Do the copy
|
|
;
|
|
|
|
read-syms ProgressCopy$(!STF_LANGUAGE)
|
|
install Install-DoCopy
|
|
ifstr(i) $(STF_INSTALL_OUTCOME) == "STF_USERQUIT"
|
|
goto patchnotdone
|
|
else-ifstr(i) $(STF_INSTALL_OUTCOME) == "STF_FAILURE"
|
|
goto patchnotdone
|
|
endif
|
|
|
|
;
|
|
; Process the Attributes List
|
|
;
|
|
set FileSection = "FileAttributes";
|
|
set FileList = ^(FileSection, 0)
|
|
ForListDo $(FileList)
|
|
set FileKey = $($)
|
|
set File = #($(FileSection), $(FileKey), 2)
|
|
set FileDest = #($(FileSection), $(FileKey), 3)
|
|
set FilePerms = #($(FileSection), $(FileKey), 4)
|
|
set FileDestFullPath = $(FileDest)\$(File)
|
|
|
|
ifstr(i) $(FilePerms) != ""
|
|
LibraryProcedure STATUS,$(!PATCHLIBHANDLE),ChangeFileAttributes $(FilePerms) $(FileDestFullPath)
|
|
endif
|
|
EndForListDo
|
|
|
|
processmovefileex=+
|
|
;
|
|
; Process MoveFileExList
|
|
;
|
|
|
|
ForListDo $(MoveFileExList)
|
|
;
|
|
set ExistingPath = *($($), 1)
|
|
set NewPath = *($($), 2)
|
|
|
|
; DEBUG
|
|
;
|
|
;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "CopyFileOnReboot "$(ExistingPath)" to "$(NewPath)
|
|
;
|
|
; DEBUG END
|
|
|
|
LibraryProcedure STATUS, $(!PATCHLIBHANDLE), CopyFileOnReboot $(ExistingPath) $(NewPath)
|
|
ifstr(i) $(STATUS) == ERROR
|
|
goto patchnotdone
|
|
endif
|
|
EndForListDo
|
|
|
|
|
|
patchdone =+
|
|
ifstr(i) $(BillboardPushed) == TRUE
|
|
shell "subroutn.inf" PopBillboard
|
|
set BillboardPushed = FALSE
|
|
endif
|
|
|
|
;
|
|
; do the registry modifications needed
|
|
;
|
|
|
|
shell "" DoRegistryModifications $(!STF_CSDVER)
|
|
read-syms SetupDoneDlg$(!STF_LANGUAGE)
|
|
ui start "SetupDone"
|
|
ifstr(i) $(DLGEVENT) == "CONTINUE"
|
|
ui pop 1
|
|
goto rebootend
|
|
else
|
|
ui pop 1
|
|
goto finish1
|
|
endif
|
|
|
|
patchnotdone =+
|
|
set String = $(String2)
|
|
finish2 =+
|
|
ifstr(i) $(BillboardPushed) == TRUE
|
|
shell "subroutn.inf" PopBillboard
|
|
set BillboardPushed = FALSE
|
|
endif
|
|
|
|
shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "FATAL" $(String)
|
|
goto finish1
|
|
|
|
finish1 =+
|
|
;
|
|
; Free the library support
|
|
;
|
|
|
|
install FreeSetupLibrary
|
|
|
|
finish =+
|
|
|
|
install FreePatchLibrary
|
|
exit
|
|
|
|
rebootend =+
|
|
set Reboot = YES
|
|
install Install-Shutdown
|
|
goto finish1
|
|
exit
|
|
|
|
|
|
;-----------------------------------------------------------------------
|
|
; INSTALL HELPERS
|
|
;-----------------------------------------------------------------------
|
|
|
|
[LoadPatchLibrary]
|
|
LoadLibrary "x" patchdll.dll !PATCHLIBHANDLE
|
|
exit
|
|
|
|
[FreePatchLibrary]
|
|
ifstr(i) $(!PATCHLIBHANDLE) != ""
|
|
FreeLibrary $(!PATCHLIBHANDLE)
|
|
endif
|
|
exit
|
|
|
|
[LoadSetupLibrary]
|
|
LoadLibrary "x" $(!STF_CWDDIR)setupdll.dll !LIBHANDLE
|
|
exit
|
|
|
|
[FreeSetupLibrary]
|
|
ifstr(i) $(!LIBHANDLE) != ""
|
|
FreeLibrary $(!LIBHANDLE)
|
|
endif
|
|
exit
|
|
|
|
[Install-File]
|
|
set STF_VITAL = ""
|
|
AddSectionKeyFileToCopyList $(FileSection) $(FileKey) $(FileSource) $(FileDest)
|
|
exit
|
|
|
|
[Install-DoCopy]
|
|
CopyFilesInCopyList
|
|
exit
|
|
|
|
|
|
[Install-Shutdown]
|
|
;
|
|
LibraryProcedure STATUS,$(!LIBHANDLE),ShutdownSystem $(Reboot)
|
|
exit
|
|
|
|
;-----------------------------------------------------------------------
|
|
; REGISTRY SUBROUTINES
|
|
;-----------------------------------------------------------------------
|
|
|
|
[RegistryConstants]
|
|
|
|
MaskAllAccess = 33554432
|
|
NoTitle = 0
|
|
RegLastError = $(!REG_ERROR_SUCCESS)
|
|
|
|
;-----------------------------------------------------------------------
|
|
; ROUTINE: DoRegistryModifications
|
|
;
|
|
; DESCRIPTION: Does the registry modifications needed.
|
|
; - Sets the compatibility flags for the postcript stuff
|
|
; - Creates an entry for the WinNT software.
|
|
;
|
|
; INPUTS: $0: CSD Version #
|
|
;
|
|
; OUTPUTS: $R0: Status: STATUS_SUCCESSFUL
|
|
; STATUS_FAILED
|
|
;
|
|
;------------------------------------------------------------------------
|
|
|
|
[DoRegistryModifications]
|
|
|
|
set Status = STATUS_FAILED
|
|
read-syms RegistryConstants
|
|
|
|
;
|
|
; Modify the compatibility flags..
|
|
;
|
|
set KeyPath = { +
|
|
{SOFTWARE, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Microsoft, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Windows NT", $(NoTitle), $(MaskAllAccess)}, +
|
|
{CurrentVersion, $(NoTitle), $(MaskAllAccess)}, +
|
|
{WOW, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Compatibility, $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structures for the WinNT entry
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{FH3, $(NoTitle), $(!REG_VT_SZ), "0x00004000" } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
;
|
|
; Modify the values of DosKeybIDs..
|
|
;
|
|
set KeyPath = { +
|
|
{SYSTEM, $(NoTitle), $(MaskAllAccess)}, +
|
|
{ControlSet001, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Control, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Keyboard Layout", $(NoTitle), $(MaskAllAccess)}, +
|
|
{DosKeybIDs, $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structures for the DosKeybIDs entry
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{0000041F, $(NoTitle), $(!REG_VT_SZ), "179" } +
|
|
{0001041F, $(NoTitle), $(!REG_VT_SZ), "440" } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
|
|
;
|
|
; Modify the value of Romance Standard Time
|
|
;
|
|
set KeyPath = { +
|
|
{SOFTWARE, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Microsoft, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Windows NT", $(NoTitle), $(MaskAllAccess)}, +
|
|
{CurrentVersion, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Time Zones", $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Romance Standard Time", $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structures for the Romance Standard Time entry
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{TZI, $(NoTitle), $(!REG_VT_BIN), { +
|
|
"196","255","255","255", +
|
|
"000","000","000","000", +
|
|
"196","255","255","255", +
|
|
"000","000","009","000", +
|
|
"000","000","005","000", +
|
|
"000","000","000","000", +
|
|
"000","000","000","000", +
|
|
"000","000","003","000", +
|
|
"000","000","005","000", +
|
|
"000","000","000","000", +
|
|
"000","000","000","000" +
|
|
} +
|
|
} +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
;
|
|
; Modify the value of GFT Standard Time
|
|
;
|
|
set KeyPath = { +
|
|
{SOFTWARE, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Microsoft, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Windows NT", $(NoTitle), $(MaskAllAccess)}, +
|
|
{CurrentVersion, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Time Zones", $(NoTitle), $(MaskAllAccess)}, +
|
|
{"GFT Standard Time", $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structures for the GFT Standard Time entry
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{TZI, $(NoTitle), $(!REG_VT_BIN), { +
|
|
"136","255","255","255", +
|
|
"000","000","000","000", +
|
|
"196","255","255","255", +
|
|
"000","000","009","000", +
|
|
"000","000","005","000", +
|
|
"000","000","000","000", +
|
|
"000","000","000","000", +
|
|
"000","000","003","000", +
|
|
"000","000","005","000", +
|
|
"000","000","000","000", +
|
|
"000","000","000","000" +
|
|
} +
|
|
} +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
;
|
|
; Modify the value of Central Asia Standard Time
|
|
;
|
|
set KeyPath = { +
|
|
{SOFTWARE, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Microsoft, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Windows NT", $(NoTitle), $(MaskAllAccess)}, +
|
|
{CurrentVersion, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Time Zones", $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Central Asia Standard Time", $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structures for the GFT Standard Time entry
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{Display, $(NoTitle), $(!REG_VT_SZ), "(GMT+06:00) Almaty, Dhaka" } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
;
|
|
; Modify the value of E. South America Standard Time
|
|
;
|
|
set KeyPath = { +
|
|
{SOFTWARE, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Microsoft, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Windows NT", $(NoTitle), $(MaskAllAccess)}, +
|
|
{CurrentVersion, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Time Zones", $(NoTitle), $(MaskAllAccess)}, +
|
|
{"E. South America Standard Time", $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structures for the GFT Standard Time entry
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{Display, $(NoTitle), $(!REG_VT_SZ), "(GMT-03:00) Brazilia" } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
;
|
|
; Modify the value of win.ini\windows
|
|
;
|
|
set KeyPath = { +
|
|
{SOFTWARE, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Microsoft, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Windows NT", $(NoTitle), $(MaskAllAccess)}, +
|
|
{CurrentVersion, $(NoTitle), $(MaskAllAccess)}, +
|
|
{IniFileMapping, $(NoTitle), $(MaskAllAccess)}, +
|
|
{win.ini, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Windows, $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structure
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{SnapToDefaultButton, $(NoTitle), $(!REG_VT_SZ), "#USR:Control Panel\Mouse" } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
;
|
|
; Modify the value of Providers
|
|
;
|
|
set KeyPath = { +
|
|
{SYSTEM, $(NoTitle), $(MaskAllAccess)}, +
|
|
{ControlSet001, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Control, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Print, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Providers, $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structure
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{RouterCacheSize, $(NoTitle), $(!REG_VT_DWORD), 5 } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
|
|
;
|
|
; Modify the value of ServiceGroupOrder
|
|
;
|
|
set KeyPath = { +
|
|
{SYSTEM, $(NoTitle), $(MaskAllAccess)}, +
|
|
{ControlSet001, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Control, $(NoTitle), $(MaskAllAccess)}, +
|
|
{ServiceGroupOrder, $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structure
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{List, $(NoTitle), $(!REG_VT_MULTI_SZ), { +
|
|
"SCSI miniport", +
|
|
"port", +
|
|
"Primary disk", +
|
|
"SCSI class", +
|
|
"SCSI CDROM class", +
|
|
"filter", +
|
|
"boot file system", +
|
|
"Base", +
|
|
"Pointer Port", +
|
|
"Keyboard Port", +
|
|
"Pointer Class", +
|
|
"Keyboard Class", +
|
|
"Video Init", +
|
|
"Video", +
|
|
"Video Save", +
|
|
"file system", +
|
|
"Event log", +
|
|
"Streams Drivers", +
|
|
"NDIS", +
|
|
"TDI", +
|
|
"NetBIOSGroup", +
|
|
"SpoolerGroup", +
|
|
"NetDDEGroup", +
|
|
"Parallel arbitrator", +
|
|
"extended base", +
|
|
"RemoteValidation", +
|
|
"PCI Configuration" +
|
|
} } +
|
|
}
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
|
|
;
|
|
; Modify the value of Session Manager
|
|
;
|
|
set KeyPath = { +
|
|
{SYSTEM, $(NoTitle), $(MaskAllAccess)}, +
|
|
{ControlSet001, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Control, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Session Manager", $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structure
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{GlobalFlag, $(NoTitle), $(!REG_VT_DWORD), 0 } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
|
|
;
|
|
; Modify the value of Memory Management
|
|
;
|
|
set KeyPath = { +
|
|
{SYSTEM, $(NoTitle), $(MaskAllAccess)}, +
|
|
{ControlSet001, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Control, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Session Manager", $(NoTitle), $(MaskAllAccess)}, +
|
|
{"Memory Management", $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structure
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{DisablePagingExecutive, $(NoTitle), $(!REG_VT_DWORD), 0 } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
|
|
;
|
|
; Modify the value of Device0
|
|
;
|
|
set KeyPath = { +
|
|
{SYSTEM, $(NoTitle), $(MaskAllAccess)}, +
|
|
{ControlSet001, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Services, $(NoTitle), $(MaskAllAccess)}, +
|
|
{et4000, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Device0, $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structure
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{InstalledDisplayDrivers, $(NoTitle), $(!REG_VT_MULTI_SZ), { +
|
|
"vga", +
|
|
"w32", +
|
|
"vga256", +
|
|
"vga64k" +
|
|
} } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
|
|
;
|
|
; Modify the value of tga
|
|
;
|
|
set KeyPath = { +
|
|
{SYSTEM, $(NoTitle), $(MaskAllAccess)}, +
|
|
{ControlSet001, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Services, $(NoTitle), $(MaskAllAccess)}, +
|
|
{tga, $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structure
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{Type, $(NoTitle), $(!REG_VT_DWORD), 1 } +
|
|
{Start, $(NoTitle), $(!REG_VT_DWORD), 1 } +
|
|
{ErrorControl, $(NoTitle), $(!REG_VT_DWORD), 0 } +
|
|
{Group, $(NoTitle), $(!REG_VT_SZ), "Video" } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
|
|
;
|
|
; Modify the value of tga\Device0
|
|
;
|
|
set KeyPath = { +
|
|
{SYSTEM, $(NoTitle), $(MaskAllAccess)}, +
|
|
{ControlSet001, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Services, $(NoTitle), $(MaskAllAccess)}, +
|
|
{tga, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Device0, $(NoTitle), $(MaskAllAccess)}, +
|
|
}
|
|
|
|
;
|
|
; Form the value info structure
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{VgaCompatible, $(NoTitle), $(!REG_VT_DWORD), 0 } +
|
|
{InstalledDisplayDrivers,$(NoTitle), $(!REG_VT_MULTI_SZ), {"tga"} } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
|
|
;
|
|
; Modify the value of PCIDump
|
|
;
|
|
set KeyPath = { +
|
|
{SYSTEM, $(NoTitle), $(MaskAllAccess)}, +
|
|
{ControlSet001, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Services, $(NoTitle), $(MaskAllAccess)}, +
|
|
{PCIDump, $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structure
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{ErrorControl, $(NoTitle), $(!REG_VT_DWORD), 0 } +
|
|
{Group, $(NoTitle), $(!REG_VT_SZ), "PCI Configuration" } +
|
|
{Start, $(NoTitle), $(!REG_VT_DWORD), 1 } +
|
|
{Tag, $(NoTitle), $(!REG_VT_DWORD), 1 } +
|
|
{Type, $(NoTitle), $(!REG_VT_DWORD), 1 } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
|
|
;
|
|
; Modify the value of Classes\CLSID\{00022601-0000-0000-C000-000000000046}
|
|
;
|
|
set KeyPath = { +
|
|
{SOFTWARE, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Microsoft, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Classes, $(NoTitle), $(MaskAllAccess)}, +
|
|
{CLSID, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"{00022601-0000-0000-C000-000000000046}", $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structures for the Media Clip entry
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{"", $(NoTitle), $(!REG_VT_SZ), "Media Clip" } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
;
|
|
; Modify the value of Classes\CLSID\{00022601-0000-0000-C000-000000000046}\verb\2
|
|
;
|
|
set KeyPath = { +
|
|
{SOFTWARE, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Microsoft, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Classes, $(NoTitle), $(MaskAllAccess)}, +
|
|
{CLSID, $(NoTitle), $(MaskAllAccess)}, +
|
|
{"{00022601-0000-0000-C000-000000000046}", $(NoTitle), $(MaskAllAccess)} +
|
|
{verb, $(NoTitle), $(MaskAllAccess)} +
|
|
{2, $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structures for the entry
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{"", $(NoTitle), $(!REG_VT_SZ), "&Open,0,2" } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
;
|
|
; Modify the value of Classes\MPlayer\protocol\StdFileEditing\Verb\2
|
|
;
|
|
set KeyPath = { +
|
|
{SOFTWARE, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Microsoft, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Classes, $(NoTitle), $(MaskAllAccess)}, +
|
|
{MPlayer, $(NoTitle), $(MaskAllAccess)}, +
|
|
{protocol, $(NoTitle), $(MaskAllAccess)}, +
|
|
{StdFileEditing, $(NoTitle), $(MaskAllAccess)}, +
|
|
{verb, $(NoTitle), $(MaskAllAccess)} +
|
|
{2, $(NoTitle), $(MaskAllAccess)} +
|
|
}
|
|
|
|
;
|
|
; Form the value info structures for the entry
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{"", $(NoTitle), $(!REG_VT_SZ), "&Open" } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
;
|
|
; Modify the value of qv\Device0
|
|
;
|
|
set KeyPath = { +
|
|
{SYSTEM, $(NoTitle), $(MaskAllAccess)}, +
|
|
{ControlSet001, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Services, $(NoTitle), $(MaskAllAccess)}, +
|
|
{qv, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Device0, $(NoTitle), $(MaskAllAccess)}, +
|
|
}
|
|
|
|
;
|
|
; Form the value info structure
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{InstalledDisplayDrivers,$(NoTitle), $(!REG_VT_MULTI_SZ), {"vga", "qv"} } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
|
|
;
|
|
; Form the path up to the version key
|
|
;
|
|
|
|
set KeyPath = { +
|
|
{SYSTEM, $(NoTitle), $(MaskAllAccess)}, +
|
|
{CurrentControlSet, $(NoTitle), $(MaskAllAccess)}, +
|
|
{Control, $(NoTitle), $(MaskAllAccess)}, +
|
|
{ProductOptions, $(NoTitle), $(MaskAllAccess)}, +
|
|
}
|
|
|
|
;
|
|
; Form the value info structures for the WinNT entry
|
|
; Note that for NT 3.5, the CSD version goes into the high order word
|
|
;
|
|
|
|
set KeyValues = { +
|
|
{CSDVersion, $(NoTitle), $(!REG_VT_DWORD), $($0) } +
|
|
}
|
|
|
|
|
|
shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
|
|
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
|
goto endCSDVersionCreate
|
|
endif
|
|
ifstr(i) $($R0) != STATUS_SUCCESSFUL
|
|
goto endCSDVersionCreate
|
|
else
|
|
CloseRegKey $($R1)
|
|
endif
|
|
|
|
set Status = STATUS_SUCCESSFUL
|
|
endCSDVersionCreate = +
|
|
Return $(Status)
|
|
|
|
|
|
|
|
|
|
;-----------------------------------------------------------------------
|
|
; ROUTINE: GetCSDVersion
|
|
;
|
|
; DESCRIPTION: Reads the software entry to find out what the CSD Patch Version
|
|
; is
|
|
;
|
|
; INPUTS: $0: None
|
|
;
|
|
; OUTPUTS: $R0: Status: STATUS_SUCCESSFUL
|
|
; STATUS_FAILED
|
|
;
|
|
; $R1: CSDVersion
|
|
;
|
|
;------------------------------------------------------------------------
|
|
|
|
[GetCSDVersion]
|
|
|
|
set Status = STATUS_SUCCESSFUL
|
|
read-syms RegistryConstants
|
|
set CSDVersion = 0
|
|
|
|
;
|
|
; Open the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
|
|
; key
|
|
|
|
set KeyName = "SYSTEM\CurrentControlSet\ProductOptions"
|
|
OpenRegKey $(!REG_H_LOCAL) "" $(KeyName) $(!REG_KEY_READ) KeyHandle
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
Debug-Output "REGISTRY.INF: Couldn't open windows nt software key for read access"
|
|
goto end_GetCSDVersion
|
|
endif
|
|
|
|
;
|
|
; read the csdversion entry
|
|
;
|
|
|
|
GetRegValue $(KeyHandle) "CSDVersion" CSDVersionValue
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
CloseRegKey $(KeyHandle)
|
|
goto end_GetCSDVersion
|
|
endif
|
|
|
|
set CSDVersion = *($(CSDVersionValue), 4)
|
|
CloseRegKey $(KeyHandle)
|
|
end_GetCSDVersion = +
|
|
Return $(Status) $(CSDVersion)
|
|
|
|
|
|
;-----------------------------------------------------------------------
|
|
; ROUTINE: GetCheckedFree
|
|
;
|
|
; DESCRIPTION: Reads the software entry to find out whether the system
|
|
; is checked / free.
|
|
;
|
|
; INPUTS: $0: None
|
|
;
|
|
; OUTPUTS: $R0: Status: STATUS_SUCCESSFUL
|
|
; STATUS_FAILED
|
|
;
|
|
; $R1: Checked | Free
|
|
;
|
|
;------------------------------------------------------------------------
|
|
|
|
[GetCheckedFree]
|
|
|
|
set Status = STATUS_SUCCESSFUL
|
|
read-syms RegistryConstants
|
|
set System = Free
|
|
|
|
;
|
|
; Open the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
|
|
; key
|
|
|
|
set KeyName = "Software\Microsoft\Windows NT\CurrentVersion"
|
|
OpenRegKey $(!REG_H_LOCAL) "" $(KeyName) $(!REG_KEY_READ) KeyHandle
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
Debug-Output "REGISTRY.INF: Couldn't open windows nt software key for read access"
|
|
goto end_GetCheckedFree
|
|
endif
|
|
|
|
;
|
|
; read the currenttype value
|
|
;
|
|
|
|
GetRegValue $(KeyHandle) "CurrentType" CurrentTypeValue
|
|
ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
|
CloseRegKey $(KeyHandle)
|
|
goto end_GetCheckedFree
|
|
endif
|
|
|
|
;
|
|
; split the currenttype value and see if the split string has "free" or
|
|
; "checked" in it
|
|
;
|
|
|
|
Split-String *($(CurrentTypeValue), 4) " " CurrentTypeList
|
|
ForListDo $(CurrentTypeList)
|
|
ifstr(i) $($) == "free"
|
|
set System = free
|
|
else-ifstr(i) $($) == "checked"
|
|
set System = checked
|
|
endif
|
|
EndForListDo
|
|
|
|
CloseRegKey $(KeyHandle)
|
|
end_GetCheckedFree = +
|
|
Return $(Status) $(System)
|
|
|
|
|
|
;-----------------------------------------------------------------------
|
|
; ROUTINE: QueryOkCancel
|
|
;
|
|
; DESCRIPTION: This routine lets the user query OK / Cancel giving OK as
|
|
; default
|
|
;
|
|
; INPUTS: $0: MessageText.
|
|
;
|
|
; OUTPUTS: $R0: STATUS: STATUS_SUCCESSFUL |
|
|
; STATUS_NOLANGUAGE
|
|
; STATUS_FAILED
|
|
;
|
|
; $R1: DLGEVENT: OK | CANCEL
|
|
;
|
|
;------------------------------------------------------------------------
|
|
|
|
[QueryOkCancel]
|
|
|
|
set DlgText = $($0)
|
|
read-syms QueryOKCancelDlg$(!STF_LANGUAGE)
|
|
|
|
ui start "SetupMessage"
|
|
ifstr(i) $(DLGEVENT) == "OK"
|
|
set Status = STATUS_SUCCESSFUL
|
|
set UserAction = $(DLGEVENT)
|
|
|
|
else-ifstr(i) $(DLGEVENT) == "CANCEL"
|
|
set Status = STATUS_SUCCESSFUL
|
|
set UserAction = $(DLGEVENT)
|
|
else
|
|
set Status = STATUS_FAILED
|
|
set UserAction = "CANCEL"
|
|
endif
|
|
Return $(Status) $(UserAction)
|