; ; 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)