windows-nt/Source/XPSP1/NT/base/ntsetup/inf/beta/utility.inf
2020-09-26 16:20:57 +08:00

4791 lines
152 KiB
INI

;*************************************************************************
;
; UTILITY.INF
;
; Network Installation utility functions. Each major piece of
; functionality is coded as a [Section], and is invoked by name from
; the outer level INF. See TEMPLATE.INF for example usage.
;
; CHANGES:
; DavidHov 6/11/92 Added Service"Linkage" key return
; value to [AddSoftwareComponent]
;
; DavidHov 8/24/92 Add WinSock support routines for
; transports
;
;
;
;*************************************************************************
;
;--------------------------------------------------------------------------
; Header to be used at the front of all externally available INF sections.
;--------------------------------------------------------------------------
;
;*************************************************************************
;
; SECTION: sectionname
;
; PURPOSE: <describe purpose of section>
;
; ARGUMENTS: $0
; $1
;
; RETURNS: $R0
; $R1
;
; REFERENCES: <list of global or parent variables referenced>
;
; MODIFIES: <list of global or parent variables modified>
;
;
;*************************************************************************
;*************************************************************************
; end of section sectionname
;*************************************************************************
;
; Initialize general constants
;
[InitBaseVars]
KeyNull = ""
MAXIMUM_ALLOWED = 33554432
KeyInfo = {}
RegistryErrorIndex = NO_ERROR
NoTitle = 0
CurrentControlSet = "SYSTEM\CurrentControlSet"
ServicesBaseName = $(CurrentControlSet)"\Services"
NetworkCardKeyName = $(!NTN_SoftwareBase)"\Microsoft\Windows NT\CurrentVersion\NetworkCards"
!RegLastError = NO_ERROR
[RegistryErrorSetup]
RegistryErrorIndex = ^(RegistryErrors$(!STF_LANGUAGE),1)
RegistryErrorList = ^(RegistryErrors$(!STF_LANGUAGE),2)
;*************************************************************************
;
; SECTION: RegistryErrorString
;
; PURPOSE: Translate a numeric registry error code into a string
;
; ARGUMENTS: $0 Registry error code
;
; RETURNS: $R0 String containing displayable text in language
;
; REFERENCES: !STF_LANGUAGE -- global "user's language" variable;
; see [RegistryErrorSetup]
;
; MODIFIES: Nothing
;
;
;*************************************************************************
[RegistryErrorString]
read-syms RegistryErrorSetup
read-syms RegistryErrorUnknown$(!STF_LANGUAGE)
set RE_String = *($(RegistryErrorList),~($(RegistryErrorIndex),$($0)))
Ifstr $(RE_String) == ""
set RE_String = $(Error_Bogus)
endif
return $(RE_String)
;*************************************************************************
; end of section RegistryErrorString
;*************************************************************************
;*************************************************************************
;
; SECTION: BaseServiceKey
;
; PURPOSE: Return an open key handle to the top of the services tree
;
; ARGUMENTS: none
;
; RETURNS: $R0 Registry error code
; $R1 Registry key variable for SERVICES0
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[BaseServiceKey]
read-syms InitBaseVars
set BS_KeyServices = ""
OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName) $(MAXIMUM_ALLOWED) BS_KeyServices
Ifstr $(BS_KeyServices) == $(KeyNull)
Debug-Output "UTILITY.INF: could not open Services base key"
set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
endif
B_S_Return = +
return $(RegistryErrorIndex), $(BS_KeyServices)
;*************************************************************************
;
; SECTION: ReduceInfPath
;
; PURPOSE: Process the path\name string to an INF file. If
; its path points to STF_WINDOWSSYSPATH, remove the path prefix.
;
; ARGUMENTS: $0 Path\name to INF file
;
; RETURNS: $R0 Resulting string
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[ReduceInfPath]
Set RIP_Result = $($0)
Split-String $(RIP_Result) "\" InList
Set BasePath = $(!STF_WINDOWSSYSPATH)"\"
Split-String $(BasePath) "\" BaseList
;
; See how many of the path elements match
;
Set Indx = 0
Set Matched = 0
QueryListSize InListSize, $(InList)
ForListDo $(BaseList)
Set-add Indx = $(Indx),1
Ifint $(Indx) <= $(InListSize)
Set Instr = *($(InList),$(Indx))
Ifstr(i) $($) == $(Instr)
Set-add Matched = $(Matched),1
Endif
Endif
EndForListDo
;
; If all the path elements of the input path matched
; those of STF_WINDOWSSYSPATH, strip them off of the result.
;
Ifint $(Indx) == $(Matched)
Set RIP_Result = ""
Set Indx2 = 0
ForListDo $(InList)
Set-add Indx2 = $(Indx2),1
Ifint $(Indx2) > $(Indx)
Set RIP_Result = $(RIP_Result)$($)
Endif
EndForListDo
Endif
Return $(RIP_Result)
;*************************************************************************
;
; SECTION: InstallSoftwareProduct
;
; PURPOSE: Add a new component into the Registry
;
; ARGUMENTS: $0 name of Manufacturer
; $1 name of Product
; $2 full INF path and name
;
; RETURNS: $R0 error code or zero if no error
; $R1 Registry key variable for
; SOFTWARE\Manufacturer\Product\Version key
; $R2 Registry key variable for
; ...\NetRules
;
; REFERENCES: none
;
; MODIFIES: none
;
;*************************************************************************
[InstallSoftwareProduct]
read-syms InitBaseVars
set IS_MfgName = $($0)
set IS_ProdName = $($1)
set IS_Infname = $($2)
set IS_KeySoftware = ""
set IS_KeyMfg = ""
set IS_KeyProduct = ""
set IS_KeyVersion = ""
set IS_KeyNetRules = ""
set IS_MfgCreated = 1
set IS_ProductCreated = 1
;
; Validate the arguments passed in
;
set RegistryErrorIndex = INVALID_DATA_PASSED
Ifstr(i) $(IS_MfgName) == ""
goto I_S_Return
endif
Ifstr(i) $(IS_ProdName) == ""
goto I_S_Return
endif
set RegistryErrorIndex = NO_ERROR
;
; Open the HKEY_LOCAL_MACHINE\SOFTWARE key
;
OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_SoftwareBase) $(MAXIMUM_ALLOWED) IS_KeySoftware
Ifstr $(IS_KeySoftware) == $(KeyNull)
set RegistryErrorIndex = UNABLE_ACCESS_SOFTWARE_REG
goto I_S_Return
endif
;
; Create the Manufacturer's key if necessary
;
CreateRegKey $(IS_KeySoftware) {$(IS_MfgName),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" IS_KeyMfg
Ifstr $(IS_KeyMfg) == $(KeyNull)
set IS_MfgCreated = 0
OpenRegKey $(IS_KeySoftware) "" $(IS_MfgName) $(MAXIMUM_ALLOWED) IS_KeyMfg
Ifstr $(IS_KeyMfg) == $(KeyNull)
set RegistryErrorIndex = UNABLE_OPEN_MICROSOFT_KEY
goto I_S_Return
endif
endif
;
; Create the Software Product key if necessary
;
CreateRegKey $(IS_KeyMfg) {$(IS_ProdName),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" IS_KeyProduct
Ifstr $(IS_KeyProduct) == $(KeyNull)
set IS_ProductCreated = 0
OpenRegKey $(IS_KeyMfg) "" $(IS_ProdName) $(MAXIMUM_ALLOWED) IS_KeyProduct
Ifstr $(IS_KeyProduct) == $(KeyNull)
set RegistryErrorIndex = UNABLE_CREATE_PRODUCT_KEY
goto I_S_Return
endif
endif
;
; Create the software product version key.
;
CreateRegKey $(IS_KeyProduct) {"CurrentVersion",$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" IS_KeyVersion
Ifstr $(IS_KeyVersion) == $(KeyNull)
OpenRegKey $(IS_KeyProduct) "" "CurrentVersion" $(MAXIMUM_ALLOWED) IS_KeyVersion
Ifstr $(IS_KeyVersion) == $(KeyNull)
set RegistryErrorIndex = UNABLE_CREATE_PRODUCT_VERSION
goto I_S_Return
endif
endif
set RegistryErrorIndex = NO_ERROR
;
; Create the NetRules key
;
CreateRegKey $(IS_KeyVersion) {NetRules,$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" IS_KeyNetRules
Ifstr $(IS_KeyNetRules) == $(KeyNull)
OpenRegKey $(IS_KeyVersion) "" NetRules $(MAXIMUM_ALLOWED) IS_KeyNetRules
Ifstr $(IS_KeyNetRules) == $(KeyNull)
set RegistryErrorIndex = UNABLE_CREATE_NETRULES_KEY
goto I_S_Return
endif
endif
;
; Set the "Infname" value if non-null; reduce it if it's in %SystemRoot%
;
Ifstr $(IS_Infname) != ""
Shell "", ReduceInfPath, $(IS_Infname)
SetRegValue $(IS_KeyNetRules) {InfName,$(NoTitle),$(!REG_VT_SZ),$($R0)}
endif
;
; Exit, leaving $(IS_KeyVersion) and $(IS_KeyNetRules) open for the caller...
;
I_S_Return = +
Ifstr $(IS_KeyProduct) != ""
Ifint $(IS_ProductCreated) == 1
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Debug-Output "UTILITY.INF: DeleteRegTree Product Key"
;DeleteRegTree $(IS_KeyProduct) ""
set IS_KeyProduct = ""
endif
endif
Ifstr $(IS_KeyProduct) != ""
CloseRegKey $(IS_KeyProduct)
endif
endif
Ifstr $(IS_KeyMfg) != ""
Ifint $(IS_MfgCreated) == 1
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
;DeleteRegTree $(IS_KeyMfg) ""
Debug-Output "UTILITY.INF: DeleteRegTree Manufacturer Key"
set IS_KeyMfg = ""
endif
endif
Ifstr $(IS_KeyMfg) != ""
CloseRegKey $(IS_KeyMfg)
endif
endif
Ifstr $(IS_KeySoftware) != ""
CloseRegKey $(IS_KeySoftware)
endif
return $(RegistryErrorIndex), $(IS_KeyVersion), $(IS_KeyNetRules)
;*************************************************************************
; end of section InstallSoftwareProduct
;*************************************************************************
;*************************************************************************
;
; SECTION: AddValueList
;
; PURPOSE: Given a nested list of value items, add each to the given
; key. Key is left open.
;
; ARGUMENTS: $0 Registry key handle
; $1 List of value items; for example:
; { {ValueName1,0,$(!REG_VT_SZ),$(ValueData1)}, +
; {ValueName2,0,$(!REG_VT_SZ),$(ValueData2)} }
;
; RETURNS: $R0 Registry error code.
;
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[AddValueList]
set RegistryErrorIndex = NO_ERROR
ForListDo $($1)
SetRegValue $($0) $($)
ifint $(RegLastError) != 0
Debug-Output "UTILITY.INF: Value write fail data: "$($)
Debug-Output "UTILITY.INF: Value write fail key: "$($0)
return UNABLE_WRITE_REGISTRY
endif
EndForListDo
return $(RegistryErrorIndex)
;*************************************************************************
; end of section AddValueList
;*************************************************************************
;*************************************************************************
;
; SECTION: DeleteSoftwareProduct
;
; PURPOSE: Delete the given product from the Registry entirely
;
; ARGUMENTS: $0 Product Key Handle
;
; RETURNS: $R0 Registry error code
; $R1
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[DeleteSoftwareProduct]
set RegistryErrorIndex = NO_ERROR
Debug-Output "UTILITY.INF: DeleteRegTree Software Product"
DeleteRegTree $($0) ""
return $(RegistryErrorIndex)
;*************************************************************************
; end of section DeleteSoftwareProduct
;*************************************************************************
;*************************************************************************
;
; SECTION: VerExistedDlg
;
; PURPOSE: Popup a dialog and tell the user that the same ver of
; the software already exists in the registery tree.
; Ask the user whether he want to continue or not
;
; ARGUMENTS: $0 Product Name
; $0 Product version
;
; RETURNS: $R0 Registry error code
; $R1 either "continue" or "exit"
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[VerExistedDlg]
set RegistryErrorIndex = NO_ERROR
set-subst LF = "\n"
read-syms VerExisted$(!STF_LANGUAGE)
set DlgText = $($0)+
$(ver)+
$($1)+
$(Text)
Shell "Subroutn.Inf" SetupMessage $(!STF_LANGUAGE) "NONFATAL" $(DlgText)
ifint $($ShellCode) != $(!SHELL_CODE_OK)
set RegistryErrorIndex = ERROR
endif
return $(RegistryErrorIndex), $($R1)
;*************************************************************************
; end of section VerExistedDialog
;*************************************************************************
;*************************************************************************
;
; SECTION: CardExistedDlg
;
; PURPOSE: Popup a dialog and tell the user that the network card
; is lready installed and ask them whether theyr want to
; continue.
;
; ARGUMENTS: NONE
;
; RETURNS: $R0 Registry error code
; $R1 either "continue" or "exit"
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[CardExistedDlg]
set RegistryErrorIndex = NO_ERROR
set ButtonReturn = "OK"
ifstr(i) $(!STF_GUI_UNATTENDED) != "YES"
set-subst LF = "\n"
read-syms CardExisted$(!STF_LANGUAGE)
set DlgText = $(Text)
Shell "Subroutn.Inf" SetupMessage $(!STF_LANGUAGE) "WARNING" $(DlgText)
ifint $($ShellCode) != $(!SHELL_CODE_OK)
set RegistryErrorIndex = ERROR
endif
set ButtonReturn = $($R1)
endif
return $(RegistryErrorIndex), $(ButtonReturn)
;*************************************************************************
; end of section CardExistedDialog
;*************************************************************************
;*************************************************************************
;
; SECTION: CreateService
;
; PURPOSE: Create the Services area entry for a new product
;
; ARGUMENTS: $0 Name of the service (no imbedded blanks, etc.)
; $1 Display Name of service
; $2 image path string
; $3 type of service:
; system
; adapter
; driver
; transport
; service
; serviceshare
; $4 group, if any or ""
; $5 dependency **list**, if any or {}
; $6 ObjectName, usually ""
; $7 EventMessageFile [Optional]
; $8 TypeSupported [Optional]
; $9 EventLog Location[Optional]
; $10 Error control value [Optional]
; $11 Event Source name [Optional]
; $12 ParameterMessageFile [Optional]
; $13 Services area key [Optional]
;
;
; RETURNS: $R0 Registry error code
; $R1 Service area key handle
; $R2 Parameters key handle
; $R3 Linkage key handle
;
; REFERENCES: <list of global or parent variables referenced>
;
; MODIFIES: <list of global or parent variables modified>
;
; NOTES: If $(!NTN_ScUseRegistry) is != "", then direct Registry
; access is used in lieu of the Service Controller API
; wrapper. The Registry is automatically used if the
; service type is "adapter".
;
; The image path format varies for drivers and other
; services. For drivers of any kind, it's an NT name space
; name. For services, it's a REG_EXPAND_SZ format Win32 name.
;
;
; CHANGES: DavidHov: 6/11/92. "Groups" is REG_SZ, not REG_EXPAND_SZ
; Adapters are type=4, start=4.
; Only services get "ObjectName" value
;
;
;
;
;*************************************************************************
[CreateService]
read-syms InitBaseVars
set CS_NameOfService = $($0)
set CS_DisplayName = $($1)
set CS_ImagePath = $($2)
set CS_TypeOfService = $($3)
set CS_Group = $($4)
set CS_Dependencies = $($5)
set CS_ObjectName = $($6)
set CS_EventFile = $($7)
set CS_TypeSupported = $($8)
ifstr(i) $(CS_TypeSupported) == ""
set CS_TypeSupported = 7
endif
; Set event log location
set CS_EventLogLocation = $($9)
ifstr(i) $(CS_EventLogLocation) == ""
set CS_EventLogLocation = "System"
endif
set CS_ErrorControl = $($10)
ifstr(i) $(CS_ErrorControl) == ""
set CS_ErrorControl = 1
endif
set CS_EventSourceName = $($11)
ifstr(i) $(CS_EventSourceName) == ""
set CS_EventSourceName = $(CS_NameOfService)
endif
set CS_ParameterMessageFile = $($12)
set CS_KeyServices = $($13)
set CS_KeyTempSvc = ""
set CS_KeySvcManager = ""
set CS_KeyParameters = ""
set CS_KeyLinkage = ""
set CS_UseRegistry = $(!NTN_ScUseRegistry)
Debug-Output "UTILITY.INF: [CreateService] entered for "$(CS_NameOfService)
Ifstr(i) $(CS_UseRegistry) != "YES"
Ifstr(i) $(CS_UseRegistry) != "NO"
Set CS_UseRegistry = "NO"
Endif
Endif
Ifstr(i) $(CS_Dependencies) == ""
Set CS_Dependencies = {}
Endif
;
; Get the base key handle for the services area if not passed in
;
Ifstr(i) $(CS_KeyServices) == ""
Shell "", BaseServiceKey
set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
goto C_S_Return
endif
set CS_KeyServices = $($R1)
set CS_KeyServicesOpened = $($R1)
Endif
ifstr(i) $(CS_TypeOfService) == "system"
set TypeValue = 2
set StartValue = 3
else-ifstr(i) $(CS_TypeOfService) == "systemstart"
set TypeValue = 2
set StartValue = 1
else-ifstr(i) $(CS_TypeOfService) == "systemauto"
set TypeValue = 2
set StartValue = 2
else-ifstr(i) $(CS_TypeOfService) == "adapter"
set TypeValue = 4
set StartValue = 3
Set CS_UseRegistry = "YES"
else-ifstr(i) $(CS_TypeOfService) == "kernelauto"
set TypeValue = 1
set StartValue = 1
else-ifstr(i) $(CS_TypeOfService) == "autoserviceshare"
set TypeValue = 32
set StartValue = 2
else-ifstr(i) $(CS_TypeOfService) == "transport"
set TypeValue = 2
set StartValue = 3
else-ifstr(i) $(CS_TypeOfService) == "kernel"
set TypeValue = 1
set StartValue = 3
else-ifstr(i) $(CS_TypeOfService) == "kernelautostart"
set TypeValue = 1
set StartValue = 2
else-ifstr(i) $(CS_TypeOfService) == "kerneldisable"
set TypeValue = 1
set StartValue = 4
else-ifstr(i) $(CS_TypeOfService) == "service"
set TypeValue = 16
set StartValue = 3
else-ifstr(i) $(CS_TypeOfService) == "serviceauto"
set TypeValue = 16
set StartValue = 2
else-ifstr(i) $(CS_TypeOfService) == "servicedisable"
set TypeValue = 16
set StartValue = 4
else-ifstr(i) $(CS_TypeOfService) == "serviceshare"
set TypeValue = 32
set StartValue = 3
else
Set CS_UseRegistry = "YES"
Debug-Output "UTILITY.INF: [CreateService] Unrecognized TypeOfService parameter"
set TypeValue = 4
set StartValue = 3
endif
Ifint $(TypeValue) > 4
Ifstr(i) $(CS_ObjectName) == ""
set CS_ObjectName = "LocalSystem"
Endif
Endif
OpenRegKey $(CS_KeyServices) "" $(CS_NameOfService) $(MAXIMUM_ALLOWED) +
CS_KeyTempSvc
ifstr $(CS_KeyTempSvc) != $(KeyNull)
; wait a minute.. somebody already installed the driver
; go to open other keys
; check whether it is marked for deletion
GetRegValue $(CS_KeyTempSvc),"DeleteFlag", DeleteFlagInfo
set DeleteFlag = *($(DeleteFlagInfo), 4)
ifint $(DeleteFlag) == 1
Set RegistryErrorIndex = REBOOT_MACHINE_BEFORE_ADD_ADAPTER
goto C_S_Return
endif
;
; Device section of the registry already exist.
; Let the code below to handle it. It will popup a dialog
; and returns error code.
;
endif
ifstr(i) $(CS_UseRegistry) == "YES"
;
Debug-Output "UTILITY.INF: [CreateService] "$(CS_NameOfService)" using Registry"
;
; Create our own service
;
ifstr(i) $(CS_KeyTempSvc) == $(KeyNull)
CreateRegKey $(CS_KeyServices) {$(CS_NameOfService),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" CS_KeyTempSvc
else
Debug-Output "UTILITY.INF: service key "$(CS_NameOfService)" already existed"
Set RegistryErrorIndex = UNABLE_CREATE_CONFIGURE_SERVICE
CloseRegKey $(CS_KeyTempSvc)
Goto C_S_Return
endif
Ifstr(i) $(CS_KeyTempSvc) == $(KeyNull)
Debug-Output "UTILITY.INF: could not create service key "$(CS_NameOfService)
Set RegistryErrorIndex = UNABLE_CREATE_CONFIGURE_SERVICE
CloseRegKey $(CS_KeyTempSvc)
Goto C_S_Return
else
set NewValueList = {+
{Type,$(NoTitle),$(!REG_VT_DWORD),$(TypeValue)},+
{Start,$(NoTitle),$(!REG_VT_DWORD),$(StartValue)},+
{ErrorControl,$(NoTitle),$(!REG_VT_DWORD),$(CS_ErrorControl)}+
}
Ifint $(TypeValue) > 4
Set NewValueList = >($(NewValueList), +
{ObjectName,$(NoTitle),$(!REG_VT_SZ),$(CS_ObjectName)})
Endif
ifstr(i) $(CS_Group) != ""
set NewValueList = >($(NewValueList), +
{Group,$(NoTitle),$(!REG_VT_SZ),$(CS_Group)})
endif
ifstr(i) $(CS_ImagePath) != ""
set NewValueList = >($(NewValueList), +
{ImagePath,$(NoTitle),$(!REG_VT_EXPAND_SZ),$(CS_ImagePath)})
endif
ifstr(i) $(CS_Dependencies) != ""
ifstr(i) $(CS_Dependencies) != {}
set NewValueList = >($(NewValueList), +
{Dependencies,$(NoTitle),$(!REG_VT_MULTI_SZ),$(CS_Dependencies)})
endif
endif
Shell "", AddValueList, $(CS_KeyTempSvc), $(NewValueList)
set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Debug-Output "Registry error: Add value list"
endif
endif
else
Debug-Output "UTILITY.INF: [CreateService] "$(CS_NameOfService)" using CreateService() wrapper"
;
; Call NCPA to create service key.
;
Set FLibraryErrCtl = 1
LibraryProcedure CS_CreateResult $(!NCPA_HANDLE), CPlSetup, $(!STF_HWND), CREATESVC,+
$(CS_NameOfService), $(CS_DisplayName), $(StartValue), $(TypeValue), $(CS_ErrorControl),+
$(CS_ImagePath), $(CS_Group),$(CS_Dependencies),$(CS_ObjectName)
Set FLibraryErrCtl = 0
;
; Check the return code
;
Set CS_CreateError = *($(CS_CreateResult),1)
Ifint $(CS_CreateError) != 0
Debug-Output "UTILITY.INF: CreateService wrapper failed, error: "$(CS_CreateResult)
;
; See if the error is special
;
Ifint $(CS_CreateError) == 1073
Set RegistryErrorIndex = SERVICE_ALREADY_EXISTS
Else-ifint $(CS_CreateError) == 1072
Set RegistryErrorIndex = SERVICE_MARKED_FOR_DELETE
Else
Set RegistryErrorIndex = UNABLE_CREATE_CONFIGURE_SERVICE
Endif
CloseRegKey $(CS_KeyTempSvc)
Goto C_S_Return
Endif
;
; Now open the key which should have been created by the service controller
;
OpenRegKey $(CS_KeyServices) "" $(CS_NameOfService) $(MAXIMUM_ALLOWED) CS_KeyTempSvc
ifstr $(CS_KeyTempSvc) == $(KeyNull)
Debug-Output "UTILITY.INF: unable to open new service key"
set RegistryErrorIndex = UNABLE_CREATE_CONFIGURE_SERVICE
CloseRegKey $(CS_KeyTempSvc)
Goto C_S_Return
endif
endif
;
; Open or Create the Parameters subkey
;
CreateRegKey $(CS_KeyTempSvc) {"Parameters",$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" CS_KeyParameters
ifstr $(CS_KeyParameters) == $(KeyNull)
OpenRegKey $(CS_KeyTempSvc) "" "Parameters" $(MAXIMUM_ALLOWED) +
CS_KeyParameters
endif
Ifstr $(CS_KeyParameters) == $(KeyNull)
set RegistryErrorIndex = UNABLE_CREATE_SERVICE_SUBKEY
CloseRegKey $(CS_KeyTempSvc)
goto C_S_Return
endif
set RegistryErrorIndex = NO_ERROR
;
; Open or Create the Linkage subkey
;
CreateRegKey $(CS_KeyTempSvc) {"Linkage",$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" CS_KeyLinkage
Ifstr $(CS_KeyLinkage) == $(KeyNull)
OpenRegKey $(CS_KeyTempSvc) "" "Linkage" $(MAXIMUM_ALLOWED) CS_KeyLinkage
Endif
Ifstr $(CS_KeyLinkage) == $(KeyNull)
set RegistryErrorIndex = UNABLE_CREATE_SERVICE_SUBKEY
CloseRegKey $(CS_KeyTempSvc)
goto C_S_Return
endif
;
; Open or Create the Linkage\Disabled subkey
;
CreateRegKey $(CS_KeyLinkage) {"Disabled",$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" CS_KeyDisabled
Ifstr $(CS_KeyDisabled) == $(KeyNull)
OpenRegKey $(CS_KeyLinkage) "" "Disabled" $(MAXIMUM_ALLOWED) CS_KeyDisabled
Endif
Ifstr $(CS_KeyDisabled) == $(KeyNull)
set RegistryErrorIndex = UNABLE_CREATE_SERVICE_SUBKEY
CloseRegKey $(CS_KeyTempSvc)
CloseRegKey $(CS_KeyLinkage)
goto C_S_Return
endif
CloseRegKey $(CS_KeyDisabled)
;
; Create Eventlog information
;
ifstr(i) $(CS_EventFile) != ""
OpenRegKey $(!REG_H_LOCAL) "" "SYSTEM\CurrentControlSet\Services\EventLog\"$(CS_EventLogLocation) $(MAXIMUM_ALLOWED) CS_KeyEventLog
Ifstr $(CS_KeyEventLog) == $(KeyNull)
; cannot open eventlog
debug-output "Cannot open eventlog key"
set RegistryErrorIndex = UNABLE_OPEN_EVENTLOG_SUBKEY
CloseRegKey $(CS_KeyTempSvc)
CloseRegKey $(CS_KeyParameters)
CloseRegKey $(CS_KeyLinkage)
goto C_S_Return
else
; set up the service key
CreateRegKey $(CS_KeyEventLog) {$(CS_EventSourceName),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" CS_KeyService
ifstr(i) $(CS_KeyService) == ""
OpenRegKey $(CS_KeyEventLog) "" $(CS_EventSourceName) $(MAXIMUM_ALLOWED) CS_KeyService
endif
Ifstr $(CS_KeyService) != $(KeyNull)
; create the EventMessageFile and TypeSupported fields
SetRegValue $(CS_KeyService) {EventMessageFile,$(NoTitle),$(!REG_VT_EXPAND_SZ),$(CS_EventFile)}
SetRegValue $(CS_KeyService) {TypesSupported,$(NoTitle),$(!REG_VT_DWORD),$(CS_TypeSupported)}
ifstr(i) $(CS_ParameterMessageFile) != ""
SetRegValue $(CS_KeyService) {ParameterMessageFile,$(NoTitle),$(!REG_VT_EXPAND_SZ),$(CS_ParameterMessageFile)}
endif
CloseRegKey $(CS_KeyService)
endif
Endif
endif
;
; Return the keys and error codes
;
C_S_Return = +
; Only close the services key if it was opened in this routine.
Ifstr $(CS_KeyServicesOpened) != $(KeyNull)
CloseRegKey $(CS_KeyServices)
endif
return $(RegistryErrorIndex), $(CS_KeyTempSvc), $(CS_KeyParameters), $(CS_KeyLinkage)
;*************************************************************************
; end of section CreateService
;*************************************************************************
;*************************************************************************
;
; SECTION: AssignAdapterNumber
;
; PURPOSE: Enumerate the netcards, and return a numeric value which
; is unused.
;
; ARGUMENTS: $0 - Optional - NetworkCardKey - for performance
; $1 - Optional - AdapterNumber to start with - for performance
;
; RETURNS: $R0 Regisitry Error Code
; $R1 Numeric value to be use for new adapter;
; (1,2,3..)
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;
;*************************************************************************
[AssignAdapterNumber]
read-syms InitBaseVars
set AA_KeyNetcards = $($0)
ifstr $($1) == ""
set AA_AdapterNumber = 1
else
set AA_AdapterNumber = $($1)
endif
set AA_KeyNetcards = ""
set AA_KeyTemp = ""
set RegistryErrorIndex = NO_ERROR
Debug-Output "[AssignAdapterNumber] starting with "$(AA_AdapterNumber)
Ifstr(i) $(AA_KeyNetcards) == $(KeyNull)
OpenRegKey $(!REG_H_LOCAL) "" $(NetworkCardKeyName) $(MAXIMUM_ALLOWED) AA_KeyNetcards
set AA_KeyNetcardsOpened = $(AA_KeyNetcards)
endif
Ifstr $(AA_KeyNetcards) == $(KeyNull)
set RegistryErrorIndex = UNABLE_OPEN_NETWORKCARD_SECTION
goto A_A_Return
endif
;
; Loop to find an unused adapter number
;
A_A_TryAgain = +
ifint $(AA_AdapterNumber) < 10
set Tmp_Zero_AdapterNumber = "0"$(AA_AdapterNumber)
OpenRegKey $(AA_KeyNetcards) "" $(Tmp_Zero_AdapterNumber) $(MAXIMUM_ALLOWED) AA_Zero_KeyTemp
ifstr(i) $(AA_Zero_KeyTemp) != ""
CloseRegKey $(AA_Zero_KeyTemp)
goto Next_Number
endif
endif
set Tmp_AA_AdapterNumber = $(AA_AdapterNumber)
OpenRegKey $(AA_KeyNetcards) "" $(Tmp_AA_AdapterNumber) $(MAXIMUM_ALLOWED) AA_KeyTemp
Ifstr $(AA_KeyTemp) == $(KeyNull)
Goto A_A_Found
Endif
CloseRegKey $(AA_KeyTemp)
Next_Number = +
Set AA_KeyTemp = $(KeyNull)
Set-add AA_AdapterNumber = $(AA_AdapterNumber),1
Goto A_A_TryAgain
A_A_Found =+
CloseRegKey $(AA_KeyNetcardsOpened)
A_A_Return = +
return $(RegistryErrorIndex) $(AA_AdapterNumber)
;*************************************************************************
; end of section AssignAdapterNumber
;*************************************************************************
;*************************************************************************
;
; SECTION: InstallNetcard
;
; PURPOSE: Create a new HARDWARE\Netcard\(n) area in the Registry
;
; ARGUMENTS: $0 Name if the INF file
; $1 Optional - Netcards Area key
; $2 Optional - net card number to start with
;
; RETURNS: $R0 Registry error code
; $R1 Netcard\(n) key handle
; $R2 numeric index of netcard (n)
; $R3 NetRules key handle
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;
;*************************************************************************
[InstallNetcard]
read-syms InitBaseVars
set IN_Infname = $($0)
set IN_KeyNetcardsArea = $($1)
set IN_CardNumber = $($2)
set IN_KeyNetcard = ""
set IN_KeyNetRules = ""
;
; Assign a number to this network card and create its key
;
Shell "" AssignAdapterNumber $(IN_KeyNetcardsArea) $(IN_CardNumber)
set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
goto I_N_Return
endif
set IN_CardNumber = $($R1)
CreateRegKey $(!REG_H_LOCAL) {$(NetworkCardKeyName)\$(IN_CardNumber),$(NoTitle),GenericClass} +
"" $(MAXIMUM_ALLOWED) "" IN_KeyNetcard
Ifstr $(IN_KeyNetcard) == $(KeyNull)
set RegistryErrorIndex = UNABLE_CREATE_NETCARD_CONFIGURATION
goto I_N_Return
endif
;
; Create the NetRules key
;
CreateRegKey $(IN_KeyNetcard) {NetRules,$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" IN_KeyNetRules
Ifstr $(IN_KeyNetRules) == $(KeyNull)
set RegistryErrorIndex = UNABLE_CREATE_NETRULES_KEY
goto I_N_Return
endif
;
; Set the "Infname" value if non-null; reduce it if it's in %SystemRoot%
;
Ifstr $(IN_Infname) != ""
Shell "", ReduceInfPath, $(IN_Infname)
SetRegValue $(IN_KeyNetRules) {InfName,$(NoTitle),$(!REG_VT_SZ),$($R0)}
endif
set RegistryErrorIndex = NO_ERROR
I_N_Return = +
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Debug-Output "UTILITY.INF: [InstallNetcard]: "$(RegistryErrorIndex)
Ifstr $(IN_KeyNetRules) != $(KeyNull)
CloseRegKey $(IN_KeyNetRules)
set IN_KeyNetrules = ''
endif
;BUGBUG DeleteRegTree $(IN_KeyNetcard)
set IN_KeyNetcard = ""
endif
return $(RegistryErrorIndex), $(IN_KeyNetcard), $(IN_CardNumber), $(IN_KeyNetRules)
;*************************************************************************
; end of section InstallNetcard
;*************************************************************************
;*************************************************************************
;
; SECTION: LinkToService
;
; PURPOSE: Link a software or hardware component to its
; corresponding service area entry
;
; ARGUMENTS: $0 Registry key handle to primary component key
; $1 Name of service (no imbedded blanks, etc.)
;
; RETURNS: $R0 Registry error code
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;
;*************************************************************************
[LinkToService]
read-syms InitBaseVars
SetRegValue $($0) {ServiceName,$(NoTitle),$(!REG_VT_SZ),$($1)}
L_S_Return = +
return $(RegistryErrorIndex)
;*************************************************************************
; end of section LinkToService
;*************************************************************************
;*************************************************************************
;
; SECTION: IncrementRefCount
;
; PURPOSE: Increment the reference counter in the registry
;
; ARGUMENTS: $0 Registry key name
;
; RETURNS: $R0 Registry error code
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;
;*************************************************************************
[IncrementRefCount]
read-syms InitBaseVars
OpenRegKey $(!REG_H_LOCAL) "" $($0) $(MAXIMUM_ALLOWED) SoftwareKey
Ifstr $(SoftwareKey) == $(KeyNull)
Debug-Output "UTILITY.INF: could not open Software base key"
set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
goto IncrementRefCount_Return
endif
GetRegValue $(SoftwareKey),"RefCount", RefCountInfo
set RefCount = *($(RefCountInfo), 4)
Set-add RefCount = $(RefCount),1
SetRegValue $(SoftwareKey) {RefCount,$(NoTitle),$(!REG_VT_DWORD),$(RefCount)}
CloseRegKey $(SoftwareKey)
IncrementRefCount_Return = +
return $(RegistryErrorIndex)
;*************************************************************************
; end of section IncrementRefCount
;*************************************************************************
;*************************************************************************
;
; SECTION: DecrementRefCount
;
; PURPOSE: Decrement the reference counter in the registry
;
; ARGUMENTS: $0 Registry key name
;
; RETURNS: $R0 Registry error code
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;
;*************************************************************************
[DecrementRefCount]
read-syms InitBaseVars
OpenRegKey $(!REG_H_LOCAL) "" $($0) $(MAXIMUM_ALLOWED) SoftwareKey
Ifstr $(SoftwareKey) == $(KeyNull)
Debug-Output "UTILITY.INF: could not open Software base key"
set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
goto DecrementRefCount_Return
endif
GetRegValue $(SoftwareKey),"RefCount", RefCountInfo
set RefCount = *($(RefCountInfo), 4)
ifint $(RefCount) == 0
; something wrong
goto DecrementRefCount_Return
endif
Set-sub RefCount = $(RefCount),1
SetRegValue $(SoftwareKey) {RefCount,$(NoTitle),$(!REG_VT_DWORD),$(RefCount)}
CloseRegKey $(SoftwareKey)
DecrementRefCount_Return = +
return $(RegistryErrorIndex)
;*************************************************************************
; end of section DecrementRefCount
;*************************************************************************
;*************************************************************************
;
; SECTION: IsRefCountEqual0
;
; PURPOSE: check the reference counter in the registry is equal to 0 or
; not
;
; ARGUMENTS: $0 Registry key name
;
; RETURNS: $R0 Registry error code
; $R1 0 - if ref count != 0
; 1 - if ref count = 0
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;
;*************************************************************************
[IsRefCountEqualZero]
read-syms InitBaseVars
OpenRegKey $(!REG_H_LOCAL) "" $($0) $(MAXIMUM_ALLOWED) SoftwareKey
Ifstr $(SoftwareKey) == $(KeyNull)
Debug-Output "UTILITY.INF: could not open Software base key"
set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
set RefCountEqualZero = 1
goto IsRefCountEqualZero_Return
endif
GetRegValue $(SoftwareKey),"RefCount", RefCountInfo
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
set RefCount = 0
else
set RefCount = *($(RefCountInfo), 4)
endif
Ifint $(RefCount) == 0
set RefCountEqualZero = 1
else
set RefCountEqualZero = 0
endif
CloseRegKey $(SoftwareKey)
IsRefCountEqualZero_Return = +
return $(RegistryErrorIndex) $(RefCountEqualZero)
;*************************************************************************
;
; SECTION: FindService
;
; PURPOSE: Given a hardware or software component key handle,
; return a key handle to the corresponding Service entry
;
; ARGUMENTS: $0 Registry key handle to primary component
; $1 type of component (adapter, etc.)
;
; RETURNS: $R0 Registry error code
; $R1 Registry key handle for Service area
; $R2 Registry key handle for Parameters subkey
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;
;*************************************************************************
[FindService]
read-syms InitBaseVars
set FS_KeyThisService = ""
set FS_KeyParameters = ""
set FS_KeyComponent = $($0)
set FS_TypeComponent = $($1)
Shell "", BaseServiceKey
set FS_KeyServices = $($R1)
set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
goto F_S_Return
endif
;
; Obtain the all the values for the component key.
;
EnumRegValue $(FS_KeyComponent) FS_ValueList
; BUGBUG: Check RegLastError
set FS_SvcName = ""
ForListDo $(FS_ValueList)
set FS_ValueName = *($($),1)
Ifstr(i) $(FS_ValueName) == ServiceName
set FS_SvcName = *($($),4)
goto F_S_Break1
endif
EndForListDo
F_S_Break1 = +
Ifstr $(FS_SvcName) == $(KeyNull)
set RegistryErrorIndex = CANNOT_FIND_COMPONENT_SERVICE
goto F_S_Return
endif
OpenRegKey $(FS_KeyServices) "" $(FS_SvcName) $(MAXIMUM_ALLOWED) FS_KeyThisService
Ifstr $(FS_KeyThisService) == $(KeyNull)
set RegistryErrorIndex = CANNOT_FIND_COMPONENT_SERVICE
goto F_S_Return
endif
OpenRegKey $(FS_KeyThisService) "" "Parameters" $(MAXIMUM_ALLOWED) FS_KeyParameters
Ifstr $(FS_KeyParameters) == $(KeyNull)
set RegistryErrorIndex = CANNOT_FIND_COMPONENT_SERVICE
goto F_S_Return
endif
F_S_Return = +
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Ifstr $(FS_KeyParameters) != $(KeyNull)
CloseRegKey $(FS_KeyParameters)
endif
Ifstr $(FS_KeyThisService) != $(KeyNull)
CloseRegKey $(FS_KeyThisService)
endif
endif
return $(RegistryErrorIndex), $(FS_KeyThisService) $(FS_KeyParameters)
;*************************************************************************
; end of section FindService
;*************************************************************************
;*************************************************************************
;
; SECTION: GetServiceParameters
;
; PURPOSE: Given a component key and type, return a list of
; all its current parameters
;
; ARGUMENTS: $0 Registry key handle to primary component
; $1 type of component (adapter, etc.)
;
; RETURNS: $R0 Registry error code
; $R1 Registry key handle for Service area
; $R2 Registry key handle for Parameters subkey
; $R3 Value list of all values under Parameters subkey
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[GetServiceParameters]
read-syms InitBaseVars
set GP_KeyComponent = $($0)
set GP_KeyService = ""
set GP_KeyParameters = ""
set GP_ValueList = {}
FindService $(GP_KeyComponent) $($1)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
goto G_P_Return
endif
set GP_KeyService = $($R1)
set GP_KeyParameters = $($R2)
EnumRegValue $(GP_KeyParameters) GP_ValueList
G_P_Return = +
return $(RegistryErrorIndex) $(GP_KeyService) $(GP_KeyParameters) $(GP_ValueList)
;*************************************************************************
; end of section sectionname
;*************************************************************************
;*************************************************************************
;
; SECTION: AddSoftwareComponent
;
; PURPOSE: Adds all the Registry information necessary for
; a new software component. This involves creating
; the SOFTWARE area and the SERVICE area.
;
; ARGUMENTS: $0 name of Manufacturer
; $1 name of Product
; $2 service name to use (no imbedded blanks, etc.)
; $3 Display Name for service
; $4 full path name to the INF file for configuration
; $5 ImagePath
; $6 type of the software,
; see [CreateService] for complete list
; $7 service order group, if any or ""
; $8 dependency **list**, if any or {}
; $9 ObjectName. if "", it will set to "LocalSystem"
; $10 EventMessageFile [optional]
; $11 TypeSupported [optional]
; $12 event log location [optional]
; $13 error control value [optional]
; $14 event log source [optional]
; $15 ParameterMessageFile[optional]
;
; RETURNS: $R0 error code or zero if no error
; $R1 Registry key variable for
; SOFTWARE\Manufacturer\Product\Version key
; $R2 Registry key variable for
; SOFTWARE\...\NetRules
; $R3 Registry key handle for Services key
; $R4 "Parameters" key handle for Services area
; $R5 "Linkage" key handle for Services area
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[AddSoftwareComponent]
read-syms InitBaseVars
set AS_MfgName = $($0)
set AS_ProdName = $($1)
set AS_SvcName = $($2)
set AS_DisplayName = $($3)
set AS_Infname = $($4)
set AS_ImagePath = $($5)
set AS_ServiceType = $($6)
set AS_Group = $($7)
set AS_Dependencies = $($8)
set AS_ObjectName = $($9)
set AS_EventFile = $($10)
set AS_TypeSupported = $($11)
set AS_EventLocation = $($12)
set AS_ErrorCtlValue = $($13)
set AS_EventSource = $($14)
set AS_ParameterMessageFile = $($15)
set AS_KeyServicesArea = $($16)
set AS_KeyVersion = ""
set AS_KeyNetRules = ""
set AS_KeyService = ""
set AS_KeyParameters = ""
set AS_KeyLinkage = ""
;
; Create the Service entry for this product
;
Shell "", CreateService,$(AS_SvcName),$(AS_DisplayName),$(AS_ImagePath),+
$(AS_ServiceType),$(AS_Group),$(AS_Dependencies),$(AS_ObjectName),+
$(AS_EventFile),$(AS_TypeSupported),$(AS_EventLocation),+
$(AS_ErrorCtlValue),$(AS_EventSource),$(AS_ParameterMessageFile),+
$(AS_KeyServicesArea)
set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
goto A_S_Return
endif
set AS_KeyService = $($R1)
set AS_KeyParameters = $($R2)
set AS_KeyLinkage = $($R3)
;
; Service area is created. Create the software area and link them
;
Shell "", InstallSoftwareProduct, $(AS_MfgName), $(AS_ProdName), $(AS_Infname)
set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) == NO_ERROR
set AS_KeyVersion = $($R1)
set AS_KeyNetRules = $($R2)
Shell "", LinkToService, $(AS_KeyVersion), $(AS_SvcName), service
set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
goto A_S_Return
endif
;
; Add Reference Counter
;
GetRegValue $(AS_KeyVersion),"RefCount", RefCountInfo
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
; no RefCount variable
SetRegValue $(AS_KeyVersion) {RefCount,$(NoTitle),$(!REG_VT_DWORD),0}
endif
endif
A_S_Return = +
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Ifstr $(AS_KeyNetRules) != $(KeyNull)
CloseRegKey $(AS_KeyNetRules)
endif
Ifstr $(AS_KeyParameters) != $(KeyNull)
CloseRegKey $(AS_KeyParameters)
endif
Ifstr $(AS_KeyLinkage) != $(KeyNull)
CloseRegKey $(AS_KeyLinkage)
endif
Ifstr $(AS_KeyVersion) != $(KeyNull)
CloseRegKey $(AS_KeyVersion)
Set AS_ProdKeyName = $(!NTN_SoftwareBase)"\"$(AS_MfgName)"\"$(AS_ProdName)
OpenRegKey $(!REG_H_LOCAL) "" $(AS_ProdKeyName) $(MAXIMUM_ALLOWED) AS_KeyProduct
Ifstr(i) $(AS_KeyProduct) != $(KeyNull)
DeleteRegKey $(AS_KeyProduct) "CurrentVersion"
CloseRegKey $(AS_KeyProduct)
Endif
Endif
Ifstr $(AS_KeyService) != $(KeyNull)
Debug-Output "UTILITY.INF: DeleteRegTree Service Key"
;DeleteRegTree $(AS_KeyService) ""
endif
set AS_KeyVersion = ""
set AS_KeyNetRules = ""
set AS_KeyService = ""
set AS_KeyParameters = ""
set AS_KeyLinkage = ""
endif
return $(RegistryErrorIndex), $(AS_KeyVersion), $(AS_KeyNetRules), $(AS_KeyService),+
$(AS_KeyParameters), $(AS_KeyLinkage)
;*************************************************************************
; end of section AddSoftwareComponent
;*************************************************************************
;*************************************************************************
;
; SECTION: AddHardwareComponent
;
; PURPOSE: Adds all the Registry information necessary for
; a new network adapater card
;
; ARGUMENTS: $0 service name to use (no imbedded blanks, etc.).
; This name will have the numeric value from
; InstallNetCard appended to it for uniqueness.
; $1 INF name for this adapter
; $2 Driver name in software section
; $3 Optional - Services area Key (for performance if an
; INF will be calling this routine many times)
; $4 Optional - Netcards area Key (for performance if an
; INF will be calling this routine many times)
; $5 Optional - number of netcard to start with when looking
; for the next empty slot. For performance, and INF which
; is adding many adapters can pass in the value returned
; for adapter number from the last AddHardwareComponent
; call
;
;
; RETURNS: $R0 Registry error code or zero if no error
; $R1 Registry key variable for HARDWARE\Netcard\(n)
; $R2 Registry key variable for HARDWARE\Netcard\(n)\\NetRules
; $R3 Registry key handle for <service>\Parameters key
; $R4 Adapter number assigned to adapter
; $R5 Service name generated by combining svc name with
; adapter number
;
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[AddHardwareComponent]
read-syms InitBaseVars
set AH_SvcName = $($0)
set AH_Infname = $($1)
set AH_SoftwareName = $($2)
set AH_KeyServicesArea = $($3)
set AH_KeyNetcardsArea = $($4)
set AH_AdapNum = $($5)
set AH_KeyNetcard = ""
set AH_KeyNetRules = ""
set AH_KeyService = ""
set AH_KeyParameters = ""
;
; Create the HARDWARE\Netcard entry for this adapter
;
Shell "", InstallNetcard, $(AH_Infname) $(AH_KeyNetcardsArea) $(AH_AdapNum)
set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Debug-Output "UTILITY.INF: [AddHardwareComponent] InstallNetcard returned: "$(RegistryErrorIndex)
goto A_H_Return
endif
set AH_KeyNetcard = $($R1)
set AH_AdapNum = $($R2)
set AH_SvcName = $(AH_SvcName)$(AH_AdapNum)
set AH_KeyNetRules = $($R3)
;
; Create the SERVICES entry for this adapter; no binary path, no group,
; no dependencies.
;
Shell "", CreateService, $(AH_SvcName), "", "", "adapter","",{},"","","","","","","", $(AH_KeyServicesArea)
set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Debug-Output "UTILITY.INF: CreateService returned "$(RegistryErrorIndex)
goto A_H_Return
endif
CloseRegKey $($R1)
set AH_KeyParameters = $($R2)
CloseRegKey $($R3)
;
; Link the Netcard entry to the Service created
;
Shell "", LinkToService, $(AH_KeyNetcard), $(AH_SvcName)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Debug-Output "UTILITY.INF: [AddHardwareComponent] LinkToService returned "$(RegistryErrorIndex)
goto A_H_Return
endif
;
; Add the reference counter in the driver section
;
Shell "", IncrementRefCount, $(AH_SoftwareName)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Debug-Output "UTILITY.INF: [AddHardwareComponent] IncrementRefCount returned "$(RegistryErrorIndex)
goto A_H_Return
endif
A_H_Return = +
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Debug-Output "UTILITY.INF: [AddHardwareComponent] returning error: "$(RegistryErrorIndex)
Ifstr(i) $(AH_KeyNetRules) != $(KeyNull)
CloseRegKey $(AH_KeyNetRules)
Endif
Ifstr(i) $(AH_KeyNetcard) != $(KeyNull)
; Let the RemoveHardware handle it
;DeleteRegTree $(AH_KeyNetcard) ""
Endif
set AH_KeyNetRules = ""
set AH_KeyNetcard = ""
endif
return $(RegistryErrorIndex), $(AH_KeyNetcard), $(AH_KeyNetRules), $(AH_KeyParameters),+
$(AH_AdapNum), $(AH_SvcName)
;*************************************************************************
; end of section AddHardwareComponent
;*************************************************************************
;*************************************************************************
;
; SECTION: MCAFindBus
;
; PURPOSE: Find adpater(s) location
;
; ARGUMENTS: $0 The least signifiance byte of the device ID
; $1 The most signifiance byte of the device ID
;
;
; RETURNS: $R0 Registry error code or zero if no error
; $R1 The list of adapter location
; {{bus0,slot0},{bus1,slot1},{bus2,slot2}...{busk,slotk}}
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[MCAFindBus]
read-syms InitBaseVars
set RegistryErrorIndex = NO_ERROR
set MultifunctionAdapter = "HARDWARE\Description\System\MultifunctionAdapter"
set InfoList = {}
OpenRegKey $(!REG_H_LOCAL) "" $(MultifunctionAdapter) $(MAXIMUM_ALLOWED) KeyMultiAdapter
Ifstr $(KeyMultiAdapter) == $(KeyNull)
goto MCAFindBus_return
endif
EnumRegKey $(KeyMultiAdapter) BusList
Debug-Output "Buslist"
Debug-Output $(BusList)
ForListDo $(BusList)
set BusNum = *($($),1)
set RegName = $(MultifunctionAdapter)"\"$(BusNum)
Debug-Output "BusNum"
Debug-Output $(BusNum)
OpenRegKey $(!REG_H_LOCAL) "" $(RegName) $(MAXIMUM_ALLOWED) KeyBus
ifstr $(KeyBus) != $(KeyNull)
GetRegValue $(KeyBus),"Configuration Data",ConfigData
ifstr $(ConfigData) != $(KeyNull)
set CardInfo = *($(ConfigData), 4 )
;
; Skip the header and jump to data position 33
;
set Position = 33
set SlotNum = 1
QueryListSize ListSize $(CardInfo)
Loop1 =+
ifint $(Position) < $(ListSize)
set-add NextByte = $(Position), 1
ifint *($(CardInfo), $(Position)) == $($0)
ifint *($(CardInfo), $(NextByte)) == $($1)
;
; Set up the hardware
;
LibraryProcedure RealBusNum, $(!LIBHANDLE), GetMCABusInformation, $(KeyBus), "Configuration Data", $(BusNum)
Debug-Output $(RealBusNum)
set BusNum = *($(RealBusNum),1)
Debug-Output $(SlotNum)
set-mul mcaid = $($1), 256
set-add mcaid = $(mcaid), $($0)
set InfoList = >($(InfoList),{$(BusNum),$(SlotNum),$(mcaid)})
endif
endif
set-add Position = $(Position), 6
set-add SlotNum = $(SlotNum), 1
goto Loop1
endif
endif
CloseRegKey $(KeyBus)
endif
EndForListDo
CloseRegKey $(KeyMultiAdapter)
MCAFindBus_return = +
return $(RegistryErrorIndex) $(InfoList)
;*************************************************************************
; end of section MCAFindBus
;*************************************************************************
;*************************************************************************
;
; SECTION: EISAFindBus
;
; PURPOSE: Find adpater(s) location
;
; ARGUMENTS: $0 The compress ID of the EISA card
; $1 EISA Compressed ID mask
;
;
; RETURNS: $R0 Registry error code or zero if no error
; $R1 The list of adapter location
; {{bus0,slot0},{bus1,slot1},{bus2,slot2}...{busk,slotk}}
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[EISAFindBus]
read-syms InitBaseVars
set MaskNum = $($1)
ifstr(i) $($1) == ""
set MaskNum = 16777215 ; 0xffffff
endif
set RegistryErrorIndex = NO_ERROR
set EISAAdapter = "HARDWARE\Description\System\EISAAdapter"
set InfoList = {}
OpenRegKey $(!REG_H_LOCAL) "" $(EISAAdapter) $(MAXIMUM_ALLOWED) KeyEISAAdapter
Ifstr $(KeyEISAAdapter) == $(KeyNull)
goto EISAFindBus_return
endif
EnumRegKey $(KeyEISAAdapter) BusList
Debug-Output "Buslist"
Debug-Output $(BusList)
ForListDo $(BusList)
set BusNum = *($($),1)
OpenRegKey $(!REG_H_LOCAL) "" $(EISAAdapter)"\"$(BusNum) $(MAXIMUM_ALLOWED) KeyEISAAdapterBus
LibraryProcedure SlotList, $(!LIBHANDLE), GetEisaSlotInformation, $(KeyEISAAdapterBus), "Configuration Data", $($0), $(MaskNum)
ifstr(i) $(SlotList) != {}
ForListDo $(SlotList)
set SlotNum = $($)
ifstr(i) $(SlotNum) != "ERROR"
Debug-Output $(BusNum)
Debug-Output $(SlotNum)
set InfoList = >($(InfoList),{$(BusNum),$(SlotNum),$($0)})
endif
EndForListDo
endif
EndForListDo
CloseRegKey $(KeyEISAAdapter)
EISAFindBus_return = +
return $(RegistryErrorIndex) $(InfoList)
;*************************************************************************
; end of section EISAFindBus
;*************************************************************************
;*************************************************************************
;
; SECTION: GetPCIInformation
;
; PURPOSE: Get PCI vendor and device information
;
; ARGUMENTS: $0 Vendor ID
; $1 Device ID
;
;
; RETURNS: $R0 List of bus and slot information
; {{bus0,slot0},{bus1,slot1},{bus2,slot2}...{busk,slotk}}
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[GetPCIInformation]
read-syms InitBaseVars
set VendorID = $($0)
set DeviceID = $($1)
set MultiAdapter = "HARDWARE\Description\System\MultifunctionAdapter"
set InfoList = {}
OpenRegKey $(!REG_H_LOCAL) "" $(MultiAdapter) $(MAXIMUM_ALLOWED) KeyMultiAdapter
Ifstr $(KeyMultiAdapter) == $(KeyNull)
goto GetPCIInformation_return
endif
EnumRegKey $(KeyMultiAdapter) BusList
Debug-Output "Buslist"
Debug-Output $(BusList)
set BusNum = 0
set index = 0
ForListDo $(BusList)
OpenRegKey $(!REG_H_LOCAL) "" $(MultiAdapter)"\"$(index) $(MAXIMUM_ALLOWED) KeyMultiAdapterBus
GetRegValue $(KeyMultiAdapterBus) "Identifier" IdentifierInfo
ifstr(i) *($(IdentifierInfo),4) == "PCI"
;
; Only check for PCI bus
;
set device = 0
next_device = +
ifint $(device) < 32
set function = 0
next_function = +
ifint $(function) < 8
LibraryProcedure Result, $(!LIBHANDLE), GetPciInformation, $(BusNum), $(device), $(function)
debug-output $(BusNum)".."$(device)".."$(function)".."$(Result)
ifint *($(Result),1) == 65535
Set-add device = $(device),1
goto next_device
endif
ifint *($(Result),1) == $(VendorID)
ifint *($(Result),2) == $(DeviceID)
set InfoList = >($(InfoList),{$(BusNum),$(device),$(function)})
endif
endif
set-add function = $(function), 1
goto next_function
endif
Set-add device = $(device),1
goto next_device
endif
finish_bus = +
set-add BusNum = $(BusNum),1
endif
set-add index = $(index),1
EndForListDo
CloseRegKey $(KeyMultiAdapter)
GetPCIInformation_return = +
return $(InfoList)
;*************************************************************************
;
; SECTION: AddNetworkProvider
;
; PURPOSE: Add a network provider entry into the registry
;
; ARGUMENTS: $0 network provider id. i.e., lanmanredirector
; $1 network provder location. i.e, c:\nt\windows\system\ntlanman.dll
; $2 English name of the provider. i.e, NT Lan Manager
; $3 network provider device name, if different from network
; provider
;
;
; RETURNS: $R0 Registry error code or zero if no error
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[AddNetworkProvider]
read-syms InitBaseVars
set RegistryErrorIndex = NO_ERROR
set ProviderDeviceName = $($3)
ifstr(i) $(ProviderDeviceName) == ""
set ProviderDeviceName = $($0)
endif
; OpenRegKey $(!REG_H_LOCAL) "" $(CurrentControlSet)"\control\NetworkProvider\Active\"$($0) $(MAXIMUM_ALLOWED) ActiveKey
; ifstr(i) $(OrderKey) == $(KeyNull)
; CreateRegKey $(!REG_H_LOCAL) {$(CurrentControlSet)"\control\NetworkProvider\Active\"$($0),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" ActiveKey
; endif
OpenRegKey $(!REG_H_LOCAL) "" $(CurrentControlSet)"\control\NetworkProvider\order" $(MAXIMUM_ALLOWED) OrderKey
ifstr(i) $(OrderKey) == $(KeyNull)
CreateRegKey $(!REG_H_LOCAL) {$(CurrentControlSet)"\control\NetworkProvider\order",$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" OrderKey
endif
GetRegValue $(OrderKey) "ProviderOrder" OrderValue
set Order = *($(OrderValue), 4 )
ifstr(i) $(OrderValue) == $(KeyNull)
goto AddFirstProvider
else-ifstr(i) $(Order) == $(KeyNull)
goto AddFirstProvider
else
goto AddProvider
endif
AddFirstProvider = +
SetRegValue $(OrderKey) {ProviderOrder,$(NoTitle),$(!REG_VT_SZ),$($0)}
goto WriteProviderInfo
AddProvider = +
Split-String $(Order) "," OrderList
ifContains(i) $($0) in $(OrderList)
; Enable if we cannot have the same provider
;
;set RegistryErrorIndex = PROVIDER_ALREADY_EXISTED
;goto AddnetworkProvider_return
else
set Order = $(Order)","$($0)
SetRegValue $(OrderKey) {ProviderOrder,$(NoTitle),$(!REG_VT_SZ),$(Order)}
endif
goto WriteProviderInfo
WriteProviderInfo = +
CloseRegKey $(OrderKey)
OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName)"\"$($0)"\networkprovider" $(MAXIMUM_ALLOWED) ProviderKey
Ifstr(i) $(ProviderKey) == $(KeyNull)
CreateRegKey $(!REG_H_LOCAL) {$(ServicesBaseName)"\"$($0)"\networkprovider",$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" ProviderKey
endif
set NewValueList = {{Devicename,$(NoTitle),$(!REG_VT_SZ),"\Device\"$(ProviderDeviceName)},+
{ProviderPath, $(NoTitle), $(!REG_VT_EXPAND_SZ), $($1)},+
{Name, $(NoTitle), $(!REG_VT_SZ), $($2)}}
Shell "" AddValueList $(ProviderKey) $(NewValueList)
CloseRegKey $(ProviderKey)
AddNetworkProvider_return = +
return $(RegistryErrorIndex)
;*************************************************************************
; end of section AddNetworkProvider
;*************************************************************************
;*************************************************************************
;
; SECTION: AddServiceProvider
;
; PURPOSE: Add a Service provider entry into the registry
;
; ARGUMENTS: $0 Service provider id. i.e., tcpip
; $1 Service provder location. i.e, c:\nt\windows\system\ntlanman.dll
; $2 English name of the provider. i.e, NT Lan Manager
; $3 Class number
;
;
; RETURNS: $R0 Registry error code or zero if no error
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[AddServiceProvider]
read-syms InitBaseVars
set RegistryErrorIndex = NO_ERROR
set ClassNum = $($3)
ifstr(i) $(ClassNum) == ""
set ClassNum = 8
endif
OpenRegKey $(!REG_H_LOCAL) "" $(CurrentControlSet)"\control\ServiceProvider\order" $(MAXIMUM_ALLOWED) OrderKey
ifstr(i) $(OrderKey) == $(KeyNull)
CreateRegKey $(!REG_H_LOCAL) {$(CurrentControlSet)"\control\ServiceProvider\Order",$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" OrderKey
SetRegValue $(OrderKey) {ExcludedProviders,$(NoTitle),$(!REG_VT_MULTI_SZ),{}}
endif
GetRegValue $(OrderKey) "ProviderOrder" OrderValue
set Order = *($(OrderValue), 4 )
ifstr(i) $(OrderValue) == $(KeyNull)
goto AddFirstProvider
else-ifstr(i) $(Order) == $(KeyNull)
goto AddFirstProvider
else
goto AddProvider
endif
AddFirstProvider = +
SetRegValue $(OrderKey) {ProviderOrder,$(NoTitle),$(!REG_VT_MULTI_SZ),{$($0)}}
goto WriteProviderInfo
AddProvider = +
ifContains(i) $($0) in $(Order)
; Enable if we cannot have the same provider
;
;set RegistryErrorIndex = PROVIDER_ALREADY_EXISTED
;goto AddProvider_return
else
set Order = >($(Order),$($0))
SetRegValue $(OrderKey) {ProviderOrder,$(NoTitle),$(!REG_VT_MULTI_SZ),$(Order)}
endif
goto WriteProviderInfo
WriteProviderInfo = +
CloseRegKey $(OrderKey)
OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName)"\"$($0)"\Serviceprovider" $(MAXIMUM_ALLOWED) ProviderKey
Ifstr(i) $(ProviderKey) == $(KeyNull)
CreateRegKey $(!REG_H_LOCAL) {$(ServicesBaseName)"\"$($0)"\Serviceprovider",$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" ProviderKey
endif
set NewValueList = {{Class,$(NoTitle),$(!REG_VT_DWORD),$(ClassNum)},+
{ProviderPath, $(NoTitle), $(!REG_VT_EXPAND_SZ), $($1)},+
{Name, $(NoTitle), $(!REG_VT_SZ), $($2)}}
Shell "" AddValueList $(ProviderKey) $(NewValueList)
CloseRegKey $(ProviderKey)
AddProvider_return = +
return $(RegistryErrorIndex)
;*************************************************************************
; end of section AddServiceProvider
;*************************************************************************
;*************************************************************************
;
; SECTION: RemoveServiceProvider
;
; PURPOSE: Remove Service provider entry
;
; ARGUMENTS: $0 provider name
;
; RETURNS: $R0 Registry error code or zero if no error
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[RemoveServiceProvider]
read-syms InitBaseVars
set RegistryErrorIndex = NO_ERROR
OpenRegKey $(!REG_H_LOCAL) "" $(CurrentControlSet)"\control\ServiceProvider\order" $(MAXIMUM_ALLOWED) OrderKey
ifstr(i) $(OrderKey) == $(KeyNull)
set RegistryErrorIndex = PROVIDER_ORDER_DOES_NOT_EXIST
goto RemoveProvider_return
endif
GetRegValue $(OrderKey) "ProviderOrder" OrderValue
set Order = *($(OrderValue), 4 )
set NewOrderList = {}
set FirstTime = TRUE
set Found = FALSE
ForListDo $(Order)
ifstr(i) $($) != $($0)
ifstr(i) $(FirstTime) == TRUE
set FirstTime = FALSE
set NewOrderList = {$($)}
else
set NewOrderList = >($(NewOrderList),$($))
endif
else
set Found = TRUE
endif
EndForListDo
ifstr(i) $(Found) == FALSE
; set RegistryErrorIndex = PROVIDER_ORDER_DOES_NOT_EXIST
; goto RemoveProvider_return
else
ifstr(i) $(NewOrderList) == {}
set NewOrderList = ""
endif
SetRegValue $(OrderKey) {ProviderOrder,$(NoTitle),$(!REG_VT_MULTI_SZ),$(NewOrderList)}
endif
OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName)\$($0) $(MAXIMUM_ALLOWED) ProviderKey
ifstr $(ProviderKey) != $(KeyNull)
DeleteRegTree $(ProviderKey) "ServiceProvider"
endif
RemoveProvider_return = +
return $(RegistryErrorIndex)
;*************************************************************************
;
; SECTION: RemoveNetworkProvider
;
; PURPOSE: Remove network provider entry
;
; ARGUMENTS: $0 provider name
;
; RETURNS: $R0 Registry error code or zero if no error
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[RemoveNetworkProvider]
read-syms InitBaseVars
set RegistryErrorIndex = NO_ERROR
OpenRegKey $(!REG_H_LOCAL) "" $(CurrentControlSet)"\control\NetworkProvider\order" $(MAXIMUM_ALLOWED) OrderKey
ifstr(i) $(OrderKey) == $(KeyNull)
set RegistryErrorIndex = PROVIDER_ORDER_DOES_NOT_EXIST
goto RemoveNetworkProvider_return
endif
GetRegValue $(OrderKey) "ProviderOrder" OrderValue
set Order = *($(OrderValue), 4 )
Split-String $(Order) "," OrderList
set NewOrderList = {}
set FirstTime = TRUE
set Found = FALSE
ForListDo $(OrderList)
ifstr(i) $($) != ","
ifstr(i) $($) != $($0)
ifstr(i) $(FirstTime) == TRUE
set FirstTime = FALSE
set NewOrderList = $($)
else
set NewOrderList = $(NewOrderList)","$($)
endif
else
set Found = TRUE
endif
endif
EndForListDo
ifstr(i) $(Found) == FALSE
; set RegistryErrorIndex = PROVIDER_ORDER_DOES_NOT_EXIST
; goto RemoveNetworkProvider_return
else
ifstr(i) $(NewOrderList) == {}
set NewOrderList = ""
endif
SetRegValue $(OrderKey) {ProviderOrder,$(NoTitle),$(!REG_VT_SZ),$(NewOrderList)}
endif
OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName)\$($0) $(MAXIMUM_ALLOWED) ProviderKey
ifstr $(ProviderKey) != $(KeyNull)
DeleteRegTree $(ProviderKey) "NetworkProvider"
endif
RemoveNetworkProvider_return = +
return $(RegistryErrorIndex)
;*************************************************************************
;
; SECTION: AddNameSpaceProvider
;
; PURPOSE: Add a NameSpace provider entry into the registry
;
; ARGUMENTS: $0 (STRING) Name Space Provider Display Name
; $1 (STRING) Name Space Provider DLL (full path)
; $2 (INT) Name Space support, see Winsock2.h or NSPApi.h in sdk\inc
; $3 (BOOL) Schema Support (TRUE | FALSE)
; $4 (STRING - GUID) Name Space Provider ID {46cd93d0-7e92-11cf-ae5a-00aa00a7112b}
;
;
; RETURNS: $R0 Registry error code or zero if no error
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[AddNameSpaceProvider]
read-syms InitBaseVars
set RegistryErrorIndex = NO_ERROR
Set FLibraryErrCtl = 1
LibraryProcedure Result, $(!NCPA_HANDLE), AddNameSpaceProvider, $($0), $($1), $($2), $($3), $($4)
Set FLibraryErrCtl = 0
Set ResultError = *($(Result),1)
Ifint $(ResultError) != 0
Debug-Output "UTILITY.INF: AddNameSpaceProvider wrapper failed, error: "$(Result)
Set RegistryErrorIndex = UNABLE_ADD_NAMESPACE_PROVIDER
Goto AddNameSpaceProvider_return
Endif
AddNameSpaceProvider_return = +
return $(RegistryErrorIndex)
;*************************************************************************
;
; SECTION: RemoveNameSpaceProvider
;
; PURPOSE: Remove namespace provider entry
;
; ARGUMENTS: $0 (STRING, GUID) Name Space Provider ID {46cd93d0-7e92-11cf-ae5a-00aa00a7112b}
;
; RETURNS: $R0 Registry error code or zero if no error
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[RemoveNameSpaceProvider]
read-syms InitBaseVars
set RegistryErrorIndex = NO_ERROR
Set FLibraryErrCtl = 1
LibraryProcedure Result, $(!NCPA_HANDLE), RemoveNameSpaceProvider, $($0)
Set FLibraryErrCtl = 0
Set ResultError = *($(Result),1)
Ifint $(ResultError) != 0
Debug-Output "UTILITY.INF: RemoveNameSpaceProvider wrapper failed, error: "$(Result)
Set RegistryErrorIndex = UNABLE_REMOVE_NAMESPACE_PROVIDER
Goto RemoveNameSpaceProvider_return
Endif
RemoveNameSpaceProvider_return = +
return $(RegistryErrorIndex)
;*************************************************************************
;
; SECTION: PrepareToCopy
;
; PURPOSE: Establish the variables required to perform
; "CopyFilesInCopyList"
;
; ARGUMENTS: none
;
; RETURNS: $R0 STATUS_SUCCESSFUL
;
; REFERENCES: nothing
;
; MODIFIES: see [ProgressCopyEng] above for list of variables
; modified/created in parent context.
;
; NOTES: Read NOTES commentary for section [DoAskSource]
;
;*************************************************************************
[PrepareToCopy]
;
; Read the progress copy symbols.
;
Read-syms ProgressCopy$(!STF_LANGUAGE)
Return STATUS_SUCCESSFUL
;*************************************************************************
; end of section PrepareToCopy
;*************************************************************************
;*************************************************************************
;
; SECTION: DoAskSource
;
; PURPOSE: Determine or ask to location of the network binaries
;
; ARGUMENTS: $0 current value of STF_CWDDIR
; $1 current value of STF_SRCDIR
; $2 "YES" if part of NT base product (i.e., not OEM)
; "NO" otherwise.
;
; RETURNS: $R0: STATUS: STATUS_SUCCESSFUL |
; STATUS_USERCANCEL |
; STATUS_FAILED
; $R1 path to sources
;
; REFERENCES: Nothing
;
; MODIFIES: !STF_SRCDIR_USED changed to point to the user's
; keyed location
; !STF_SRCDIR_KEYED
;
; NOTES: The SETUP copy operations read the symbol table the old way;
; this means that they will only utilize local symbols for
; the necessary progress variables. This section/function assumes
; that it's being called by an INF at THE EXACT SAME CONTEXT LEVEL
; AT WHICH THE INSTALL FUNCTION WILL BE INVOKED! It stores the
; values specifically into the parent context so the progress dialog
; function can see them.
;
;*************************************************************************
[DoAskSource]
Set DAS_CWDDIR = $($0)
Set DAS_SRCDIR = $($1)
Set DAS_BUILTIN = $($2)
Set DAS_Result = STATUS_FAILED
;
; If !STF_SRCDIR_OVERRIDE is not empty, use it instead.
;
Ifstr(i) $(!STF_SRCDIR_OVERRIDE) != ""
Set DAS_SRCDIR = $(!STF_SRCDIR_OVERRIDE)
Set DAS_Result = STATUS_SUCCESSFUL
Goto DAS_exit
Endif
;
; If this is a built-in component during primary installation,
; use the given source path automatically unless !SFT_SRCDIR_WINNT
; is set. This is for the WINNT case, where Setup's SourcePath lies.
;
Ifstr(i) $(DAS_BUILTIN) == YES
Ifstr(i) $(!NTN_InstallPhase) == primary
Ifstr(i) $(!STF_SRCDIR_WINNT) != ""
Set DAS_SRCDIR = $(!STF_SRCDIR_WINNT)
Endif
Set DAS_Result = STATUS_SUCCESSFUL
Goto DAS_exit
Endif
Else
Ifstr(i) $(!NTN_InstallPhase) == primary
; during primary install, always use the passed value
Set DAS_Result = STATUS_SUCCESSFUL
Goto DAS_exit
Else
; not a shipped item, so force to use A rather than saved location
Set DAS_SRCDIR = ""
EndIf
Endif
Debug-Output "UTILITY.INF: [DoAskSource] STF_CWDDIR = "$(DAS_CWDDIR)" STF_SRCDIR = "$(DAS_SRCDIR)
;
; Set default to drive A: if necessary
;
Ifstr(i) $(DAS_SRCDIR) == ""
Set DAS_SRCDIR = "A:\"
Endif
;
; If this is the same SRCDIR as last time, replace it with the string
; actually keyed by the user. This causes UNC names to reappear in their
; original form; the name of the automatically "used" remote drive should
; never be shown.
;
Ifstr(i) $(DAS_SRCDIR) == $(!STF_SRCDIR_USED)
Set DAS_SRCDIR = $(!STF_SRCDIR_KEYED)
Endif
;
; Ask for the setup sources
;
Shell "subroutn.inf" DoAskSource $(DAS_SRCDIR)
ifint $($ShellCode) != $(!SHELL_CODE_OK)
Debug-Output "UTILITY.INF: shelling SUBROUTN.INF [DoAskSource] failed"
goto DAS_exit
endif
Set DAS_Result = $($R0)
Ifstr(i) $(DAS_Result) == STATUS_USERCANCEL
;
; BUGBUG: All the INFs should change to handle this correctly.
;
Set !p:CommonStatus = STATUS_USERCANCEL
goto DAS_exit
Endif
Set DAS_SRCDIR = $($R1)
;
; Save the actual and converted SRCDIRs
;
Set !STF_SRCDIR_USED = $($R1)
Set !STF_SRCDIR_KEYED = $($R3)
;
; Store the new location if this is a request for NT source in the registry.
;
Ifstr(i) $(DAS_BUILTIN) == YES
OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Windows Nt\CurrentVersion" $(!REG_KEY_WRITE) KeyNt
Ifstr(i) $(KeyNt) != ""
SetRegValue $(KeyNt) {SourcePath,$(NoTitle),$(!REG_VT_SZ),$(!STF_SRCDIR_USED)}
Debug-Output "UTILITY.INF: SourcePath stored is "$(!STF_SRCDIR_USED)
CloseRegKey $(KeyNt)
Endif
Endif
DAS_exit =+
;
; Read the progress copy symbols.
;
Read-syms ProgressCopy$(!STF_LANGUAGE)
Return $(DAS_Result) $(DAS_SRCDIR)
;*************************************************************************
; end of section DoAskSource
;*************************************************************************
;*************************************************************************
;
; SECTION: RemoveSoftwareComponent
;
; PURPOSE: Remove the specified software component from the
; registry. It will remove the entry in the software
; section of the registry first. Then it will remove
; the entry in the service section of the registry.
;
; ARGUMENTS: $0 Manufacturer Name
; $1 Product Name
; $2 Boolean flag for zero reference count checking
; ( optional. If it is defined, skip checking )
;
;
; RETURNS: $R0 Registry error code or zero if no error
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[RemoveSoftwareComponent]
Debug-Output "Remove Software Component..."
read-syms InitBaseVars
set RS_Manufacturer = $($0)
set RS_ProductName = $($1)
set RS_CheckRefCount = $($2)
set RS_VersionNum = "CurrentVersion"
set RS_ManufacturerKey = $(!NTN_SoftwareBase)"\"$(RS_Manufacturer)
set RS_ProductKey = $(!NTN_SoftwareBase)"\"$(RS_Manufacturer)"\"$(RS_ProductName)
set RS_ProductVerKey = $(!NTN_SoftwareBase)"\"$(RS_Manufacturer)"\"$(RS_ProductName)"\"$(RS_VersionNum)
set RegistryErrorIndex = NO_ERROR
;
; Check the reference counter first
;
ifstr(i) $(RS_CheckRefCount) != FALSE
Shell "", IsRefCountEqualZero, $(RS_ProductVerKey)
Ifstr(i) $($R0) != NO_ERROR
Debug-Output "UTILITY.INF: [RemoveSoftwareComponent] IsRefCountEqualZero returned "$($R0)
goto RemoveSoftwareComponent_Return
endif
Ifint $($R1) == 0
set RegistryErrorIndex = REF_COUNT_NOT_ZERO
goto RemoveSoftwareComponent_Return
endif
endif
;
; Remove the software first
;
OpenRegKey $(!REG_H_LOCAL) "" $(RS_ManufacturerKey) $(MAXIMUM_ALLOWED) ProductKey
Ifstr $(ProductKey) == $(KeyNull)
Debug-Output "UTILITY.INF: could not open Software product key"
set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
goto RemoveSoftwareComponent_Return
endif
DeleteRegTree $(ProductKey) $(RS_ProductName)
CloseRegKey $(ProductKey)
;
; Remove the service
;
Shell "" RemoveService, $(RS_ProductName), "YES"
Set RS_RemoveError = $($R0)
Ifint $(RS_RemoveError) != 0
Debug-Output "UTILITY.INF: RemoveService wrapper failed, error: "$(RS_RemoveResult)
Set RegistryErrorIndex = UNABLE_REMOVE_CONFIGURE_SERVICE
Goto RemoveSoftwareComponent_Return
Endif
RemoveSoftwareComponent_Return = +
Return $(RegistryErrorIndex)
;*************************************************************************
; end of section RemoveSoftwareComponent
;*************************************************************************
;*************************************************************************
;
; SECTION: RemoveHardwareComponent
;
; PURPOSE: Remove the adapter entry from the registry. First
; remove the adapter entry under Networkcards. Then it
; will remove the service entry under SYSTEM.
;
; ARGUMENTS: $0 Manufacturer Name (i.e., 3Com)
; $1 Product Name (i.e., Elnk)
; $2 Net Card Name (i.e., Elnkii05)
;
;
; RETURNS: $R0 Registry error code or zero if no error
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[RemoveHardwareComponent]
Debug-Output "Remove Hardware Component..."
read-syms InitBaseVars
set RH_Manufacturer = $($0)
set RH_ProductName = $($1)
set RH_VersionNum = "CurrentVersion"
set RH_ProductKey = $(!NTN_SoftwareBase)"\"$($0)"\"$($1)"\"$(RH_VersionNum)
set RH_NetCardName = $($2)
Split-String $(RH_NetCardName), "\", CardInfo
set RH_NetCardNum = *($(CardInfo),11)
set RH_NetCardBase = *($(CardInfo),1)*($(CardInfo),2)*($(CardInfo),3)*($(CardInfo),4)*($(CardInfo),5)*($(CardInfo),6)*($(CardInfo),7)*($(CardInfo),8)*($(CardInfo),9)
set RegistryErrorIndex = NO_ERROR
;
; decrement the reference counter first
;
Shell "", DecrementRefCount, $(RH_ProductKey)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Debug-Output "UTILITY.INF: [AddHardwareComponent] IncrementRefCount returned "$(RegistryErrorIndex)
goto RemoveHardwareComponent_Return
endif
;
; Remove the Net card first
;
OpenRegKey $(!REG_H_LOCAL) "" $(RH_NetCardBase) $(MAXIMUM_ALLOWED) NetCardKey
Ifstr $(NetCardKey) == $(KeyNull)
Debug-Output "UTILITY.INF: could not open NetworkCards key"
set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
goto RemoveHardwareComponent_Return
endif
OpenRegKey $(NetCardKey) "" $(RH_NetCardNum) $(MAXIMUM_ALLOWED) NetCardNumKey
Ifstr $(NetCardNumKey) == $(KeyNull)
Debug-Output "UTILITY.INF: could not open NetworkCards Number key"
set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
goto RemoveHardwareComponent_Return
endif
GetRegValue $(NetCardNumKey),"ServiceName", RH_ServiceNameInfo
set RH_ServiceName = *($(RH_ServiceNameInfo), 4)
ifstr(i) $(RH_ServiceName) == ""
; if we cannot get the service name, make a guess
set RH_ServiceName = $(RH_ProductName)$(RH_NetCardNum)
endif
CloseRegKey $(NetCardNumKey)
DeleteRegTree $(NetCardKey) $(RH_NetCardNum)
CloseRegKey $(NetCardKey)
Shell "", RemoveService, $(RH_ServiceName), "NO"
Set RS_RemoveError = $($R0)
Ifint $(RS_RemoveError) != 0
Debug-Output "UTILITY.INF: RemoveService wrapper failed, error: "$(RS_RemoveResult)
Set RegistryErrorIndex = UNABLE_REMOVE_CONFIGURE_SERVICE
Goto RemoveHardwareComponent_Return
Endif
;
; If driver reference count is equal to 0, remove it.
;
Shell "", IsRefCountEqualZero, $(RH_ProductKey)
Ifstr(i) $($R0) != NO_ERROR
Debug-Output "UTILITY.INF: [RemoveHardwareComponent] IsRefCountEqualZero returned "$($R0)
goto RemoveHardwareComponent_Return
endif
Ifint $($R1) == 1
Debug-Output "Remove software component..."
Shell "" RemoveSoftwareComponent, $(RH_Manufacturer), $(RH_ProductName)
set RegistryErrorIndex = $($R0)
endif
debug-output "remove netbios information..."
LibraryProcedure Result, $(!NCPA_HANDLE), RemoveRouteFromNETBIOS, $(RH_ServiceName)
RemoveHardwareComponent_Return = +
Return $(RegistryErrorIndex)
;*************************************************************************
; end of section RemoveHardwareComponent
;*************************************************************************
;*************************************************************************
;
; SECTION: RemoveService
;
; PURPOSE: Remove a specified service from the registry. It is
; called by RemoveSoftwareComponent and
; RemoveHardwareComponent. Or, if the service is
; created by calling "CreateService", we will
; need to use this subroutine to remove it.
;
; ARGUMENTS: $0 Service Name
; $1 "YES" - we use DeleteService to remove the service
; "NO" - we use DeleteRegTree to remove the
; registry tree
;
; RETURNS: $R0 Registry error code or zero if no error
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[RemoveService]
read-syms InitBaseVars
Set RS_SvcName = $($0)
Set RS_UseDelSvc = $($1)
; Make sure the service key exists first.
OpenRegKey $(!REG_H_LOCAL) "" "SYSTEM\CurrentControlSet\Services\"$(RS_SvcName) +
$(MAXIMUM_ALLOWED) ServiceKey
Ifstr $(ServiceKey) == $(KeyNull)
Debug-Output "UTILITY.INF: could not open SYSTEM Service key "$(RS_SvcName)
goto RemoveService_Return
endif
; Remove the NbProvider value if it exists
OpenRegKey $(ServiceKey) "" "Parameters" $(MAXIMUM_ALLOWED) ParameterKey
Ifstr $(ParameterKey) != $(KeyNull)
DeleteRegValue $(ParameterKey) "NbProvider"
CloseRegKey $(ParameterKey)
Endif
CloseRegKey $(ServiceKey)
ifstr(i) $(RS_UseDelSvc) == "YES"
; Remove the service
Set FLibraryErrCtl = 1
LibraryProcedure RS_RemoveResult $(!NCPA_HANDLE), CPlSetup, +
$(!STF_HWND), DELETESVC, $(RS_SvcName)
Set FLibraryErrCtl = 0
; Check the return code
Set RS_RemoveError = *($(RS_RemoveResult),1)
Ifint $(RS_RemoveError) != 0
Debug-Output "UTILITY.INF: RemoveService wrapper failed, error: "$(RS_RemoveResult)
Set RegistryErrorIndex = UNABLE_REMOVE_CONFIGURE_SERVICE
Goto RemoveService_Return
Endif
else
OpenRegKey $(!REG_H_LOCAL) "" "SYSTEM\CurrentControlSet\Services" +
$(MAXIMUM_ALLOWED) ServiceKey
Ifstr $(ServiceKey) == $(KeyNull)
Debug-Output "UTILITY.INF: could not open SYSTEM Service key "$(RS_SvcName)
set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
goto RemoveService_Return
endif
DeleteRegTree $(ServiceKey) $(RS_SvcName)
CloseRegKey $(ServiceKey)
endif
RemoveService_Return = +
return $(RegistryErrorIndex)
;*************************************************************************
; end of section RemoveService
;*************************************************************************
;*************************************************************************
;
; SECTION: IsNetCardAlreadyInstalled
;
; PURPOSE: This subroutine is called by EISA and MCA net card
; setup. Given the bus number and slot number, it will
; return a boolean to idicate whether the card is
; already installed or not.
;
; ARGUMENTS: $0 Bus Number
; $1 Slot Number
; $2 Product Description
; $3 Product Name
; $4 Skip description and name checking
;
; RETURNS: $R0 Registry error code or zero if no error
; $R1 "YES" - if the net card already installed
; "NO" - if the net card is not in the registry
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;*************************************************************************
[IsNetCardAlreadyInstalled]
read-syms InitBaseVars
set AlreadyExisted = "NO"
set BusNum = $($0)
set SlotNum = $($1)
set Description = $($2)
set Product = $($3)
set SkipDescriptionCheck = $($4)
ifstr(i) $(SkipDescriptionCheck) == ""
set SkipDescriptionCheck = "NO"
endif
OpenRegKey $(!REG_H_LOCAL) "" $(NetworkCardKeyName) $(MAXIMUM_ALLOWED) IE_KeyNetcards
Ifstr $(IE_KeyNetcards) == $(KeyNull)
set RegistryErrorIndex = UNABLE_OPEN_NETWORKCARD_SECTION
goto IE_Return
endif
EnumRegKey $(IE_KeyNetcards) IE_KeyNameList
;
; Compare all the NetworkCards entry and see whether they have the
; same title and productname.
;
ForListDo $(IE_KeyNameList)
set IE_KeyName = *($($),1)
OpenRegKey $(IE_KeyNetcards) "" $(IE_KeyName) $(MAXIMUM_ALLOWED) IE_Card
Ifstr $(IE_Card) == $(KeyNull)
set RegistryErrorIndex = UNABLE_OPEN_NETWORKCARD_SECTION
goto IE_Return
endif
GetRegValue $(IE_Card),"Description", DescriptionInfo
GetRegValue $(IE_Card),"ProductName", ProductNameInfo
set CardDescription = *($(DescriptionInfo), 4)
set CardProductName = *($(ProductNameInfo), 4)
ifstr(i) $(SkipDescriptionCheck) == "YES"
set CardDescription = $(Description)
set CardProductName = $(Product)
endif
ifstr(i) $(CardDescription) == $(Description)
ifstr(i) $(CardProductName) == $(Product)
;
; We find the same product type. make sure that it
; does not have the same bus number and slot number
;
GetRegValue $(IE_Card), "ServiceName", ServiceNameInfo
set ServiceName = *($(ServiceNameInfo), 4)
OpenRegKey $(!REG_H_LOCAL) "" +
$(ServicesBaseName)"\"$(ServiceName)"\Parameters" +
$(MAXIMUM_ALLOWED) IE_KeyService
Ifstr $(IE_KeyService) == $(KeyNull)
set RegistryErrorIndex = UNABLE_OPEN_NETWORKCARD_SECTION
goto IE_Return
endif
GetRegValue $(IE_KeyService), "BusNumber", BusInfo
GetRegValue $(IE_KeyService), "SlotNumber", SlotInfo
set CardBusNum = *($(BusInfo), 4)
set CardSlotNum = *($(SlotInfo), 4)
ifint $(CardBusNum) == $(BusNum)
ifint $(CardSlotNum) == $(SlotNum)
;
; Don't install this card. It is already installed
;
set AlreadyExisted = "YES"
endif
endif
endif
endif
EndForListDo
IE_Return = +
return $(RegistryErrorIndex) $(AlreadyExisted)
;*************************************************************************
; end of section IsNetCardAlreadyInstalled
;*************************************************************************
;*************************************************************************
;
; SECTION: CopyRegTreeAs
;
; PURPOSE:
;
;
; ARGUMENTS: $0 Handle to the source reg key
; $1 Handle to the destination reg key
; $2 (optional) Name of the destination key to place the entries in
; $3 (optional) (TRUE|FALSE) Make destination volatile
;
; RETURNS: $R0 Registry error code or zero if no error
; $R1 Handle to destination key (if $2 is "" then returns $1)
;
; REFERENCES: none
;
; MODIFIES: none
;
;
;*************************************************************************
[CopyRegTreeAs]
read-syms InitBaseVars
Set RegistryErrorIndex = NO_ERROR
set CRTA_SrcKey = $($0)
set CRTA_BaseDestKey = $($1)
set CRTA_DestName = $($2)
set CRTA_DestKey = $($1)
ifstr(i) $(CRTA_DestName) != ""
;
; create the destination key
;
CreateRegKey $(CRTA_BaseDestKey) {$(CRTA_DestName),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" CRTA_DestKey
Ifstr(i) $(CRTA_DestKey) == $(KeyNull)
Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
Goto CRTA_Return
Endif
endif
;
; call into the ncpa to copy the reg tree
;
Set FLibraryErrCtl = 1
LibraryProcedure CRTA_CopyResult $(!NCPA_HANDLE), RegCopyTree, $(CRTA_SrcKey), $(CRTA_DestKey)
Set FLibraryErrCtl = 0
Set CRTA_CopyError = *($(CRTA_CopyResult),1)
Ifint $(CRTA_CopyError) != 0
Debug-Output "UTILITY.INF: [CopyRegTreeAs] RegCopyTree returned "$(CRTA_CopyError)
Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
Goto CRTA_Return
Endif
CRTA_Return = +
return $(RegistryErrorIndex) $(CRTA_DestKey)
;*************************************************************************
;
; SECTION: UpdateWinsockService
;
; PURPOSE: This section creates, if necessary, the WinSock
; service data object. This Registry key is a placeholder
; for all WinSock mapping information. In particular,
; it contains a value called Transports, which contains
; a REG_MULTI_SZ listing the names of all transports
; which export a sockets interface (through a DLL).
;
; Then, we either add or remove the name of this transport
; from the list.
;
; ARGUMENTS: $0 Name of Transport Service supporting WinSock
; $1 TRUE if adding data; FALSE if removing data
;
; RETURNS: $R0 Registry error code or zero if no error
;
; REFERENCES: none
;
; MODIFIES: none
;
;
;*************************************************************************
[UpdateWinsockService]
read-syms InitBaseVars
;
; Get the base key handle for the services area
;
Set UW_NameOfService = $($0)
Set UW_Adding = $($1)
Set UW_KeyServices = $(KeyNull)
Set UW_KeyParameters = $(KeyNull)
Shell "", BaseServiceKey
Set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
Goto U_W_Return
endif
Set UW_KeyServices = $($R1)
OpenRegKey $(UW_KeyServices) "" "WinSock\Parameters" $(MAXIMUM_ALLOWED) UW_KeyParameters
Ifstr(i) $(UW_KeyParameters) == $(KeyNull)
;
; Service is not correctly installed or not installed
;
set UW_KeyWinSock = $(KeyNull)
set UW_RestoreKeys = FALSE
set UW_TempKeyName = ""
set UW_TempKey = $(KeyNull)
OpenRegKey $(UW_KeyServices) "" "WinSock" $(MAXIMUM_ALLOWED) UW_KeyWinSock
Ifstr(i) $(UW_KeyWinSock) != $(KeyNull)
;
; Service is not correctly installed,
; save the everything away and then delete the key
; later after it has been installed, reload the saved
; child keys and values
;
set UW_RestoreKeys = TRUE
set UW_TempKeyName = "WinSockMergeVolatile"
Shell "", CopyRegTreeAs $(UW_KeyWinSock) $(UW_KeyServices) $(UW_TempKeyName)
set UW_TempKey = $($R1)
CloseRegKey $(UW_KeyWinSock)
DeleteRegTree $(UW_KeyServices) "WinSock"
Endif
Debug-Output "UTILITY.INF: Create WinSock Service"
Shell "", CreateService, "WinSock", "", "", "adapter", "", {}
Set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Debug-Output "UTILITY.INF: CreateService for WinSock returned "$(RegistryErrorIndex)
ifstr(i) $(UW_RestoreKeys) == TRUE
CloseRegKey $(UW_TempKey)
Endif
Goto U_W_Return
Endif
set UW_KeyWinSock = $($R1)
Set UW_KeyParameters = $($R2)
;
; Copy the temp key back into the Winsock key,
; then we delete it
;
ifstr(i) $(UW_RestoreKeys) == TRUE
Shell "", CopyRegTreeAs $(UW_TempKey) $(UW_KeyWinSock) ""
CloseRegKey $(UW_TempKey)
DeleteRegTree $(UW_KeyServices) "WinSockMergeVolatile"
Endif
CloseRegKey $(UW_KeyWinSock)
CloseRegKey $($R3)
Else
Debug-Output "UTILITY.INF: Open WinSock Service"
Endif
Ifstr(i) $(UW_KeyParameters) == $(KeyNull)
Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
Goto U_W_Return
Endif
;
; Get the old REG_MULTI_SZ containing the list of supported transports;
; add the new transport service name to the list or remove it.
;
GetRegValue $(UW_KeyParameters) "Transports" UW_TransportsValue
Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set UW_TransportsList = *($(UW_TransportsValue), 4)
Else
Set UW_TransportsList = {}
Endif
Ifstr(i) $(UW_TransportsList) == ""
Set UW_TransportsList = {}
Endif
;
; If we're removing the transport, do so; else, append it to the
; end of the list.
;
Ifstr(i) $(UW_Adding) == "TRUE"
Set UW_TransportsList = >($(UW_TransportsList), $(UW_NameOfService))
Else
Set UW_NewList = {}
ForListDo $(UW_TransportsList)
Ifstr(i) $($) != $(UW_NameOfService)
Set UW_NewList = >($(UW_NewList), $($))
Endif
EndForListDo
Set UW_TransportsList = $(UW_NewList)
Endif
SetRegValue $(UW_KeyParameters) {Transports, $(NoTitle), $(!REG_VT_MULTI_SZ), $(UW_TransportsList)}
Debug-Output "UTILITY.INF: WinSock transport info added/deleted for "$(UW_NameOfService)
U_W_Return = +
Ifstr $(UW_KeyParameters) != $(KeyNull)
CloseRegKey $(UW_KeyParameters)
Endif
Ifstr $(UW_KeyServices) != $(KeyNull)
CloseRegKey $(UW_KeyServices)
Endif
Return $(RegistryErrorIndex)
;*************************************************************************
; end of section UpdateWinsockService
;*************************************************************************
;*************************************************************************
;
; SECTION: UpdateWinsockMappings
;
; PURPOSE: This function calls into CPLSetup to get new mapping
; information for the protocol
;
; ARGUMENTS: $0 Service name of transport driver
; $1 DLL name for WinSock interface to transport
;
; RETURNS: $R0 Registry error code or zero if no error
; $R1 Key handle to <service>\Parameters\Winsock
;
; REFERENCES: none
;
; MODIFIES: none
;
;*************************************************************************
[UpdateWinsockMappings]
read-syms InitBaseVars
Set AW_NameOfService = $($0)
Set AW_DLLName = $($1)
Shell "", BaseServiceKey
Set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
Goto M_W_Return
endif
OpenRegKey $($R1) "" $(AW_NameOfService)"\Parameters\Winsock" $(MAXIMUM_ALLOWED) KeyWinsock
Ifstr(i) $(KeyWinsock) == ""
Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
Goto M_W_Return
Endif
Set FLibraryErrCtl = 1
LibraryProcedure MW_MapResult $(!NCPA_HANDLE), CPlSetup, $(!STF_HWND), WINSOCKMAP, $(AW_DLLName), $(KeyWinsock)
Set FLibraryErrCtl = 0
Set AW_MapError = *($(MW_MapResult),1)
Ifint $(AW_MapError) != 0
Debug-Output "UTILITY.INF: [UpdateWinsockMappings] WINSOCKMAP returned "$(AW_MapError)
Set RegistryErrorIndex = UNABLE_ACCESS_WINSOCK_MAP_INFO
Goto M_W_Return
Endif
M_W_Return = +
Ifstr $(KeyWinsock) != $(KeyNull)
CloseRegKey $(KeyWinsock)
Endif
Return $(RegistryErrorIndex)
;*************************************************************************
; end of section AddWinsockInfo
;*************************************************************************
;*************************************************************************
;
; SECTION: AddWinsockInfo
;
; PURPOSE: This function adds WinSock sockets provider info
; to a transport.
;
; ARGUMENTS: $0 Service name of transport driver
; $1 DLL name for WinSock interface to transport
; $2 integer value for MaxSockAddrLength
; $3 integer value for MinSockAddrLength
;
; RETURNS: $R0 Registry error code or zero if no error
; $R1 Key handle to <service>\Parameters\Winsock
;
; REFERENCES: none
;
; MODIFIES: none
;
;
; NOTES: This function/section calls the NCPA function CPlSetup
; to bind to the DLL in question and add the value of the
; export function WSHWinSockMapping() to the Registry under
; the "<service>\Parameters\Winsock:Mapping" value. To do
; this, the Registry key handle in SETUP form is passed
; to the NCPA export.
;
;
;*************************************************************************
[AddWinsockInfo]
read-syms InitBaseVars
;
; Get the base key handle for the services area
;
Set AW_NameOfService = $($0)
Set AW_DLLName = $($1)
Set AW_MaxAddrLgt = $($2)
Set AW_MinAddrLgt = $($3)
Set AW_KeyServices = $(KeyNull)
Set AW_KeyParameters = $(KeyNull)
Set AW_KeySockets = $(KeyNull)
Shell "", AddAFD
Set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) == NO_ERROR
Shell "", BaseServiceKey
Set RegistryErrorIndex = $($R0)
Endif
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
Goto A_W_Return
endif
Set AW_KeyServices = $($R1)
OpenRegKey $(AW_KeyServices) "" $(AW_NameOfService)"\Parameters" $(MAXIMUM_ALLOWED) AW_KeyParameters
Ifstr(i) $(AW_KeyParameters) == $(KeyNull)
Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
Goto A_W_Return
Endif
OpenRegKey $(AW_KeyParameters) "" "Winsock" $(MAXIMUM_ALLOWED) AW_KeySockets
Ifstr(i) $(AW_KeySockets) == $(KeyNull)
CreateRegKey $(AW_KeyParameters) {Winsock,$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" AW_KeySockets
Endif
Ifstr(i) $(AW_KeySockets) == $(KeyNull)
Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
Goto A_W_Return
Endif
Set AW_ValueList = {{HelperDllName ,$(NoTitle),$(!REG_VT_EXPAND_SZ),$(AW_DLLName)},+
{MaxSockAddrLength,$(NoTitle),$(!REG_VT_DWORD),$(AW_MaxAddrLgt)},+
{MinSockAddrLength,$(NoTitle),$(!REG_VT_DWORD),$(AW_MinAddrLgt)}}
Shell "", AddValueList, $(AW_KeySockets), $(AW_ValueList)
Set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Debug-Output "UTILITY.INF: [AddWinsockInfo] Registry error: Add value list"
Endif
;
; Extract the WinSock mapping information from the DLL
;
Set FLibraryErrCtl = 1
LibraryProcedure AW_MapResult $(!NCPA_HANDLE), CPlSetup, $(!STF_HWND), WINSOCKMAP, $(AW_DLLName), $(AW_KeySockets)
Set FLibraryErrCtl = 0
Set AW_MapError = *($(AW_MapResult),1)
Ifint $(AW_MapError) != 0
Debug-Output "UTILITY.INF: [AddWinsockInfo] WINSOCKMAP returned "$(AW_MapError)
Set RegistryErrorIndex = UNABLE_ACCESS_WINSOCK_MAP_INFO
Goto A_W_Return
Endif
;
; Add this service to the WinSock transports list.
;
Shell "" UpdateWinsockService $(AW_NameOfService) TRUE
Set RegistryErrorIndex = $($R0)
A_W_Return = +
Ifstr $(AW_KeySockets) != $(KeyNull)
CloseRegKey $(AW_KeySockets)
Endif
Ifstr $(AW_KeyParameters) != $(KeyNull)
CloseRegKey $(AW_KeyParameters)
Endif
Ifstr $(AW_KeyServices) != $(KeyNull)
CloseRegKey $(AW_KeyServices)
Endif
Return $(RegistryErrorIndex)
;*************************************************************************
; end of section AddWinsockInfo
;*************************************************************************
;*************************************************************************
;
; SECTION: RemoveWinsockInfo
;
; PURPOSE: This function removes WinSock sockets provider
; information from a transport
;
; ARGUMENTS: $0 Service name of transport driver
;
; RETURNS: $R0 Registry error code or zero if no error
;
; REFERENCES: none
;
; MODIFIES: none
;
;
;*************************************************************************
[RemoveWinsockInfo]
read-syms InitBaseVars
;
; Get the base key handle for the services area
;
Set RW_NameOfService = $($0)
Set RW_KeyServices = $(KeyNull)
Set RW_KeySockets = $(KeyNull)
Shell "", BaseServiceKey
Set RegistryErrorIndex = $($R0)
Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
Set RegistryErrorIndex = UNABLE_ACCESS_CONFIGURE_SERVICE
Goto R_W_Return
endif
Set RW_KeyServices = $($R1)
OpenRegKey $(RW_KeyServices) "" $(RW_NameOfService)"\Parameters" $(MAXIMUM_ALLOWED) RW_KeySockets
Ifstr(i) $(RW_KeySockets) == $(KeyNull)
Set RegistryErrorIndex = NO_ERROR
else
;
; Delete the \Parameters\Winsock key. Ignore errors, since the service
; is almost certainly being deinstalled.
;
DeleteRegTree $(RW_KeySockets) "Winsock"
Endif
;
; Remove this service from the WinSock transports list.
;
Shell "" UpdateWinsockService $(RW_NameOfService) FALSE
Set RegistryErrorIndex = $($R0)
R_W_Return = +
Ifstr $(RW_KeySockets) != $(KeyNull)
CloseRegKey $(RW_KeySockets)
Endif
Ifstr $(RW_KeyServices) != $(KeyNull)
CloseRegKey $(RW_KeyServices)
Endif
Return $(RegistryErrorIndex)
;*************************************************************************
; end of section RemoveWinsockInfo
;*************************************************************************
;*************************************************************************
;
; SECTION: GetBindingInfo
;
; PURPOSE: This function returns the bindable rules for the given
; manufacturer.
;
; ARGUMENTS: $0 manufacturer name
;
; RETURNS: $R0 Registry error code or zero if no error
; $R1 Bindable rule
;
; REFERENCES: none
;
; MODIFIES: none
;
;
;*************************************************************************
[BindingInfo-DEC]
BindingInfo = {+
"lanceDriver dec100Adapter non exclusive 100",+
"lanceDriver dec101Adapter non exclusive 100",+
"lanceDriver decetherworksturboAdapter non exclusive 100",+
"lanceDriver dec422Adapter non exclusive 100",+
"lanceDriver decpcAdapter non exclusive 100",+
"lanceDriver decstatAdapter non exclusive 100"+
}
[BindingInfo-WD]
BindingInfo = {+
"smc8000nDriver smcisaAdapter non exclusive 100",+
"smc8000nDriver wd8003eaAdapter non exclusive 100",+
"smc8000nDriver wd8003waAdapter non exclusive 100",+
"smc8000nDriver wd8013epaAdapter non exclusive 100",+
"smc8000nDriver wd8013wpaAdapter non exclusive 100"+
}
[BindingInfo-PROTEON]
BindingInfo = {+
"proteonDriver p1990Adapter non exclusive 100",+
"proteonDriver p1390Adapter non exclusive 100"+
}
[BindingInfo-PRONET16]
BindingInfo = {+
"pronet16Driver p199XAdapter non exclusive 100",+
"pronet16Driver p139XAdapter non exclusive 100"+
}
[BindingInfo-IBMTOK2E]
BindingInfo = {+
"ibmtok2eDriver ibmtok2eAdapter non exclusive 100"+
}
[BindingInfo-IBM]
BindingInfo = {"ibmtokDriver ibmtokAdapter non exclusive 100",+
"ibmtokDriver ibmtokmcAdapter non exclusive 100"}
[GetBindingInfo]
set BindingInfo = {}
read-syms BindingInfo-$($0)
return "NO_ERROR", $(BindingInfo)
;*************************************************************************
; end of section GetBindingInfo
;*************************************************************************
;*************************************************************************
;
; SECTION: AddStreams
;
; PURPOSE: Add Streams component
;
; ARGUMENTS: nothing
;
; RETURNS: $R0 error code
;
; MODIFIES: Nothing
;
;*************************************************************************
[AddStreams]
read-syms InitBaseVars
OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName)"\streams" $(MAXIMUM_ALLOWED) BS_KeyServices
Ifstr $(BS_KeyServices) == $(KeyNull)
set OldOption = $(!NTN_InfOption)
set !NTN_InfOption = STREAMS
Shell "oemnxpst.inf" InstallOption $(!STF_LANGUAGE) "STREAMS" $(!STF_SRCDIR) $(!NtLmAddCopy) $(!NtLmDoCopy) $(!NtLmDoConfig)
set !NTN_InfOption = $(OldOption)
else
CloseRegKey $(BS_KeyServices)
Debug-Output "UTILITY.INF: streams already installed"
endif
;
; Increase the reference counter
;
Shell "", IncrementRefCount, "Software\Microsoft\streams\CurrentVersion"
AddStreamsReturn = +
return NO_ERROR
;*************************************************************************
;
; SECTION: RemoveStreams
;
; PURPOSE: Remove Streams component
;
; ARGUMENTS: nothing
;
; RETURNS: $R0 error code
;
; MODIFIES: Nothing
;
;*************************************************************************
[RemoveStreams]
read-syms InitBaseVars
OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName)"\streams" $(MAXIMUM_ALLOWED) BS_KeyServices
Ifstr $(BS_KeyServices) != $(KeyNull)
CloseRegKey $(BS_KeyServices)
Shell "", DecrementRefCount, "Software\Microsoft\streams\CurrentVersion"
Shell "", IsRefCountEqualZero, "Software\Microsoft\streams\CurrentVersion"
Ifstr(i) $($R0) != NO_ERROR
Debug-Output "UTILITY.INF: [RemoveSoftwareComponent] IsRefCountEqualZero returned "$($R0)
goto RemoveStreamsReturn
endif
Ifint $($R1) != 1
; if not zero, remove it next time
goto RemoveStreamsReturn
endif
set OldOption = $(!NTN_InfOption)
set OldInstallMode = $(!NTN_InstallMode)
set !NTN_InfOption = STREAMS
set !NTN_InstallMode = deinstall
Shell "oemnxpst.inf" InstallOption $(!STF_LANGUAGE) "STREAMS" $(!STF_SRCDIR) $(!NtLmAddCopy) $(!NtLmDoCopy) $(!NtLmDoConfig)
set !NTN_InfOption = $(OldOption)
set !NTN_InstallMode = $(OldInstallMode)
endif
RemoveStreamsReturn = +
return NO_ERROR
;*************************************************************************
;
; SECTION: AddAFD
;
; PURPOSE: Add AFD component
;
; ARGUMENTS: nothing
;
; RETURNS: $R0 error code
;
; MODIFIES: Nothing
;
;*************************************************************************
[AddAFD]
read-syms InitBaseVars
read-syms AFDVars
Set Result = NO_ERROR
OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName)"\AFD" $(MAXIMUM_ALLOWED) BS_KeyServices
Ifstr $(BS_KeyServices) == $(KeyNull)
Shell "", CreateService, $(ProductAFDName),+
$(ProductAFDTitle),+
$(ProductAFDImagePath),+
$(ProductAFDSvcType), "TDI", {}, "",+
"%SystemRoot%\System32\IoLogMsg.dll"
Set Result = $($R0)
else
CloseRegKey $(BS_KeyServices)
endif
AddAFDReturn = +
return $(Result)
;*************************************************************************
;
; SECTION: UpgradeAFD
;
; PURPOSE: Upgrade the AFD component
;
; ARGUMENTS: nothing
;
; RETURNS: $R0 error code
;
; MODIFIES: Nothing
;
;*************************************************************************
[UpgradeAFD]
read-syms InitBaseVars
Set Result = NO_ERROR
OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName)"\AFD" $(MAXIMUM_ALLOWED) BS_KeyServices
Ifstr $(BS_KeyServices) != $(KeyNull)
;
; add group value
;
SetRegValue $(BS_KeyServices) {Group,$(NoTitle),$(!REG_VT_SZ),"TDI"}
CloseRegKey $(BS_KeyServices)
endif
return $(Result)
;*************************************************************************
;
; SECTION: GetBusTypeNum
;
; PURPOSE: return the Bus Type Number
;
; ARGUMENTS: nothing
;
; RETURNS: $R0 error code
; $R1 bus number
;
; MODIFIES: Nothing
;
;*************************************************************************
[GetBusTypeNum]
read-syms InitBaseVars
set DetCard = $(!p:DetectedCard)
ifstr(i) $(DetCard) == ""
set DetCard = FALSE
endif
ifstr(i) $(DetCard) == FALSE
; Assume it is an ISA Bus
set BusType = 1
ifstr(i) $(!STF_BUSTYPE) == "ISA"
set BusType = 1
else-ifstr(i) $(!STF_BUSTYPE) == "EISA"
set BusType = 2
else-ifstr(i) $(!STF_BUSTYPE) == "Jazz-Internal Bus"
set BusType = 0
else-ifstr(i) $(!STF_BUSTYPE) == "MCA"
set BusType = 3
else-ifstr(i) $(!STF_BUSTYPE) == "TCChannel"
set BusType = 4
else-ifstr(i) $(!STF_BUSTYPE) == "PCI"
set BusType = 5
else-ifstr(i) $(!STF_BUSTYPE) == "PCMCIA"
;
; when we have plug and play, we need to change it to 8 (not 1)
;
set BusType = 1
else
debug-output "Utility.inf: Unknown bus type"
endif
else
set BusType = *($(!STF_NCDETINFO),5)
endif
return NO_ERROR, $(BusType)
;*************************************************************************
;
; SECTION: AddRpcProtocol
;
; PURPOSE: Update the sections of the SOFTWARE\Microsoft\Rpc keys
; to reflect the presenceof a new protocol in the system.
;
; ARGUMENTS: $0 complete RPC protocol string; e.g., "ncacn_ip_tcp"
; $1 name of client DLL (no path); e.g., "rpclt1.dll"
; $2 name of server DLL (no path); e.g., "rpclt1.dll"
;
; RETURNS: $R0 STATUS_SUCCESSFUL if ok; error otherwise.
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;
;*************************************************************************
[AddRpcProtocol]
Set ARP_Protocol = $($0)
Set ARP_ClientDll = $($1)
Set ARP_ServerDll = $($2)
read-syms InitBaseVars
Set ARP_KeyRpc = $(KeyNull)
Set ARP_KeyRpcServer = $(KeyNull)
Set ARP_KeyRpcClient = $(KeyNull)
Set RegistryErrorIndex = UNABLE_ACCESS_SOFTWARE_REG
OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Rpc" $(MAXIMUM_ALLOWED) ARP_KeyRpc
Ifstr(i) $(ARP_KeyRpc) == $(KeyNull)
Goto ARP_Return
Endif
OpenRegKey $(ARP_KeyRpc) "" "ClientProtocols" $(MAXIMUM_ALLOWED) ARP_KeyClient
Ifstr(i) $(ARP_KeyClient) == $(KeyNull)
Goto ARP_Return
Endif
OpenRegKey $(ARP_KeyRpc) "" "ServerProtocols" $(MAXIMUM_ALLOWED) ARP_KeyServer
Ifstr(i) $(ARP_KeyServer) == $(KeyNull)
Goto ARP_Return
Endif
SetRegValue $(ARP_KeyClient) {$(ARP_Protocol),$(NoTitle),$(!REG_VT_SZ),$(ARP_ClientDll)}
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Goto ARP_Return
Endif
SetRegValue $(ARP_KeyServer) {$(ARP_Protocol),$(NoTitle),$(!REG_VT_SZ),$(ARP_ServerDll)}
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Goto ARP_Return
Endif
Set RegistryErrorIndex = NO_ERROR
ARP_Return = +
Ifstr(i) $(ARP_KeyServer) != $(KeyNull)
CloseRegKey $(ARP_KeyServer)
Endif
Ifstr(i) $(ARP_KeyClient) != $(KeyNull)
CloseRegKey $(ARP_KeyClient)
Endif
Ifstr(i) $(ARP_KeyRpc) != $(KeyNull)
CloseRegKey $(ARP_KeyRpc)
Endif
Return $(RegistryErrorIndex)
;*************************************************************************
; end of section AddRpcProtocol
;*************************************************************************
[AddClientRpcProtocol]
Set ARP_Protocol = $($0)
Set ARP_ClientDll = $($1)
read-syms InitBaseVars
Set ARP_KeyRpc = $(KeyNull)
Set ARP_KeyRpcClient = $(KeyNull)
Set RegistryErrorIndex = UNABLE_ACCESS_SOFTWARE_REG
OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Rpc" $(MAXIMUM_ALLOWED) ARP_KeyRpc
Ifstr(i) $(ARP_KeyRpc) == $(KeyNull)
Goto ARP_Return
Endif
OpenRegKey $(ARP_KeyRpc) "" "ClientProtocols" $(MAXIMUM_ALLOWED) ARP_KeyClient
Ifstr(i) $(ARP_KeyClient) == $(KeyNull)
Goto ARP_Return
Endif
SetRegValue $(ARP_KeyClient) {$(ARP_Protocol),$(NoTitle),$(!REG_VT_SZ),$(ARP_ClientDll)}
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Goto ARP_Return
Endif
Set RegistryErrorIndex = NO_ERROR
ARP_Return = +
Ifstr(i) $(ARP_KeyClient) != $(KeyNull)
CloseRegKey $(ARP_KeyClient)
Endif
Ifstr(i) $(ARP_KeyRpc) != $(KeyNull)
CloseRegKey $(ARP_KeyRpc)
Endif
Return $(RegistryErrorIndex)
[AddServerRpcProtocol]
Set ARP_Protocol = $($0)
Set ARP_ServerDll = $($1)
read-syms InitBaseVars
Set ARP_KeyRpc = $(KeyNull)
Set ARP_KeyRpcServer = $(KeyNull)
Set RegistryErrorIndex = UNABLE_ACCESS_SOFTWARE_REG
OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Rpc" $(MAXIMUM_ALLOWED) ARP_KeyRpc
Ifstr(i) $(ARP_KeyRpc) == $(KeyNull)
Goto ARP_Return
Endif
OpenRegKey $(ARP_KeyRpc) "" "ServerProtocols" $(MAXIMUM_ALLOWED) ARP_KeyServer
Ifstr(i) $(ARP_KeyServer) == $(KeyNull)
Goto ARP_Return
Endif
SetRegValue $(ARP_KeyServer) {$(ARP_Protocol),$(NoTitle),$(!REG_VT_SZ),$(ARP_ServerDll)}
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Goto ARP_Return
Endif
Set RegistryErrorIndex = NO_ERROR
ARP_Return = +
Ifstr(i) $(ARP_KeyServer) != $(KeyNull)
CloseRegKey $(ARP_KeyServer)
Endif
Ifstr(i) $(ARP_KeyRpc) != $(KeyNull)
CloseRegKey $(ARP_KeyRpc)
Endif
Return $(RegistryErrorIndex)
;*************************************************************************
;
; SECTION: AddMixRpcProtocol
;
; PURPOSE: Update the sections of the SOFTWARE\Microsoft\Rpc keys
; to reflect the presenceof a new protocol in the system.
; Update if and only if two services exist
;
; ARGUMENTS: $0 & $1 The two related services
; $2 complete RPC protocol string; e.g., "ncacn_ip_tcp"
; $3 name of client DLL (no path); e.g., "rpclt1.dll"
; $4 name of server DLL (no path); e.g., "rpclt1.dll"
;
; RETURNS: $R0 STATUS_SUCCESSFUL if ok; error otherwise.
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;
;*************************************************************************
;
; WARNING: If you change the lists below, you will need to modify OemNsvRp.INF lists
; also. See [UpgradeMapConstants]
;
[UpgradeRPCMapConstants]
; must be changed to rpclt1.dll
DLLClientList = { "rpcltc3.dll", "rpcltc6.dll", "rpcltc5.dll", "rpcltc7.dll", "rpcdgc3.dll", "rpcltccm.dll", "rpcltc1.dll" }
; must be changed to rpclt1.dll
DLLServerList = { "rpclts3.dll", "rpclts6.dll", "rpclts5.dll", "rpclts7.dll", "rpcdgs3.dll", "rpcltscm.dll", "rpclts1.dll" }
[AddMixRpcProtocol]
set ServiceA = $($0)
set ServiceB = $($1)
Set ARP_Protocol = $($2)
Set ARP_ClientDll = $($3)
Set ARP_ServerDll = $($4)
read-syms InitBaseVars
read-syms UpgradeRPCMapConstants
OpenRegKey $(!REG_H_LOCAL) "" "System\CurrentControlSet\Services\"$(ServiceA) $(MAXIMUM_ALLOWED) KeyServiceA
OpenRegKey $(!REG_H_LOCAL) "" "System\CurrentControlSet\Services\"$(ServiceB) $(MAXIMUM_ALLOWED) KeyServiceB
ifstr(i) $(KeyServiceA) != $(KeyNull)
ifstr(i) $(KeyServiceB) != $(KeyNull)
;
; if the request is add a old name, change it the new version
;
Ifcontains(i) $(ARP_ClientDll) in $(DLLClientList)
Debug-Output "UTILITY.INF: AddMixRpcProtocol tried to add old "$(ARP_ClientDll)", changed to rpclt1.dll!"
set ARP_ClientDll = "rpclt1.dll"
Endif
Ifcontains(i) $(ARP_ServerDll) in $(DLLServerList)
Debug-Output "UTILITY.INF: AddMixRpcProtocol tried to add old "$(ARP_ServerDll)", changed to rpclt1.dll!"
set ARP_ServerDll = "rpclt1.dll"
Endif
Shell "" AddRpcProtocol $(ARP_Protocol) $(ARP_ClientDll) $(ARP_ServerDll)
set ReturnCode = $($R0)
endif
endif
set ReturnCode = NO_ERROR
return_AddMixRpcProtocl = +
return $(ReturnCode)
;*************************************************************************
;
; SECTION: RemoveRpcProtocol
;
; PURPOSE: Remove information about an installed RPC protocol.
;
; ARGUMENTS: $0 complete RPC protocol string (see [AddRpcProtocol]).
;
; RETURNS: $R0 STATUS_SUCCESSFUL if ok; error otherwise.
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;
;*************************************************************************
[RemoveRpcProtocol]
Set RRP_Protocol = $($0)
read-syms InitBaseVars
Set RRP_KeyRpc = $(KeyNull)
Set RRP_KeyRpcServer = $(KeyNull)
Set RRP_KeyRpcClient = $(KeyNull)
Set RegistryErrorIndex = UNABLE_ACCESS_SOFTWARE_REG
OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Rpc" $(MAXIMUM_ALLOWED) RRP_KeyRpc
Ifstr(i) $(RRP_KeyRpc) == $(KeyNull)
Goto RRP_Return
Endif
OpenRegKey $(RRP_KeyRpc) "" "ClientProtocols" $(MAXIMUM_ALLOWED) RRP_KeyClient
Ifstr(i) $(RRP_KeyClient) == $(KeyNull)
Goto RRP_Return
Endif
OpenRegKey $(RRP_KeyRpc) "" "ServerProtocols" $(MAXIMUM_ALLOWED) RRP_KeyServer
Ifstr(i) $(RRP_KeyServer) == $(KeyNull)
Goto RRP_Return
Endif
DeleteRegValue $(RRP_KeyClient) $(RRP_Protocol)
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Goto RRP_Return
Endif
DeleteRegValue $(RRP_KeyServer) $(RRP_Protocol)
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Goto RRP_Return
Endif
Set RegistryErrorIndex = NO_ERROR
RRP_Return = +
Ifstr(i) $(RRP_KeyServer) != $(KeyNull)
CloseRegKey $(RRP_KeyServer)
Endif
Ifstr(i) $(RRP_KeyClient) != $(KeyNull)
CloseRegKey $(RRP_KeyClient)
Endif
Ifstr(i) $(RRP_KeyRpc) != $(KeyNull)
CloseRegKey $(RRP_KeyRpc)
Endif
Return $(RegistryErrorIndex)
;*************************************************************************
; end of section RemoveRpcProtocl
;*************************************************************************
[RemoveClientRpcProtocol]
Set RRP_Protocol = $($0)
read-syms InitBaseVars
Set RRP_KeyRpc = $(KeyNull)
Set RRP_KeyRpcClient = $(KeyNull)
Set RegistryErrorIndex = UNABLE_ACCESS_SOFTWARE_REG
OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Rpc" $(MAXIMUM_ALLOWED) RRP_KeyRpc
Ifstr(i) $(RRP_KeyRpc) == $(KeyNull)
Goto RRP_Return
Endif
OpenRegKey $(RRP_KeyRpc) "" "ClientProtocols" $(MAXIMUM_ALLOWED) RRP_KeyClient
Ifstr(i) $(RRP_KeyClient) == $(KeyNull)
Goto RRP_Return
Endif
DeleteRegValue $(RRP_KeyClient) $(RRP_Protocol)
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Goto RRP_Return
Endif
Set RegistryErrorIndex = NO_ERROR
RRP_Return = +
Ifstr(i) $(RRP_KeyClient) != $(KeyNull)
CloseRegKey $(RRP_KeyClient)
Endif
Ifstr(i) $(RRP_KeyRpc) != $(KeyNull)
CloseRegKey $(RRP_KeyRpc)
Endif
Return $(RegistryErrorIndex)
[RemoveServerRpcProtocol]
Set RRP_Protocol = $($0)
read-syms InitBaseVars
Set RRP_KeyRpc = $(KeyNull)
Set RRP_KeyRpcServer = $(KeyNull)
Set RegistryErrorIndex = UNABLE_ACCESS_SOFTWARE_REG
OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Rpc" $(MAXIMUM_ALLOWED) RRP_KeyRpc
Ifstr(i) $(RRP_KeyRpc) == $(KeyNull)
Goto RRP_Return
Endif
OpenRegKey $(RRP_KeyRpc) "" "ServerProtocols" $(MAXIMUM_ALLOWED) RRP_KeyServer
Ifstr(i) $(RRP_KeyServer) == $(KeyNull)
Goto RRP_Return
Endif
DeleteRegValue $(RRP_KeyServer) $(RRP_Protocol)
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Goto RRP_Return
Endif
Set RegistryErrorIndex = NO_ERROR
RRP_Return = +
Ifstr(i) $(RRP_KeyServer) != $(KeyNull)
CloseRegKey $(RRP_KeyServer)
Endif
Ifstr(i) $(RRP_KeyRpc) != $(KeyNull)
CloseRegKey $(RRP_KeyRpc)
Endif
Return $(RegistryErrorIndex)
;*************************************************************************
;
; SECTION: GetInfFileNameFromRegistry
;
; PURPOSE: get the inf file name from the product' NetRules section.
;
; ARGUMENTS: $0 product key handle
; (ie, system\software\Microsoft\Lance\CurrentVersion)
;
; RETURNS: $R0 Inf file name.
;
; REFERENCES: Nothing
;
; MODIFIES: Nothing
;
;
;*************************************************************************
[GetInfFileNameFromRegistry]
read-syms InitBaseVars
set KeyProduct = $($0)
set InfName = ""
OpenRegKey $(KeyProduct) "" "NetRules" $(!REG_KEY_READ) NetRuleKey
Ifstr(i) $(NetRuleKey) != $(KeyNull)
GetRegValue $(NetRuleKey) "InfName" NetRuleInfNameList
set NetRuleInfName = *($(NetRuleInfNameList), 4)
Split-String $(NetRuleInfName), "\", FilenameList
QueryListSize ListSize $(FilenameList)
set InfName = *($(FilenameList), $(ListSize))
CloseRegKey $(NetRuleKey)
endif
return $(InfName)
;*************************************************************************
;
; SECTION: ToggleBinding
;
; PURPOSE: Take the named binding from the list of "Disabled"
; bindings and merge it with the active bindings.
;
; ARGUMENTS: $0 name of service
; $1 number of binding
; $2 "activate" or "disable"
;
; RETURNS: $R0 NO_ERROR if OK; RegistryError if not.
;
; REFERENCES: None
;
; MODIFIES: None
;
; NOTES: This routine takes either the given inactive binding
; and activates it or the given active binding and
; deactivates it.
;
;
;*************************************************************************
[ToggleBinding]
Set SvcName = $($0)
Set BindNumber = $($1)
Set Action = $($2)
Set Status = UNABLE_ACCESS_CONFIGURE_SERVICE
Set KeySvc = ""
Set KeyFrom = ""
Set KeyTo = ""
read-syms InitBaseVars
OpenRegKey $(!REG_H_LOCAL) "" $(ServicesBaseName)"\"$(SvcName) $(MAXIMUM_ALLOWED) KeySvc
Ifstr(i) $(KeySvc) == $(KeyNull)
Debug-Output "UTILITY.INF: ToggleBinding: service key open FAILED"
Goto TB_Return
Endif
Ifstr(i) $(Action) == activate
Set FromKeyName = "Linkage\Disabled"
Set ToKeyName = "Linkage"
Else
Set FromKeyName = "Linkage"
Set ToKeyName = "Linkage\Disabled"
Endif
; Open the Linkage and Linkage\Disabled subkeys
OpenRegKey $(KeySvc) "" $(FromKeyName) $(MAXIMUM_ALLOWED) KeyFrom
Ifstr(i) $(KeyFrom) == $(KeyNull)
Debug-Output "UTILITY.INF: ToggleBinding: from linkage key open FAILED"
Goto TB_Return
Endif
OpenRegKey $(KeySvc) "" $(ToKeyName) $(MAXIMUM_ALLOWED) KeyTo
Ifstr(i) $(KeyTo) == $(KeyNull)
Debug-Output "UTILITY.INF: ToggleBinding: to linkage key open FAILED"
Goto TB_Return
Endif
; Fetch all their values, allowing for complete absence.
; First, from the "From" key
Set FromBindList = {}
Set FromExportList = {}
Set FromRouteList = {}
Set ToBindList = {}
Set ToExportList = {}
Set ToRouteList = {}
Set ErrorTotal = 0
Debug-Output "UTILITY.INF: ToggleBinding; fetch all linkage values"
GetRegValue $(KeyFrom),"Bind",TempValue
Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set FromBindList = *($(TempValue),4)
Set-add ErrorTotal = $(ErrorTotal),1
Endif
GetRegValue $(KeyFrom),"Export",TempValue
Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set FromExportList = *($(TempValue),4)
Set-add ErrorTotal = $(ErrorTotal),1
Endif
GetRegValue $(KeyFrom),"Route",TempValue
Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set FromRouteList = *($(TempValue),4)
Set-add ErrorTotal = $(ErrorTotal),1
Endif
; Next, from the "To" key
GetRegValue $(KeyTo),"Bind",TempValue
Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set ToBindList = *($(TempValue),4)
Set-add ErrorTotal = $(ErrorTotal),1
Endif
GetRegValue $(KeyTo),"Export",TempValue
Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set ToExportList = *($(TempValue),4)
Set-add ErrorTotal = $(ErrorTotal),1
Endif
GetRegValue $(KeyTo),"Route",TempValue
Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set ToRouteList = *($(TempValue),4)
Set-add ErrorTotal = $(ErrorTotal),1
Endif
; We have all the data. Do some sanity checking.
; Are the lists the same size?
Ifint $(ErrorTotal) != 6
Debug-Output "UTILITY.INF: ToggleBinding; Bind list retreival error, "$(ErrorTotal)
Endif
Debug-Output "UTILITY.INF: ToggleBinding; sanity check results"
QueryListSize sz1 $(FromBindList)
QueryListSize sz2 $(FromExportList)
QueryListSize sz3 $(FromRouteList)
Ifint $(sz1) != $(sz2)
Goto TB_Return
Endif
Ifint $(sz1) != $(sz3)
Goto TB_Return
Endif
QueryListSize sz2 $(ToBindList)
QueryListSize sz3 $(ToExportList)
QueryListSize sz4 $(ToRouteList)
Ifint $(sz2) != $(sz3)
Goto TB_Return
Endif
Ifint $(sz2) != $(sz4)
Goto TB_Return
Endif
; Does the requested element exist?
Debug-Output "UTILITY.INF: ToggleBinding; prepare to move binding"
Ifint $(BindNumber) > $(sz1)
Debug-Output "UTILITY.INF: ToggleBinding; binding to move was invalid"
Set Status = INVALID_DATA_PASSED
Endif
; We're ready. Move the data around.
; Extract the element from the "From" lists, append it
; to the "To" lists...
Set FromBindItem = *($(FromBindList),$(BindNumber))
Set FromRouteItem = *($(FromRouteList),$(BindNumber))
Set FromExportItem = *($(FromExportList),$(BindNumber))
Set ToBindList = >($(ToBindList),$(FromBindItem))
Set ToRouteList = >($(ToRouteList),$(FromRouteItem))
Set ToExportList = >($(ToExportList),$(FromExportItem))
; Regenerate the "From" lists by iteration.
Set NewBind = {}
Set NewExport = {}
Set NewRoute = {}
Set Index = 0
ForListDo $(FromBindList)
Set-add Index = $(Index),1
Ifint $(Index) != $(BindNumber)
Set NewBind = >($(NewBind),$($))
Set NewExport = >($(NewExport),*($(FromExportList),$(Index)))
Set NewRoute = >($(NewRoute),*($(FromRouteList),$(Index)))
Endif
EndForListDo
; Replace the old values
Set FromBindList = $(NewBind)
Set FromExportList = $(NewExport)
Set FromRouteList = $(NewRoute)
; Update the registry.
Set ErrorTotal = 0
SetRegValue $(KeyFrom) {Bind,$(NoTitle),$(!REG_VT_MULTI_SZ),$(FromBindList)}
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Set-add ErrorTotal = $(ErrorTotal),1
Endif
SetRegValue $(KeyFrom) {Export,$(NoTitle),$(!REG_VT_MULTI_SZ),$(FromExportList)}
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Set-add ErrorTotal = $(ErrorTotal),1
Endif
SetRegValue $(KeyFrom) {Route,$(NoTitle),$(!REG_VT_MULTI_SZ),$(FromRouteList)}
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Set-add ErrorTotal = $(ErrorTotal),1
Endif
SetRegValue $(KeyTo) {Bind,$(NoTitle),$(!REG_VT_MULTI_SZ),$(ToBindList)}
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Set-add ErrorTotal = $(ErrorTotal),1
Endif
SetRegValue $(KeyTo) {Export,$(NoTitle),$(!REG_VT_MULTI_SZ),$(ToExportList)}
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Set-add ErrorTotal = $(ErrorTotal),1
Endif
SetRegValue $(KeyTo) {Route,$(NoTitle),$(!REG_VT_MULTI_SZ),$(ToRouteList)}
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Set-add ErrorTotal = $(ErrorTotal),1
Endif
Debug-Output "UTILITY.INF: ToggleBinding; Registry update error total = "$(ErrorTotal)
Ifint $(ErrorTotal) != 0
Set Status = UNABLE_WRITE_REGISTRY
Else
Set Status = NO_ERROR
Endif
TB_Return = +
Ifstr(i) $(KeyFrom) != $(KeyNull)
CloseRegKey $(KeyFrom)
Endif
Ifstr(i) $(KeyTo) != $(KeyNull)
CloseRegKey $(KeyTo)
Endif
Ifstr(i) $(KeySvc) != $(KeyNull)
CloseRegKey $(KeySvc)
Endif
Return $(Status)
;*************************************************************************
; end of section ToggleBinding
;*************************************************************************
;-------------------------------------------------------------------------
;
; ROUTINE: SortListIndex
;
; DESCRIPTION: Sort a list into sequence, returning an "index" list, which
; indicates the sort position of each of the original list
; elements.
;
; INPUTS: $0: List to be sorted
; $1: TRUE for ascending sort (FALSE otherwise)
; $2: TRUE for case-insensitive sort (FALSE otherwise)
;
; OUTPUTS: $R0: Index list
;
; NOTES: Lists of displayable numeric values will automatically
; be sorted numerically if they are all decimal or hex
; and the sort is case-insensitive (param $2 FALSE).
;
;----------------------------------------------------------------------------
[SortListIndex]
Set List = $($0)
Set BoolAscend = $($1)
Set BoolCaseSens = $($2)
LibraryProcedure IndexList, $(!LIBHANDLE), GenerateSortedIndexList, $(List), $(BoolAscend), $(BoolCaseSens)
Return $(IndexList)
;-------------------------------------------------------------------------
;
; ROUTINE: SortByIndex
;
; DESCRIPTION: Sort a list into the sequence given by an "index list".
;
; INPUTS: $0: List to be sorted
; $1: Index list
;
; OUTPUTS: $R0: Index list
;
;----------------------------------------------------------------------------
[SortByIndex]
Set List = $($0)
Set IndexList = $($1)
Set NewList = {}
ForListDo $(IndexList)
Set Index = $($)
Set Item = *($(List),$(Index))
Set NewList = >($(NewList),$(Item))
EndForListDo
Return $(NewList)
;-------------------------------------------------------------------------
;
; ROUTINE: SortList
;
; DESCRIPTION: Sort a list into sequence, returning a sorted list.
;
; INPUTS: $0: List to be sorted
; $1: TRUE for ascending sort (FALSE otherwise)
; $2: TRUE for case-sensitive sort (FALSE for case-ins)
;
; OUTPUTS: $R0: Sorted list
;
; NOTES: Lists of displayable numeric values will automatically
; be sorted numerically if they are all decimal or hex
; and the sort is case-insensitive (param $2 FALSE).
;
;----------------------------------------------------------------------------
[SortList]
Set List = $($0)
Shell "" SortListIndex $(List) $($1) $($2)
Set IndexList = $($R0)
Shell "" SortByIndex $(List) $(IndexList)
Set ResultList = $($R0)
return $(ResultList)
;*************************************************************************
; end of file UTILITY.INF
;*************************************************************************
;*************************************************************************
;
; SECTION: UpdateDetectionDllNames
;
; PURPOSE: Search for files of the name ???NCDET.DLL.
; Update the Registry accordingly.
;
;
; ARGUMENTS: None
;
; RETURNS: $R0 STATUS_SUCCESSFUL if Registry updated
; STATUS_USERCANCEL if no update was required
; STATUS_FAILED if failed
;
; NOTES: This routine searches for all DLLs named ???NCDET.DLL
; and adds them to a list containing the name of the
; "standard" detection DLL, MSNCDET.DLL.
;
; Netcard detection is stopped and restarted if the
; Registry is updated.
;
; REFERENCES:
;
; MODIFIES:
;
;*************************************************************************
[DetectionDllFiles]
DetectionDllsFound = {} ? $(!LIBHANDLE) FindFileInstances $(!STF_WINDOWSSYSPATH)"\???ncdet.dll"
[UpdateDetectionDllNames]
Set Status = STATUS_FAILED
read-syms InitBaseVars
Detect DetectionDllFiles
Set DllValueName = "NetcardDlls"
OpenRegKey $(!REG_H_LOCAL) "" "System\Setup" $(MAXIMUM_ALLOWED) KeySetup
Ifstr(i) $(KeySetup) == $(KeyNull)
Debug-Output "UTILITY.INF: [UpdateDetectionDllNames] cant open System\Setup key"
Goto UDDN_Return
Endif
; Prefix the list with MSNCDET.DLL
Set NewDllList = {"MSNCDET.DLL"}
ForListDo $(DetectionDllsFound)
Set NewDllList = >($(NewDllList),$($))
EndForListDo
; Get the old list
Set UpdateRequired = 1
GetRegValue $(KeySetup) $(DllValueName) DllNamesValue
Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set DllNames = *($(DllNamesValue),4)
Debug-Output "UTILITY.INF: [UpdateDetectionDllNames] DllNames = "$(DllNames)
Set UpdateRequired = 0
; See if all the names are already present
ForListDo $(NewDllList)
Set DllIndex = ~($(DllNames),$($))
Ifint $(DllIndex) == 0
Set UpdateRequired = 1
Endif
EndForListDo
Endif
Set Status = STATUS_SUCCESSFUL
Ifint $(UpdateRequired) == 1
Debug-Output "UTILITY.INF: [UpdateDetectionDllNames] new DLL names = "$(NewDllList)
Set ValueInfo = {$(DllValueName), $(NoTitle), $(!REG_VT_MULTI_SZ), $(NewDllList)}
SetRegValue $(KeySetup) $(ValueInfo)
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Set Status = STATUS_FAILED
Else
Shell "NCPARAM.INF" Param_ControlDetection DTEND
Shell "NCPARAM.INF" Param_ControlDetection DTSTART
Endif
Else
Set Status = STATUS_USERCANCEL
Endif
CloseRegKey $(KeySetup)
UDDN_Return = +
Return $(Status)
;*************************************************************************
; end of section UpdateDetectionDllNames
;*************************************************************************
;*************************************************************************
;
; SECTION: CheckIfCopyNecessary
;
; PURPOSE: Check a set of files and see if all are present. Used
; to offer the user a "current files" versus "new files"
; choice.
;
; ARGUMENTS: $0 list of path names corresponding to names
; given in next parameter
; $1 nested list of file names; see NOTES below
;
; RETURNS: $R0 STATUS_SUCCESSFUL or
; STATUS_FAILED
;
; REFERENCES: nothing
;
; MODIFIES: nothing
;
; NOTES: Typical values (taken from OEMNSVWK.INF) might be:
;
; $0: {$(!STF_WINDOWSSYSPATH),$(!STF_WINDOWSSYSPATH)\drivers}
; $1: {{"BOWSVC.DLL","WKSSVC.DLL","LMREPL.EXE"},+
; {"SMBTRSUP.SYS","BROWSER.SYS","RDR.SYS"}}
;
;
;*************************************************************************
[CheckIfCopyNecessary]
Set Status = STATUS_SUCCESSFUL
Set PathList = $($0)
Set NamesList = $($1)
Set Index = 0
Set Found = 1
ForListDo $(PathList)
Set ThisPath = $($)
Set-add Index = Index,1
Set NameList = *($(NamesList),$(Index))
ForListDo $(NameList)
Set FileToCheck = $(ThisPath)\$($)
LibraryProcedure FilePresent,$(!LIBHANDLE), CheckFileExistance $(FileToCheck)
Ifstr(i) $(FilePresent) != "YES"
Set Found = 0
Endif
EndForListDo
EndForListDo
Ifint $(Found) != 1
Set Status = STATUS_FAILED
Endif
Return $(Status)
;*************************************************************************
; end of section CheckIfCopyNecessary
;*************************************************************************
;*************************************************************************
;
; SECTION: GetBusTypeDialog
;
; PURPOSE: Call the GetBusDialog function in ncpa.cpl and
; get the location of the network card.
;
; ARGUMENTS: $0 Card name description
; $1 Default bus type
; $2 Default bus number
;
; RETURNS: $R0 NO_ERROR
; $R1 BusType
; $R2 BusNumber
; $R3 DlgReturn - "OK" | "CANCEL" if $R0 is NO_ERROR otherwise ""
;
; REFERENCES: nothing
;
; MODIFIES: nothing
;
;*************************************************************************
[GetBusTypeDialog]
set CardName = $($0)
set BusInterfaceType = $($1)
set BusNumber = $($2)
set DlgReturn = ""
ifstr(i) $(BusInterfaceType) == ""
set BusInterfaceType = 1 ; ISA
endif
ifstr(i) $(BusNumber) == ""
set BusNumber = 0 ; Bus 0
endif
set FLibraryErrCtl = 1
LibraryProcedure BusInfo $(!NCPA_HANDLE), GetBusTypeDialog, $(!STF_HWND), $(CardName), $(BusInterfaceType), $(BusNumber)
set FLibraryErrCtl = 0
; return values
ifint *($(BusInfo),1) == 0
set ReturnValue = NO_ERROR
set BusInterfaceType = *($(BusInfo),2)
set BusNumber = *($(BusInfo),3)
set DlgReturn = *($(BusInfo),4)
else
set ReturnValue = ERROR
endif
Return $(ReturnValue), $(BusInterfaceType), $(BusNumber), $(DlgReturn)
;*************************************************************************
; end of section GetBusTypeDialog
;*************************************************************************
;*************************************************************************
;
; SECTION: SetMasterComponent
;
; PURPOSE: This function is used by components which wish
; to be automatically removed when another component is
; remove by the user. It will either add (default)
; the given component as a dependent or remove it.
;
; ARGUMENTS: $0: Vendor name of master component
; $1: Product name of master component
; $2: INF file name of dependent (caller) component
; $3: INF option of dependent (caller) component
; $4: "ADD" or "" if adding or "REMOVE" if removing
;
; RETURNS: $R0: STATUS_SUCCESSFUL if ok, or
; STATUS_FAILED if failure
;
; $R1: Registry error code string if failure;
; CANNOT_FIND_COMPONENT_SERVICE, etc.
;
; NOTES: This function and its companion, RemoveDependentComponents,
; update and reference values under
; <Vendor>\<Product>\CurrentVersion:
;
; DependentInfNames REG_MULTI_SZ
; DependentInfOptions REG_MULTI_SZ
;
;*************************************************************************
[SetMasterComponent]
Read-syms InitBaseVars
Set Vendor = $($0)
Set Product = $($1)
Set InfName = $($2)
Set InfOption = $($3)
Set Adding = 1
Ifstr(i) $($4) == REMOVE
Set Adding = 0
Endif
Set Status = STATUS_FAILED
Set Error = ""
Set InfNamesList = {}
Set InfOptionsList = {}
Set InfIndex = 0
Set NameListSize = 0
Set OptionListSize = 0
Set UpdateRequired = 0
Set MasterKey = ""
OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_SoftwareBase)"\"$(Vendor)"\"$(Product)"\CurrentVersion" +
$(MAXIMUM_ALLOWED) MasterKey
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Set Error = CANNOT_FIND_COMPONENT_SERVICE
Debug-Output "UTILITY.INF: Cant open master component key: "$(Product)
Goto SMC_Return
Endif
GetRegValue $(MasterKey) DependentInfNames InfNamesValue
Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set InfNamesList = *($(InfNamesValue),4)
Set InfIndex = ~($(InfNamesList),$(InfName))
QueryListSize NameListSize $(InfNamesList)
Endif
GetRegValue $(MasterKey) DependentInfOptions InfOptionsValue
Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set InfOptionsList = *($(InfOptionsValue),4)
QueryListSize OptionListSize $(InfOptionsList)
Endif
;
; Check that the two lists are in sync. Bag out if not.
;
Ifint $(NameListSize) != $(OptionListSize)
Set Error = UNABLE_INSTALL
Debug-Output "UTILITY.INF: Dependent INF list degenerate: "$(Product)
Goto SMC_Return
Endif
;
; If Adding and the INF name is not already present, add it;
; else if present, remove the names.
;
Ifint $(Adding) == 1
Ifint $(InfIndex) == 0
Set UpdateRequired = 1
Set InfNamesList = >($(InfNamesList),$(InfName))
Set InfOptionsList = >($(InfOptionsList),$(InfOption))
Endif
Else
Ifint $(InfIndex) != 0
Set UpdateRequired = 1
Set TlistNames = {}
Set TlistOptions = {}
Set Tindex = 0
ForListDo $(InfNamesList)
Set-add Tindex = $(Tindex), 1
Ifstr(i) $($) != $(InfName)
Set TlistNames = >($(TlistNames),$($))
Set TlistOptions = >($(TlistOptions),*($(InfOptionsList),$(Tindex)))
Endif
EndForListDo
Set InfNamesList = TlistNames
Set InfOptionsList = TlistOptions
Endif
Endif
Set Status = STATUS_SUCCESSFUL
Ifint $(UpdateRequired) == 0
Goto SMC_Return
Endif
SetRegValue $(MasterKey) {DependentInfNames,$(NoTitle),$(!REG_VT_MULTI_SZ),$(InfNamesList)}
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Debug-Output "UTILITY.INF: master component value update failed (1)"
Set Status = UNABLE_WRITE_REGISTRY
Endif
SetRegValue $(MasterKey) {DependentInfOptions,$(NoTitle),$(!REG_VT_MULTI_SZ),$(InfOptionsList)}
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Debug-Output "UTILITY.INF: master component value update failed (2)"
Set Status = UNABLE_WRITE_REGISTRY
Endif
SMC_Return =+
Ifstr(i) $(MasterKey) != $(KeyNull)
CloseRegKey $(MasterKey)
Endif
Return $(Status) $(Error)
;*************************************************************************
; end of section SetMasterComponent
;*************************************************************************
;*************************************************************************
;
; SECTION: RemoveDependentComponents
;
; PURPOSE: Remove components which are entirely dependent upon
; the named master component
;
; ARGUMENTS: $0: Vendor name of master component
; $1: Product name of master component
;
; RETURNS: $R0: STATUS_SUCCESSFUL if ok, or
; STATUS_FAILED if failure
;
; $R1: Registry error code string if failure;
; CANNOT_FIND_COMPONENT_SERVICE, etc.
;
; MODIFIES: Nothing
;
;*************************************************************************
[RemoveDependentComponents]
Read-syms InitBaseVars
Set Vendor = $($0)
Set Product = $($1)
Set Status = STATUS_FAILED
Set Error = ""
Set InfNamesList = {}
Set InfOptionsList = {}
Set InfIndex = 0
Set NameListSize = 0
Set OptionListSize = 0
Set UpdateRequired = 0
Set MasterKey = ""
OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_SoftwareBase)"\"$(Vendor)"\"$(Product)"\CurrentVersion" +
$(MAXIMUM_ALLOWED) MasterKey
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
Debug-Output "UTILITY.INF: Cant open master component key: "$(Product)
Set Error = CANNOT_FIND_COMPONENT_SERVICE
Goto RDC_Return
Endif
GetRegValue $(MasterKey) DependentInfNames InfNamesValue
Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set InfNamesList = *($(InfNamesValue),4)
Set InfIndex = ~($(InfNamesList),$(InfName))
QueryListSize NameListSize $(InfNamesList)
Endif
GetRegValue $(MasterKey) DependentInfOptions InfOptionsValue
Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set InfOptionsList = *($(InfOptionsValue),4)
QueryListSize OptionListSize $(InfOptionsList)
Endif
;
; Check that the two lists are in sync. Bag out if not.
;
Ifint $(NameListSize) != $(OptionListSize)
Set Error = UNABLE_INSTALL
Debug-Output "UTILITY.INF: Dependent INF list degenerate: "$(Product)
Goto RDC_Return
Endif
;
; If the list is empty, bag out.
;
Ifint $(NameListSize) == 0
Set Status = STATUS_SUCCESSFUL
Goto RDC_Return
Endif
;
; "push" the current global variable values
;
Set OldOption = $(!NTN_InfOption)
Set OldMode = $(!NTN_InstallMode)
Set OldInf = $(!NTN_Infname)
Set !NTN_InstallMode = deinstall
;
; Iterate the list, removing each INF and option pair.
;
Set Tindex = 0
ForListDo $(InfNamesList)
Set-add Tindex = $(Tindex), 1
Set !NTN_InfOption = *($(InfOptionsList),$(Tindex))
Set !NTN_Infname = $($)
Debug-Output "UTILITY.INF: Removing "$(Product)" dependent: "$(InfName)":"$(InfOption)
Shell $(!NTN_Infname) InstallOption $(!STF_LANGUAGE) $(!NTN_InfOption) $(!STF_SRCDIR) +
$(!NtLmAddCopy) $(!NtLmDoCopy) $(!NtLmDoConfig)
EndForListDo
;
; "pop" the saved global variable values
;
Set !NTN_InfOption = $(OldOption)
Set !NTN_InstallMode = $(OldMode)
Set !NTN_Infname = $(OldInf)
Set Status = STATUS_SUCCESSFUL
RDC_Return =+
Ifstr(i) $(MasterKey) != $(KeyNull)
CloseRegKey $(MasterKey)
Endif
return $(Status) $(Error)
;*************************************************************************
; end of RemoveDependentComponents
;*************************************************************************
;*************************************************************************
;
; SECTION: AddDefaultNetCardParameters
;
; PURPOSE: Add default parameter to the system
;
; ARGUMENTS: $0: Service\netcard\parameter key
;
; MODIFIES: Nothing
;
;*************************************************************************
[AddDefaultNetCardParameters]
set KeyParameter = $($0)
ForListDo $(!NetCardParameterName)
set Name = $($)
set Value = *($(!NetCardParameterValue), $(#))
ifstr(i) $(Name) == "NetworkAddress"
set Type = $(!REG_VT_SZ)
else
set Type = $(!REG_VT_DWORD)
endif
Debug-Output "Name = "$(Name)
Debug-Output "Value = "$(Value)
SetRegValue $(KeyParameter) {$(Name),$(NoTitle),$(Type),$(Value)}
EndForListDo
return
;*************************************************************************
;
; SECTION: FindNextNetworkCard
;
; PURPOSE: Find the next network card registry entry
;
; ARGUMENTS: $0: Network Card ID
; $1: Starting Index, 1 to start at top
;
;
; RETURNS: $R0: RegKeyHandle to Netcard location
; $R1: Next Index, pass back in to continue search
;
; MODIFIES: Nothing
;
;*************************************************************************
[FindNextNetworkCard]
read-syms InitBaseVars
set NetcardName = $($0)
set iSearch = $($1)
set KeyNetcard = ""
Debug-Output "Utility.Inf: FindNextNetworkCard "$(NetcardName)", "$(iSearch)
checknextnetcard = +
set KeyName = $(NetworkCardKeyName)"\"$(iSearch)
Debug-Output "Utility.Inf: FindNextNetworkCard, checking "$(KeyName)
OpenRegKey $(!REG_H_LOCAL) "" $(KeyName) $(MAXIMUM_ALLOWED) KeyNetcard
set-add iSearch = $(iSearch), 1
Ifstr $(KeyNetcard) != $(KeyNull)
GetRegValue $(KeyNetcard) "ProductName" ValueList
ifstr(i) $(NetcardName) != *($(ValueList),4)
CloseRegKey $(KeyNetcard)
Debug-Output "Utility.Inf: FindNextNetworkCard, its not "*($(ValueList),4)" at "$(iSearch)
goto checknextnetcard
endif
Debug-Output "Utility.Inf: FindNextNetworkCard, Found "*($(ValueList),4)" at "$(iSearch)
else
Debug-Output "Utility.Inf: FindNextNetworkCard, Last One "$(iSearch)
endif
Debug-Output "Utility.Inf: FindNextNetworkCard returning "$(KeyNetcard)","$(iSearch)
return $(KeyNetcard) $(iSearch)