;-------------------------------------- ; HARDWARE OPTION CLASSES WE UNDERSTAND ;-------------------------------------- [Options] ; Computer = cpt Video = vio Layout = lay Language = lng Printer = prn Sound = snd Driver = drv NetAdapter = nad NetDriver = ndr NetTransport = nxp NetService = nsv Network = nwk NetProvider = npr [OemOptionFiles] OemFiles = {} ? $(!LIBHANDLE) FindFileInstances $(!STF_WINDOWSSYSPATH)"\oem"$(Abb)"*.inf" [DetectFileTime] FileDateTime = {"0","0"} ? $(!LIBHANDLE) GetFileLastWriteTime $(!STF_WINDOWSSYSPATH)"\"$(FileDateTimeName) ;----------------------------------------------------------------------- ; ; ROUTINE: ReturnOemOptions ; ; DESCRIPTION: This routine finds out if an OEM file representing ; the option exists in the windows sytem directory ; and returns the options represented in the INF. ; ; INPUTS: $0: Language to use ; $1: Option Type (Computer|Video|...) ; ; OUTPUTS: $R0: STATUS: STATUS_SUCCESSFUL | ; STATUS_FAILED ; ; $R1: OemOptionList: This is of form: ; { {Oemfile1, Option1List, Option1TextList}, ; {Oemfile2, Option2List, Option2TextList}, ; ... ; } ; ; ;------------------------------------------------------------------------ [ReturnOemOptions] ; ; Initialize ; set Status = STATUS_FAILED set OemOptionList = {} set FromNetwork = $($2) set AllChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789." set Numerals = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" } set Abb = #(Options, $($1), 1) read-syms OemOptionFiles detect OemOptionFiles ifcontains(i) "oemnadzz.inf" in $(OemFiles) ; ; Put oemnadzz.inf at the beginning ; set newList = {"oemnadzz.inf"} ForListDo $(OemFiles) ifstr(i) $($) != "oemnadzz.inf" set newList = >($(newList),$($)) endif EndForListDo ;set newList = >($(newList),"oemnadzz.inf") set OemFiles = $(newList) endif debug-output $(OemFiles) set TotalOptions = {} ForListDo $(OemFiles) set fExclude = "" Split-String $($) $(AllChars) InfNameChars ifcontains(i) *($(InfNameChars), 7) in $(Numerals) ; exclude if from network and a numerical item (thus a real net Oem) ; set fExclude = $(FromNetwork) endif ifstr(i) $(fExclude) == "" set OemFileName = $(!STF_WINDOWSSYSPATH)"\"$($) ifstr(i) $(FromNetwork) == "" shell "", GetOptionsFromINF $($0) $($1) $(OemFileName) else shell "", GetNetworkOptionsFromINF $($0) $($1) $(OemFileName) endif set CurrentInf = $($) ifstr(i) $($R0) == STATUS_SUCCESSFUL set Index = 0 set ReturnOption = $($R1) set ReturnOptionText = $($R2) ForListDo $(ReturnOption) set-add Index = $(Index), 1 ifcontains(i) $($) not-in $(TotalOptions) set OemOptionList = >($(OemOptionList), {$(CurrentInf), $($), *($(ReturnOptionText),$(Index))}) set TotalOptions = >($(TotalOptions), $($)) endif EndForListDo endif endif EndForListDo set Status = STATUS_SUCCESSFUL finish_GetCurrentOemOptions = + Return $(Status) $(OemOptionList) ;----------------------------------------------------------------------- ; ; ROUTINE: GetNetworkOptionsFromINF ; ; DESCRIPTION: This routine checks to see if the specified file exists ; and if it is of the right type and gets option info from ; the INF. It is called for network option only. ; ; The different between this function and GetOptionsFromINF ; is that it will elminiate the dupliication of the same ; option. ; ; INPUTS: $0: Language To use ; $1: OptionType ; $2: OptionFileName ; ; OUTPUTS: $R0: STATUS: STATUS_SUCCESSFUL | ; STATUS_INFNOTFOUND | ; STATUS_FAILED ; ; $R1: OptionList ; $R2: OPtionTextList ; ;------------------------------------------------------------------------ [GetNetworkOptionsFromINF] ; ; Initialize ; set Status = STATUS_FAILED set OptionList = {} set OptionTextList = {} set FileToCheck = $($2) install Install-SeeIfFileIsPresent ifstr(i) $(STATUS) != "YES" set Status = STATUS_INFNOTFOUND goto finish_GetNetworkOptionsFromINF endif ; ; See if we have cached this information into the Registry. ; Shell "" GetOptionsFromRegistry $($1) $($2) ifstr(i) $($R0) == "STATUS_SUCCESSFUL" set OptionList = $($R1) set OptionTextList = $($R2) set Status = STATUS_SUCCESSFUL goto finish_GetNetworkOptionsFromINF endif ; ; Check that the INF represents the option we are looking for ; shell $($2) Identify ifstr(i) $($R0) == "STATUS_SUCCESSFUL" ifstr(i) $($R1) == $($1) set OptionList = {} set OptionTextList = {} forlistdo $(!STF_BUSTYPELIST) shell $($2) ReturnOptions $($0) $($) ifstr(i) $($R0) == STATUS_SUCCESSFUL set Index = 0 set ReturnOption = $($R1) set ReturnOptionText = $($R2) ForListDo $(ReturnOption) set-add Index = $(Index), 1 ifstr(i) $(OptionList) == {} set OptionList = {$($)} set OptionTextList = {*($(ReturnOptionText),$(Index))} else ifcontains(i) $($) not-in $(OptionList) set OptionList = >($(OptionList),$($)) set OptionTextList = >($(OptionTextList),*($(ReturnOptionText),$(Index))) endif endif EndForListDo set Status = STATUS_SUCCESSFUL endif endforlistdo ifstr(i) $(OptionList) != "" Shell "" SetOptionsIntoRegistry $($1) $($2) $(OptionList) $(OptionTextList) endif endif endif finish_GetNetworkOptionsFromINF = + Return $(Status) $(OptionList) $(OptionTextList) ;----------------------------------------------------------------------- ; ; ROUTINE: GetOptionsFromINF ; ; DESCRIPTION: This routine checks to see if the specified file exists ; and if it is of the right type and gets option info from ; the INF. ; ; INPUTS: $0: Language To use ; $1: OptionType ; $2: OptionFileName ; ; OUTPUTS: $R0: STATUS: STATUS_SUCCESSFUL | ; STATUS_INFNOTFOUND | ; STATUS_FAILED ; ; $R1: OptionList ; $R2: OPtionTextList ; ;------------------------------------------------------------------------ [GetOptionsFromINF] ; ; Initialize ; set Status = STATUS_FAILED set OptionList = {} set OptionTextList = {} set FileToCheck = $($2) install Install-SeeIfFileIsPresent ifstr(i) $(STATUS) != "YES" set Status = STATUS_INFNOTFOUND goto finish_GetOptionsFromINF endif ; ; See if we have cached this information into the Registry. ; Shell "" GetOptionsFromRegistry $($1) $($2) ifstr(i) $($R0) == "STATUS_SUCCESSFUL" set OptionList = $($R1) set OptionTextList = $($R2) set Status = STATUS_SUCCESSFUL goto finish_GetOptionsFromINF endif ; ; Check that the INF represents the option we are looking for ; shell $($2) Identify ifstr(i) $($R0) == "STATUS_SUCCESSFUL" ifstr(i) $($R1) == $($1) set OptionList = "" shell $($2) ReturnOptions $($0) $($) ifstr(i) $($R0) == STATUS_SUCCESSFUL set OptionList = $($R1) set OptionTextList = $($R2) set Status = STATUS_SUCCESSFUL endif ifstr(i) $(OptionList) != "" Shell "" SetOptionsIntoRegistry $($1) $($2) $(OptionList) $(OptionTextList) endif endif endif finish_GetOptionsFromINF = + Return $(Status) $(OptionList) $(OptionTextList) ;----------------------------------------------------------------------- ; ; ROUTINE: GetNewOEMOption ; ; DESCRIPTION: This routine prompts the user for a new OEM file, presents ; the options supported and if the user chooses one of these ; copies over the INF to the windows system directory. ; ; INPUTS: $0: Language to use ; $1: OemOptionList ; $2: OptionType ; $3: OptDisketteSource ; $4: Optional Dialog Text ; ; OUTPUTS: $R0: STATUS: STATUS_SUCCESSFUL | ; STATUS_USERCANCEL | ; STATUS_FAILED | ; ; $R1: NewOemOptionList ; $R2: OemOptionChosen ; $R3: OemOptionChosenText ; $R4: OEMINFSource ; ;------------------------------------------------------------------------ [GetNewOEMOption] ; set Status = STATUS_FAILED set Option = $($2) set OptDisketteSrc = $($3) set OptionalDlgText = $($4) set OptDiskette = #(OptionDiskettes$($0), $($2), 1) set InfName1 = "OEMSETUP.INF" set InfName2 = "OEMSETNT.INF" set Abb = #(Options, $(Option), 1) set NewOemOptionList = $($1) set OptionChosen = "" set OptionChosenText = "" ; ; Prompt the user for the diskette containing the INF ; ask_dodiskette = + ; ; Reset the INF name to the standard default ; set InfName = $(InfName1) shell "" DoDiskette $($0) $(OptDiskette) $(OptDisketteSrc) set Status = STATUS_FAILED ifstr(i) $($R0) == STATUS_USERCANCEL set Status = STATUS_USERCANCEL goto finish_GetOEMOption else-ifstr(i) $($R0) == STATUS_FAILED goto finish_GetOEMOption endif set OptDisketteSrc = $($R1) ; ; Check that the Diskette contains an INF we are looking for ; ask_inf_retry = + FlushInf $(InfName) LibraryProcedure FileToCheck, $(!LIBHANDLE), AppendBackSlash $(OptDisketteSrc) set FileToCheck = $(FileToCheck)$(InfName) install Install-SeeIfFileIsPresent set OemSetupFilePath = $(FileToCheck) set NfError = 1 ifstr(i) $(STATUS) == YES set NfError = 2 ; ; Check that the INF represents the option we are looking for ; shell $(OemSetupFilePath) Identify ifstr(i) $($R0) == "STATUS_SUCCESSFUL" ifstr(i) $($R1) == $(Option) ForListDo $(!STF_BUSTYPELIST) shell $(OemSetupFilePath) ReturnOptions $($0) $($) ifstr(i) $($R0) == STATUS_SUCCESSFUL set OemList = $($R1) set OemTextList = $($R2) goto asksingleselection endif EndForListDo endif endif endif ; ; The file isn't in NT format; try the alternate name. ; ifstr(i) $(InfName) == $(InfName1) Set InfName = $(InfName2) goto ask_inf_retry endif read-syms NonFatalError$(NfError)$($0) shell "subroutn.inf" SetupMessage $($0) "NONFATAL" $(NonFatal) goto ask_dodiskette ; ; Present the OEM options to the user. Let the user select. If ; the user selects to cancel, don't change anything, just return ; asksingleselection = + shell "" DoSingleOption $(OemList) $(OemTextList) $(OptDiskette) $(OptionalDlgText) ifstr(i) $($R0) == STATUS_FAILED set Status = STATUS_FAILED goto finish_GetOEMOption else-ifstr(i) $($R0) == STATUS_USERCANCEL set Status = STATUS_USERCANCEL goto finish_GetOEMOption endif set OptionChosen = $($R1) set OptionChosenText = $($R2) ; ; Determine the file name to use to copy over. First see if the INF ; is a duplicate ; set Duplicate = FALSE ForListDo $($1) ifstr(i) *($($), 2) == $(OemList) set OemFileName = *($($), 1) set Duplicate = TRUE FlushInf $(OemFileName) goto copyinf endif EndForListDo ; ; Not a duplicate, we need to copy it under a unique name. ; set Num = 0 nextinf = + ifint $(Num) < 99 set OemFileName = "oem"$(Abb)$(Num)".inf" set FileToCheck = $(!STF_WINDOWSSYSPATH)"\"$(OemFileName) install Install-SeeIfFileIsPresent ifstr(i) $(STATUS) == "YES" set-add Num = $(Num) 1 goto nextinf else goto copyinf endif endif goto finish_GetOEMOption copyinf = + ; ; copy the INF over to the windows system directory ; set OemSrc = $(OemSetupFilePath) set OemDst = $(!STF_WINDOWSSYSPATH)"\"$(OemFileName) install Install-OemINF ; ; form the new oem option list ; ifstr(i) $(Duplicate) == TRUE else set NewOemOptionList = >($(NewOemOptionList), {$(OemFileName), $(OemList), $(OemTextList)}) endif set Status = STATUS_SUCCESSFUL finish_GetOEMOption = + FlushInf $(InfName) Return $(Status) $(NewOemOptionList) $(OptionChosen) $(OptionChosenText) $(OptDisketteSrc) ;----------------------------------------------------------------------- ; ; ROUTINE: GetNewOEMMultiOption ; ; DESCRIPTION: This routine prompts the user for a new OEM file, presents ; the options supported and if the user chooses one of these ; copies over the INF to the windows system directory. ; ; INPUTS: $0: Language to use ; $1: OemOptionList ; $2: OptionTypeList; e.g., { NetService, NetTransport } ; $3: OptDisketteSource ; $4: (Optional) Dialog Text ; ; OUTPUTS: $R0: STATUS: STATUS_SUCCESSFUL | ; STATUS_USERCANCEL | ; STATUS_FAILED | ; ; $R1: NewOemOptionList ; $R2: OemOptionChosen ; $R3: OemOptionChosenText ; $R4: OEMINFSource ; ;------------------------------------------------------------------------ [GetNewOEMMultiOption] Debug-Output $(STF_CONTEXTINFNAME)": GetNewOEMMultiOption called" set Status = STATUS_FAILED set OptionType = "" set OptionTypeList = $($2) set OptDisketteSrc = $($3) set OptionalDlgText = $($4) set InfName1 = "OEMSETUP.INF" set InfName2 = "OEMSETNT.INF" read-syms OptionDisketteMulti$($0) Set TypeNames = ^(Options,0) Set TypeAbbs = ^(Options,1) set NewOemOptionList = $($1) set OptionChosen = "" set OptionChosenText = "" ; ; Prompt the user for the diskette containing the INF ; m_ask_dodiskette = + Debug-Output $(STF_CONTEXTINFNAME)": GetNewOEMMultiOption shelling DoDiskette" ; ; Reset the INF name to the standard default ; set InfName = $(InfName1) shell "" DoDiskette $($0) $(OptDiskette) $(OptDisketteSrc) set Status = STATUS_FAILED ifstr(i) $($R0) == STATUS_USERCANCEL set Status = STATUS_USERCANCEL goto m_finish_GetOEMOption else-ifstr(i) $($R0) == STATUS_FAILED goto m_finish_GetOEMOption endif set OptDisketteSrc = $($R1) ; ; Check that the Diskette contains an INF we are looking for ; m_ask_inf_retry = + FlushInf $(InfName) LibraryProcedure FileToCheck, $(!LIBHANDLE), AppendBackSlash $(OptDisketteSrc) set FileToCheck = $(FileToCheck)$(InfName) install Install-SeeIfFileIsPresent set OemSetupFilePath = $(FileToCheck) set NfError = 1 ifstr(i) $(STATUS) == YES set NfError = 2 ; ; Check that the INF represents the option we are looking for ; shell $(OemSetupFilePath) Identify ifstr(i) $($R0) == "STATUS_SUCCESSFUL" ifcontains(i) $($R1) in $(OptionTypeList) Set OptionType = $($R1) ForListDo $(!STF_BUSTYPELIST) shell $(OemSetupFilePath) ReturnOptions $($0) $($) ifstr(i) $($R0) == STATUS_SUCCESSFUL set OemList = $($R1) set OemTextList = $($R2) goto m_asksingleselection endif EndForListDo endif endif endif ; ; The file wasn't found or isn't in NT format; try the alternate name. ; ifstr(i) $(InfName) == $(InfName1) Set InfName = $(InfName2) goto m_ask_inf_retry endif read-syms NonFatalError$(NfError)$($0) shell "subroutn.inf" SetupMessage $($0) "NONFATAL" $(NonFatal) goto m_ask_dodiskette ; ; Present the OEM options to the user. Let the user select. If ; the user selects to cancel, don't change anything, just return ; m_asksingleselection = + shell "" DoSingleOption $(OemList) $(OemTextList) $(OptDiskette) $(OptionalDlgText) ifstr(i) $($R0) == STATUS_FAILED set Status = STATUS_FAILED goto m_finish_GetOEMOption else-ifstr(i) $($R0) == STATUS_USERCANCEL set Status = STATUS_USERCANCEL goto m_finish_GetOEMOption endif set OptionChosen = $($R1) set OptionChosenText = $($R2) ; ; Determine the file name to use to copy over. First see if the INF ; is a duplicate ; set Duplicate = FALSE ForListDo $($1) ifstr(i) *($($), 2) == $(OemList) set OemFileName = *($($), 1) set Duplicate = TRUE FlushInf $(OemFileName) goto m_copyinf endif EndForListDo ; ; Not a duplicate, we need to copy it under a unique name. ; set Num = 0 Set Abb = *($(TypeAbbs),~($(TypeNames),$(OptionType))) m_nextinf = + ifint $(Num) < 99 set OemFileName = "oem"$(Abb)$(Num)".inf" Debug-Output "OTHER.INF: Checking winsyspath for "$(OemFileName) set FileToCheck = $(!STF_WINDOWSSYSPATH)"\"$(OemFileName) install Install-SeeIfFileIsPresent ifstr(i) $(STATUS) == "YES" set-add Num = $(Num) 1 goto m_nextinf else goto m_copyinf endif endif goto m_finish_GetOEMOption m_copyinf = + ; ; copy the INF over to the windows system directory ; set OemSrc = $(OemSetupFilePath) set OemDst = $(!STF_WINDOWSSYSPATH)"\"$(OemFileName) install Install-OemINF ; ; form the new oem option list ; ifstr(i) $(Duplicate) == TRUE else set NewOemOptionList = >($(NewOemOptionList), {$(OemFileName), $(OemList), $(OemTextList)}) endif set Status = STATUS_SUCCESSFUL m_finish_GetOEMOption = + FlushInf $(InfName) Return $(Status) $(NewOemOptionList) $(OptionChosen) $(OptionChosenText) $(OptDisketteSrc) ;----------------------------------------------------------------------- ; ; ROUTINE: DoDiskette ; ; DESCRIPTION: This routine prompts the OEM for the source of the OEM ; Diskette ; ; INPUTS: $0: Language ; $1: OemDiskette ; $2: OemDisketteSrc ; ; OUTPUTS: $R0: STATUS: STATUS_SUCCESSFUL | ; STATUS_USERCANCEL | ; STATUS_FAILED ; ; $R1: Diskette Src ; ;------------------------------------------------------------------------ [DoDiskette] ; ; set Status = STATUS_FAILED set OemDiskette = $($1) set OemDisketteSrc = $($2) Debug-Output $(STF_CONTEXTINFNAME)": DoDiskette called" read-syms DisketteDlg$($0) ui start "Diskette" ifstr(i) $(DLGEVENT) == "CONTINUE" set OemDisketteSrc = $(EditTextOut) ui pop 1 set Status = STATUS_SUCCESSFUL goto finish_dodiskette else-ifstr(i) $(DLGEVENT) == "BACK" ui pop 1 set Status = STATUS_USERCANCEL goto finish_dodiskette else ui pop 1 goto finish_dodiskette endif finish_dodiskette = + Return $(Status) $(OemDisketteSrc) ;----------------------------------------------------------------------- ; ; ROUTINE: DoSingleOption ; ; DESCRIPTION: This routine presents the OEM Options to the user to ; get a selectiom ; ; INPUTS: $0: OptionList ; $1: OptionTextList ; $2: OptionTypeText ; $3: (Optional) dialog text ; ; OUTPUTS: $R0: STATUS: STATUS_SUCCESSFUL | ; STATUS_USERCANCEL | ; STATUS_FAILED ; ; $R1: OptionChosen ; $R2: OptionChosenText ; ;------------------------------------------------------------------------ [DoSingleOption] set Status = STATUS_FAILED set OemOptionChosen = "" set OemOptionChosenText = "" set OemOptionList = $($0) set OemOptionTextList = $($1) set OemOptionTypeText = $($2) read-syms OemSingleOptionDlg$(!STF_LANGUAGE) ifstr(i) $($3) != "" set DlgText = $($3) endif ui start "Diskette" ifstr(i) $(DLGEVENT) == "CONTINUE" ui pop 1 ifstr(i) $(ListItemsOut) == "" set Status = STATUS_USERCANCEL else set OemOptionChosenText = $(ListItemsOut) set OemOptionChosen = *($($0), ~($(ListItemsIn), $(ListItemsOut))) set Status = STATUS_SUCCESSFUL endif goto finish_dosingleoption else-ifstr(i) $(DLGEVENT) == "BACK" ui pop 1 set Status = STATUS_USERCANCEL goto finish_dosingleoption else ui pop 1 set Status = STATUS_FAILED goto finish_dosingleoption endif finish_dosingleoption = + Return $(Status) $(OemOptionChosen) $(OemOptionChosenText) ;----------------------------------------------------------------------- ; ; ROUTINE: GetOptionsFromRegistry ; ; DESCRIPTION: Extract previously cached INF file option information ; from the Registry. ; ; ; INPUTS: $0: OptionType ; $1: OptionFileName ; ; OUTPUTS: $R0: STATUS: STATUS_SUCCESSFUL | ; STATUS_FAILED ; ; $R1: OptionList ; $R2: OptionTextList ; ; COMMENTARY: ; The Registry information was stored like this: ; ; HKEY_LOCAL_MACHINE\System\Setup\InfOptions\ ; ; The Registry information is stored like this: ; ; HKEY_LOCAL_MACHINE\Software\Microsoft\Ncpa\InfOptions\ ; ; DateLow = REG_DWORD ; ; # Keys named . ; ; NetDriver.ISA ; OptionList = REG_MULTI_SZ ; OptionTextList = REG_MULTI_SZ ; ;------------------------------------------------------------------------ [GetOptionsFromRegistry] Set InfType = $($0) Set InfFullName = $($1) Set Status = STATUS_FAILED Set OptionList = {} Set OptionTextList = {} Set KeyInf = "" Set KeyType = "" Set RegLastError = $(!REG_ERROR_SUCCESS) ; ; See if there's a bus type defined. If not,don't even try. ; Ifstr(i) $(!STF_BUSTYPE) == "" goto finish_getregoptions Endif ; ; Extract the file name from the tail of the full path\name ; Split-String $(InfFullName) "\" NameInfo QueryListSize NameInfoListSize $(NameInfo) Set InfName = *($(NameInfo),$(NameInfoListSize)) Set KeyName = "Software\Microsoft\Ncpa\InfOptions\"$(InfName) OpenRegKey $(!REG_H_LOCAL) "" $(KeyName) $(!REG_KEY_READ) KeyInf Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) goto finish_getregoptions Endif ; ; Key exists. Validate the file date/time stamp. ; Set FileDateTimeName = $(InfName) Detect DetectFileTime Set TimeLow = *($(FileDateTime),1) Ifint $(TimeLow) == 0 goto finish_getregoptions Endif GetRegValue $(KeyInf) DateLow ValueRegTimeLow Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) goto finish_getregoptions Endif Set RegTimeLow = *($(ValueRegTimeLow),4) Ifint $(TimeLow) != $(RegTimeLow) goto finish_getregoptions Endif ; ; Date time stamp matches. See if there's info ; for the given option type on the current bus ; ForListDo $(!STF_BUSTYPELIST) Set TypeKeyName = $(InfType)"."$($) OpenRegKey $(KeyInf) "" $(TypeKeyName) $(!REG_KEY_READ) KeyType ifint $(RegLastError) == $(!REG_ERROR_SUCCESS ) goto findit endif EndForListDo Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) ; ; No option data for this type. ; Not supported by this INF. ; Set Status = STATUS_SUCCESSFUL goto finish_getregoptions Endif findit = + ; ; Fetch the option list and the option text list. ; GetRegValue $(KeyType) OptionList ValueOptionList Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) goto finish_getregoptions Endif Set OptionList = *($(ValueOptionList),4) GetRegValue $(KeyType) OptionTextList ValueOptionTextList Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) goto finish_getregoptions Endif Set OptionTextList = *($(ValueOptionTextList),4) Set Status = STATUS_SUCCESSFUL finish_getregoptions =+ Ifstr(i) $(Status) != STATUS_SUCCESSFUL Set OptionList = {} Set OptionTextList = {} Endif Ifstr(i) $(KeyType) != "" CloseRegKey $(KeyType) Endif Ifstr(i) $(KeyInf) != "" CloseRegKey $(KeyInf) Endif return $(Status) $(OptionList) $(OptionTextList) ;----------------------------------------------------------------------- ; ; ROUTINE: SetOptionsIntoRegistry ; ; DESCRIPTION: Update cached INF file option information into ; the Registry. ; ; ; INPUTS: $0: OptionType ; $1: OptionFileName ; $2: OptionList ; $3: OptionTextList ; ; OUTPUTS: $R0: STATUS: STATUS_SUCCESSFUL | ; STATUS_USERCANCEL | ; STATUS_FAILED ; ; ;------------------------------------------------------------------------ [SetOptionsIntoRegistry] Debug-Output "OTHER.INF: SetOptionsIntoRegistry - Entry "$($0)", "$($1)", "$($2)", "$($3) Set OptionType = $($0) Set InfFullName = $($1) Set OptionList = $($2) Set OptionTextList = $($3) Set MaskAllAccess = 33554432 Set NoTitle = 0 Set RegLastError = $(!REG_ERROR_SUCCESS) Set Status = STATUS_FAILED Set KeyInf = "" ; ; See if there's a bus type defined. If not,don't even try. ; Ifstr(i) $(!STF_BUSTYPE) == "" goto finish_setregoptions Endif ; ; Extract the file name from the tail of the full path\name ; Split-String $(InfFullName) "\" NameInfo QueryListSize NameInfoListSize $(NameInfo) Set InfName = *($(NameInfo),$(NameInfoListSize)) Set KeyInfName = "SOFTWARE\Microsoft\Ncpa\InfOptions\"$(InfName) Set KeyOptName = $(OptionType)"."$(!STF_BUSTYPE) ; ; Get the time stamp for this file; check for failure. ; Set FileDateTimeName = $(InfName) Detect DetectFileTime Set TimeLsw = *($(FileDateTime),1) Ifint $(TimeLsw) == 0 goto finish_setregoptions Endif ; ; Create or open the key for this INF. ; Set KeyInfo = {$(KeyInfName),$(NoTitle),""} OpenRegKey $(!REG_H_LOCAL) "" $(KeyInfName) $(MaskAllAccess) KeyInf ifstr(i) $(KeyInf) == "" CreateRegKey $(!REG_H_LOCAL) $(KeyInfo) "" $(MaskAllAccess) "" KeyInf Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) Debug-Output "OTHER.INF: SetOptionsIntoRegistry - Reg Error"$(KeyInfo) goto finish_setregoptions Endif Endif ; ; Create or open the key for this type ; Set KeyInfo = {$(KeyOptName),$(NoTitle),""} OpenRegKey $(KeyInf) "" $(KeyOptName) $(MaskAllAccess) KeyType ifstr(i) $(KeyType) == "" CreateRegKey $(KeyInf) $(KeyInfo) "" $(MaskAllAccess) "" KeyType Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) Debug-Output "OTHER.INF: SetOptionsIntoRegistry - Reg Error"$(KeyInfo) goto finish_setregoptions Endif Endif ; ; Write the values. First the time stamp (under the INF key), ; then the lists (under the type.bustype sub-key). ; Set ValueInfo = {DateLow, $(NoTitle), $(!REG_VT_DWORD), $(TimeLsw)} SetRegValue $(KeyInf) $(ValueInfo) Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) goto finish_setregoptions Endif Set ValueInfo = {OptionList, $(NoTitle), $(!REG_VT_MULTI_SZ), $(OptionList)} SetRegValue $(KeyType) $(ValueInfo) Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) goto finish_setregoptions Endif Set ValueInfo = {OptionTextList, $(NoTitle), $(!REG_VT_MULTI_SZ), $(OptionTextList)} SetRegValue $(KeyType) $(ValueInfo) Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS) goto finish_setregoptions Endif Set Status = STATUS_SUCCESSFUL finish_setregoptions =+ Ifstr(i) $(KeyType) != "" CloseRegKey $(KeyType) ; ; If the update operation failed, nuke the type.bustype key and values ; Ifstr(i) $(Status) != STATUS_SUCCESSFUL DeleteRegTree $(KeyOptName) Endif Endif Ifstr(i) $(KeyInf) != "" CloseRegKey $(KeyInf) Endif Debug-Output "OTHER.INF: SetOptionsIntoRegistry - Exit "$(Status) return $(Status) [Install-SeeIfFileIsPresent] LibraryProcedure STATUS,$(!LIBHANDLE), CheckFileExistance $(FileToCheck) exit [Install-OemINF] LibraryProcedure STATUS,$(!NCPA_HANDLE), CopySingleFile $(!STF_HWND) $(OemSrc) $(OemDst) exit