903 lines
28 KiB
INI
903 lines
28 KiB
INI
;***********************************************************************
|
||
;
|
||
; NBINFO.INF
|
||
;
|
||
; NETBIOS LANA number and provider management inf file.
|
||
;
|
||
; History:
|
||
;
|
||
;***********************************************************************
|
||
|
||
;-----------------------------------------------------------------------
|
||
; OPTION TYPE
|
||
; -----------
|
||
; This identifies the Option type we are dealing with. The different
|
||
; possible types are:
|
||
;
|
||
; COMPUTER, DISPLAY, MOUSE, KEYBOARD, LAYOUT, SCSI, PRINTER, ...
|
||
;
|
||
; Types specific to networking:
|
||
;
|
||
; NetAdapter, a netcard / adapter combination or just a netcard
|
||
; NetDriver, just a netcard driver
|
||
; NetTransport, a complete NDIS-compliant TDI transport stack
|
||
; NetService, an NT networking service
|
||
; NetWork, a complete network ensemble.
|
||
; NetProvider a complete network which supports NT MPR protocol
|
||
;-----------------------------------------------------------------------
|
||
|
||
[Identification]
|
||
OptionType = NetProvider
|
||
|
||
;-----------------------------------------------------------------------
|
||
; OPTION LIST
|
||
; -----------
|
||
; This section lists the OEM Option key names. These keys are locale
|
||
; independent and used to represent the option in a locale independent
|
||
; manner.
|
||
;
|
||
;-----------------------------------------------------------------------
|
||
|
||
[Options]
|
||
NETBIOS
|
||
|
||
;***********************************************************************
|
||
; CONSTANTS FOR USING DIALOGS
|
||
;***********************************************************************
|
||
|
||
[FileConstants]
|
||
;
|
||
; File names, etc.
|
||
;
|
||
UtilityInf = "UTILITY.INF"
|
||
subroutineinf = "SUBROUTN.INF"
|
||
SoftwareType = "driver"
|
||
Exit_Code = 0
|
||
;ShellCode = 0
|
||
|
||
;
|
||
; EventLog Message File
|
||
;
|
||
NetEventDLL = "%SystemRoot%\System32\netevent.dll"
|
||
IoLogMsgDLL = "%SystemRoot%\System32\IoLogMsg.dll"
|
||
|
||
;
|
||
; Product Info
|
||
;
|
||
Manufacturer = "Microsoft"
|
||
ProductMajorVersion = "4"
|
||
ProductMinorVersion = "0"
|
||
ProductVersion = $(ProductMajorVersion)"."$(ProductMinorVersion)
|
||
;
|
||
; Registry Key
|
||
;
|
||
ProductKeyName = $(!NTN_SoftwareBase)"\"$(Manufacturer)"\"$(ProductSoftwareName)"\CurrentVersion"
|
||
ParamKeyName = $(!NTN_ServiceBase)$(ProductHardwareName)"\Parameters"
|
||
;
|
||
; Misc
|
||
;
|
||
NbProviderField = "NbProvider"
|
||
EndPointField = "EndPoint"
|
||
RouteField = "Route"
|
||
ExportField = "Export"
|
||
|
||
[GeneralConstants]
|
||
;
|
||
; Program flow control variables.
|
||
;
|
||
from = ""
|
||
to = ""
|
||
;
|
||
; Return codes; Exit_Code is set to one of these
|
||
;
|
||
ExitCodeOk = 0
|
||
ExitCodeCancel = 1
|
||
ExitCodeFatal = 2
|
||
|
||
KeyNull = ""
|
||
MAXIMUM_ALLOWED = 33554432
|
||
RegistryErrorIndex = NO_ERROR
|
||
KeyProduct = ""
|
||
KeyParameters = ""
|
||
|
||
TRUE = 1
|
||
FALSE = 0
|
||
NoTitle = 0
|
||
|
||
ExitState = "Active"
|
||
OldVersionExisted = $(FALSE)
|
||
|
||
DriverPath = $(!STF_NTPATH)\drivers
|
||
|
||
[date]
|
||
; Now is a list which contains { Sec from 1-1-1970, Year, Month, Day, Hour,
|
||
; Minute, Second }
|
||
Now = {} ? $(!LIBHANDLE) GetSystemDate
|
||
|
||
|
||
;---------------------------------------------------------------------------
|
||
; 1. Identify
|
||
;
|
||
; DESCRIPTION: To verify that this INF deals with the same type of options
|
||
; as we are choosing currently.
|
||
;
|
||
; INPUT: None
|
||
;
|
||
; OUTPUT: $($R0): STATUS: STATUS_SUCCESSFUL
|
||
; $($R1): Option Type (COMPUTER ...)
|
||
; $($R2): Diskette description
|
||
;---------------------------------------------------------------------------
|
||
|
||
[Identify]
|
||
;
|
||
;
|
||
read-syms Identification
|
||
|
||
set Status = STATUS_SUCCESSFUL
|
||
set Identifier = $(OptionType)
|
||
set Media = #("Source Media Descriptions", 1, 1)
|
||
|
||
Return $(Status) $(Identifier) $(Media)
|
||
|
||
;------------------------------------------------------------------------
|
||
; 2. ReturnOptions:
|
||
;
|
||
; DESCRIPTION: To return the option list supported by this INF and the
|
||
; localised text list representing the options.
|
||
;
|
||
;
|
||
; INPUT: $($0): Language used. ( ENG | FRN | ... )
|
||
;
|
||
; OUTPUT: $($R0): STATUS: STATUS_SUCCESSFUL |
|
||
; STATUS_NOLANGUAGE
|
||
; STATUS_FAILED
|
||
;
|
||
; $($R1): Option List
|
||
; $($R2): Option Text List
|
||
;------------------------------------------------------------------------
|
||
|
||
[ReturnOptions]
|
||
;
|
||
;
|
||
set Status = STATUS_FAILED
|
||
set OptionList = {}
|
||
set OptionTextList = {}
|
||
|
||
;
|
||
; Check if the language requested is supported
|
||
;
|
||
set LanguageList = ^(LanguagesSupported, 1)
|
||
Ifcontains(i) $($0) in $(LanguageList)
|
||
goto returnoptions
|
||
else
|
||
set Status = STATUS_NOLANGUAGE
|
||
goto finish_ReturnOptions
|
||
endif
|
||
|
||
;
|
||
; form a list of all the options and another of the text representing
|
||
;
|
||
|
||
returnoptions = +
|
||
set OptionList = ^(Options, 1)
|
||
set OptionTextList = ^(OptionsText$($0), 1)
|
||
set Status = STATUS_SUCCESSFUL
|
||
|
||
finish_ReturnOptions = +
|
||
Return $(Status) $(OptionList) $(OptionTextList)
|
||
|
||
;***********************************************************************
|
||
; SETUP (NTLANMAN) INVOCATION SECTION
|
||
;***********************************************************************
|
||
;------------------------------------------------------------------------
|
||
;
|
||
; InstallOption:
|
||
;
|
||
; This section is shelled to by main installation processing.
|
||
;
|
||
;
|
||
; FUNCTION: To copy files representing Options
|
||
; To configure the installed option
|
||
; To update the registry for the installed option
|
||
;
|
||
; INPUT: $($0): Language to use
|
||
; $($1): OptionID to install
|
||
; $($2): SourceDirectory
|
||
; $($3): AddCopy (YES | NO)
|
||
; $($4): DoCopy (YES | NO)
|
||
; $($5): DoConfig (YES | NO)
|
||
;
|
||
; OUTPUT: $($R0): STATUS: STATUS_SUCCESSFUL |
|
||
; STATUS_NOLANGUAGE |
|
||
; STATUS_USERCANCEL |
|
||
; STATUS_FAILED
|
||
;
|
||
;------------------------------------------------------------------------
|
||
[InstallOption]
|
||
;
|
||
; Set default values for
|
||
;
|
||
set Status = STATUS_FAILED
|
||
|
||
;
|
||
; extract parameters
|
||
;
|
||
set Option = $($1)
|
||
set SrcDir = $($2)
|
||
set AddCopy = $($3)
|
||
set DoCopy = $($4)
|
||
set DoConfig = $($5)
|
||
|
||
;
|
||
; Check if the language requested is supported
|
||
;
|
||
set LanguageList = ^(LanguagesSupported, 1)
|
||
Ifcontains(i) $($0) NOT-IN $(LanguageList)
|
||
Return STATUS_NOLANGUAGE
|
||
endif
|
||
;
|
||
; Call the CommonSection
|
||
;
|
||
Shell "" CommonSection $(Option) $(SrcDir) $(AddCopy) $(DoCopy) $(DoConfig)
|
||
|
||
set Status = $($R0)
|
||
|
||
Return $(Status)
|
||
|
||
[BindingsReview]
|
||
;
|
||
; extract parameters
|
||
;
|
||
set Option = $($1)
|
||
set SrcDir = $($2)
|
||
set AddCopy = $($3)
|
||
set DoCopy = $($4)
|
||
set DoConfig = $($5)
|
||
|
||
Shell "" CommonSection $(Option) $(SrcDir) $(AddCopy) $(DoCopy) $(DoConfig)
|
||
|
||
set Status = $($R0)
|
||
|
||
Return $(Status)
|
||
|
||
|
||
;***********************************************************************
|
||
; COMMON SECTION
|
||
;***********************************************************************
|
||
;------------------------------------------------------------------------
|
||
;
|
||
; CommonSection:
|
||
;
|
||
; This section is shelled to from above by this INF.
|
||
;
|
||
;
|
||
; FUNCTION: To copy files representing Options
|
||
; To configure the installed option
|
||
; To update the registry for the installed option
|
||
;
|
||
; INPUT: $($1): OptionID to install
|
||
; $($2): SourceDirectory
|
||
; $($3): AddCopy (YES | NO)
|
||
; $($4): DoCopy (YES | NO)
|
||
; $($5): DoConfig (YES | NO)
|
||
;
|
||
; OUTPUT: $($R0): STATUS: STATUS_SUCCESSFUL |
|
||
; STATUS_NOLANGUAGE |
|
||
; STATUS_USERCANCEL |
|
||
; STATUS_FAILED
|
||
;
|
||
;------------------------------------------------------------------------
|
||
[CommonSection]
|
||
|
||
StartWait
|
||
;
|
||
; extract parameters
|
||
;
|
||
set Option = $($1)
|
||
set SrcDir = $($2)
|
||
set AddCopy = $($3)
|
||
set DoCopy = $($4)
|
||
set DoConfig = $($5)
|
||
|
||
; define all the constants
|
||
|
||
set-subst LF = "\n"
|
||
|
||
read-syms GeneralConstants
|
||
read-syms FileConstants
|
||
|
||
read-syms DialogConstants$(!STF_LANGUAGE)
|
||
read-syms FileConstants$(!STF_LANGUAGE)
|
||
|
||
detect date
|
||
|
||
set-title $(FunctionTitle)
|
||
|
||
set to = Begin
|
||
set from = Begin
|
||
;
|
||
; Assume all is well.
|
||
;
|
||
set CommonStatus = STATUS_SUCCESSFUL
|
||
;
|
||
; Set up the operation-mode-based variables and gaily welcome
|
||
; the user. If the "install mode" variable is improperly set,
|
||
; assume this is a new installation.
|
||
;
|
||
Begin = +
|
||
;
|
||
; Open Service key
|
||
;
|
||
OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_ServiceBase) $(MAXIMUM_ALLOWED) ServiceKey
|
||
|
||
Ifstr $(ServiceKey) == $(KeyNull)
|
||
set RegistryErrorIndex = $($R0)
|
||
goto fatalregistry
|
||
endif
|
||
|
||
;
|
||
; Set the result values to {empty}
|
||
;
|
||
; List of Route strings from NetBIOS; element form {<NetBIOS linkage route string>}
|
||
;
|
||
Set RouteInformationList = {}
|
||
;
|
||
; Get the Linkage information from the NetBIOS service. If the NetBIOS key doesn't
|
||
; exist, then assume we're not wanted and exit quietly.
|
||
;
|
||
OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_ServiceBase)"\NetBIOS\Linkage" $(MAXIMUM_ALLOWED) NbKey
|
||
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
||
;
|
||
; NetBIOS service isn't present. Bail out.
|
||
;
|
||
Debug-Output "NBINFO.INF: could not open CurrentControlSet\Services\NetBIOS\Linkage key"
|
||
goto successful
|
||
Endif
|
||
;
|
||
; First the active bindings Route data.
|
||
;
|
||
GetRegValue $(NbKey) Route RouteListValue
|
||
Ifint $(RegLastError) != 0
|
||
Debug-Output "NBINFO.INF: Error reading NetBIOS\Linkage:Route value: "$(RegLastError)
|
||
Set RouteList = {}
|
||
Else
|
||
Set RouteList = *($(RouteListValue),4)
|
||
Endif
|
||
|
||
set ActiveRouteList = $(RouteList)
|
||
|
||
ForListDo $(RouteList)
|
||
Debug-Output "NBINFO.INF: Adding NetBIOS route value: "$($)
|
||
Set RouteInformationList = >($(RouteInformationList),$($))
|
||
EndForListDo
|
||
;
|
||
; Read the disabled binding route information; add it to the list
|
||
;
|
||
OpenRegKey $(NbKey) "" "Disabled" $(MAXIMUM_ALLOWED) NbDisKey
|
||
Ifstr(i) $(NbDisKey) != $(KeyNull)
|
||
Set RouteList = {}
|
||
GetRegValue $(NbDisKey) Route RouteListValue
|
||
Ifint $(RegLastError) == 0
|
||
Set RouteList = *($(RouteListValue),4)
|
||
Endif
|
||
|
||
ForListDo $(RouteList)
|
||
Debug-Output "NBINFO.INF: Adding DISABLED NetBIOS route value: "$($)
|
||
Set RouteInformationList = >($(RouteInformationList),$($))
|
||
EndForListDo
|
||
CloseRegKey $(NbDisKey)
|
||
Endif
|
||
|
||
CloseRegKey $(NbKey)
|
||
|
||
Debug-Output "NBINFO.INF: open N/B info service"
|
||
;
|
||
; Open the service key in registry.
|
||
; If key isn't there, perform [CreateService].
|
||
;
|
||
; Leave the Parameters key open for later use.
|
||
;
|
||
OpenRegKey $(ServiceKey) "" "NetBIOSInformation" $(MAXIMUM_ALLOWED) NetBIOSKey
|
||
|
||
Ifstr(i) $(NetBIOSKey) == ""
|
||
Shell $(UtilityInf), CreateService, "NetBIOSInformation", "NetBIOSInformation", "", "adapter", "", {}, ""
|
||
|
||
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
||
Debug-Output "NBINFO.INF: Shell error creating service"
|
||
goto ShellCodeError
|
||
endif
|
||
|
||
set RegistryErrorIndex = $($R0)
|
||
Set ParameterKey = $($R2)
|
||
CloseRegKey $($R1)
|
||
CloseRegKey $($R3)
|
||
Else
|
||
;
|
||
; Create the Linkage and Parameters keys.
|
||
;
|
||
OpenRegKey $(NetBIOSKey) "" "Linkage" $(MAXIMUM_ALLOWED) LinkageKey
|
||
Ifstr(i) $(LinkageKey) == $(KeyNull)
|
||
CreateRegKey $(NetBIOSKey) { "Linkage", $(NoTitle), GenericClass } "" $(MAXIMUM_ALLOWED) "" LinkageKey
|
||
Endif
|
||
CloseRegKey $(LinkageKey)
|
||
|
||
OpenRegKey $(NetBIOSKey) "" "Parameters" $(MAXIMUM_ALLOWED) ParameterKey
|
||
Ifstr(i) $(ParameterKey) == $(KeyNull)
|
||
CreateRegKey $(NetBIOSKey) { "Parameters", $(NoTitle), GenericClass } "" $(MAXIMUM_ALLOWED) "" ParameterKey
|
||
Endif
|
||
CloseRegKey $(NetBIOSKey)
|
||
Endif
|
||
|
||
Ifstr(i) $(ParameterKey) == $(KeyNull)
|
||
read-syms FatalError1$(!STF_LANGUAGE)
|
||
goto fatal
|
||
Endif
|
||
|
||
;
|
||
; Prune old information from NetBIOSInformation\Parameters key.
|
||
;
|
||
; Iterate the Route list. Any routes found which are not currently associated
|
||
; with the NetBIOS service are removed, along with their LanaNum<n> and EnumExport<n>
|
||
; values.
|
||
;
|
||
GetRegValue $(ParameterKey) "Route" OrigRouteValue
|
||
Ifint $(RegLastError) == 0
|
||
Set OrigRouteList = *($(OrigRouteValue), 4)
|
||
ifstr(i) $(OrigRouteList) == ""
|
||
set OrigRouteList = {}
|
||
Endif
|
||
Set OrigIndex = 0
|
||
Set NewIndex = 0
|
||
Set AnyChanges = 0
|
||
Set CurrentRouteList = {}
|
||
Set NewValueList = {}
|
||
ForListDo $(OrigRouteList)
|
||
Set-add OrigIndex = $(OrigIndex),1
|
||
Set ThisOrigRoute = $($)
|
||
ifContains(i) $(ThisOrigRoute) NOT-IN $(RouteInformationList)
|
||
;
|
||
; A route value has disappeared from the NetBIOS service.
|
||
; Remove the corresponding LanaNum and EnumExport values.
|
||
;
|
||
Debug-Output "NBINFO.INF: Removing info for old route: "$(ThisOrigRoute)", index "$(OrigIndex)
|
||
DeleteRegValue $(ParameterKey) LanaNum$(OrigIndex)
|
||
DeleteRegValue $(ParameterKey) EnumExport$(OrigIndex)
|
||
Set AnyChanges = 1
|
||
Else
|
||
Set CurrentRouteList = >($(CurrentRouteList),$(ThisOrigRoute))
|
||
Set-add NewIndex = $(NewIndex),1
|
||
GetRegValue $(ParameterKey) LanaNum$(OrigIndex) OrigLanaValue
|
||
Set OrigLanaNum = *($(OrigLanaValue),4)
|
||
GetRegValue $(ParameterKey) EnumExport$(OrigIndex) OrigExportValue
|
||
Set OrigExport = *($(OrigExportValue),4)
|
||
set NewValueList = >($(NewValueList),{LanaNum$(NewIndex), $(NoTitle), $(!REG_VT_DWORD), $(OrigLanaNum) })
|
||
set NewValueList = >($(NewValueList),{EnumExport$(NewIndex), $(NoTitle), $(!REG_VT_DWORD), $(OrigExport)})
|
||
Endif
|
||
EndForListDo
|
||
|
||
Ifint $(AnyChanges) != 0
|
||
DeleteNextOldLana = +
|
||
Ifint $(NewIndex) <= $(OrigIndex)
|
||
Debug-Output "NBINFO.INF: pruning old lana info for index = "$(NewIndex)
|
||
DeleteRegValue $(ParameterKey) LanaNum$(NewIndex)
|
||
DeleteRegValue $(ParameterKey) EnumExport$(NewIndex)
|
||
Set-add NewIndex = $(NewIndex),1
|
||
Goto DeleteNextOldLana
|
||
Endif
|
||
|
||
Debug-Output "NBINFO.INF: updating Route, LanaNumX and EnumExportX after pruning"
|
||
Set NewValueList = >($(NewValueList),{Route, $(NoTitle), $(!REG_VT_MULTI_SZ), $(CurrentRouteList)})
|
||
Shell $(UtilityInf), AddValueList, $(ParameterKey), $(NewValueList)
|
||
Endif
|
||
Endif
|
||
|
||
;
|
||
; Get the registry values; algorithm:
|
||
;
|
||
; Read the existing information into a list.
|
||
;
|
||
Debug-Output "NBINFO.INF: Access N/B info route data"
|
||
|
||
GetRegValue $(ParameterKey) "Route" OldRouteValue
|
||
set OldRouteList = *($(OldRouteValue), 4)
|
||
ifstr(i) $(OldRouteList) == ""
|
||
set OldRouteList = {}
|
||
Endif
|
||
|
||
Debug-Output "NBINFO.INF: Enumerate N/B info lananums"
|
||
EnumRegValue $(ParameterKey) ParameterValue
|
||
Set HighLana = 0
|
||
set UsedLanaNum = {}
|
||
ForListDo $(ParameterValue)
|
||
set LanaNumName = *($($), 1)
|
||
Set LanaNumNum = *($($), 4)
|
||
LibraryProcedure Result $(!LIBHANDLE) SetupStrncmp $(LanaNumName) "LanaNum" 7
|
||
ifint $(Result) == 0
|
||
Ifint $(HighLana) < $(LanaNumNum)
|
||
Set HighLana = $(LanaNumNum)
|
||
Endif
|
||
|
||
set UsedLanaNum = >($(UsedLanaNum),$(LanaNumNum))
|
||
;
|
||
; remember the zero position
|
||
;
|
||
ifint $(LanaNumNum) == 0
|
||
set LanaZeroNum = $(LanaNumName)
|
||
endif
|
||
;
|
||
; declare a variable for RPC support: "RpcLanaNum<n> = <n>"
|
||
;
|
||
Set Rpc$(LanaNumName) = $(LanaNumNum)
|
||
endif
|
||
EndForListDo
|
||
|
||
Set NewValueList = {}
|
||
Set RpcLanaList = {}
|
||
Set RpcProtoList = {}
|
||
QueryListSize Position $(OldRouteList)
|
||
Set LanaNum = 0
|
||
Set AnyChanges = 0
|
||
Set LanaXnsNum = ""
|
||
|
||
ForListDo $(RouteInformationList)
|
||
Set ThisRoute = $($)
|
||
ifContains(i) $(ThisRoute) NOT-IN $(OldRouteList)
|
||
;
|
||
; New route; add it to the old list.
|
||
; Then find first unused LanaNum.
|
||
;
|
||
Debug-Output "NBINFO.INF: New route to be added: "$(ThisRoute)
|
||
Set-add Position = $(Position), 1
|
||
Set OldRouteList = >($(OldRouteList), $(ThisRoute))
|
||
Set AnyChanges = 1
|
||
|
||
TryAgain = +
|
||
ifContains(i) $(LanaNum) IN $(UsedLanaNum)
|
||
set-add LanaNum = $(LanaNum), 1
|
||
goto TryAgain
|
||
else
|
||
ifint $(LanaNum) == 0
|
||
set LanaZeroNum = "LanaNum"$(Position)
|
||
endif
|
||
Debug-Output "NBINFO.INF: LanaNum "$(LanaNum)" assigned to "$(ThisRoute)
|
||
set NewValueList = >($(NewValueList),{LanaNum$(Position), $(NoTitle), $(!REG_VT_DWORD), $(LanaNum) })
|
||
set NewValueList = >($(NewValueList),{EnumExport$(Position), $(NoTitle), $(!REG_VT_DWORD), 1})
|
||
set UsedLanaNum = >($(UsedLanaNum), $(LanaNum))
|
||
Set RpcLanaNum$(Position) = $(LanaNum)
|
||
Ifint $(HighLana) < $(LanaNum)
|
||
Set HighLana = $(LanaNum)
|
||
Endif
|
||
set-add LanaNum = $(LanaNum), 1
|
||
endif
|
||
;
|
||
; hack: always set xns lananum to 0
|
||
; BUGBUG: this should be based upon an "MS Campus" flag!
|
||
;
|
||
set FLibraryErrCtl = 1
|
||
LibraryProcedure Result $(!NCPA_HANDLE) EqualToXnsRoute $(ThisRoute)
|
||
ifstr(i) $(Result) == "1"
|
||
set LanaXnsNum = "LanaNum"$(Position)
|
||
endif
|
||
endif
|
||
;
|
||
; Locate the position of this route in the newly-updated OldRouteList.
|
||
; Build lists containing RPC lanas and protocol suffix strings.
|
||
;
|
||
Set RouteIndex = ~($(OldRouteList),$(ThisRoute))
|
||
Set ThisLana = $(RpcLanaNum$(RouteIndex))
|
||
;
|
||
; Locate the provider for this route. Strip the name of the first service from
|
||
; the route, open its "Parameters" key, get its "NbProvider" value.
|
||
;
|
||
LibraryProcedure CEPSTemp $(!NCPA_HANDLE) CPlSetup $(!STF_HWND), ROUTETOLIST, $(ThisRoute)
|
||
Set ThisProto = ""
|
||
Set ThisService = *($(CEPSTemp),2)
|
||
Debug-Output "NBINFO.INF: CEPS: "$(ThisRoute)" = "$(CEPSTemp)", ThisService = "$(ThisService)
|
||
OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_ServiceBase)"\"$(ThisService)"\Parameters" $(!REG_KEY_READ) SrvParmKey
|
||
Ifint $(RegLastError) == 0
|
||
GetRegValue $(SrvParmKey) $(NbProviderField) NbProviderData
|
||
Ifint $(RegLastError) == 0
|
||
Set ThisProto = *($(NbProviderData),4)
|
||
Debug-Output "NBINFO.INF: Service "$(ThisService)" is a NetBIOS provider: "$(ThisProto)
|
||
Set RpcSuffixCount$(ThisProto) = 0
|
||
Set RpcLanaList = >($(RpcLanaList),$(ThisLana))
|
||
Set RpcProtoList = >($(RpcProtoList),$(ThisProto))
|
||
Else
|
||
Debug-Output "NBINFO.INF: "$(ThisService)"\Parameters has no NbProvider value"
|
||
Endif
|
||
CloseRegKey $(SrvParmKey)
|
||
Else
|
||
Debug-Output "NBINFO.INF: open of key "$(ThisService)"\Parameters FAILED; no provider info"
|
||
Endif
|
||
|
||
Debug-Output "NBINFO.INF: RPC string for route "$(ThisRoute)" is "$(ThisProto)" = "$(ThisLana)
|
||
EndForListDo
|
||
|
||
Ifint $(AnyChanges) != 0
|
||
Debug-Output "NBINFO.INF: Update Parameters..."
|
||
Set NewValueList = >($(NewValueList),{Route, $(NoTitle), $(!REG_VT_MULTI_SZ), $(OldRouteList)})
|
||
Shell $(UtilityInf), AddValueList, $(ParameterKey), $(NewValueList)
|
||
Endif
|
||
|
||
set ExportNum = 1
|
||
ForListDo $(OldRouteList)
|
||
Set ThisRoute = *($($),1)
|
||
Set ThisProto = *($($),2)
|
||
; setup the EnumExport value
|
||
LibraryProcedure "" $(!NCPA_HANDLE) SetEnumExport $(ExportNum) $(ThisRoute)
|
||
set-add ExportNum = $(ExportNum), 1
|
||
EndForListDo
|
||
|
||
;
|
||
; hack: always set xns lananum to 0
|
||
; BUGBUG: this should be based upon an "MS Campus" flag!
|
||
;
|
||
ifstr(i) $(LanaXnsNum) != ""
|
||
GetRegValue $(ParameterKey) $(LanaXnsNum) LanaXnsInfo
|
||
GetRegValue $(ParameterKey) $(LanaZeroNum) LanaZeroInfo
|
||
set XnsNum = *($(LanaXnsInfo), 4)
|
||
set ZeroNum = *($(LanaZeroInfo), 4)
|
||
SetRegValue $(ParameterKey) {$(LanaXnsNum),$(NoTitle),$(!REG_VT_DWORD),$(ZeroNum)}
|
||
SetRegValue $(ParameterKey) {$(LanaZeroNum),$(NoTitle),$(!REG_VT_DWORD),$(XnsNum)}
|
||
Endif
|
||
|
||
CloseRegKey $(ParameterKey)
|
||
|
||
set FLibraryErrCtl = 1
|
||
LibraryProcedure "" $(!NCPA_HANDLE), CPlSetupLanaMap
|
||
|
||
EndWait
|
||
;
|
||
; Using the lists build above, update the RPC NetBIOS information in the
|
||
; SOFTWARE hive.
|
||
;
|
||
; This starts by deleting the NetBios key to reset all values, then the key is
|
||
; recreated and the new values are added. Uses the lists $(RpcLanaList)
|
||
; and $(RpcProtoList). The values $(RpcSuffixCount<suffix)) have already been
|
||
; set to zero.
|
||
;
|
||
; This bizarro logic is necessary because RPC wants to have its protocol strings
|
||
; sorted into LANA order. There can be no gaps in the numbering of protocol strings,
|
||
; but there may be gaps in the numbering of LANAs.
|
||
;
|
||
OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Rpc" $(MAXIMUM_ALLOWED) KeyRpc
|
||
|
||
Ifstr(i) $(KeyRpc) == ""
|
||
Debug-Output "NBINFO.INF: Unable to open RPC software key"
|
||
goto successful
|
||
Endif
|
||
|
||
Set RpcValueList = {}
|
||
|
||
Set NextLana = 0
|
||
|
||
OpenRegKey $(!REG_H_LOCAL) "" "System\CurrentControlSet\Services\NetBIOS\Linkage" $(MAXIMUM_ALLOWED) NetBiosLinkage
|
||
ifstr(i) $(NetBiosLinkage) != ""
|
||
GetRegValue $(NetBiosLinkage) "LanaMap" LanaMapInfo
|
||
set BindedLana = {}
|
||
set Odd = 1
|
||
ForListDo *($(LanaMapInfo),4)
|
||
ifint $(Odd) == 1
|
||
set Odd = 0
|
||
else
|
||
set Odd = 1
|
||
ifstr $(BindedLana) == {}
|
||
set BindedLana = $($)
|
||
else
|
||
set BindedLana = >($(BindedLana),$($))
|
||
endif
|
||
endif
|
||
EndForListDo
|
||
CloseRegKey $(NetBiosLinkage)
|
||
endif
|
||
;
|
||
; Increment through all the possible LANAs. If one is used for RPC, generate
|
||
; the appropriate protocol string and LANA number value; then update the
|
||
; suffix for that protocol.
|
||
;
|
||
trynextlana = +
|
||
Debug-Output "Binded Lana:"$(BindedLana)
|
||
Debug-Output "NBINFO.INF: HighLana = "$(HighLana)", LanaXnsNum = "$(LanaXnsNum)", XnsNum = "$(XnsNum)", ZeroNum = "$(ZeroNum)
|
||
Ifint $(NextLana) > $(HighLana)
|
||
goto updaterpc
|
||
Endif
|
||
|
||
Ifcontains(i) $(NextLana) in $(RpcLanaList)
|
||
Set Index = ~($(RpcLanaList),$(NextLana))
|
||
Set ThisProto = *($(RpcProtoList),$(Index))
|
||
Set NextSuffix = $(RpcSuffixCount$(ThisProto))
|
||
Set-add RpcSuffixCount$(ThisProto) = $(NextSuffix),1
|
||
Set ThisString = "ncacn_nb"$(ThisProto)$(NextSuffix)
|
||
Set UseLana = $(NextLana)
|
||
Ifstr(i) $(LanaXnsNum) != ""
|
||
Ifint $(NextLana) == $(XnsNum)
|
||
Set UseLana = $(ZeroNum)
|
||
Else-ifint $(NextLana) == $(ZeroNum)
|
||
Set UseLana = $(XnsNum)
|
||
Endif
|
||
Endif
|
||
Debug-Output "NBINFO.INF: RPC string = "$(ThisString)", lana = "$(UseLana)
|
||
ifcontains(i) $(UseLana) in $(BindedLana)
|
||
Set RpcValueList = >($(RpcValueList),{$(ThisString),$(NoTitle),$(!REG_VT_DWORD),$(UseLana)})
|
||
endif
|
||
Endif
|
||
|
||
Set-add NextLana = $(NextLana),1
|
||
Goto trynextlana
|
||
|
||
updaterpc = +
|
||
;
|
||
; Delete the Rpc\NetBios key, recreate it, append the generated values.
|
||
; The result of the deletion operation is not checked, since recreation will
|
||
; fail if the key already exists.
|
||
;
|
||
Set KeyNameNetBios = "NetBios"
|
||
DeleteRegKey $(KeyRpc) $(KeyNameNetBios)
|
||
CreateRegKey $(KeyRpc) { $(KeyNameNetBios), $(NoTitle), GenericClass } "" $(MAXIMUM_ALLOWED) "" KeyNetBios
|
||
Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
|
||
Debug-Output "NBINFO.INF: RpcValueList = "$(RpcValueList)
|
||
Shell $(UtilityInf), AddValueList, $(KeyNetBios), $(RpcValueList)
|
||
CloseRegKey $(KeyNetBios)
|
||
Else
|
||
Debug-Output "NBINFO.INF: Rpc\Netbios key recreation failed"
|
||
Endif
|
||
|
||
CloseRegKey $(KeyRpc)
|
||
|
||
goto successful
|
||
|
||
; Escape hatches
|
||
;
|
||
successful = +
|
||
;
|
||
goto end
|
||
;
|
||
; warning display
|
||
;
|
||
warning = +
|
||
Shell $(subroutineinf) SetupMessage, $(!STF_LANGUAGE), "WARNING", $(Error)
|
||
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
||
goto ShellCodeError
|
||
endif
|
||
ifstr(i) $($R1) == "OK"
|
||
goto $(to)
|
||
else-ifstr(i) $($R1) == "CANCEL"
|
||
goto $(from)
|
||
else
|
||
; Debug-Msg "Error Error Bad DLGEVENT"
|
||
goto "end"
|
||
endif
|
||
|
||
|
||
;
|
||
; non fatal error display
|
||
;
|
||
nonfatal = +
|
||
Shell $(subroutineinf) SetupMessage, $(!STF_LANGUAGE), "NONFATAL", $(Error)
|
||
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
||
goto ShellCodeError
|
||
endif
|
||
ifstr(i) $($R1) == "OK"
|
||
goto $(from)
|
||
else
|
||
goto "end"
|
||
endif
|
||
|
||
;
|
||
; Registry is broken
|
||
;
|
||
fatalregistry = +
|
||
Shell $(UtilityInf) RegistryErrorString $(RegistryErrorIndex)
|
||
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
||
goto ShellCodeError
|
||
endif
|
||
set Error = $($R0)
|
||
goto fatal
|
||
;
|
||
; fatal error display
|
||
;
|
||
fatal = +
|
||
Shell $(subroutineinf) SetupMessage, $(!STF_LANGUAGE), "FATAL", $(Error)
|
||
ifint $($ShellCode) != $(!SHELL_CODE_OK)
|
||
goto ShellCodeError
|
||
endif
|
||
|
||
goto setfailed
|
||
|
||
;
|
||
; Shelling error
|
||
;
|
||
ShellCodeError = +
|
||
set DlgType = "MessageBox"
|
||
set STF_MB_TITLE = $(ShellCodeErrorTitle)
|
||
set STF_MB_TEXT = $(ShellCodeErrorText)
|
||
set STF_MB_TYPE = 1
|
||
set STF_MB_ICON = 3
|
||
set STF_MB_DEF = 1
|
||
ui start "Error Message"
|
||
goto setfailed
|
||
|
||
setfailed = +
|
||
set CommonStatus = STATUS_FAILED
|
||
goto end
|
||
|
||
end = +
|
||
goto term
|
||
|
||
term = +
|
||
Return $(CommonStatus)
|
||
|
||
;------------------------------------------------------------------------
|
||
;
|
||
; CheckMixRpcProtocol
|
||
;
|
||
; During review binding, this function will be called by other
|
||
; inf file. The function will check whether the binding is
|
||
; disabled or not. If it is disabled, it will remove the RPC client
|
||
; and server protocol
|
||
;
|
||
;
|
||
; FUNCTION: Check active binding for netbios
|
||
; remove or add the rpc client or server protocol
|
||
;
|
||
; INPUT: $($0): Netbios Related protocol name (eg, NetBT)
|
||
; $($1): Length of $($0)
|
||
; $($2): actual protocol name (eg, tcpip)
|
||
; $($3): rpc tag (eg, ncacn_nb_tcp)
|
||
; $($4): rpc client dll
|
||
; $($5): rpc server dll
|
||
;
|
||
;------------------------------------------------------------------------
|
||
[CheckMixRpcProtocol]
|
||
read-syms GeneralConstants
|
||
read-syms FileConstants
|
||
|
||
OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_ServiceBase)"\NetBIOS\Linkage" $(MAXIMUM_ALLOWED) NbKey
|
||
Ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
|
||
goto CheckMixRpcProtocolReturn
|
||
endif
|
||
;
|
||
; First get the active bindings Route data.
|
||
;
|
||
GetRegValue $(NbKey) Route RouteListValue
|
||
Ifint $(RegLastError) != 0
|
||
Debug-Output "NBINFO.INF: Error reading NetBIOS\Linkage:Route value: "$(RegLastError)
|
||
Set RouteList = {}
|
||
Else
|
||
Set RouteList = *($(RouteListValue),4)
|
||
Endif
|
||
|
||
set ActiveRouteList = $(RouteList)
|
||
set CheckedProtocol = """"$($0)""""
|
||
set-add Length = $($1),2
|
||
set AddedProtocol = $($2)
|
||
set AddedRpcString = $($3)
|
||
set AddedClientDLL = $($4)
|
||
set AddedServerDLL = $($5)
|
||
set Find = 0
|
||
ForListDo $(ActiveRouteList)
|
||
;
|
||
; see whether we have the related binding
|
||
;
|
||
LibraryProcedure Result $(!LIBHANDLE) SetupStrncmp $($) $(CheckedProtocol) $(Length)
|
||
ifint $(Result) == 0
|
||
set Find = 1
|
||
goto FindIt
|
||
endif
|
||
EndForListDo
|
||
FindIt = +
|
||
ifint $(Find) == 1
|
||
;
|
||
; Add the rpc stuff if we have active binding
|
||
;
|
||
Shell $(UtilityInf) AddMixRpcProtocol "Netbios" $(AddedProtocol) $(AddedRpcString) $(AddedClientDLL) $(AddedServerDLL)
|
||
else
|
||
;
|
||
; remove the rpc stuff if we don't have the active binding
|
||
;
|
||
Shell $(UtilityInf) RemoveRpcProtocol $(AddedRpcString)
|
||
endif
|
||
CheckMixRpcProtocolReturn = +
|
||
return
|
||
|