;******************************************************************************
; PPP over Ethernet Protocol
; Windows NT 4.0 NDIS Intermediate Driver INF
; written by Robert Schlabbach (normanb@cs.TU-Berlin.DE)
; Copyright (C) 2000-2002 by Robert Schlabbach
;******************************************************************************
[Identification]
OptionType = NetTransport
[LanguagesSupported]
ENG
[Options]
RASPPPOE
[OptionsTextENG]
RASPPPOE = "PPP over Ethernet Protocol"
[FileConstants]
; manufacturer and product constants
Manufacturer = "Robert Schlabbach"
ProductMajorVersion = "0"
ProductMinorVersion = "98"
ProductVersion = $(ProductMajorVersion)"."$(ProductMinorVersion)
ProductImagePath = "\SystemRoot\System32\Drivers\RMSPPPOE.SYS"
EventMessageFile = "%SystemRoot%\System32\RASPPPOE.DLL"
; protocol default properties
EventLogging = 7
LimitTCPMSS = 1
LinkSpeed = 0
OverrideMTU = 0
WanEndPoints = 1
; protocol portion constants
ProtocolName = "RMSPPPOE"
ProtocolType = "transport"
ProtocolNetRuleType = "rmspppoe rmspppoe"
ProtocolNetRuleUse = $(ProtocolType)" none none"
ProtocolNetRuleBindForm = """rmspppoe"" yes yes container"
ProtocolNetRuleClass = {"rmspppoe basic"}
ProtocolNetRuleBindable = {"rmspppoe ndisDriver non non 100"}
; protocol portion registry subkey names
ProtocolProductKeyName = $(!NTN_SoftwareBase)"\"$(Manufacturer)"\"$(ProtocolName)"\CurrentVersion"
ProtocolServiceKeyName = $(!NTN_ServiceBase)"\"$(ProtocolName)
ProtocolLinkageKeyName = $(!NTN_ServiceBase)"\"$(ProtocolName)"\Linkage"
ProtocolParamsKeyName = $(!NTN_ServiceBase)"\"$(ProtocolName)"\Parameters"
; miniport portion constants
MiniportName = "RASPPPOE"
MiniportType = "driver"
MiniportNetRuleType = "raspppoeSys raspppoeDriver"
MiniportNetRuleUse = $(MiniportType)
MiniportNetRuleBindForm = """raspppoeSys"" yes no container"
MiniportNetRuleClass = {"raspppoeDriver basic"}
MiniportNetRuleBindable = {"raspppoeDriver raspppoeAdapter non exclusive 100"}
; miniport portion registry subkey names
MiniportProductKeyName = $(!NTN_SoftwareBase)"\"$(Manufacturer)"\"$(MiniportName)"\CurrentVersion"
MiniportServiceKeyName = $(!NTN_ServiceBase)"\"$(MiniportName)
MiniportLinkageKeyName = $(!NTN_ServiceBase)"\"$(MiniportName)"\Linkage"
MiniportParamsKeyName = $(!NTN_ServiceBase)"\"$(MiniportName)"\Parameters"
; virtual adapter constants
HardwareNetRuleType = "raspppoe raspppoeAdapter"
HardwareNetRuleClass = {"raspppoeAdapter basic"}
HardwareNetRuleBindForm = " yes yes container"
; TAPI devices registry subkey names and TAPI media type
MicrosoftRasKeyName = $(!NTN_SoftwareBase)"\Microsoft\RAS"
DeviceMapKeyName = "HARDWARE\DEVICEMAP"
TapiDevicesKeyName = "TAPI DEVICES"
TapiMediaType = "PPPoE"
; NDISWAN parameters registry subkey name, IPMTU value name and limits
NdisWanParamsKeyName = $(!NTN_ServiceBase)"\NdisWan\Parameters"
NdisWanIPMTUValueName = "IPMTU"
MINPPPOEMTU = 576
MAXPPPOEMTU = 1492
; NetworkCards registry subkey name
NetworkCardsKeyName = $(!NTN_SoftwareBase)"\Microsoft\Windows NT\CurrentVersion\NetworkCards"
; uninstall registry subkey name
UninstallKeyName = $(!NTN_SoftwareBase)"\Microsoft\Windows\CurrentVersion\Uninstall\RASPPPOE"
; general constants
UtilityINF = "UTILITY.INF"
SubroutineINF = "SUBROUTN.INF"
[FileConstantsENG]
; display names
ProtocolDisplayName = "PPP over Ethernet Protocol"
MiniportDisplayName = "PPP over Ethernet Miniport"
; protocol description
ProtocolDescription = "Allows making PPP connections through Ethernet adapters according to RFC 2516. Required for connections with many broadband service providers."
; dialog string constants
FunctionTitle = "PPP over Ethernet Protocol"
ShellCodeErrorTitle = "Error: "$(FunctionTitle)
ShellCodeErrorText = "Shell Code Error."
; progress gauge strings
ProCaption = "PPP over Ethernet Protocol Setup"
ProText1 = "Copying:"
ProText2 = "To:"
ProCancel = "Cancel"
ProCancelCap = "PPP over Ethernet Protocol Setup Message"
ProCancelMsg = "The protocol is not correctly installed. Are you sure you want to cancel copying files?"
[DialogConstantsENG]
; dialog box strings
Cancel = "Cancel"
Continue = "Continue"
Exit = "Cancel"
Help = "&Help"
HelpContext = ""
OK = "OK"
; Remote Access Service (RAS) install message
InstallRasMsg = "The Remote Access Service (Dial-Up Networking) "+
"must now be installed."$(!LF)$(!LF)+
"When prompted for Windows NT files, you should "+
"specify the location of the last SERVICE PACK "+
"you had applied. "$(!LF)+
"If you specify the location of the original "+
"Windows NT files, you will have to re-apply "+
"the Service Pack after installation. "$(!LF)$(!LF)+
"When the ""Remote Access Setup"" dialog box "+
"comes up, just click the ""Continue"" button "+
"to complete the installation."
; configuration control panel warning message
NoAdaptersMsg = "Could not find any network adapter the PPP over "+
"Ethernet Protocol is currently bound to."$(!LF)+
"There are no properties to configure. Review the "+
"protocol bindings on the Bindings tab."
[GeneralConstants]
ExitCodeOk = 0
ExitCodeCancel = 1
ExitCodeFatal = 2
KeyNull = ""
MAXIMUM_ALLOWED = 33554432
RegistryErrorIndex = NO_ERROR
KeyProduct = ""
KeyParameters = ""
TRUE = 1
FALSE = 0
NoTitle = 0
[Source Media Descriptions]
1 = "PPP over Ethernet Protocol Installation Diskette", TAGFILE = RMSPPPOE.SYS
[RASPPPOE.Files.DLL]
1, RASPPPOE.DLL
1, RASPPPOE.EXE
[RASPPPOE.Files.SYS]
1, RMSPPPOE.SYS
[Date]
; retrieve the current system date
Now = {} ? $(!LIBHANDLE) GetSystemDate
;------------------------------------------------------------------------------
; The Identify Section - Return the type of driver this INF file can install
;------------------------------------------------------------------------------
[Identify]
; read identification symbols
Read-Syms Identification
; set return values
Set Status = STATUS_SUCCESSFUL
Set Identifier = $(OptionType)
Set Media = #("Source Media Descriptions", 1, 1)
; return results
Return $(Status) $(Identifier) $(Media)
;------------------------------------------------------------------------------
; The ReturnOptions Section - Return the options this INF file can install
;------------------------------------------------------------------------------
[ReturnOptions]
; retrieve list of supported languages
Set LanguageList = ^(LanguagesSupported, 1)
; check if the requested language is in the list
IfContains(i) $($0) In $(LanguageList)
; set return values
Set Status = STATUS_SUCCESSFUL
Set OptionList = ^(Options, 1)
Set OptionTextList = ^(OptionsText$($0), 1)
Else
; requested language is not supported
Set Status = STATUS_NOLANGUAGE
Set OptionList = {}
Set OptionTextList = {}
EndIf
; return results
Return $(Status) $(OptionList) $(OptionTextList)
;------------------------------------------------------------------------------
; The InstallOption Section - Install the user selected option
;------------------------------------------------------------------------------
[InstallOption]
; retrieve parameters
Set Language = $($0)
Set Option = $($1)
Set SrcDir = $($2)
Set AddCopy = $($3)
Set DoCopy = $($4)
Set DoConfig = $($5)
; retrieve list of supported languages
Set LanguageList = ^(LanguagesSupported, 1)
; check if the requested language is in the list
IfContains(i) $($0) Not-In $(LanguageList)
; requested language is not supported
Set Status = STATUS_NOLANGUAGE
GoTo InstallOptionEnd
EndIf
; assume success
Set Status = STATUS_SUCCESSFUL
; read symbol constants
Read-Syms FileConstants
Read-Syms FileConstants$(!STF_LANGUAGE)
Read-Syms DialogConstants$(!STF_LANGUAGE)
Read-Syms GeneralConstants
; change Continue dialog string if invoked from the NCPA
IfStr(i) $(!NTN_Origination) == "NCPA"
Set Continue = $(OK)
EndIf
; get the current system date
Detect Date
; initialize installer
Set-Title $(FunctionTitle)
EndWait
; determine the installer mode
IfStr(i) $(!NTN_InstallMode) == "Install"
Set StartLabel = Install
Else-IfStr(i) $(!NTN_InstallMode) == "Bind"
Set StartLabel = Bind
Else-IfStr(i) $(!NTN_InstallMode) == "Configure"
Set StartLabel = Configure
Else-IfStr(i) $(!NTN_InstallMode) == "DeInstall"
Set StartLabel = DeInstall
Else-IfStr(i) $(!NTN_InstallMode) == "Update"
Set StartLabel = Update
Else
; requested installer mode is not supported
Set Status = STATUS_NOTSUPPORTED
GoTo InstallOptionEnd
Endif
; jump to the selected installer function
GoTo $(StartLabel)
;------------------------------------------------------------------------------
; The InstallOption Install Subsection - Install the protocol
;------------------------------------------------------------------------------
Install = +
; check if the protocol is already installed
OpenRegKey $(!REG_H_LOCAL) "" $(ProtocolProductKeyName) +
$(MAXIMUM_ALLOWED) ProtocolProductKey
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; registry subkey already exists, close it
CloseRegKey $(ProtocolProductKey)
; display a message that the protocol is already installed
Shell $(UtilityINF) VerExistedDlg $(ProtocolDisplayName) $(ProductVersion)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
; exit from the installer
GoTo InstallOptionEnd
EndIf
; install the protocol
StartWait
; check if to copy the installation files
IfStr(i) $(DoCopy) == "YES"
; ask for the source directory
Shell $(UtilityINF) DoAskSource $(!STF_CWDDIR) $(SrcDir) "YES"
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
; check if the result is failure
IfStr(i) $($R0) == "STATUS_FAILED"
Shell $(UtilityINF) RegistryErrorString "ASK_SOURCE_FAIL"
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
Set Error = $($R0)
GoTo FatalError
EndIf
; check if the user canceled the operation
IfStr(i) $($R0) == "STATUS_USERCANCEL"
GoTo InstallOptionEnd
EndIf
; store the source directory
Set SrcDir = $($R1)
EndIf
; copy the installation files
Install "InstallCopyFiles"
; check outcome of the operation
IfStr(i) $(STF_INSTALL_OUTCOME) != "STF_SUCCESS"
Shell $(UtilityINF) RegistryErrorString "UNABLE_COPY_FILE"
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
Set Error = $($R0)
GoTo FatalError
EndIf
; flag that deinstall must be invoked in case of failure
Set OEM_ABANDON_ON = "YES"
; add protocol portion to the registry
Shell $(UtilityINF) AddSoftwareComponent $(Manufacturer) $(ProtocolName) +
$(ProtocolName) $(ProtocolDisplayName) $(STF_CONTEXTINFNAME) +
$(ProductImagePath) "transport" "TDI" {} "" $(EventMessageFile)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
EndWait
GoTo ShellCodeError
EndIf
; retrieve result
Set RegistryErrorIndex = $($R0)
Set ProtocolProductKey = $($R1)
Set ProtocolNetRulesKey = $($R2)
Set ProtocolServiceKey = $($R3)
Set ProtocolParametersKey = $($R4)
Set ProtocolLinkageKey = $($R5)
; check if there was any error during registry entry creation
IfStr(i) $(RegistryErrorIndex) != "NO_ERROR"
EndWait
CloseRegKey $(ProtocolProductKey)
CloseRegKey $(ProtocolNetRulesKey)
CloseRegKey $(ProtocolServiceKey)
CloseRegKey $(ProtocolParametersKey)
CloseRegKey $(ProtocolLinkageKey)
GoTo FatalRegistryError
EndIf
; add protocol product registry values
Set NewValueList = { +
{SoftwareType, $(NoTitle), $(!REG_VT_SZ), $(ProtocolType)}, +
{MajorVersion, $(NoTitle), $(!REG_VT_DWORD), $(ProductMajorVersion)}, +
{MinorVersion, $(NoTitle), $(!REG_VT_DWORD), $(ProductMinorVersion)}, +
{Title, $(NoTitle), $(!REG_VT_SZ), $(ProtocolDisplayName)}, +
{Description, $(NoTitle), $(!REG_VT_SZ), $(ProtocolDescription)}, +
{ServiceName, $(NoTitle), $(!REG_VT_SZ), $(ProtocolName)}, +
{InstallDate, $(NoTitle), $(!REG_VT_DWORD), *($(Now), 1)}, +
{OperationsSupport, $(NoTitle), $(!REG_VT_DWORD), 134}, +
{Review, $(NoTitle), $(!REG_VT_DWORD), 1}}
Shell $(UtilityINF) AddValueList $(ProtocolProductKey) $(NewValueList)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
EndWait
GoTo ShellCodeError
EndIf
; retrieve result
Set RegistryErrorIndex = $($R0)
; check if there was any error adding the values
IfStr(i) $(RegistryErrorIndex) != "NO_ERROR"
EndWait
CloseRegKey $(ProtocolProductKey)
CloseRegKey $(ProtocolNetRulesKey)
CloseRegKey $(ProtocolServiceKey)
CloseRegKey $(ProtocolParametersKey)
CloseRegKey $(ProtocolLinkageKey)
GoTo FatalRegistryError
EndIf
; add protocol net rules registry values
Set NewValueList = { +
{type, $(NoTitle), $(!REG_VT_SZ), $(ProtocolNetRuleType)}, +
{use, $(NoTitle), $(!REG_VT_SZ), $(ProtocolNetRuleUse)}, +
{bindform, $(NoTitle), $(!REG_VT_SZ), $(ProtocolNetRuleBindForm)}, +
{class, $(NoTitle), $(!REG_VT_MULTI_SZ), $(ProtocolNetRuleClass)}, +
{bindable, $(NoTitle), $(!REG_VT_MULTI_SZ), $(ProtocolNetRuleBindable)}, +
{InfOption, $(NoTitle), $(!REG_VT_SZ), $(Option)}}
Shell $(UtilityINF) AddValueList $(ProtocolNetRulesKey) $(NewValueList)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
EndWait
GoTo ShellCodeError
EndIf
; retrieve result
Set RegistryErrorIndex = $($R0)
; check if there was any error adding the values
IfStr(i) $(RegistryErrorIndex) != "NO_ERROR"
EndWait
CloseRegKey $(ProtocolProductKey)
CloseRegKey $(ProtocolNetRulesKey)
CloseRegKey $(ProtocolServiceKey)
CloseRegKey $(ProtocolParametersKey)
CloseRegKey $(ProtocolLinkageKey)
GoTo FatalRegistryError
EndIf
; close all protocol registry keys
CloseRegKey $(ProtocolProductKey)
CloseRegKey $(ProtocolNetRulesKey)
CloseRegKey $(ProtocolServiceKey)
CloseRegKey $(ProtocolParametersKey)
CloseRegKey $(ProtocolLinkageKey)
; add miniport portion to the registry
Shell $(UtilityINF) AddSoftwareComponent $(Manufacturer) $(MiniportName) +
$(MiniportName) $(MiniportDisplayName) $(STF_CONTEXTINFNAME) +
$(ProductImagePath) "kernelautostart" "PNP_TDI" {} "" $(EventMessageFile)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
EndWait
GoTo ShellCodeError
EndIf
; retrieve result
Set RegistryErrorIndex = $($R0)
Set MiniportProductKey = $($R1)
Set MiniportNetRulesKey = $($R2)
Set MiniportServiceKey = $($R3)
Set MiniportParametersKey = $($R4)
Set MiniportLinkageKey = $($R5)
; check if there was any error during registry entry creation
IfStr(i) $(RegistryErrorIndex) != "NO_ERROR"
EndWait
CloseRegKey $(MiniportProductKey)
CloseRegKey $(MiniportNetRulesKey)
CloseRegKey $(MiniportServiceKey)
CloseRegKey $(MiniportParametersKey)
CloseRegKey $(MiniportLinkageKey)
GoTo FatalRegistryError
EndIf
; add miniport product registry values
Set NewValueList = { +
{SoftwareType, $(NoTitle), $(!REG_VT_SZ), $(MiniportType)}, +
{MajorVersion, $(NoTitle), $(!REG_VT_DWORD), $(ProductMajorVersion)}, +
{MinorVersion, $(NoTitle), $(!REG_VT_DWORD), $(ProductMinorVersion)}, +
{Title, $(NoTitle), $(!REG_VT_SZ), $(MiniportDisplayName)}, +
{Description, $(NoTitle), $(!REG_VT_SZ), $(MiniportDisplayName)}, +
{ServiceName, $(NoTitle), $(!REG_VT_SZ), $(MiniportName)}, +
{InstallDate, $(NoTitle), $(!REG_VT_DWORD), *($(Now), 1)}}
Shell $(UtilityINF) AddValueList $(MiniportProductKey) $(NewValueList)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
EndWait
GoTo ShellCodeError
EndIf
; retrieve result
Set RegistryErrorIndex = $($R0)
; check if there was any error adding the values
IfStr(i) $(RegistryErrorIndex) != "NO_ERROR"
EndWait
CloseRegKey $(MiniportProductKey)
CloseRegKey $(MiniportNetRulesKey)
CloseRegKey $(MiniportServiceKey)
CloseRegKey $(MiniportParametersKey)
CloseRegKey $(MiniportLinkageKey)
GoTo FatalRegistryError
EndIf
; add miniport net rules registry values
Set NewValueList = { +
{type, $(NoTitle), $(!REG_VT_SZ), $(MiniportNetRuleType)}, +
{use, $(NoTitle), $(!REG_VT_SZ), $(MiniportNetRuleUse)}, +
{bindform, $(NoTitle), $(!REG_VT_SZ), $(MiniportNetRuleBindForm)}, +
{class, $(NoTitle), $(!REG_VT_MULTI_SZ), $(MiniportNetRuleClass)}, +
{bindable, $(NoTitle), $(!REG_VT_MULTI_SZ), $(MiniportNetRuleBindable)}, +
{InfOption, $(NoTitle), $(!REG_VT_SZ), $(Option)}}
Shell $(UtilityINF) AddValueList $(MiniportNetRulesKey) $(NewValueList)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
; retrieve result
Set RegistryErrorIndex = $($R0)
; check if there was any error adding the values
IfStr(i) $(RegistryErrorIndex) != "NO_ERROR"
EndWait
CloseRegKey $(MiniportProductKey)
CloseRegKey $(MiniportNetRulesKey)
CloseRegKey $(MiniportServiceKey)
CloseRegKey $(MiniportParametersKey)
CloseRegKey $(MiniportLinkageKey)
GoTo FatalRegistryError
EndIf
; close all miniport registry keys
CloseRegKey $(MiniportProductKey)
CloseRegKey $(MiniportNetRulesKey)
CloseRegKey $(MiniportServiceKey)
CloseRegKey $(MiniportParametersKey)
CloseRegKey $(MiniportLinkageKey)
; installation is finished
EndWait
GoTo InstallOptionEnd
;------------------------------------------------------------------------------
; The InstallOption Bind Subsection - Review the protocol bindings
;------------------------------------------------------------------------------
Bind = +
; only the binding review for the protocol portion needs attention
IfStr(i) $(!NTN_RegBase) != $(ProtocolProductKeyName)
GoTo InstallOptionEnd
EndIf
; open the Linkage registry key
OpenRegKey $(!REG_H_LOCAL) "" $(ProtocolLinkageKeyName) +
$(MAXIMUM_ALLOWED) ProtocolLinkageKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
GoTo FatalRegistryError
EndIf
; get the Bind value from the registry
GetRegValue $(ProtocolLinkageKey) "Bind" BindValue
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
CloseRegKey $(ProtocolLinkageKey)
GoTo FatalRegistryError
EndIf
; extract the Bind list and initialize the pruned bind list
Set BindList = *($(BindValue), 4)
Set PrunedBindList = {}
; open the NetworkCards registry key
OpenRegKey $(!REG_H_LOCAL) "" $(NetworkCardsKeyName) +
$(MAXIMUM_ALLOWED) NetworkCardsKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
CloseRegKey $(ProtocolLinkageKey)
GoTo FatalRegistryError
EndIf
; enumerate the network cards in the registry
Set NetworkCardsList = {}
EnumRegKey $(NetworkCardsKey) NetworkCardsList
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; extract list of network card device instances
Set InstancesList = {}
ForListDo $(NetworkCardsList)
IfStr(i) $(InstancesList) == {}
Set InstancesList = {*($($), 1)}
Else
Set InstancesList = >($(InstancesList), *($($), 1))
EndIf
EndForListDo
EndIf
; initialize the installed and used virtual adapters lists
Set AdaptersList = {}
Set AdaptersUsed = {}
; create a list of the service names of all installed virtual adapters
ForListDo $(InstancesList)
Set Instance = $($)
; open the device instance registry key
OpenRegKey $(NetworkCardsKey) "" $(Instance) $(MAXIMUM_ALLOWED) InstanceKey
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; retrieve the ProductName registry value
GetRegValue $(InstanceKey) "ProductName" ProductNameValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set ProductName = *($(ProductNameValue), 4)
; retrieve the ServiceName registry value
GetRegValue $(InstanceKey) "ServiceName" ServiceNameValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set ServiceName = *($(ServiceNameValue), 4)
; check if this is an instance of our virtual adapter
IfStr(i) $(ProductName) == $(MiniportName)
IfStr(i) $(AdaptersList) == {}
Set AdaptersList = {$(ServiceName)}
Else
Set AdaptersList = >($(AdaptersList), $(ServiceName))
EndIf
EndIf
EndIf
EndIf
; close the device instance registry key
CloseRegKey $(InstanceKey)
EndIf
EndForListDo
; no virtual adapter was added or removed yet
Set VirtualAdaptersChanged = "NO"
; install virtual adapter instances as needed
ForListDo $(InstancesList)
Set Instance = $($)
; open the device instance registry key
OpenRegKey $(NetworkCardsKey) "" $(Instance) $(MAXIMUM_ALLOWED) InstanceKey
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; retrieve the ProductName registry value
GetRegValue $(InstanceKey) "ProductName" ProductNameValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set ProductName = *($(ProductNameValue), 4)
; skip our own virtual adapter instances
IfStr(i) $(ProductName) != $(MiniportName)
; retrieve the ServiceName registry value
GetRegValue $(InstanceKey) "ServiceName" ServiceNameValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set ServiceName = *($(ServiceNameValue), 4)
; retrieve the Title registry value
GetRegValue $(InstanceKey) "Title" TitleValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set Title = *($(TitleValue), 4)
Else
Set Title = "Unnamed Network Adapter "$(ServiceName)
EndIf
; generate the Bind name and the Parameters key name
Set BindName = "\Device\"$(ServiceName)
Set ParametersKeyName = $(!NTN_ServiceBase)"\"$(ServiceName)"\Parameters\"$(ProtocolName)
; check if this adapter is in the Bind list
IfContains(i) $(BindName) Not-In $(BindList)
; adapter not in bind list, delete protocol-specific parameters
DeleteRegKey $(!REG_H_LOCAL) $(ParametersKeyName)
Else
; adapter is in bind list, try to retrieve its UpperBindings parameter
Set UpperBindings = "noupper"
OpenRegKey $(!REG_H_LOCAL) "" $(ParametersKeyName) +
$(MAXIMUM_ALLOWED) ParametersKey
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; retrieve the UpperBindings registry value
GetRegValue $(ParametersKey) "UpperBindings" UpperBindingsValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set UpperBindings = *($(UpperBindingsValue), 4)
EndIf
; close the parameters registry key
CloseRegKey $(ParametersKey)
EndIf
; check if there is no valid virtual adapter for this adapter
IfContains(i) $(UpperBindings) Not-In $(AdaptersList)
; no valid virtual adapter, delete any protocol-specific parameters
DeleteRegKey $(!REG_H_LOCAL) $(ParametersKeyName)
; create the protocol-specific key in the adapter's registry parameters
CreateRegKey $(!REG_H_LOCAL) {$(ParametersKeyName), $(NoTitle), +
GenericClass} "" $(MAXIMUM_ALLOWED) "" ParametersKey
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; install a virtual adapter instance
Shell "" InstallVirtualAdapter $(Option)
IfInt $($ShellCode) == $(!SHELL_CODE_OK)
; check if the installation was successful
IfStr(i) $($R0) == "STATUS_SUCCESSFUL"
; retrieve the returned UpperBindings value
Set UpperBindings = $($R1)
; flag that a virtual adapter was added
Set VirtualAdaptersChanged = "YES"
; add protocol parameters registry values
Set NewValueList = { +
{DriverDesc, $(NoTitle), $(!REG_VT_SZ), $(Title)}, +
{EventLogging, $(NoTitle), $(!REG_VT_DWORD), $(EventLogging)}, +
{LimitTCPMSS, $(NoTitle), $(!REG_VT_DWORD), $(LimitTCPMSS)}, +
{LinkSpeed, $(NoTitle), $(!REG_VT_DWORD), $(LinkSpeed)}, +
{OverrideMTU, $(NoTitle), $(!REG_VT_DWORD), $(OverrideMTU)}, +
{UpperBindings, $(NoTitle), $(!REG_VT_SZ), $(UpperBindings)}}
Shell $(UtilityINF) AddValueList $(ParametersKey) $(NewValueList)
IfInt $($ShellCode) == $(!SHELL_CODE_OK)
; retrieve result
Set RegistryErrorIndex = $($R0)
; check if there was no error adding the values
IfStr(i) $(RegistryErrorIndex) == "NO_ERROR"
; add installed virtual adapter to list of virtual adapters
IfStr(i) $(AdaptersList) == {}
Set AdaptersList = {$(UpperBindings)}
Else
Set AdaptersList = >($(AdaptersList), $(UpperBindings))
EndIf
EndIf
EndIf
EndIf
EndIf
; close the parameters registry key
CloseRegKey $(ParametersKey)
EndIf
EndIf
; check if there is a valid virtual adapter for this adapter now
IfContains(i) $(UpperBindings) In $(AdaptersList)
; there is, add virtual adapter to list of used virtual adapters
IfStr(i) $(AdaptersUsed) == {}
Set AdaptersUsed = {$(UpperBindings)}
Else
Set AdaptersUsed = >($(AdaptersUsed), $(UpperBindings))
EndIf
; add adapter's bind name to the pruned bind list
IfStr(i) $(PrunedBindList) == {}
Set PrunedBindList = {$(BindName)}
Else
Set PrunedBindList = >($(PrunedBindList), $(BindName))
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
; close the device instance registry key
CloseRegKey $(InstanceKey)
EndIf
EndForListDo
; increment the miniport reference count to prevent driver removal
Shell $(UtilityINF) IncrementRefCount $(MiniportProductKeyName)
IfInt $($ShellCode) == $(!SHELL_CODE_OK)
; remove any unused virtual adapter instances
ForListDo $(InstancesList)
Set Instance = $($)
; open the device instance registry key
OpenRegKey $(NetworkCardsKey) "" $(Instance) $(MAXIMUM_ALLOWED) InstanceKey
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; retrieve the ProductName registry value
GetRegValue $(InstanceKey) "ProductName" ProductNameValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set ProductName = *($(ProductNameValue), 4)
; check if this is one of our own virtual adapter instances
IfStr(i) $(ProductName) == $(MiniportName)
; retrieve the ServiceName registry value
GetRegValue $(InstanceKey) "ServiceName" ServiceNameValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set ServiceName = *($(ServiceNameValue), 4)
; check if this instance is not in the used instances list
IfContains(i) $(ServiceName) Not-In $(AdaptersUsed)
; remove the virtual adapter instance
Set NetCardName = $(NetworkCardsKeyName)\$(Instance)
Shell $(UtilityINF) RemoveHardwareComponent $(Manufacturer) +
$(MiniportName) $(NetCardName)
IfInt $($ShellCode) == $(!SHELL_CODE_OK)
; retrieve result
Set RegistryErrorIndex = $($R0)
; check if there was no error removing the instance
IfStr(i) $(RegistryErrorIndex) == "NO_ERROR"
; flag that a virtual adapter was removed
Set VirtualAdaptersChanged = "YES"
EndIf
EndIf
EndIf
EndIf
EndIf
; close the device instance registry key
CloseRegKey $(InstanceKey)
EndIf
EndIf
EndForListDo
; decrement the miniport reference count back to the original count
Shell $(UtilityINF) DecrementRefCount $(MiniportProductKeyName)
EndIf
; write the pruned Bind list back to the registry
SetRegValue $(ProtocolLinkageKey) {"Bind", $(NoTitle), +
$(!REG_VT_MULTI_SZ), $(PrunedBindList)}
; close the Linkage registry key
CloseRegKey $(ProtocolLinkageKey)
; check if any virtual adapters were added or removed
IfStr(i) $(VirtualAdaptersChanged) == "YES"
; NCPA needs to review bindings again
Set NcpaKeyName = $(!NTN_SoftwareBase)"\Microsoft\NCPA\CurrentVersion"
OpenRegKey $(!REG_H_LOCAL) "" $(NcpaKeyName) $(MAXIMUM_ALLOWED) NcpaKey
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
SetRegValue $(NcpaKey) {"BindRestart", $(NoTitle), $(!REG_VT_DWORD), 1}
CloseRegKey $(NcpaKey)
EndIf
; configure the Remote Access Service
Shell "" ConfigureRAS
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
; retrieve result
Set Status = $($R0)
EndIf
; bindings review complete
GoTo InstallOptionEnd
;------------------------------------------------------------------------------
; The InstallOption Configure Subsection - Configure the protocol
;------------------------------------------------------------------------------
Configure = +
; load the control panel library and run the control panel
LoadLibrary "" $(!STF_WINDOWSSYSPATH)"\RASPPPOE.DLL" LibraryHandle
LibraryProcedure Result, $(LibraryHandle), WindowsNTControlPanel, $(!STF_HWND)
FreeLibrary $(LibraryHandle)
; check the result from the control panel
IfStr(i) $(Result) == "STATUS_FILENOTFOUND"
; could not find any network adapter the protocol is currently bound to
Set Error = $(NoAdaptersMsg)
GoTo NonFatal
Else-IfStr(i) $(Result) == "STATUS_REBIND"
; WAN endpoints setting change, reconfigure the Remote Access Service
Shell "" ConfigureRAS
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
; retrieve result
Set Status = $($R0)
Else
; pass the result as the return status
Set Status = $(Result)
EndIf
; configuration complete
GoTo InstallOptionEnd
;------------------------------------------------------------------------------
; InstallOption/DeInstall Section - Remove the protocol
;------------------------------------------------------------------------------
DeInstall = +
; open the NetworkCards registry key
OpenRegKey $(!REG_H_LOCAL) "" $(NetworkCardsKeyName) +
$(MAXIMUM_ALLOWED) NetworkCardsKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
GoTo FatalRegistryError
EndIf
; enumerate the network cards in the registry
Set NetworkCardsList = {}
EnumRegKey $(NetworkCardsKey) NetworkCardsList
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; extract list of network card device instances
Set InstancesList = {}
ForListDo $(NetworkCardsList)
IfStr(i) $(InstancesList) == {}
Set InstancesList = {*($($), 1)}
Else
Set InstancesList = >($(InstancesList), *($($), 1))
EndIf
EndForListDo
EndIf
; remove the TAPI Service Provider registry keys
DeleteRegKey $(!REG_H_LOCAL) +
$(DeviceMapKeyName)"\"$(TapiDevicesKeyName)"\"$(MiniportName)
DeleteRegKey $(!REG_H_LOCAL) +
$(MicrosoftRasKeyName)"\"$(TapiDevicesKeyName)"\"$(MiniportName)
; remove all installed virtual adapters
ForListDo $(InstancesList)
Set Instance = $($)
; open the device instance registry key
OpenRegKey $(NetworkCardsKey) "" $(Instance) $(MAXIMUM_ALLOWED) InstanceKey
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; retrieve the ProductName registry value
GetRegValue $(InstanceKey) "ProductName" ProductNameValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set ProductName = *($(ProductNameValue), 4)
; retrieve the ServiceName registry value
GetRegValue $(InstanceKey) "ServiceName" ServiceNameValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set ServiceName = *($(ServiceNameValue), 4)
; generate the Parameters key name
Set ParametersKeyName = $(!NTN_ServiceBase)"\"$(ServiceName)"\Parameters\"$(ProtocolName)
; delete protocol-specific parameters
DeleteRegKey $(!REG_H_LOCAL) $(ParametersKeyName)
; check if this is an instance of our virtual adapter
IfStr(i) $(ProductName) == $(MiniportName)
; close the device instance registry key
CloseRegKey $(InstanceKey)
Set InstanceKey = ""
; remove the virtual adapter instance
Set NetCardName = $(NetworkCardsKeyName)\$(Instance)
Shell $(UtilityINF) RemoveHardwareComponent $(Manufacturer) +
$(MiniportName) $(NetCardName)
EndIf
EndIf
EndIf
; close the device instance registry key
CloseRegKey $(InstanceKey)
EndIf
EndForListDo
; open the protocol NetRules registry key
OpenRegKey $(!REG_H_LOCAL) "" $(ProtocolProductKeyName)"\NetRules" +
$(MAXIMUM_ALLOWED) ProtocolNetRulesKey
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; retrieve the InfName registry value
GetRegValue $(ProtocolNetRulesKey) "InfName" InfNameValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set InfName = *($(InfNameValue), 4)
Else
Set InfName = "NUL"
EndIf
; close the protocol NetRules registry key
CloseRegKey $(ProtocolNetRulesKey)
EndIf
; remove the miniport portion
Shell $(UtilityINF) RemoveSoftwareComponent $(Manufacturer) $(MiniportName)
IfInt $($ShellCode) == $(!SHELL_CODE_OK)
DeleteRegKey $(!REG_H_LOCAL) $(!NTN_ServiceBase)"\EventLog\System\"$(MiniportName)
; remove the protocol portion
Shell $(UtilityINF) RemoveSoftwareComponent $(Manufacturer) $(ProtocolName)
IfInt $($ShellCode) == $(!SHELL_CODE_OK)
DeleteRegKey $(!REG_H_LOCAL) $(!NTN_ServiceBase)"\EventLog\System\"$(ProtocolName)
; retrieve result
Set RegistryErrorIndex = $($R0)
; check if there was no error removing the protocol
IfStr(i) $(RegistryErrorIndex) == "NO_ERROR"
; remove the manufacturer registry subkey
DeleteRegKey $(!REG_H_LOCAL) $(!NTN_SoftwareBase)"\"$(Manufacturer)
; delete all installed files
LibraryProcedure Result, $(!LIBHANDLE), DelFile $(!STF_WINDOWSSYSPATH)"\"$(InfName)
LibraryProcedure Result, $(!LIBHANDLE), DelFile $(!STF_WINDOWSSYSPATH)"\RASPPPOE.DLL"
LibraryProcedure Result, $(!LIBHANDLE), DelFile $(!STF_WINDOWSSYSPATH)"\RASPPPOE.EXE"
LibraryProcedure Result, $(!LIBHANDLE), DelFile $(!STF_WINDOWSSYSPATH)"\Drivers\RMSPPPOE.SYS"
; delete the uninstall registry subkey
DeleteRegKey $(!REG_H_LOCAL) $(UninstallKeyName)
EndIf
EndIf
EndIf
; deinstallation is finished
GoTo InstallOptionEnd
;------------------------------------------------------------------------------
; InstallOption/Update Section - Update the protocol
;------------------------------------------------------------------------------
Update = +
; updating is not implemented
Set Error = "Update is not implemented, Remove and Reinstall."
GoTo NonFatal
;------------------------------------------------------------------------------
; InstallOption exit points
;------------------------------------------------------------------------------
NonFatal = +
; show a non-fatal message and exit
Set CommonStatus = STATUS_USERCANCEL
IfStr(i) $(Error) == ""
Shell $(UtilityINF) RegistryErrorString "SETUP_FAIL"
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
Set Error = $($R0)
EndIf
Shell $(SubroutineINF) SetupMessage $(!STF_LANGUAGE) "STATUS" $(Error)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
GoTo InstallOptionEnd
FatalRegistryError = +
; show a fatal registry error message and exit
Shell $(UtilityINF) RegistryErrorString $(RegistryErrorIndex)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
Set Error = $($R0)
Goto FatalError
FatalError = +
; show a fatal error message and exit
IfStr(i) $(Error) == ""
Shell $(UtilityINF) RegistryErrorString "SETUP_FAIL"
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
Set Error = $($R0)
EndIf
Shell $(SubroutineINF) SetupMessage $(!STF_LANGUAGE) "FATAL" $(Error)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
GoTo InstallOptionFailed
ShellCodeError = +
; show a shell code error message box and exit
Set DlgType = "MessageBox"
Set STF_MB_TITLE = $(ShellCodeErrorTitle)
Set STF_MB_TEXT = $(ShellCodeErrorText)
Set STF_MB_TYPE = 1 ; OK button
Set STF_MB_ICON = 3 ; STOP icon
Set STF_MB_DEF = 1 ; default button
UI Start "ShellCodeError"
GoTo InstallOptionFailed
InstallOptionFailed = +
; operation failed
Set Status = STATUS_FAILED
IfStr(i) $(OEM_ABANDON_ON) == "YES"
Set OEM_ABANDON_ON = "NO"
GoTo DeInstall
EndIf
GoTo InstallOptionEnd
InstallOptionEnd = +
Return $(Status)
;------------------------------------------------------------------------------
; InstallCopyFiles - Copy the installation files
;------------------------------------------------------------------------------
[InstallCopyFiles]
; disable termination if copy operation fails
Set STF_VITAL = ""
; add files to copy list if requested
IfStr(i) $(AddCopy) == "YES"
AddSectionFilesToCopyList $(Option).Files.DLL $(SrcDir) $(!STF_WINDOWSSYSPATH)
AddSectionFilesToCopyList $(Option).Files.SYS $(SrcDir) $(!STF_WINDOWSSYSPATH)\Drivers
EndIf
; copy files in copy list if requested
IfStr(i) $(DoCopy) == "YES"
Set !STF_NCPA_FLUSH_COPYLIST = "TRUE"
CopyFilesInCopyList
EndIf
; exit from this section
Exit
;------------------------------------------------------------------------------
; InstallVirtualAdapter - Install an instance of the RASPPPOE virtual adapter
;------------------------------------------------------------------------------
[InstallVirtualAdapter]
; retrieve parameter
Set Option = $($0)
; assume success
Set Status = STATUS_SUCCESSFUL
; read symbol constants
Read-Syms FileConstants
Read-Syms FileConstants$(!STF_LANGUAGE)
Read-Syms DialogConstants$(!STF_LANGUAGE)
Read-Syms GeneralConstants
; change Continue dialog string if invoked from the NCPA
IfStr(i) $(!NTN_Origination) == "NCPA"
Set Continue = $(OK)
EndIf
; get the current system date
Detect Date
; add a virtual adapter instance
Shell $(UtilityINF), AddHardwareComponent $(MiniportName) +
$(STF_CONTEXTINFNAME) $(MiniportProductKeyName)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
; retrieve result
Set RegistryErrorIndex = $($R0)
Set HardProductKey = $($R1)
Set HardNetRuleKey = $($R2)
Set HardParametersKey = $($R3)
Set AdapterNumber = $($R4)
Set ServiceName = $($R5)
; check if there was any error during registry entry creation
IfStr(i) $(RegistryErrorIndex) != "NO_ERROR"
CloseRegKey $(HardProductKey)
CloseRegKey $(HardNetRuleKey)
CloseRegKey $(HardParametersKey)
GoTo FatalRegistryError
EndIf
; add virtual adapter product registry values
Set NewValueList = { +
{Manufacturer, $(NoTitle), $(!REG_VT_SZ), $(Manufacturer)}, +
{Title, $(NoTitle), $(!REG_VT_SZ), "["$(AdapterNumber)"] "$(MiniportDisplayName)}, +
{Description, $(NoTitle), $(!REG_VT_SZ), $(MiniportDisplayName)}, +
{ProductName, $(NoTitle), $(!REG_VT_SZ), $(MiniportName)}, +
{ServiceName, $(NoTitle), $(!REG_VT_SZ), $(ServiceName)}, +
{InstallDate, $(NoTitle), $(!REG_VT_DWORD), *($(Now), 1)} +
{Hidden, $(NoTitle), $(!REG_VT_DWORD), 1}}
Shell $(UtilityINF) AddValueList $(HardProductKey) $(NewValueList)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
; retrieve result
Set RegistryErrorIndex = $($R0)
; check if there was any error adding the values
IfStr(i) $(RegistryErrorIndex) != "NO_ERROR"
CloseRegKey $(HardProductKey)
CloseRegKey $(HardNetRuleKey)
CloseRegKey $(HardParametersKey)
GoTo FatalRegistryError
EndIf
; close the product registry key
CloseRegKey $(HardProductKey)
; add virtual adapter net rules registry values
Set ObjectName = """"$(MiniportName)$(AdapterNumber)""""
Set BindForm = $(ObjectName)$(HardwareNetRuleBindForm)
Set NewValueList = { +
{type, $(NoTitle), $(!REG_VT_SZ), $(HardwareNetRuleType)}, +
{class, $(NoTitle), $(!REG_VT_MULTI_SZ), $(HardwareNetRuleClass)}, +
{bindform, $(NoTitle), $(!REG_VT_SZ), $(BindForm)}, +
{InfOption, $(NoTitle), $(!REG_VT_SZ), $(Option)}}
Shell $(UtilityINF) AddValueList $(HardNetRuleKey) $(NewValueList)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
; retrieve result
Set RegistryErrorIndex = $($R0)
; check if there was any error adding the values
IfStr(i) $(RegistryErrorIndex) != "NO_ERROR"
CloseRegKey $(HardNetRuleKey)
CloseRegKey $(HardParametersKey)
GoTo FatalRegistryError
EndIf
; close the net rules registry key
CloseRegKey $(HardNetRuleKey)
; add virtual adapter parameters registry values
Set NewValueList = { +
{Instance, $(NoTitle), $(!REG_VT_DWORD), $(AdapterNumber)}, +
{WanEndPoints, $(NoTitle), $(!REG_VT_DWORD), $(WanEndPoints)}}
Shell $(UtilityINF) AddValueList $(HardParametersKey) $(NewValueList)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
; retrieve result
Set RegistryErrorIndex = $($R0)
; check if there was any error adding the values
IfStr(i) $(RegistryErrorIndex) != "NO_ERROR"
CloseRegKey $(HardParametersKey)
GoTo FatalRegistryError
EndIf
; close the virtual adapter parameters registry key
CloseRegKey $(HardParametersKey)
; return the last status and the virtual adapter instance service name
Return $(Status) $(ServiceName)
FatalRegistryError = +
; show a fatal registry error message and exit
Shell $(UtilityINF) RegistryErrorString $(RegistryErrorIndex)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
Set Error = $($R0)
IfStr(i) $(Error) == ""
Shell $(UtilityINF) RegistryErrorString "SETUP_FAIL"
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
Set Error = $($R0)
EndIf
Shell $(SubroutineINF) SetupMessage $(!STF_LANGUAGE) "FATAL" $(Error)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
Return STATUS_FAILED
ShellCodeError = +
; show a shell code error message box and exit
Set DlgType = "MessageBox"
Set STF_MB_TITLE = $(ShellCodeErrorTitle)
Set STF_MB_TEXT = $(ShellCodeErrorText)
Set STF_MB_TYPE = 1 ; OK button
Set STF_MB_ICON = 3 ; STOP icon
Set STF_MB_DEF = 1 ; default button
UI Start "ShellCodeError"
Return STATUS_FAILED
;------------------------------------------------------------------------------
; ConfigureRAS - Configure the Remote Access Service
;------------------------------------------------------------------------------
[ConfigureRAS]
; assume success
Set Status = STATUS_SUCCESSFUL
; read symbol constants
Read-Syms FileConstants
Read-Syms FileConstants$(!STF_LANGUAGE)
Read-Syms DialogConstants$(!STF_LANGUAGE)
Read-Syms GeneralConstants
; change Continue dialog string if invoked from the NCPA
IfStr(i) $(!NTN_Origination) == "NCPA"
Set Continue = $(OK)
EndIf
; open the NetworkCards registry key
OpenRegKey $(!REG_H_LOCAL) "" $(NetworkCardsKeyName) +
$(MAXIMUM_ALLOWED) NetworkCardsKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
GoTo FatalRegistryError
EndIf
; enumerate the network cards in the registry
Set NetworkCardsList = {}
EnumRegKey $(NetworkCardsKey) NetworkCardsList
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; extract list of network card device instances
Set InstancesList = {}
ForListDo $(NetworkCardsList)
IfStr(i) $(InstancesList) == {}
Set InstancesList = {*($($), 1)}
Else
Set InstancesList = >($(InstancesList), *($($), 1))
EndIf
EndForListDo
EndIf
; initialize TAPI registry values and IPMTU to set
Set PortIdentifier = 1
Set TapiAddressList = {}
Set TapiNamesList = {}
Set TapiUsageList = {}
Set IPMTU = $(MAXPPPOEMTU)
; generate TAPI address list and determine IPMTU to set
ForListDo $(InstancesList)
Set Instance = $($)
; open the device instance registry key
OpenRegKey $(NetworkCardsKey) "" $(Instance) $(MAXIMUM_ALLOWED) InstanceKey
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; retrieve the ProductName registry value
GetRegValue $(InstanceKey) "ProductName" ProductNameValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set ProductName = *($(ProductNameValue), 4)
; retrieve the ServiceName registry value
GetRegValue $(InstanceKey) "ServiceName" ServiceNameValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set ServiceName = *($(ServiceNameValue), 4)
; check if this is an instance of our virtual adapter
IfStr(i) $(ProductName) == $(MiniportName)
; open the virtual adapter's Parameters registry subkey
Set ParametersKeyName = $(!NTN_ServiceBase)"\"$(ServiceName)"\Parameters"
OpenRegKey $(!REG_H_LOCAL) "" $(ParametersKeyName) +
$(MAXIMUM_ALLOWED) ParametersKey
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; retrieve the WanEndPoints registry value
GetRegValue $(ParametersKey) "WanEndPoints" WanEndPointsValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set WanEndPoints = *($(WanEndPointsValue), 4)
; add the TAPI addresses for this adapter to the TAPI adress list
Set Line = 1
AddLine = +
IfStr(i) $(TapiAddressList) == {}
Set TapiAddressList = {$(Instance)" "$(Line)" 0"}
Set TapiNamesList = {$(TapiMediaType)$(PortIdentifier)}
Set TapiUsageList = {"Client"}
Else
Set TapiAddressList = >($(TapiAddressList), $(Instance)" "$(Line)" 0")
Set TapiNamesList = >($(TapiNamesList), $(TapiMediaType)$(PortIdentifier))
Set TapiUsageList = >($(TapiUsageList), "Client")
EndIf
Set-Add PortIdentifier = $(PortIdentifier), 1
Set-Add Line = $(Line), 1
IfInt $(Line) <= $(WanEndPoints)
GoTo AddLine
EndIf
EndIf
; close the parameters registry key
CloseRegKey $(ParametersKey)
EndIf
Else
; other adapter, try to open the protocol Parameters registry subkey
Set ParametersKeyName = $(!NTN_ServiceBase)"\"$(ServiceName)"\Parameters\"$(ProtocolName)
OpenRegKey $(!REG_H_LOCAL) "" $(ParametersKeyName) +
$(MAXIMUM_ALLOWED) ParametersKey
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; retrieve the OverrideMTU registry value
GetRegValue $(ParametersKey) "OverrideMTU" OverrideMTUValue
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
Set OverrideMTU = *($(OverrideMTUValue), 4)
; check if the OverrideMTU value is valid
IfInt $(OverrideMTU) >= $(MINPPPOEMTU)
; if the value is lower than the current IPMTU, use it
IfInt $(OverrideMTU) < $(IPMTU)
Set IPMTU = $(OverrideMTU)
EndIf
EndIf
EndIf
; close the parameters registry key
CloseRegKey $(ParametersKey)
EndIf
EndIf
EndIf
EndIf
; close the device instance registry key
CloseRegKey $(InstanceKey)
EndIf
EndForListDo
; check if the TAPI address list is empty
IfStr(i) $(TapiAddressList) == {}
; TAPI address list is empty, remove the TAPI Service Provider registry keys
DeleteRegKey $(!REG_H_LOCAL) +
$(DeviceMapKeyName)"\"$(TapiDevicesKeyName)"\"$(MiniportName)
DeleteRegKey $(!REG_H_LOCAL) +
$(MicrosoftRasKeyName)"\"$(TapiDevicesKeyName)"\"$(MiniportName)
Else
; open the HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP registry key
OpenRegKey $(!REG_H_LOCAL) "" $(DeviceMapKeyName) +
$(MAXIMUM_ALLOWED) DeviceMapKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
GoTo FatalRegistryError
EndIf
; create the TAPI DEVICES registry subkey
CreateRegKey $(DeviceMapKey) {$(TapiDevicesKeyName), $(NoTitle), +
GenericClass} "" $(MAXIMUM_ALLOWED) "" TapiDevicesKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
; subkey creation failed; it may already exist
OpenRegKey $(DeviceMapKey) "" $(TapiDevicesKeyName) +
$(MAXIMUM_ALLOWED) TapiDevicesKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
CloseRegKey $(DeviceMapKey)
GoTo FatalRegistryError
EndIf
EndIf
; close the HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP registry key
CloseRegKey $(DeviceMapKey)
; create the Service Provider registry subkey
CreateRegKey $(TapiDevicesKey) {$(MiniportName), $(NoTitle), GenericClass} "" +
$(MAXIMUM_ALLOWED) "" ServiceProviderKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
; subkey creation failed; it may already exist
OpenRegKey $(TapiDevicesKey) "" $(MiniportName) +
$(MAXIMUM_ALLOWED) ServiceProviderKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
CloseRegKey $(TapiDevicesKey)
GoTo FatalRegistryError
EndIf
EndIf
; close the TAPI DEVICES registry subkey
CloseRegKey $(TapiDevicesKey)
; add TAPI Service Provider registry values
Set NewValueList = { +
{Address, $(NoTitle), $(!REG_VT_MULTI_SZ), $(TapiAddressList)}, +
{"Media Type", $(NoTitle), $(!REG_VT_SZ), $(TapiMediaType)}}
Shell $(UtilityINF) AddValueList $(ServiceProviderKey) $(NewValueList)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
; retrieve result
Set RegistryErrorIndex = $($R0)
; check if there was any error adding the values
IfStr(i) $(RegistryErrorIndex) != "NO_ERROR"
CloseRegKey $(ServiceProviderKey)
GoTo FatalRegistryError
EndIf
; close the Service Provider registry subkey
CloseRegKey $(ServiceProviderKey)
; create the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RAS registry subkey
CreateRegKey $(!REG_H_LOCAL) {$(MicrosoftRasKeyName), $(NoTitle), +
GenericClass} "" $(MAXIMUM_ALLOWED) "" MicrosoftRasKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
; subkey creation failed; it may already exist
OpenRegKey $(!REG_H_LOCAL) "" $(MicrosoftRasKeyName) +
$(MAXIMUM_ALLOWED) MicrosoftRasKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
GoTo FatalRegistryError
EndIf
EndIf
; create the TAPI DEVICES registry subkey
CreateRegKey $(MicrosoftRasKey) {$(TapiDevicesKeyName), $(NoTitle), +
GenericClass} "" $(MAXIMUM_ALLOWED) "" TapiDevicesKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
; subkey creation failed; it may already exist
OpenRegKey $(MicrosoftRasKey) "" $(TapiDevicesKeyName) +
$(MAXIMUM_ALLOWED) TapiDevicesKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
CloseRegKey $(MicrosoftRasKey)
GoTo FatalRegistryError
EndIf
EndIf
; close the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RAS registry subkey
CloseRegKey $(MicrosoftRasKey)
; create the Service Provider registry subkey
CreateRegKey $(TapiDevicesKey) {$(MiniportName), $(NoTitle), GenericClass} "" +
$(MAXIMUM_ALLOWED) "" ServiceProviderKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
; subkey creation failed; it may already exist
OpenRegKey $(TapiDevicesKey) "" $(MiniportName) +
$(MAXIMUM_ALLOWED) ServiceProviderKey
IfInt $(RegLastError) != $(!REG_ERROR_SUCCESS)
CloseRegKey $(TapiDevicesKey)
GoTo FatalRegistryError
EndIf
EndIf
; close the TAPI DEVICES registry subkey
CloseRegKey $(TapiDevicesKey)
; add TAPI Service Provider registry values
Set NewValueList = { +
{Address, $(NoTitle), $(!REG_VT_MULTI_SZ), $(TapiAddressList)}, +
{"Friendly Name", $(NoTitle), $(!REG_VT_MULTI_SZ), $(TapiNamesList)}, +
{"Media Type", $(NoTitle), $(!REG_VT_SZ), $(TapiMediaType)}, +
{Usage, $(NoTitle), $(!REG_VT_MULTI_SZ), $(TapiUsageList)}}
Shell $(UtilityINF) AddValueList $(ServiceProviderKey) $(NewValueList)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
; retrieve result
Set RegistryErrorIndex = $($R0)
; check if there was any error adding the values
IfStr(i) $(RegistryErrorIndex) != "NO_ERROR"
CloseRegKey $(ServiceProviderKey)
GoTo FatalRegistryError
EndIf
; close the Service Provider registry subkey
CloseRegKey $(ServiceProviderKey)
EndIf
; check if RAS is already installed
Shell "OEMNSVRA.INF" CheckRasInstalled
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
; retrieve return value
Set RasInstalled = $($R0)
; check if RAS has to be installed
IfStr(i) $(RasInstalled) != "TRUE"
; display RAS install message
Shell $(SubroutineINF) SetupMessage $(!STF_LANGUAGE) "STATUS" $(InstallRasMsg)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
; shell RAS installer
Set SavedInstallMode = $(!NTN_InstallMode)
Set !NTN_InstallMode = "Install"
Set SavedSrcDir_Override = $(!STF_SRCDIR_OVERRIDE)
Set !STF_SRCDIR_OVERRIDE = ""
Shell "OEMNSVRA.INF" InstallOption $(!STF_LANGUAGE) +
"RAS" $(!STF_SRCDIR) "YES" "YES" "YES"
Set !STF_SRCDIR_OVERRIDE = $(SavedSrcDir_Override)
Set !NTN_InstallMode = $(SavedInstallMode)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
Set Status = $($R0)
; check if RAS was successfully installed
ifStr(i) $(Status) == "STATUS_SUCCESSFUL"
Set RasInstalled = "TRUE"
EndIf
EndIf
; check if RAS is installed now
IfStr(i) $(RasInstalled) == "TRUE"
; if there is no RAS phonebook file yet, create an empty file
Set RasPhonebook = $(!STF_WINDOWSSYSPATH)"\RAS\rasphone.pbk"
LibraryProcedure Result, $(!LIBHANDLE), CheckFileExistance $(RasPhonebook)
IfStr(i) $(Result) == "NO"
LibraryProcedure Result, $(!LIBHANDLE), ConfigFileAppend $(RasPhonebook) ""
EndIf
; open the NDISWAN parameters registry subkey
OpenRegKey $(!REG_H_LOCAL) "" $(NdisWanParamsKeyName) +
$(MAXIMUM_ALLOWED) NdisWanParamsKey
IfInt $(RegLastError) == $(!REG_ERROR_SUCCESS)
; set the IPMTU registry value
SetRegValue $(NdisWanParamsKey) {"IPMTU", $(NoTitle), $(!REG_VT_DWORD), $(IPMTU)}
; close the NDISWAN parameters registry subkey
CloseRegKey $(NdisWanParamsKey)
EndIf
EndIf
; return the last status
Return $(Status)
FatalRegistryError = +
; show a fatal registry error message and exit
Shell $(UtilityINF) RegistryErrorString $(RegistryErrorIndex)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
Set Error = $($R0)
IfStr(i) $(Error) == ""
Shell $(UtilityINF) RegistryErrorString "SETUP_FAIL"
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
Set Error = $($R0)
EndIf
Shell $(SubroutineINF) SetupMessage $(!STF_LANGUAGE) "FATAL" $(Error)
IfInt $($ShellCode) != $(!SHELL_CODE_OK)
GoTo ShellCodeError
EndIf
Return STATUS_FAILED
ShellCodeError = +
; show a shell code error message box and exit
Set DlgType = "MessageBox"
Set STF_MB_TITLE = $(ShellCodeErrorTitle)
Set STF_MB_TEXT = $(ShellCodeErrorText)
Set STF_MB_TYPE = 1 ; OK button
Set STF_MB_ICON = 3 ; STOP icon
Set STF_MB_DEF = 1 ; default button
UI Start "ShellCodeError"
Return STATUS_FAILED
; *EOF*
Download Driver Pack
After your driver has been downloaded, follow these simple steps to install it.
Expand the archive file (if the download file is in zip or rar format).
If the expanded file has an .exe extension, double click it and follow the installation instructions.
Otherwise, open Device Manager by right-clicking the Start menu and selecting Device Manager.
Find the device and model you want to update in the device list.
Double-click on it to open the Properties dialog box.
From the Properties dialog box, select the Driver tab.
Click the Update Driver button, then follow the instructions.
Very important: You must reboot your system to ensure that any driver updates have taken effect.
For more help, visit our Driver Support section for step-by-step videos on how to install drivers for every file type.