oemsetup.inf Driver File Contents (3c980b-tx.zip)

; file version:  1.6.0.7
;%VER 3Com OEMSETUP.INF 1.6.0.7
[Identification]
    OptionType = NetTransport

[LanguagesSupported]
    ENG

[Options]
    DAPassThru

[OptionsTextENG]
    PassThru     = "DynamicAccess Intermediate Driver"

[FileConstants]
UtilityInf      			= "UTILITY.INF"
subroutineinf   			= "SUBROUTN.INF"
TransportSoftwareType			= "transport"
AdapterSoftwareType   			= "driver"
Exit_Code       			= 0
NetEventDLL     			= "%SystemRoot%\System32\drivers\daprot.sys"

Manufacturer    			= "3Com"
ProductMajorVersion     	= "1"
ProductMinorVersion     	= "5.0"
ProductVersion  			= $(ProductMajorVersion)"."$(ProductMinorVersion)

TransportProductSoftwareName	= "DAPassThruTransport"
AdapterProductSoftwareName		= "DAPassThru"
AdapterProductHardwareName		= "DAPassThru"

ProductSoftwareImagePath 		= "\SystemRoot\System32\drivers\DAprot.sys"
ProductMiniportSoftwareImagePath 	= "\SystemRoot\System32\drivers\DAmini.sys"

TransportNetRuleSoftwareType    	= "DAPassThruTransport DAPassThruTransport"
TransportNetRuleSoftwareClass   	= {"DAPassThruTransport basic"}
TransportNetRuleSoftwareUse     	= $(TransportSoftwareType)" none none"
TransportNetRuleSoftwareBindForm	= """DAPassThruTransport"" yes yes container"
TransportNetRuleSoftwareBindable 	= {"DAPassThruTransport ndisDriver non non 100"}

AdapterNetRuleSoftwareType    		= "DAPassThruSys ndisDriver DAPassThruDriver"
AdapterNetRuleSoftwareUse     		= $(AdapterSoftwareType)
AdapterNetRuleSoftwareBindForm		= """DAPROT"" yes no container"
AdapterNetRuleSoftwareClass   		= {"DAPassThruDriver basic"}
AdapterNetRuleSoftwareBindable 		= {"DAPassThruDriver DAPassThruAdapter non exclusive 100"}

AdapterNetRuleHardwareType		= "DAPassThru DAPassThruAdapter"
AdapterNetRuleHardwareBindForm 		= " yes yes container"
AdapterNetRuleHardwareClass    		= {"DAPassThruAdapter basic"}

TransportProductKeyName	= $(!NTN_SoftwareBase)"\"$(Manufacturer)"\"$(TransportProductSoftwareName)"\CurrentVersion"
TransportParamKeyName	= $(!NTN_ServiceBase)"\"$(TransportProductSoftwareName)"\Parameters"
TransportServiceKeyName	= $(!NTN_ServiceBase)"\"$(TransportProductSoftwareName)
TransportLinkageKeyName	= $(!NTN_ServiceBase)"\"$(TransportProductSoftwareName)"\Linkage"
TransportLinkageDisabledKeyName	= $(!NTN_ServiceBase)"\"$(TransportProductSoftwareName)"\Linkage\Disabled"

AdapterProductKeyName	= $(!NTN_SoftwareBase)"\"$(Manufacturer)"\"$(AdapterProductSoftwareName)"\CurrentVersion"
AdapterParamKeyName		= $(!NTN_ServiceBase)"\"$(AdapterProductSoftwareName)"\Parameters"
AdapterServiceKeyName	= $(!NTN_ServiceBase)"\"$(AdapterProductSoftwareName)
AdapterLinkageKeyName	= $(!NTN_ServiceBase)"\"$(AdapterProductSoftwareName)"\Linkage"

[FileConstantsENG]
ProCaption   				= "Windows NT Setup"
ProCancel    				= "Cancel"
ProCancelMsg 				= "Windows NT Networking is not correctly installed.  "+
               				  "Are you sure you want to cancel copying files?"
ProCancelCap 				= "Network Setup Message"
ProText1     				= "Copying:"
ProText2     				= "To:"
FunctionTitle   			= "DAPassThru Driver"
TransportProductSoftwareDescription	= "DAPassThru Driver Transport"
TransportProductSoftwareDisplayName	= "DAPassThru Driver Transport"
TransportProductSoftwareTitle    	= "DAPassThru Driver Transport"
AdapterProductSoftwareDescription	= "DAPassThru Driver Adapter"
AdapterProductSoftwareDisplayName	= "DAPassThru Driver Adapter"
AdapterProductSoftwareTitle    		= "DAPassThru Driver Adapter"
ProductHardwareDescription		= "DAPassThru Driver Virtual Adapter"
ProductHardwareDisplayName		= "DAPassThru Driver Virtual Adapter"
ProductHardwareTitle			= "DAPassThru Driver Virtual Adapter"
ShellCodeErrorTitle     		= "Error: "$(FunctionTitle)
ShellCodeErrorText      		= "Shell Code Error."

[GeneralConstants]
from      = ""
to        = ""
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
DisableOtherReviewBindings = $(!STF_WINDOWSPATH)"\System32\DASetup.exe"
DisableOtherReviewBindingsText = "DisableOtherReviews"
StartDetachedText = "StartDetachedReview"
DASetupNT = $(!STF_WINDOWSPATH)"\System32\DASetup.exe"
SetupINFName = $(!STF_WINDOWSPATH)"\System32\oemsetup.INF"
DASmartN = $(!STF_WINDOWSPATH)"\System32\DASmartN.exe"
PostProcessInf = $(!STF_WINDOWSPATH)"\System32\PRUN.INF"
DA15CFGEXE = $(!STF_WINDOWSPATH)"\System32\da15cfg.exe"
DASERVERCPL = $(!STF_WINDOWSPATH)"\System32\daserver.cpl"
DASERVERHLP = $(!STF_WINDOWSPATH)"\System32\daserver.hlp"
;DA15CFGINI = $(!STF_WINDOWSPATH)"\System32\da15cfg.ini"
DACFGCPL   = $(!STF_WINDOWSPATH)"\System32\Pacecfg.cpl"
DACFGCPLSAV= $(!STF_WINDOWSPATH)"\System32\Pacecfg.sav"
DACFGHLP   = $(!STF_WINDOWSPATH)"\System32\dacfg.hlp"
;DACFGAPPLST= $(!STF_WINDOWSPATH)"\System32\dacfgapp.lst"
ReviewProgramsTxt = "ReviewPrograms"
ProductSoftwareImagePathTxt 		= $(!STF_WINDOWSPATH)"\System32\drivers\DAprot.sys"
ProductMiniportSoftwareImagePathTxt 	= $(!STF_WINDOWSPATH)"\System32\drivers\DAmini.sys"
InstallInProcess = "DAInstallInProcess"
TotalNumberOfNICs = 64
TotalNumberOfGroups = 32 ;half of the TotalNumberOfNICs


[date]
    Now = {} ? $(!LIBHANDLE) GetSystemDate

[platform]
    STF_PLATFORM = "" ? $(!LIBHANDLE) GetPlatform

[Identify]
    read-syms Identification
    set Status     = STATUS_SUCCESSFUL
    set Identifier = $(OptionType)
    set Media      = #("Source Media Descriptions", 1, 1)
    Return $(Status) $(Identifier) $(Media)

[ReturnOptions]
    set Status        = STATUS_FAILED
    set OptionList     = {}
    set OptionTextList = {}
    set LanguageList = ^(LanguagesSupported, 1)
    Ifcontains(i) $($0) in $(LanguageList)
        goto returnoptions
    else
        set Status = STATUS_NOLANGUAGE
        goto finish_ReturnOptions
    endif
returnoptions = +
    set OptionList     = ^(Options, 1)
    set OptionTextList = ^(OptionsText$($0), 1)
    set Status         = STATUS_SUCCESSFUL
finish_ReturnOptions = +
    Return $(Status) $(OptionList) $(OptionTextList)

[InstallOption]

    set !DebugOutputControl = 1
    
    set Option   = $($1)
    set SrcDir   = $($2)
    set AddCopy  = $($3)
    set DoCopy   = $($4)
    set DoConfig = $($5)
    set LanguageList = ^(LanguagesSupported, 1)
    Ifcontains(i) $($0) NOT-IN $(LanguageList)
        Return STATUS_NOLANGUAGE
    endif
    set-subst LF = "\n"
    read-syms GeneralConstants
    read-syms FileConstants
    read-syms DialogConstants$(!STF_LANGUAGE)
    ifstr(i) $(!NTN_Origination) == "NCPA"
        set Continue = $(OK)
    endif
    read-syms FileConstants$(!STF_LANGUAGE)
    detect date
    detect platform
    set-title  $(FunctionTitle)
    set to   = Begin
    set from = Begin
    set CommonStatus = STATUS_SUCCESSFUL
    EndWait
    
Begin = +
    Ifstr(i) $(!NTN_InstallMode) == deinstall
        set StartLabel = deinstall
    else-Ifstr(i) $(!NTN_InstallMode) == update
        set StartLabel = update
    else-Ifstr(i) $(!NTN_InstallMode) == bind
        set StartLabel = bind
    else-Ifstr(i) $(!NTN_InstallMode) == configure
        set StartLabel = configure
    else
        set StartLabel = install
    endif
    set RadioDefault = 2
    set RadioIn = {$(RadioDefault)}
    set from = $(fatal)
    set to = $(fatal)
    goto $(StartLabel)

install =+

;Debug:
;	Set DlgText = "oemsetup.INF:  install=+ Section"
;	Shell "Subroutn.Inf" SetupMessage $(!STF_LANGUAGE) "WARNING" $(DlgText)
;	ifint $($ShellCode) != $(!SHELL_CODE_OK)
;		set RegistryErrorIndex = ERROR
;	endif

    OpenRegKey $(!REG_H_LOCAL) "" $(TransportProductKeyName) $(MAXIMUM_ALLOWED) KeyProduct
    Ifstr $(KeyProduct) != $(KeyNull)
        CloseRegKey $(KeyProduct)
        Shell $(UtilityInf), VerExistedDlg, $(TransportProductSoftwareTitle),+
            $(ProductVersion)
        ifint $($ShellCode) != $(!SHELL_CODE_OK)
            goto ShellCodeError
        endif
        goto end
    endif
    CloseRegKey $(KeyProduct)
    goto installproduct

installproduct = +
    StartWait
    ifint $(OldVersionExisted) == $(FALSE)
        Ifstr(i) $(DoCopy) == "YES"
           Shell $(UtilityInf), DoAskSource, $(!STF_CWDDIR), $(SrcDir) YES
           Ifint $($ShellCode) != $(!SHELL_CODE_OK)
               Goto ShellCodeError
           Else-Ifstr(i) $($R0) == STATUS_FAILED
               Shell $(UtilityInf) RegistryErrorString "ASK_SOURCE_FAIL"
               ifint $($ShellCode) != $(!SHELL_CODE_OK)
                   goto ShellCodeError
               endif
               Goto fatal
           Else-Ifstr(i) $($R0) == STATUS_USERCANCEL
               Goto successful
           Endif
           Set SrcDir = $($R1)

			Debug-Output "PassThru: oemsetup.inf: SrcDir "$(SrcDir)

        Endif
        Shell "" StripTrailSlash $(SrcDir)
        set PlatformDir  = $($R0)"\"$(STF_PLATFORM)
        set InfDir  = $($R0)"\"

        install "Install-Option"

        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 fatal
        endif
        set OEM_ABANDON_ON = TRUE

		Debug-Output "PassThru: Adding Transport Software Component to Registry"

		Shell $(UtilityInf), AddSoftwareComponent, $(Manufacturer), +
            $(TransportProductSoftwareName), +
            $(TransportProductSoftwareName), +
            $(TransportProductSoftwareDisplayName), $(STF_CONTEXTINFNAME), +
            $(ProductSoftwareImagePath), "transport", "NDIS", {}, "",+
            $(NetEventDLL)
        set RegistryErrorIndex = $($R0)
        Ifstr(i) $(RegistryErrorIndex) !=  NO_ERROR
            EndWait
            CloseRegKey $($R1)
            CloseRegKey $($R2)
            CloseRegKey $($R3)
            CloseRegKey $($R4)
            CloseRegKey $($R5)
            goto fatalregistry
        endif
        Set SoftProductKey      = $($R1)
        Set SoftNetRuleKey      = $($R2)
        Set SoftServiceKey      = $($R3)
        Set SoftParameterKey    = $($R4)
        Set SoftLinkageKey      = $($R5)
        set NewValueList = {{SoftwareType,$(NoTitle),$(!REG_VT_SZ),$(TransportSoftwareType)},+
                           {MajorVersion,$(NoTitle),$(!REG_VT_DWORD),$(ProductMajorVersion)},+
                           {MinorVersion,$(NoTitle),$(!REG_VT_DWORD),$(ProductMinorVersion)},+
                           {Title,$(NoTitle),$(!REG_VT_SZ),$(TransportProductSoftwareTitle)},+
                           {Description,$(NoTitle),$(!REG_VT_SZ),$(TransportProductSoftwareDescription)},+
                           {ServiceName,$(NoTitle),$(!REG_VT_SZ),$(TransportProductSoftwareName)},+
                           {Review,$(NoTitle),$(!REG_VT_DWORD),1},+
                           {InstallDate,$(NoTitle),$(!REG_VT_DWORD),*($(Now),1)}}
        Shell  $(UtilityInf), AddValueList, $(SoftProductKey), $(NewValueList)
        set RegistryErrorIndex = $($R0)
        Ifstr $(RegistryErrorIndex) != NO_ERROR
            CloseRegKey $(SoftProductKey)
            CloseRegKey $(SoftNetRuleKey)
            CloseRegKey $(SoftServiceKey)
            CloseRegKey $(SoftParameterKey)
            CloseRegKey $(SoftLinkageKey)
            goto fatalregistry
        endif
        set NewValueList = {{type,$(NoTitle),$(!REG_VT_SZ),$(TransportNetRuleSoftwareType)}, +
                            {use,$(NoTitle),$(!REG_VT_SZ),$(TransportNetRuleSoftwareUse)}, +
                            {class,$(NoTitle),$(!REG_VT_MULTI_SZ),$(TransportNetRuleSoftwareClass)}, +
                            {bindform,$(NoTitle),$(!REG_VT_SZ),$(TransportNetRuleSoftwareBindForm)}, +
                            {bindable,$(NoTitle),$(!REG_VT_MULTI_SZ),$(TransportNetRuleSoftwareBindable)}, +
                            {InfOption,$(NoTitle),$(!REG_VT_SZ),$(Option)}}
        Shell  $(UtilityInf), AddValueList, $(SoftNetRuleKey), $(NewValueList)
        set RegistryErrorIndex = $($R0)
        Ifstr $(RegistryErrorIndex) != NO_ERROR
            CloseRegKey $(SoftProductKey)
            CloseRegKey $(SoftNetRuleKey)
            CloseRegKey $(SoftServiceKey)
            CloseRegKey $(SoftParameterKey)
            CloseRegKey $(SoftLinkageKey)
            goto fatalregistry
        endif

        CloseRegKey $(SoftProductKey)
        CloseRegKey $(SoftNetRuleKey)
        CloseRegKey $(SoftServiceKey)
        CloseRegKey $(SoftParameterKey)
        CloseRegKey $(SoftLinkageKey)

		Debug-Output "PassThru: Adding Adapter Software Component to Registry"

        Shell $(UtilityInf), AddSoftwareComponent, $(Manufacturer), +
            $(AdapterProductSoftwareName), +
            $(AdapterProductSoftwareName), +
            $(AdapterProductSoftwareDisplayName), $(STF_CONTEXTINFNAME), +
            $(ProductMiniportSoftwareImagePath), "kernel", "NDIS", {}, "",+
            $(NetEventDLL)
        set RegistryErrorIndex = $($R0)
        Ifstr(i) $(RegistryErrorIndex) !=  NO_ERROR
            EndWait
            CloseRegKey $($R1)
            CloseRegKey $($R2)
            CloseRegKey $($R3)
            CloseRegKey $($R4)
            CloseRegKey $($R5)
            goto fatalregistry
        endif
        Set SoftProductKey      = $($R1)
        Set SoftNetRuleKey      = $($R2)
        Set SoftServiceKey      = $($R3)
        Set SoftParameterKey    = $($R4)
        Set SoftLinkageKey      = $($R5)

        set NewValueList = {{SoftwareType,$(NoTitle),$(!REG_VT_SZ),$(AdapterSoftwareType)},+
                           {MajorVersion,$(NoTitle),$(!REG_VT_DWORD),$(ProductMajorVersion)},+
                           {MinorVersion,$(NoTitle),$(!REG_VT_DWORD),$(ProductMinorVersion)},+
                           {Title,$(NoTitle),$(!REG_VT_SZ),$(AdapterProductSoftwareTitle)},+
                           {Description,$(NoTitle),$(!REG_VT_SZ),$(AdapterProductSoftwareDescription)},+
                           {ServiceName,$(NoTitle),$(!REG_VT_SZ),$(AdapterProductSoftwareName)},+
                           {InstallDate,$(NoTitle),$(!REG_VT_DWORD),*($(Now),1)}}
        Shell  $(UtilityInf), AddValueList, $(SoftProductKey), $(NewValueList)
        set RegistryErrorIndex = $($R0)
        Ifstr $(RegistryErrorIndex) != NO_ERROR
            CloseRegKey $(SoftProductKey)
            CloseRegKey $(SoftNetRuleKey)
            CloseRegKey $(SoftServiceKey)
            CloseRegKey $(SoftParameterKey)
            CloseRegKey $(SoftLinkageKey)
            goto fatalregistry
        endif
        set NewValueList = {{type,$(NoTitle),$(!REG_VT_SZ),$(AdapterNetRuleSoftwareType)}, +
                            {use,$(NoTitle),$(!REG_VT_SZ),$(AdapterNetRuleSoftwareUse)}, +
                            {class,$(NoTitle),$(!REG_VT_MULTI_SZ),$(AdapterNetRuleSoftwareClass)}, +
                            {bindform,$(NoTitle),$(!REG_VT_SZ),$(AdapterNetRuleSoftwareBindForm)}, +
                            {bindable,$(NoTitle),$(!REG_VT_MULTI_SZ),$(AdapterNetRuleSoftwareBindable)}, +
                            {InfOption,$(NoTitle),$(!REG_VT_SZ),$(Option)}}
        Shell  $(UtilityInf), AddValueList, $(SoftNetRuleKey), $(NewValueList)
        set RegistryErrorIndex = $($R0)
        Ifstr $(RegistryErrorIndex) != NO_ERROR
            CloseRegKey $(SoftProductKey)
            CloseRegKey $(SoftNetRuleKey)
            CloseRegKey $(SoftServiceKey)
            CloseRegKey $(SoftParameterKey)
            CloseRegKey $(SoftLinkageKey)
            goto fatalregistry
        endif
        
        CloseRegKey $(SoftProductKey)
        CloseRegKey $(SoftNetRuleKey)
        CloseRegKey $(SoftServiceKey)
        CloseRegKey $(SoftParameterKey)
        CloseRegKey $(SoftLinkageKey)

		OpenRegKey $(!REG_H_LOCAL) "" $(TransportParamKeyName) $(MAXIMUM_ALLOWED) DAParamKey
		SetRegValue $(DAParamKey) {$(InstallInProcess),$(NoTitle),$(!REG_VT_DWORD),2}
	endif

    EndWait
    goto successful

bind =+
	;
	;	When user terminates NCPA, bind is invoked.  Therefore, without knowing
	;	what the user has done to the NCPA (add new card, remove a card, etc.), 
	;	bind has to find out and does things accordingly.

	;	If this not the binding review for the Transport Driver exit out
   	ifstr(i) $(!NTN_RegBase) != $(TransportProductKeyName)
		goto successful
	endif

	; Open the Group_Info Key in the registry and set the Registry_Lock Key
	Set RegKey = "SOFTWARE\3Com\DA\Server\Group_Info"
	Debug-Output "CreateList: about to open "$(RegKey)
	OpenRegKey $(!REG_H_LOCAL) "" $(RegKey) $(MAXIMUM_ALLOWED) GroupInfoKey
	ifstr(i) $(GroupInfoKey) == ""
		Debug-Output "PassThru: creating "$(RegKey)" key under the Software"
		CreateRegKey $(!REG_H_LOCAL) {$(RegKey),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" GroupInfoKey
		ifstr(i) $(GroupInfoKey) == ""
			Debug-Output "Create List: failed to open and create the Group_info Key"
			goto fatalregistry
		endif
	endif

	;**** Copy TCP info from the Primary Virtuals to the Primary Reals
	RunProgram ExitCode "" "" $(DASetupNT) t

	;
	;	Open the Linkage Key of the Virtual Protocol and get the Bind Value
	;	to get the entire list of cards bound to the Virtual Protocol
	;
	Debug-Output "PassThru: Reviewing bindings in "$(TransportLinkageKeyName)
	OpenRegKey $(!REG_H_LOCAL) "" $(TransportLinkageKeyName) $(MAXIMUM_ALLOWED) TransportLinkageKey
	ifstr(i) $(TransportLinkageKey) != ""
		GetRegValue $(TransportLinkageKey) "Bind" BindList
		Debug-Output "PassThru: BindList: "$(BindList)
		Set Binding = *($(BindList),4)
		Debug-Output "PassThru: Binding:  "$(Binding)
		CloseRegKey $(TransportLinkageKey)
	else
		Debug-Output "PassThru: failed to open Linkage Key for "$(TransportServiceKeyName)
		goto fatalregistry
	endif
	;
	;	Parse the Bindings to create a list of Adapter cards
	;
	set CardList = {}
	set NICIndex = 0
	ForListDo $(Binding)
		Split-String $($), "\", BindInfo
		QueryListSize BindListSize $(BindInfo)
		set CardName = *($(BindInfo),$(BindListSize))
		Debug-Output "PassThru: Cardname: "$(CardName)
		ifstr(i) $(CardList) == {}
			set CardList = {$(CardName)}
		else
			set CardList = >($(CardList),$(CardName))
		endif
	EndForListDo

	;************************** Beginning of read in Group_info key from registry *******************
	; Create Group list for holding virtual and real nics in their groups
	Set MasterGroupList = {}
	set RealNICsThatNeedAGroupList = {}
	set VirtualNICsToBeCreatedList = {}
	set VirtualNICsToBeCreatedVLAN_IDsList = {}
	set VirtualNICsToBeDeletedList = {}
	Set GlobalAssignedRealNICList = {}
	Set GlobalAssignedVirtualNICList = {}
	Set CreateGroupIndex = 1
BuildNextGroup = +
	Debug-Output "PassThru: BuildNextGroup:  "$(CreateGroupIndex)
	OpenRegKey $(GroupInfoKey) "" $(CreateGroupIndex) $(MAXIMUM_ALLOWED) GroupKey
	ifstr(i) $(GroupKey) == ""
		Debug-Output "PassThru: BuildNextGroup: This group Does not exist in the registry"
		; if The group does not exist in the registry create a null entry
		ifstr(i) $(MasterGroupList) == {}
			set MasterGroupList = {{0,{},{}}}
		else
			set MasterGroupList = >($(MasterGroupList),{0,{},{}})
		endif
	else
		Debug-Output "PassThru: BuildNextGroup: This group is in the registry"
		set RealNICList = {}
		set VirtualNICList = {}
		set AddedVirtualNIC = NO

		;########################## Begin Processing of the Real Adapters Group info key ##########################
		OpenRegKey $(GroupKey) "" Real_NICs	$(MAXIMUM_ALLOWED) GroupRealNICKey
		ifstr(i) $(GroupRealNICKey) != ""
			;Enumerate all of the values in the Registry key, add them to the list and change thier group IDs				
			EnumRegValue $(GroupRealNICKey) GroupRealNICKeyList
			ForListDo $(GroupRealNICKeyList)
				Set NICServiceName = *( $($), 1 )
				Set RegKey = $(!NTN_ServiceBase)"\"$(NICServiceName)"\Parameters"
				OpenRegKey $(!REG_H_LOCAL) "" $(RegKey) $(MAXIMUM_ALLOWED) NICServiceNameKey
				ifstr(i) $(NICServiceNameKey) != ""
					SetRegValue $(NICServiceNameKey) {"DA_Group_ID",$(NoTitle),$(!REG_VT_DWORD),$(CreateGroupIndex)}
					ifstr(i) $(RegLastError) != 0
						; if we can't set the DA_Group_ID key we must fail
						goto fatalregistry
					endif
					CloseRegKey $(NICServiceNameKey)
					; add this NIC to the Group list for this group
					ifstr(i) $(RealNICList) == {}
						set RealNICList = {$(NICServiceName)}
					else			
						set RealNICList = >($(RealNICList),$(NICServiceName))
					endif
					; Add this NIC to the global NIC list to match it to the bind enumeration
					ifstr(i) $(GlobalAssignedRealNICList) == {}
						set GlobalAssignedRealNICList = {$(NICServiceName)}
					else			
						set GlobalAssignedRealNICList = >($(GlobalAssignedRealNICList),$(NICServiceName))
					endif
				else
					;The card does not exist anymore and needs to be removed from the Group
					DeleteRegValue $(GroupRealNICKey) *( $($), 1)
				endif
			EndForListDo
			CloseRegKey $(GroupRealNICKey)
		endif
		;########################## End Processing of the Real Adapters Group info key ##########################

		;@@@@@@@@@@@@@@@@@@@@@@@@@@ Begin Processing of the Virtual Adapters Group info key @@@@@@@@@@@@@@@@@@@@@@@@@@
		OpenRegKey $(GroupKey) "" Virtual_NICs	$(MAXIMUM_ALLOWED) GroupVirtualNICKey
		ifstr(i) $(GroupVirtualNICKey) != ""
			;Enumerate all of the values in this group Registry key, add them to the list and change thier group IDs				
			EnumRegValue $(GroupVirtualNICKey) GroupVirtualNICKeyList
			ForListDo $(GroupVirtualNICKeyList)
				Set NICServiceName = *( $($), 1 )
				Set VLAN_ID = *( $($), 4 )
				Set RegKey = $(!NTN_ServiceBase)"\"$(NICServiceName)"\Parameters"
				OpenRegKey $(!REG_H_LOCAL) "" $(RegKey) $(MAXIMUM_ALLOWED) NICServiceNameKey
				ifstr(i) $(NICServiceNameKey) != ""
					ifstr(i) $(RealNICList) != {}
						; We need to place the DA_Group_ID key in the registry and place the VNIC in the VirtualNICList
						SetRegValue $(NICServiceNameKey) {"DA_Group_ID",$(NoTitle),$(!REG_VT_DWORD),$(CreateGroupIndex)}
						ifstr(i) $(RegLastError) != 0
							; if we can't set the DA_Group_ID key we must fail
							goto fatalregistry
						endif
						CloseRegKey $(NICServiceNameKey)
						; add this NIC to the Group list for this group
						ifstr(i) $(VirtualNICList) == {}
							set VirtualNICList = {$(NICServiceName)}
						else			
							set VirtualNICList = >($(VirtualNICList),$(NICServiceName))
						endif
						; Add this NIC to the global NIC list to match it to the bind enumeration
						ifstr(i) $(GlobalAssignedVirtualNICList) == {}
							set GlobalAssignedVirtualNICList = {$(NICServiceName)}
						else			
							set GlobalAssignedVirtualNICList = >($(GlobalAssignedVirtualNICList),$(NICServiceName))
						endif
					else	
						; Since there are no real NICs in the group we must place it into the VirtualNICsToBeDeletedList
						ifstr(i) $(VirtualNICsToBeDeletedList) == {}
							set VirtualNICsToBeDeletedList = {$(NICServiceName))}	
						else			
							set VirtualNICsToBeDeletedList = >($(VirtualNICsToBeDeletedList),$(NICServiceName))
						endif
					endif
				else
					;The virtual NIC does not exist anymore and needs to be readded or it is a new VLAN
					; and needs to be added if there are any real NICs
					ifstr(i) $(RealNICList) != {}
						set AddedVirtualNIC = YES
						ifstr(i) $(VirtualNICsToBeCreatedList) == {}
							set VirtualNICsToBeCreatedList = {$(CreateGroupIndex)}
							set VirtualNICsToBeCreatedVLAN_IDsList = {$(VLAN_ID)}
						else
							set VirtualNICsToBeCreatedList = >($(VirtualNICsToBeCreatedList),$(CreateGroupIndex))
							set VirtualNICsToBeCreatedVLAN_IDsList = >($(VirtualNICsToBeCreatedVLAN_IDsList),$(VLAN_ID))
						endif
						DeleteRegValue $(GroupVirtualNICKey) $(NICServiceName)
					endif
				endif
			EndForListDo
			CloseRegKey $(GroupVirtualNICKey)
		endif
		;@@@@@@@@@@@@@@@@@@@@@@@@@@ End Processing of the Virtual Adapters Group info key @@@@@@@@@@@@@@@@@@@@@@@@@@
		;
		;Finish processing this group by adding it to the master list or Deleteing the Group Key if all of the Real NICs were removed
		;
		CloseRegKey $(GroupKey)
		ifstr(i) $(RealNICList) != {}
			; If there are any real adapters left in the group
			ifstr(i) $(VirtualNICList) == {}
				ifstr(i) $(AddedVirtualNIC) == NO
					; if there are no Virtual Adapters for this group and none were added Create a new Virtual 
					ifstr(i) $(VirtualNICsToBeCreatedList) == {}
						set VirtualNICsToBeCreatedList = {$(CreateGroupIndex)}
					else
						set VirtualNICsToBeCreatedList = >($(VirtualNICsToBeCreatedList),$(CreateGroupIndex))
					endif
				endif
			endif
			ifstr(i) $(MasterGroupList) == {}
				set MasterGroupList = {{1,$(RealNICList),$(VirtualNICList)}}
			else
				set MasterGroupList = >($(MasterGroupList),{1,$(RealNICList),$(VirtualNICList)})
			endif
			Debug-Output "PassThru: Processing RealNICList "$(RealNICList)"..."
			Debug-Output "PassThru: Processing VirtualNICList "$(VirtualNICList)"..."
		else
			Debug-Output "PassThru: There were no real adapters in this group in the registry"
			; If there are no real adapters left in the group
			DeleteRegTree $(GroupInfoKey) $(CreateGroupIndex) 
			ifstr(i) $(MasterGroupList) == {}
				set MasterGroupList = {{0,{},{}}}
			else
				set MasterGroupList = >($(MasterGroupList),{0,{},{}})
			endif
		endif
	endif
	ifstr(i) $(CreateGroupIndex) != $(TotalNumberOfGroups)
		;If we haven't tried all of the possible groups then goto the top of the loop
		Set-add CreateGroupIndex = $(CreateGroupIndex), 1
		goto BuildNextGroup
	endif		
	Debug-Output "PassThru: Processing GlobalAssignedRealNICList "$(GlobalAssignedRealNICList)"..."
	Debug-Output "PassThru: Processing GlobalAssignedVirtualNICList "$(GlobalAssignedVirtualNICList)"..."
	;************************** End of read in Group_Info key from registry *****************************

	;************************** Beginning of the section to transverse the Binding tree *****************
	;	For each real and virtual NIC process them correctly and place them in the correct list
	;
	Set CardParamKey = ""
	ForListDo $(CardList)
		Debug-Output "PassThru: Processing "$($)"..."
		ifstr(i) $(CardParamKey) != ""
			CloseRegKey $(CardParamKey)
			Set CardParamKey = ""
		endif
		Set RegKey = $(!NTN_ServiceBase)"\"$($)"\Parameters"
		OpenRegKey $(!REG_H_LOCAL) "" $(RegKey) $(MAXIMUM_ALLOWED) CardParamKey
		ifstr(i) $(CardParamKey) == ""
			CreateRegKey $(!REG_H_LOCAL) {$(RegKey),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" CardParamKey
			ifstr(i) $(CardParamKey) == ""
				Debug-Output "Create List: failed to open or create $($) parameters Key"
				goto fatalregistry
			endif
		endif
		;
		;	Check if this is a virtual adapter that WE created.
		;	and process it if it is
		;
		Split-String $($), "1234567890", ServiceNameSplitList
		Ifcontains(i) "DAPassThru" in $(ServiceNameSplitList)
			;*********************** Begin Processing of Virtual Adapter in Bind list ******************
			Debug-Output "PassThru: Processing "$($)" as a virtual adapter"
			Set GroupIDRecord = ""
			GetRegValue $(CardParamKey) "DA_Group_ID" GroupIDRecord
			ifstr(i) $(GroupIDRecord) == ""
				Debug-Output "PassThru: Processing "$($)" has no DA_Group_ID"
				; The DA_Group_ID Value is not in the registry and we need to remove this Virtual NIC
				ifstr(i) $(VirtualNICsToBeDeletedList) == {}
					set VirtualNICsToBeDeletedList = {$($)}
				else			
					set VirtualNICsToBeDeletedList = >($(VirtualNICsToBeDeletedList),$($))
				endif
				Debug-Output "PassThru: no Group_ID "$($)" added to VirtualNICsToBeDeletedList "$(VirtualNICsToBeDeletedList)
				goto continueCardList
			else
				;Check if the card is in the GlobalAssignedVirtualNICList
				Ifcontains(i) $($) not-in $(GlobalAssignedVirtualNICList)
					; if the card is not in the list then put it in the VirtualNICsToBeDeletedList
					ifstr(i) $(VirtualNICsToBeDeletedList) == {}
						set VirtualNICsToBeDeletedList = {$($)}
					else			
						set VirtualNICsToBeDeletedList = >($(VirtualNICsToBeDeletedList),$($))
					endif
					Debug-Output "PassThru: not in GlobalAssignedVirtualNICList "$($)" added to VirtualNICsToBeDeletedList "$(VirtualNICsToBeDeletedList)
				endif
				goto continueCardList
			endif
			;*********************** End Processing of Virtual Adapter in Bind list ******************
		endif
				
		;
		; Wedge supports only media type # 1 NICs
		;	We must see if the NIC is not media Type 1 and if it is not don't touch it
		;
		; ################### Begin search for non-ethernet NICs ####################################
		Set MediaTypeRecord = ""
		GetRegValue $(CardParamKey) "MediaType" MediaTypeRecord
		ifstr(i) $(MediaTypeRecord) == ""
			goto continueCardList
		endif
		Set MediaTypeValue = *($(MediaTypeRecord),4)
		ifstr(i) $(MediaTypeValue) != 1
			goto continueCardList
		else-ifstr(i) $(MediaTypeValue) == 1
			Set MediaTypeValue = *($(MediaTypeRecord),4)
			;
			;if ATM mediatype, don't create virtual NIC
			;
			;	Get Title field of mapped Nic:
			;
			Set RealNICCard = $($)
			Set RegKey = $(!NTN_SoftwareBase)"\Microsoft\Windows NT\CurrentVersion\NetworkCards"
			OpenRegKey $(!REG_H_LOCAL) "" $(RegKey) $(MAXIMUM_ALLOWED) NetCardKey
			ifstr(i) $(NetCardKey) != ""
				EnumRegKey $(NetCardKey) NetCardKeyList
				ForListDo $(NetCardKeyList)
					Set NetCardNum = *( $($), 1 )
					Set RegKey = $(!NTN_SoftwareBase)"\Microsoft\Windows NT\CurrentVersion\NetworkCards\"$(NetCardNum)
					OpenRegKey $(!REG_H_LOCAL) "" $(RegKey) $(MAXIMUM_ALLOWED) NetCardNumKey
					GetRegValue $(NetCardNumKey) "ServiceName" NetCardServiceNameValue
					Set NetCardServiceName = *( $(NetCardServiceNameValue), 4 )
					ifstr(i) $(NetCardServiceName) == $(RealNICCard)
						GetRegValue $(NetCardNumKey) "Title" NetCardTitleRec
						Set NetCardTitle = *( $(NetCardTitleRec), 4 )
					endif
				EndForListDo
			endif
			CloseRegKey $(NetCardKey)
			CloseRegKey $(NetCardNumKey)
			Split-String $(NetCardTitle), " ", itemizedTitle
			Ifcontains "ATM" in $(itemizedTitle)
				goto continueCardList
			else
				set anATMCard = 0
				ForListDo $(itemizedTitle)
					Split-String $($), "M", ATMPrependTitle
					Ifcontains "AT" in $(ATMPrependTitle)
						set anATMCard = 1
					endif
					Split-String $($), "A", ATMAppendTitle
					Ifcontains "TM" in $(ATMAppendTitle)
						set anATMCard = 1
					else
						ForListDo $(ATMAppendTitle)
							Split-String $($), "M", ATMInsideTitle
							Ifcontains "T" in $(ATMInsideTitle)
								set anATMCard = 1
							endif
						EndForListDo
					endif
				EndForListDo
				ifstr(i) $(anATMCard) == "1"
					goto continueCardList
				endif
			endif
		endif
		; ################### End search for non-ethernet NICs ####################################

		;***  We now know that this is an EtherNet NIC and a adapter that we support and that 
		;*** it is not a virtual Adapter that we created
		;*********************** Begin Processing of a Real Adapter in Bind list ******************
		Debug-Output "PassThru: Processing "$($)" as a real adapter"
		Set GroupIDRecord = ""
		GetRegValue $(CardParamKey) "DA_Group_ID" GroupIDRecord
		ifstr(i) $(GroupIDRecord) == ""
			; If the DA_Group_ID Key is not in the registry then we must add this Real Adapter to the
			; RealNICsThatNeedAGroupList
			ifstr(i) $(RealNICsThatNeedAGroupList) == {}
				set RealNICsThatNeedAGroupList = {$($)}
			else			
				set RealNICsThatNeedAGroupList = >($(RealNICsThatNeedAGroupList),$($))
			endif
			Debug-Output "PassThru: no group_id key "$($)" added to RealNICsThatNeedAGroupList "$(RealNICsThatNeedAGroupList)
			goto continueCardList
		else
			;Check if the card is in the GlobalAssignedRealNICList
			Ifcontains(i) $($) not-in $(GlobalAssignedRealNICList)
				; if the card is not in the list then put it in the RealNICsThatNeedAGroupList
				ifstr(i) $(RealNICsThatNeedAGroupList) == {}
					set RealNICsThatNeedAGroupList = {$($)}
				else			
					set RealNICsThatNeedAGroupList = >($(RealNICsThatNeedAGroupList),$($))
				endif
				Debug-Output "PassThru: not in GlobalAssignedRealNICList "$($)" added to RealNICsThatNeedAGroupList "$(RealNICsThatNeedAGroupList)
			endif
			goto continueCardList
		endif
		;*********************** End Processing of a Real Adapter in Bind list ******************
continueCardList = +
	EndForListDo
	;************************** end of the section to transverse the Binding tree *****************
	;&&&&&&&&&&&&&&&&&&&&&&&&&& Begining of Processing RealNICsThatNeedAGroupList &&&&&&&&&&&&&&&&&
	;  For each real NIC in this list we must first find a group that is not in use.  Then we 
	;  add it to that group and create a Virtual Adapter to go with it.
	Set RealNICsThatNeedAGroupListAlreadyProcessed = {}
	Set RealNICsThatNeedAGroupListAlreadyProcessedDA_Group_IDs = {}
	Set searchgroupindex = 1
	Debug-Output "PassThru: Processing RealNICsThatNeedAGroupList "$(RealNICsThatNeedAGroupList)
	ForListDo $(RealNICsThatNeedAGroupList)
		Ifcontains(i) $($) not-in $(RealNICsThatNeedAGroupListAlreadyProcessed)
RealSearchNextGroup = +
			; &&& find a group that has not already been used in the MasterGroupList
			ifstr(i) *(*($(MasterGroupList), $(searchgroupindex)),1) == 0
				Debug-Output "PassThru: Processing RealSearchNextGroup found empty group "$(searchgroupindex)
				ifstr(i) $(CardParamKey) != ""
					CloseRegKey $(CardParamKey)
					Set CardParamKey = ""
				endif
				Set RegKey = $(!NTN_ServiceBase)"\"$($)"\Parameters"
				OpenRegKey $(!REG_H_LOCAL) "" $(RegKey) $(MAXIMUM_ALLOWED) CardParamKey
				ifstr(i) $(CardParamKey) == ""
					CreateRegKey $(!REG_H_LOCAL) {$(RegKey),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" CardParamKey
					ifstr(i) $(CardParamKey) == ""
						Debug-Output "Create List: failed to open and create $($) parameters Key"
						goto fatalregistry
					endif
				endif
				; &&& give this Real nic that DA_Group_ID  
				SetRegValue $(CardParamKey) {"DA_Group_ID",$(NoTitle),$(!REG_VT_DWORD),$(searchgroupindex)}
				ifstr(i) $(RegLastError) != 0
					; if we can't set the DA_Group_ID key we must fail
					goto fatalregistry
				endif
				;&&& add a virtual nic to the list of virtual Nics to be added
				ifstr(i) $(VirtualNICsToBeCreatedList) == {}
					set VirtualNICsToBeCreatedList = {$(searchgroupindex)}
				else
					set VirtualNICsToBeCreatedList = >($(VirtualNICsToBeCreatedList), $(searchgroupindex))
				endif
				;&&& add the Nic to the RealNICsThatNeedAGroupListAlreadyProcessed so it does not get processed again
				ifstr(i) $(RealNICsThatNeedAGroupListAlreadyProcessed) == {}
					set RealNICsThatNeedAGroupListAlreadyProcessed = {$($)}
					set RealNICsThatNeedAGroupListAlreadyProcessedDA_Group_IDs = {$(searchgroupindex)}
				else
					set RealNICsThatNeedAGroupListAlreadyProcessed = >($(RealNICsThatNeedAGroupListAlreadyProcessed),$($))
					set RealNICsThatNeedAGroupListAlreadyProcessedDA_Group_IDs = >($(RealNICsThatNeedAGroupListAlreadyProcessedDA_Group_IDs),$(searchgroupindex))
				endif
				; increment to the next group because the registry will not be set yet
				ifstr(i) $(searchgroupindex) != $(TotalNumberOfGroups)
					;If we haven't tried all of the possible groups then goto the top of the loop
					Set-add searchgroupindex = $(searchgroupindex), 1
				else
					Set searchgroupindex = $(TotalNumberOfGroups)
				endif 
			else
				Debug-Output "PassThru: Processing RealSearchNextGroup found used group "$(searchgroupindex)
				; the DA_Group_ID is already in use and cannot be used so move to the next DA_Group_ID
				ifstr(i) $(searchgroupindex) != $(TotalNumberOfGroups)
					;If we haven't tried all of the possible groups then goto the top of the loop
					Set-add searchgroupindex = $(searchgroupindex), 1
					goto RealSearchNextGroup
				else
					Set searchgroupindex = $(TotalNumberOfGroups)
				endif 
			endif		
		endif
	EndForListDo
	Debug-Output "PassThru: Processing RealNICsThatNeedAGroupList "$(RealNICsThatNeedAGroupList)" -> "$(RealNICsThatNeedAGroupListAlreadyProcessed)
	;&&&&&&&&&&&&&&&&&&&&&&&&&& End of Processing RealNICsThatNeedAGroupList &&&&&&&&&&&&&&&&&


	;%%%%%%%%%%%%%%%%%%%%%%%%%% Begin of Processing VirtualNICsToBeCreatedList %%%%%%%%%%%%%%%%%%%%%
	;  For each entry in this list we must create a Virtual Adapter 
	Set VirtualNICsToBeCreatedListAlreadyProcessed = {}
	Set VirtualNICsToBeCreatedListAlreadyProcessedDA_Group_IDs = {}
	Set VirtualNICsToBeCreatedListAlreadyProcessedVLAN_IDs = $(VirtualNICsToBeCreatedVLAN_IDsList)
	Debug-Output "PassThru: Processing VirtualNICsToBeCreatedList "$(VirtualNICsToBeCreatedList)
	ForListDo $(VirtualNICsToBeCreatedList)
		;
		;	Now add a virtual hardware component to represent the ELAN
		;
		Debug-Output "PassThru: Adding Adapter Hardware Component to Registry"
		Shell $(UtilityInf), AddHardwareComponent, +
			$(AdapterProductHardwareName), +
			$(STF_CONTEXTINFNAME), +
			$(AdapterProductKeyName)
		ifint $($ShellCode) != $(!SHELL_CODE_OK)
		    Debug-Output "PassThru: ShellCode error."
		    goto ShellCodeError
		endif
		set RegistryErrorIndex = $($R0)
		Ifstr(i) $(RegistryErrorIndex) !=  NO_ERROR
			Debug-Output "PassThru: Failed to Add Hardware Component"
	        CloseRegKey $($R1)
	        CloseRegKey $($R2)
	        CloseRegKey $($R3)
			goto fatalregistry
		endif
			
	    ;
		;	Add Basic information for virtual NICs 
		set KeyParameters = $($R3)
	    set KeyAdapterRules = $($R2)
	   	set AdapterNumber = $($R4)
		set VirtNICTitle = "3Com DynamicAccess Virtual NIC"
		set VirtNICDesc = "3Com DynamicAccess Virtual NIC"
		set NewValueList = {{Manufacturer,$(NoTitle),$(!REG_VT_SZ),$(Manufacturer)},+
							{Title,$(NoTitle),$(!REG_VT_SZ),"["$($R4)"] "$(VirtNICTitle)},+
							{Description,$(NoTitle),$(!REG_VT_SZ),$(VirtNICDesc)},+
							{ProductName,$(NoTitle),$(!REG_VT_SZ),$(AdapterProductHardwareName)},+
							{ServiceName,$(NoTitle),$(!REG_VT_SZ),$($R5)},+
							{InstallDate,$(NoTitle),$(!REG_VT_DWORD),*($(Now),1)}}
		Shell  $(UtilityInf), AddValueList, $($R1), $(NewValueList)
	    ifint $($ShellCode) != $(!SHELL_CODE_OK)
	        Debug-Output "PassThru: ShellCode error"
	        goto ShellCodeError
		endif
	    CloseRegKey $($R1)
	    
		set TempProdName = """"$(AdapterProductHardwareName)$(AdapterNumber)""""
		set TempBindForm = $(TempProdName)$(AdapterNetRuleHardwareBindForm)
		set NewValueList = {{type,$(NoTitle),$(!REG_VT_SZ),$(AdapterNetRuleHardwareType)},+
							{bindform,$(NoTitle),$(!REG_VT_SZ),$(TempBindForm)}, +
							{class,$(NoTitle),$(!REG_VT_MULTI_SZ),$(AdapterNetRuleHardwareClass)}, +
							{InfOption,$(NoTitle),$(!REG_VT_SZ),$(Option)}}
		Shell  $(UtilityInf), AddValueList, $(KeyAdapterRules), $(NewValueList)
		ifint $($ShellCode) != $(!SHELL_CODE_OK)
		    Debug-Output "PassThru: ShellCode error."
		    goto ShellCodeError
		endif
		set RegistryErrorIndex = $($R0)
		Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
		    EndWait
		    Debug-Output "PassThru: Registry error: add value list."
		    CloseRegKey $(KeyParameters)
		    CloseRegKey $(KeyAdapterRules)
		    goto fatalregistry
		endif
	    CloseRegKey $(KeyAdapterRules)

		Set NewValueList = {{DA_Group_ID,$(NoTitle),$(!REG_VT_SZ),$($)},+
							{virtualNicNumber,$(NoTitle),$(!REG_VT_SZ),$(AdapterNumber)},+
							{MediaType,$(NoTitle),$(!REG_VT_DWORD),$(MediaTypeValue)}}
	    Shell  $(UtilityInf), AddValueList, $(KeyParameters), $(NewValueList)
		CloseRegKey $(KeyParameters)
		ifint $($ShellCode) != $(!SHELL_CODE_OK)
			Debug-Output "PassThru: ShellCode error."
			goto ShellCodeError
		endif

	    ; Create a key of the type
	    ;	PassThru2\Parameters\Signature\
	    ;
	    Set SigRegKey = $(!NTN_ServiceBase)"\"$(AdapterProductHardwareName)$(AdapterNumber)"\Parameters\Signature"
	    Debug-Output "SigRegKey is "$(SigRegKey)
	    CreateRegKey $(!REG_H_LOCAL) {$(SigRegKey),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" SigKey
	    ifstr(i) $(SigKey) == ""
	    	Debug-Output "Failed to create "$(SigRegKey)
	   	endif
		set RegistryErrorIndex = $($R0)
		Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
			Debug-Output "PassThru: Registry error: Add value list"
			goto fatalregistry
		endif

		;
		; 	Note that a virtual adapter was added by adding it to the correct lists so we can add these to 
		;   the registry later
		;
		ifstr(i) $(VirtualNICsToBeCreatedListAlreadyProcessed) == {}
			set VirtualNICsToBeCreatedListAlreadyProcessed = {$(AdapterProductHardwareName)$(AdapterNumber)}
			set VirtualNICsToBeCreatedListAlreadyProcessedDA_Group_IDs = {$($)}
		else
			set VirtualNICsToBeCreatedListAlreadyProcessed = >($(VirtualNICsToBeCreatedListAlreadyProcessed), $(AdapterProductHardwareName)$(AdapterNumber))
			set VirtualNICsToBeCreatedListAlreadyProcessedDA_Group_IDs = >($(VirtualNICsToBeCreatedListAlreadyProcessedDA_Group_IDs), $($))
		endif
	EndForListDo
	;%%%%%%%%%%%%%%%%%%%%%%%%%% END of Processing VirtualNICsToBeCreatedList %%%%%%%%%%%%%%%%%%%%%
			

	;@@@@@@@@@@@@@@@@@@@@@@ Begining of Writing the MasterGroupList into the registry @@@@@@@@@@@@@@@@@@@
	;  For each group in the MasterGroupList we want to write the information back to the registry
	Set WriteGroupIndex = 1
WriteNextGroup = +
	ifstr(i) *(*($(MasterGroupList), $(WriteGroupIndex)),1) == 0
		; if the group is not in the list and the key is in the registry Delete the Whole key becuase it should not be there
		OpenRegKey $(GroupInfoKey) "" $(WriteGroupIndex) $(MAXIMUM_ALLOWED) GroupKey
		ifstr $(GroupKey) != ""
			CloseRegKey $(GroupKey)
			DeleteRegTree $(GroupInfoKey) $(WriteGroupIndex)
		endif
	else
		OpenRegKey $(GroupInfoKey) "" $(WriteGroupIndex) $(MAXIMUM_ALLOWED) GroupKey
		ifstr $(GroupKey) == ""
			CreateRegKey $(GroupInfoKey) {$(WriteGroupIndex),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" GroupKey
			ifstr(i) $(GroupKey) == ""
				Debug-Output "Create List: failed to open and create $(WriteGroupIndex) group Key"
				goto fatalregistry
			else
				SetRegValue $(GroupKey) {DA_Group_Number,$(NoTitle),$(!REG_VT_DWORD),$(WriteGroupIndex)}
				SetRegValue $(GroupKey) {DA_Group_Name,$(NoTitle),$(!REG_VT_SZ),"Group "$(WriteGroupIndex)}
			endif
		endif
			
		;For each Real Nic in the RealNicsInThisGroupList Check if it already in the registry and if it is not, add it
		set RealNicsInThisGroupList = *(*($(MasterGroupList), $(WriteGroupIndex)),2)
		OpenRegKey $(GroupKey) "" Real_NICs $(MAXIMUM_ALLOWED) GroupRealNICKey
		ifstr $(GroupRealNICKey) == ""
			CreateRegKey $(GroupKey) {Real_NICs,$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" GroupRealNICKey
			ifstr(i) $(GroupRealNICKey) == ""
				Debug-Output "Create List: failed to open and create $(WriteGroupIndex) Real_NICs Key"
				goto fatalregistry
			endif
		endif
		ForListDo $(RealNicsInThisGroupList)
			set RealNicRecord = ""
			GetRegValue $(GroupRealNICKey) $($) RealNicRecord
			ifstr(i) $(RealNicRecord) == ""
				;This means that this Real Nic is not in the Group key for this group
				; We will add it
				SetRegValue $(GroupRealNICKey) {$($),$(NoTitle),$(!REG_VT_SZ),""}
			endif
		EndForListDo
		CloseRegKey $(GroupRealNICKey)
				
		;For each Virtual Nic in the VirtualNicsInThisGroupList Check if it already in the registry and if it is not, add it
		set VirtualNicsInThisGroupList = *(*($(MasterGroupList), $(WriteGroupIndex)),3)
		OpenRegKey $(GroupKey) "" Virtual_NICs $(MAXIMUM_ALLOWED) GroupVirtualNICKey
		ifstr $(GroupVirtualNICKey) == ""
			CreateRegKey $(GroupKey) {Virtual_NICs,$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" GroupVirtualNICKey
			ifstr(i) $(GroupVirtualNICKey) == ""
				Debug-Output "Create List: failed to open and create $(WriteGroupIndex) group Key"
				goto fatalregistry
			endif
		endif
		ForListDo $(VirtualNicsInThisGroupList)
			set VirtualNicRecord = ""
			GetRegValue $(GroupVirtualNICKey) $($) VirtualNicRecord
			ifstr(i) $(VirtualNicRecord) == ""
				;This means that this Virtual Nic is not in the Group key for this group
				; We will add it
				SetRegValue $(GroupVirtualNICKey) {$($),$(NoTitle),$(!REG_VT_SZ),""}
			endif
		EndForListDo
		CloseRegKey $(GroupVirtualNICKey)
		CloseRegKey $(GroupKey)
	endif

	ifstr(i) $(WriteGroupIndex) != $(TotalNumberOfGroups)
		;If we haven't tried all of the possible groups then goto the top of the loop
		Set-add WriteGroupIndex = $(WriteGroupIndex), 1
		goto WriteNextGroup
	endif		
	;@@@@@@@@@@@@@@@@@@@@@@ END of Writing the MasterGroupList into the registry @@@@@@@@@@@@@@@@@@@@@@@@

	;!!!!!!!!!!!!!!!!!!!!!! Beginging of writing RealNICsThatNeedAGroupListAlreadyProcessed into the registry !!!!!!!!!!!!!!!!!!!
	;  For each real NIC in this list we must create a group key in the registry and add the information to that key
	ForListDo $(RealNICsThatNeedAGroupListAlreadyProcessed)
		OpenRegKey $(GroupInfoKey) "" *($(RealNICsThatNeedAGroupListAlreadyProcessedDA_Group_IDs), $(#)) $(MAXIMUM_ALLOWED) GroupKey
		ifstr $(GroupKey) != ""
			;This should never happen but if it does we should Delete the Key
			Debug-Output "The Group key in the registry is the same that was given to a New NIC found"
			CloseRegKey $(GroupKey)
			DeleteRegTree $(GroupInfoKey) *($(RealNICsThatNeedAGroupListAlreadyProcessedDA_Group_IDs), $(#))
		endif			
		;!!!Create the Key and Place the Basic Group Informatin into the registry	
		CreateRegKey $(GroupInfoKey) {*($(RealNICsThatNeedAGroupListAlreadyProcessedDA_Group_IDs), $(#)),$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" GroupKey
		ifstr(i) $(GroupKey) == ""
			Debug-Output "Create List: failed to open and create *($(RealNICsThatNeedAGroupListAlreadyProcessedDA_Group_IDs), $(#)) GroupKey"
			goto fatalregistry
		else
			SetRegValue $(GroupKey) {DA_Group_Number,$(NoTitle),$(!REG_VT_DWORD),*($(RealNICsThatNeedAGroupListAlreadyProcessedDA_Group_IDs), $(#))}
			SetRegValue $(GroupKey) {DA_Group_Name,$(NoTitle),$(!REG_VT_SZ),"Group "*($(RealNICsThatNeedAGroupListAlreadyProcessedDA_Group_IDs), $(#))}
		endif

		;Place the Real NIC in the Registry
		OpenRegKey $(GroupKey) "" Real_NICs $(MAXIMUM_ALLOWED) GroupRealNICKey
		ifstr $(GroupRealNICKey) == ""
			CreateRegKey $(GroupKey) {Real_NICs,$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" GroupRealNICKey
			ifstr(i) $(GroupKey) == ""
				Debug-Output "Create List: failed to open and create $(WriteGroupIndex) group Key"
				goto fatalregistry
			endif
		endif
		SetRegValue $(GroupRealNICKey) {$($),$(NoTitle),$(!REG_VT_SZ),""}
		CloseRegKey $(GroupRealNICKey)
		CloseRegKey $(GroupKey)
	EndForListDo
	;!!!!!!!!!!!!!!!!!!!!!! END of writing RealNICsThatNeedAGroupListAlreadyProcessed into the registry !!!!!!!!!!!!!!!!!!!
	

	;%%%%%%%%%%%%%%%%%%%%%%%%%% Beginging of writing VirtualNICsToBeCreatedListAlreadyProcessed into the registry %%%%%%%%%%%%%%%%%%%%%
	;  For each virtual NIC that was created we must add the information to the registry
	Debug-Output "PassThru: adding to reg VirtualNICsToBeCreatedListAlreadyProcessed "$(VirtualNICsToBeCreatedListAlreadyProcessed)
	ForListDo $(VirtualNICsToBeCreatedListAlreadyProcessed)
		OpenRegKey $(GroupInfoKey) "" *($(VirtualNICsToBeCreatedListAlreadyProcessedDA_Group_IDs), $(#)) $(MAXIMUM_ALLOWED) GroupKey
		ifstr $(GroupKey) == ""
			;This should never happen but if it does we shouldDelete the Virtual NIC
			Debug-Output "The Group key in the registry we were going to add a virtual NIC to does not exist, so we are deleting this VNIC"
			ifstr(i) $(VirtualNICsToBeDeletedList) == {}
				set VirtualNICsToBeDeletedList = {$($)}
			else			
				set VirtualNICsToBeDeletedList = >($(VirtualNICsToBeDeletedList),$($))
			endif
		else
			;Place the Virtual NIC in the Registry
			OpenRegKey $(GroupKey) "" Virtual_NICs $(MAXIMUM_ALLOWED) GroupVirtualNICKey
			ifstr $(GroupVirtualNICKey) == ""
				CreateRegKey $(GroupKey) {Virtual_NICs,$(NoTitle),GenericClass} "" $(MAXIMUM_ALLOWED) "" GroupVirtualNICKey
				ifstr(i) $(GroupVirtualNICKey) == ""
					Debug-Output "Create List: failed to open and create $(WriteGroupIndex) group Key"
					goto fatalregistry
				endif
			endif
			set VirtualNicRecord = ""
			GetRegValue $(GroupVirtualNICKey) $($) VirtualNicRecord
			Debug-Output "PassThru: $(VirtualNicRecord) $($)"
			ifstr(i) $(VirtualNicRecord) == ""
				;This means that this Virtual Nic is not in the Group key for this group and we should add it
				Debug-Output "PassThru: adding "$($)" to group "*($(VirtualNICsToBeCreatedListAlreadyProcessedDA_Group_IDs), $(#))" in reg" 
				SetRegValue $(GroupVirtualNICKey) {$($),$(NoTitle),$(!REG_VT_DWORD),*($(VirtualNICsToBeCreatedListAlreadyProcessedVLAN_IDs), $(#))}
			endif
			CloseRegKey $(GroupVirtualNICKey)
			CloseRegKey $(GroupKey)
		endif				
	EndForListDo
	;%%%%%%%%%%%%%%%%%%%%%%%%%% END of writing VirtualNICsToBeCreatedListAlreadyProcessed into the registry %%%%%%%%%%%%%%%%%%%%%
	
	;************************ Begining of Processing VirtualNICsToBeDeletedList **********************
	;  For each real NIC in this list we must first find a group that is not in use.  Then we 
	;  add it to that group and create a Virtual Adapter to go with it.
	Set VirtualNICsToBeDeletedListAlreadyProcessed = {}
	Debug-Output "PassThru: Processing VirtualNICsToBeDeletedList "$(VirtualNICsToBeDeletedList)
	ForListDo $(VirtualNICsToBeDeletedList)
		Ifcontains(i) $($) not-in $(VirtualNICsToBeCreatedListAlreadyProcessed)
			Ifcontains(i) $($) not-in $(VirtualNICsToBeDeletedListAlreadyProcessed)
				Set RegKey = $(!NTN_ServiceBase)"\"$($)"\Parameters\"
				OpenRegKey $(!REG_H_LOCAL) "" $(RegKey) $(MAXIMUM_ALLOWED) virtualNicParams
				ifstr(i) $(virtualNicParams) != ""
					;	The virtual Nic is really there so remove it
					GetRegValue $(virtualNicParams) "virtualNicNumber" virtualNicNumberIndex
					set virtualNicNumberValue = *($(virtualNicNumberIndex),4)
					Set RegKey = $(!NTN_SoftwareBase)"\Microsoft\Windows NT\CurrentVersion\NetworkCards\"$(virtualNicNumberValue)

					Shell $(UtilityInf), RemoveHardwareComponent,+
						  $(Manufacturer),$(AdapterProductSoftwareName),$(RegKey)

					;*** add this NIC to the Already Processed List
					ifstr(i) $(VirtualNICsToBeDeletedListAlreadyProcessed) == {}
						set VirtualNICsToBeDeletedListAlreadyProcessed = {$($)}
					else
						set VirtualNICsToBeDeletedListAlreadyProcessed = >($(VirtualNICsToBeDeletedListAlreadyProcessed), $($))
					endif
				endif
			endif
		endif
	EndForListDo
	;************************ END of Processing VirtualNICsToBeDeletedList **********************

	; update the Group_Info key with all the latest info
	RunProgram ExitCode "" "" $(DASetupNT) g
	

	; if this is not during DA install check on whether to disable review bindings and cause extra bindings
	Set RegKey = $(TransportParamKeyName)
	OpenRegKey $(!REG_H_LOCAL) "" $(RegKey) $(MAXIMUM_ALLOWED) DAParamKey
	set InProcessRec = ""
	GetRegValue $(DAParamKey) $(InstallInProcess) InProcessRec
	ifstr(i) $(InProcessRec) == ""
		; This is not during install so check
	
		;Disable the protocols bindings on the first pass but not on the second
		set disableBindingRec = ""
		GetRegValue $(DAParamKey) IsSecondPass disableBindingRec
		ifstr(i) $(disableBindingRec) == ""
			;This is first pass and so we will disable bindings and create key
			SetRegValue $(DAParamKey) {"IsSecondPass",$(NoTitle),$(!REG_VT_DWORD),1}
			RunProgram ExitCode "" "" $(DisableOtherReviewBindings) 4
		else
			;This is the second pass so remove the IsSecondPass value
			DeleteRegValue $(DAParamKey) "IsSecondPass"
			RunProgram ExitCode "" "" $(DisableOtherReviewBindings) 5
		endif

		;
		;	If we added or removed a virtual adapter, tell NCPA to review bindings
		;	again after this completes.
		;
		ifstr(i) $(VirtualNICsToBeCreatedListAlreadyProcessed) == {}
			ifstr(i) $(GlobalAssignedVirtualNICList) == {}
				;If all of the Virtual NICs were deleted we should remove DA
				goto LastCardRemoved
			endif
		endif
		GetRegValue $(DAParamKey) $(StartDetachedText) StartDetachedRec
		ifstr(i) $(StartDetachedRec) == ""				
			SetRegValue $(DAParamKey) {$(StartDetachedText),$(NoTitle),$(!REG_VT_DWORD),1}
			StartDetachedProcess STATUS_SUCCESSFUL "" "" $(DASetupNT) 1
		endif
NoExtraReviewBinding =+
	endif

    goto successful

deinstall =+

;
;	To synch TCP/IP configuration again with current setup.
;	
	RunProgram ExitCode "" "" $(DASetupNT) t
;	Done synch TCP/IP

	Split-String $(!NTN_RegBase), "\", RegLoc

	Ifcontains(i) "NetworkCards" in $(RegLoc)
	;	Removing just the virtual NIC is not allowed:
;dialog#1
		Set DlgText = "If you want to uninstall 3Com's DynamicAccess software, select the DAPassThru Driver Transport, on the Protocol Page, and click Remove."
		Shell "Subroutn.Inf" SetupMessage $(!STF_LANGUAGE) "NONFATAL" $(DlgText)
		ifint $($ShellCode) != $(!SHELL_CODE_OK)
			set RegistryErrorIndex = ERROR
		endif
		Return STATUS_SUCCESSFUL		
	endif

	Ifcontains(i) "DAPassThru" in $(RegLoc)
	;	Removing just the virtual NIC is not allowed:
;dialog#2
		Set DlgText = "What do you want to do? (1) If you want to remove 3Com's DynamicAccess software, select DAPassThru Transport protocol, on the Protocol Page, and click Remove.  (2) If you want to remove your Adapter, select the adapter and click Remove.  Do no remove the 3Com's virtual NIC."
		Shell "Subroutn.Inf" SetupMessage $(!STF_LANGUAGE) "NONFATAL" $(DlgText)
		ifint $($ShellCode) != $(!SHELL_CODE_OK)
			set RegistryErrorIndex = ERROR
		endif
		Return STATUS_SUCCESSFUL		
	endif
;dialog0
	Set DlgText = "You are about to uninstall the 3Com DynamicAccess Protocol!"
 	Shell "Subroutn.Inf" SetupMessage $(!STF_LANGUAGE) "WARNING" $(DlgText)
	ifint $($ShellCode) != $(!SHELL_CODE_OK)
		set RegistryErrorIndex = ERROR
	endif

	ifstr $($R1) == "CANCEL"
		Return STATUS_SUCCESSFUL
	endif

LastCardRemoved =+
	;	Open the Linkage Key of the Virtual Protocol and get the Bind Value
	;	to get the entire list of cards bound to the Virtual Protocol
	;
	OpenRegKey $(!REG_H_LOCAL) "" $(TransportLinkageKeyName) $(MAXIMUM_ALLOWED) TransportLinkageKey
	ifstr(i) $(TransportLinkageKey) != ""
		GetRegValue $(TransportLinkageKey) "Bind" BindList
		Debug-Output "PassThru: Remove: BindList: "$(BindList)
		Set Binding = *($(BindList),4)
		Debug-Output "PassThru: Remove: Binding:  "$(Binding)
		CloseRegKey $(TransportLinkageKey)
	else
		Debug-Output "PassThru: failed to open key "$(TransportLinkageKeyName)
		goto skipRemoveBindings
	endif
	set CardList = {}
	set CreateCardList = {}
	ForListDo $(Binding)
		Split-String $($), "\", BindInfo
		QueryListSize BindListSize $(BindInfo)
		set CardName = *($(BindInfo),$(BindListSize))
		Debug-Output "PassThru: Remove: Cardname: "$(CardName)
		ifstr(i) $(CardList) == {}
			set CardList = {$(CardName)}
		else
			set CardList = >($(CardList),$(CardName))
		endif
	EndForListDo

	Debug-Output "PassThru: Cardlist: "$(CardList)
	;
	;	For each real LAN adapter in the list...
	;
	ForListDo $(CardList)
		Set RegKey = $(!NTN_ServiceBase)"\"$($)"\Parameters"
		OpenRegKey $(!REG_H_LOCAL) "" $(RegKey) $(MAXIMUM_ALLOWED) NICparamkey
		ifstr(i) $(NICparamkey) != ""
			Split-String $($), "1234567890", ServiceNameSplitList
			Ifcontains(i) "DAPassThru" in $(ServiceNameSplitList)
				;For each virtual adapter remove its Hardware component and delete its
				; mappedNics 
				GetRegValue $(NICparamkey) "virtualNicNumber" VirtNICNoRec
				Set VirtNICNo = *($(VirtNICNoRec),4)
				Set AdapterRegBase = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\"$(VirtNICNo)
				Shell $(UtilityInf), RemoveHardwareComponent, $(Manufacturer), +
					$(AdapterProductSoftwareName), $(AdapterRegBase)
				ifint $($ShellCode) != $(!SHELL_CODE_OK)
					Debug-Output "PassThru: ShellCode error"
					goto ShellCodeError
				endif
			else
				;Remove the FT LB network address
				set DANetworkAddressRec = ""
				GetRegValue $(NICparamkey) "DA_NETWORKADDRESS" DANetworkAddressRec
				ifstr(i) $(DANetworkAddressRec) != ""
					set DANetworkAddressValue = *($(DANetworkAddressRec),4)
					SetRegValue $(NICparamkey) {"NETWORKADDRESS",$(NoTitle),$(!REG_VT_SZ),$(DANetworkAddressValue)}
					DeleteRegValue $(NICparamkey) "DA_NETWORKADDRESS" 					
				else
					set NetworkAddressRec = ""
					GetRegValue $(NICparamkey) "NETWORKADDRESS" NetworkAddressRec
					ifstr(i) $(NetworkAddressRec) != ""
						set NetworkAddressValue = *($(NetworkAddressRec),4)
						ifstr(i) $(NetworkAddressValue) == "00A024CC6981"
							DeleteRegValue $(NICparamkey) "NETWORKADDRESS"
						endif
					endif
				endif							 					
					
				;** remove the DA registry values under the real NIC
				DeleteRegValue $(NICparamkey) "DA_Group_ID" 					
				DeleteRegValue $(NICparamkey) "DA_Primary_NIC" 					
			endif
			CloseRegKey $(NICparamkey)
		endif
continueRemoveBindings =+
	EndForListDo
skipRemoveBindings =+

	Set RegKey = "SOFTWARE\3Com\DA"
	OpenRegKey $(!REG_H_LOCAL) "" $(RegKey) $(MAXIMUM_ALLOWED) SoftwareDAKey
	ifstr(i) $(SoftwareDAKey) != ""
		Debug-Output "PassThru: about to delete $(RegKey)\Server"
		DeleteRegTree $(SoftwareDAKey) "Server"
		CloseRegKey $(SoftwareDAKey)
	else
		Debug-Output "PassThru: Failed to delete $(RegKey)\Server"
	endif

	Debug-Output "PassThru: Removing "$(TransportProductSoftwareName)" Software Component from Registry"
	Shell $(UtilityInf), RemoveSoftwareComponent, $(Manufacturer), +
		$(TransportProductSoftwareName)


RemovePassThru = +

	Set RegKey = $(!NTN_SoftwareBase)"\Microsoft\Windows NT\CurrentVersion"
	OpenRegKey $(!REG_H_LOCAL) "" $(RegKey) $(MAXIMUM_ALLOWED) NTVersionKey
	GetRegValue $(NTVersionKey) "CurrentVersion" NTVersionRec
	Set NTVersion = *($(NTVersionRec),4)
	CloseRegKey $(NTVersionKey)

	RunProgram ExitCode "" "" $(DASetupNT) d

	AddfileToDeleteList $(ProductSoftwareImagePathTxt)
	AddfileToDeleteList $(ProductMiniportSoftwareImagePathTxt)
	AddfileToDeleteList $(PostProcessInf)
	AddfileToDeleteList $(DASetupNT)
	AddfileToDeleteList $(SetupINFName)
	AddfileToDeleteList	$(DASmartN)
	AddfileToDeleteList $(DA15CFGEXE)
	AddfileToDeleteList $(DASERVERCPL)
	AddfileToDeleteList $(DASERVERHLP)
	;AddfileToDeleteList	$(DA15CFGINI)
	AddfileToDeleteList	$(DACFGHLP)
	;AddfileToDeleteList	$(DACFGCPL) ;done in restore pacecfg in .c program
	AddfileToDeleteList	$(DACFGCPLSAV)
	;AddfileToDeleteList	$(DACFGAPPLST)



	Set RegKey = $(!NTN_ServiceBase)
	OpenRegKey $(!REG_H_LOCAL) "" $(RegKey) $(MAXIMUM_ALLOWED) PassThru_Key
	
	ifstr(i) $(PassThru_Key) != ""
		Debug-Output "PassThru: about to delete "$(RegKey)
		DeleteRegTree $(PassThru_Key) $(AdapterProductSoftwareName)
		CloseRegKey $(PassThru_Key)
	else
		Debug-Output "PassThru: Failed to delete "$(RegKey)
	endif

	goto end

configure =+

	set Error = "To configure the server features you must close the Network Control Panel, select start, settings, control panel then double click on the DynamicAccess Server Software Icon."
	set from = end
	goto nonfatalinfo
	
update = +

    set Error = "Update Not Implemented, Remove and Reinstall"
	set from = end
	goto nonfatalinfo

successful = +
    goto end
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
        goto "end"
    endif
nonfatalinfo = +
    Set CommonStatus = STATUS_USERCANCEL
    Set Severity = STATUS
    goto nonfatalmsg
nonfatal = +
    Set Severity = NONFATAL
    goto nonfatalmsg
nonfatalmsg = +
    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), $(Severity), $(Error)
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
        goto ShellCodeError
    endif
    ifstr(i) $($R1) == "OK"
        goto $(from)
    else
        goto "end"
    endif
fatalregistry = +
    Shell $(UtilityInf) RegistryErrorString $(RegistryErrorIndex)
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
        goto ShellCodeError
    endif
    set Error = $($R0)
    goto fatal
fatal = +
    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 setfailed
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
    ifstr(i) $(OEM_ABANDON_ON) == TRUE
        set OEM_ABANDON_ON = FALSE
        goto deinstall
    endif
    goto end
end = +
    goto term
term = +
    Return $(CommonStatus)

[StripTrailSlash]
    Split-String $($0) "\" InList
    QueryListSize InListSize, $(InList)
    Ifint $(InListSize) <= 1
        Return $($0)
    Endif
    Set NewString = ""
    ForListDo $(InList)
        ifint $(#) < $(InListSize)
            Set NewString = $(NewString)$($)
        else-ifstr $($) != "\"
            Set NewString = $(NewString)$($)
        endif
    EndForListDo
    Return $(NewString)

[Install-Option]
    set STF_VITAL = ""
    ifstr(i) $(AddCopy) == "YES"
		Debug-Output "PassThru: oemsetup.inf: PlatformDir "$(PlatformDir)

        ;AddSectionFilesToCopyList Files-Platform-Drivers $(PlatformDir) $(!STF_WINDOWSSYSPATH)\drivers
        AddSectionFilesToCopyList Files-Platform-Drivers $(InfDir) $(!STF_WINDOWSSYSPATH)\drivers
		AddSectionFilesToCopyList Post-Process-Program $(InfDir) $(!STF_WINDOWSSYSPATH)
	    AddSectionFilesToCopyList Files-Platform-Utility $(InfDir) $(!STF_WINDOWSSYSPATH)
		AddSectionFilesToCopyList Files-Inf $(InfDir) $(!STF_WINDOWSSYSPATH)
    endif
    ifstr(i) $(DoCopy) == "YES"
       set !STF_NCPA_FLUSH_COPYLIST = TRUE
       CopyFilesInCopyList
    endif
    ifstr(i) $(DoConfig) == "YES"
    endif
    Exit

[Install-Update]
   set STF_VITAL        = ""
   set STF_OVERWRITE    = "VERIFYSOURCEOLDER"
   ;AddSectionFilesToCopyList Files-Platform-Drivers $(PlatformDir) $(!STF_WINDOWSSYSPATH)\drivers
   AddSectionFilesToCopyList Files-Platform-Drivers $(InfDir) $(!STF_WINDOWSSYSPATH)\drivers
   AddSectionFilesToCopyList Files-Platform-Utility $(InfDir) $(!STF_WINDOWSSYSPATH)
   AddSectionFilesToCopyList Files-Inf $(InfDir) $(!STF_WINDOWSSYSPATH)
   exit

[Source Media Descriptions]
     1 = "DAPassThru Driver Installation Disk", TAGFILE = disk1

[ProductType]
STF_PRODUCT  = Winnt

[Files-Inf]
;1, oemsetup.INF, SIZE=999, RENAME=$(!UG_Filename)
1, oemsetup.INF, SIZE=999

[Files-Platform-Drivers]
;1, passthru.SYS , SIZE=999
1, DAMINI.SYS , SIZE=999
1, DAPROT.SYS, SIZE=999

[Files-Platform-Utility]
1, DASetup.EXE, SIZE=999
1, DA15cfg.EXE, SIZE=999
1, DAcfg.hlp, SIZE=999
1, DASmartN.EXE, SIZE=999
1, DAServer.hlp, SIZE=999
1, DAServer.cpl, SIZE=999
;1, DA15cfg.INI, SIZE=999
;1, Pacecfg.cpl, SIZE=999
;1, DAcfgApp.lst, SIZE=999
;1, DADeinstallNT.EXE, SIZE=999

[Post-Process-Program]
1, PRUN.INF, SIZE=999

[DialogConstantsENG]
Help        				= "&Help"
Exit        				= "Cancel"
OK          				= "OK"
HelpContext 				= ""
Continue    				= "Continue"
Cancel      				= "Cancel"

Download Driver Pack

How To Update Drivers Manually

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.

server: web3, load: 0.83