OEMSETUP.INF Driver File Contents (ibmtokII.zip)

;-------------------------------------------------------------------
;
;  OEMSETUP.INF
;  NIC Installation Script for Windows NT 4.0
;
;  Product: IBM Token-Ring PCI Family Adapters
;  Copyright (C) 1996-1998 IBM Corporation.  All rights reserved.
;
;  Version: 2.7 (9/25/98 17:41:32)
;  MfC-NT4.0-NoMSS
;
;-------------------------------------------------------------------

[Identification]
   OptionType = NetAdapter

[PlatformsSupported]
   PCI

[LanguagesSupported]
   ENG

[Options]
   TRP

[OptionsTextENG]
   TRP = "IBM Token-Ring PCI Family Adapter"

[GeneralConstants]

   from                =   ""
   to                  =   ""
   KeyNull             =   ""
   AdapterList         =   {}
   MAXIMUM_ALLOWED     =   33554432
   RegistryErrorIndex  =   NO_ERROR
   KeyProduct          =   ""
   TRUE                =   1
   FALSE               =   0
   NoTitle             =   0
   OldVersionExisted   =   $(FALSE)

[FileConstants]

   ; These should be left alone.
   UtilityInf          =   "UTILITY.INF"
   ParamInf            =   "NCPARAM.INF"
   SubroutineInf       =   "SUBROUTN.INF"
   SoftwareType        =   "driver"
   NetRuleSoftwareUse  =   $(SoftwareType)
   
   ; Event logging message files
   NetEventDLL       =   "%SystemRoot%\System32\NETEVENT.DLL;%SystemRoot%\System32\IBMSGNET.DLL"
      
   ; These constants vary depending on Software, Manufacturer, etc.
   Manufacturer             = "IBM"
   ProductMajorVersion      = "3"
   ProductMinorVersion      = "0"
   ProductVersion      = $(ProductMajorVersion)"."$(ProductMinorVersion)
   
   ; Dialog box parameters
   InstallDLL          =   $(!STF_WINDOWSSYSPATH)"\TokStp2.Dll"

   ; PnP Information
   IBM_VENDOR_ID           =   4116       ;   0x1014 in decimal
   PIT_DEVICE_ID           =   62         ;   0x003E in decimal
   PIT_ADAPTER_ID          =   269746238  ;   0x1014003E in decimal

   ; Hardware binding information.
   ProductHardwareName     = "IBMTRP"
   NetRuleHardwareType     = "IBMTRP IBMTRPAdapter"
   NetRuleHardwareBindForm = " yes yes container"
   NetRuleHardwareClass    = {"IBMTRPAdapter basic"}

   ; Software binding information.
   ProductSoftwareName      = "IBMTRP"
   NetRuleSoftwareType      = "IBMTRPSys ndisDriver IBMTRPDriver"
   NetRuleSoftwareBindForm  = """IBMTRPSys"" yes no container"
   NetRuleSoftwareClass     = {"IBMTRP basic"}
   NetRuleSoftwareBindable  = {"IBMTRPDriver IBMTRPAdapter non exclusive 100"}
   ProductSoftwareImagePath = "%SystemRoot%\system32\drivers\IBMTRP.SYS"

   ; Various places in the registry we use
   ProductKeyName  = $(!NTN_SoftwareBase)"\"$(Manufacturer)"\"$(ProductSoftwareName)"\CurrentVersion"
   ParamKeyName    = $(!NTN_ServiceBase)"\"$(ProductHardwareName)"\Parameters"
   NetworkCardKeyName = $(!NTN_SoftwareBase)"\Microsoft\Windows NT\CurrentVersion\NetworkCards"

   ; We used to keep our ProductKeyName in the Microsoft sub-tree... oops.
   ; This is used in both RemoveAdapter and UpgradeSoftware portion of the INF.
   OldProductKeyName = $(!NTN_SoftwareBase)"\Microsoft\"$(ProductSoftwareName)"\CurrentVersion"
   OldManufacturer   = "Microsoft"

   ; NDIS Level Strings (default is NDIS4_Level; changed later if Windows NT 3.5x detected)
   NDIS4_Level         = "NDIS 4.0"
   NDIS3_Level         = "NDIS 3.1"
   NDIS_Level          = $(NDIS4_Level)
   
   ; Uncomment the appropriate lines below if you want to install
   ; a certain NDIS level driver REGARDLESS of the INF's detection
   ; of the Operating System.  This can be useful if you want to
   ; mandate use of the NDIS 3.1 miniport.
   
   ; ForceNDIS               = "NO"               ; the default, comment out if forcing
   ; ForceNDIS               = $(NDIS3_Level)   ; force use of NDIS 3.1
   ForceNDIS               = $(NDIS4_Level)   ; force use of NDIS 4.0


   ; No CSD applied string
   NO_CSD              = "NO_CSD"

   ; Driver location after installation
   DriverFile = "IBMTRP.SYS"

   ; No secondary adapter
   RNIC_Not = "XXXXXX"
[FileConstantsENG]

   ; Contains localized strings for the appropriate version of the adapter.
   FunctionTitle               = "IBM Token Ring PCI Family NIC Miniport Setup"
   ProductSoftwareDescription  = "IBM Token-Ring PCI Family Adapter Miniport"
   ProductHardwareDescription  = "IBM Token-Ring PCI Family Adapter"
   ProductSoftwareTitle        = "IBM Token-Ring PCI Family Adapter Miniport"
   ProductHardwareTitle        = "IBM Token-Ring PCI Family Adapter "    ; Leave in trailing space

   CANNOT_FIND_ANY_CARD        = "The adapter you selected is not present in the system."
   ShellCodeErrorTitle         = "Error: "$(FunctionTitle)
   ShellCodeErrorText          = "OEMSETUP.INF Shell Code Error!"

   DiskName                    = "Token Ring PCI Device Drivers: Windows 95/98/NT (CD-ROM or diskette)"

   TRP_TITLE                   = "IBM Token-Ring PCI Family Adapter"

   ; These lines are to fix a bug in gauge.c line 209 in WinNT 4.x checked build.
   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:"

[ProductType]

   STF_PRODUCT  = Winnt
   STF_PLATFORM = I386
   
[date]

   Now = {} ? $(!LIBHANDLE) GetSystemDate

;-------------------------------------------------------------------
;   SECTION NAME:       Identify
;
;   DESCRIPTION:        This required section verifies that this
;                       script supports the option currently selected.
;
;   INPUT:              None.
;
;   OUTPUT:             $($R0)      Status
;                       $($R1)      Option Type
;                       $($R2)      Diskette Description
;-------------------------------------------------------------------

[Identify]

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

   return $(Status) $(OptionType) $(Media)

;-------------------------------------------------------------------
;   SECTION NAME:       ReturnOptions
;
;   DESCRIPTION:        This required section returns the list of
;                       options supported by this script and the
;                       text list representing the options.
;
;
;   INPUT:              $($0)       Language code
;
;   OUTPUT:             $($R0)      Status
;                       $($R1)      Option List
;                       $($R2)      Option Text List
;-------------------------------------------------------------------

[ReturnOptions]

   set Status          =   STATUS_FAILED
   set OptionList      =   {}
   set OptionTextList  =   {}
   set LanguageList    =   ^(LanguagesSupported, 1)

   ifcontains(i) $($0) not-in $(LanguageList)
      set Status = STATUS_NOLANGUAGE
      goto End_ReturnOptions
   endif

   ifstr(i) $($1) == ""
      goto OK_ReturnOptions
   endif

   set PlatformList = ^(PlatformsSupported, 1)
   
   Ifcontains(i) $($1) in $(PlatformList)
      goto OK_ReturnOptions
   else
      set Status = STATUS_NOTSUPPORTED
      goto End_ReturnOptions
   endif

OK_ReturnOptions = +
     
   set OptionList      = ^(Options, 1)
   set OptionTextList  = ^(OptionsText$($0), 1)

   ; ** Hack for upgrading older IBMTRP full MAC driver --sgp
   ifstr(i) $(!NTN_InstallMode) == Update
      Set OptionList = {"IBMTRP", "TRP" }
   endif
 
   set Status          = STATUS_SUCCESSFUL

End_ReturnOptions = +
   Return $(Status) $(OptionList) $(OptionTextList)

;-----------------------------------------------------------------
;
;   SECTION NAME:       Source Media Description
;
;   DESCRIPTION:        This is a required DETECT section
;
;------------------------------------------------------------------

[Source Media Descriptions]

   1  = $(DiskName)


;-------------------------------------------------------------------
;   SECTION NAME:       InstallOption
;
;   DESCRIPTION:        Main entry point.  Shelled to by main
;                       installation processing or by NCPASHEL.INF
;                       during reconfiguration, removal, update,
;                       etc.  It performs three main functions:
;
;                       1.  Copies files representing options
;                       2.  Configures the installed option
;                       3.  Updates the registry for the installed
;                           option.
;
;   INPUT:              $($0)       Language to use
;                       $($1)       OptionID to install
;                       $($2)       SourceDirectory
;                       $($3)       AddCopy  (YES | NO)
;                       $($4)       DoCopy   (YES | NO)
;                       $($5)       DoConfig (YES | NO)
;
;   OUTPUT:             $($R0)      Status
;
;-------------------------------------------------------------------

[InstallOption]

; Uncomment the line below to enable debugging
;   set !G:DebugOutputControl = 1

   StartWait

   set Status   = STATUS_FAILED

   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

   read-syms GeneralConstants
   read-syms FileConstants
   read-syms FileConstants$(!STF_LANGUAGE)
   read-syms OptionsText$(!STF_LANGUAGE)

   detect date

   set-title  $(FunctionTitle)

   ; Optional features
   set hasMSS = "NO"
   set hasRNIC = "YES"

   ; This code detects the Windows NT Version from the registry
   set CurrentVersionValue = ""
   set CurrentCSDVersionValue   = {}
   Debug-Output "Getting version information from registry..."
   OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Windows NT\CurrentVersion" $(!REG_KEY_READ) KeyWinNT
   ifstr(i) $(KeyWinNT) != ""
      GetRegValue $(KeyWinNT) "CurrentVersion" CurrentVersionValue
      set m_WinNTVersion = *($(CurrentVersionValue),4)
      Debug-Output "** Current Windows NT Version is "$(m_WinNTVersion)
      ifstr(i) $(m_WinNTVersion) == "4.0"
         GetRegValue $(KeyWinNT) "CSDVersion" CurrentCSDVersionValue
         ifstr(i) *($(CurrentCSDVersionValue),4) == ""
            ; Key doesn't exist, so no Service Pack applied!
            set m_CSDVersion = $(NO_CSD)
            Debug-Output "** Running NT 4.0: No service pack applied!"
         else
            set m_CSDVersion   = *($(CurrentCSDVersionValue),4)
            Debug-Output "** Running NT 4.0: Current Service Pack Level is "$(m_CSDVersion)
         endif         
      endif
      CloseRegKey $(KeyWinNT)
   else
      Debug-Output "No version information availiable."
   endif

   ; Set the version information up for the proper version (NDIS3/NDIS4) 
   ; we are installing.  The default is to use the NDIS4 version.
   set NDIS_Level = $(NDIS4_Level)
   ifstr(i) $(m_WinNTVersion) == "3.51"
      ; Using WinNT 3.51 and NDIS 3.1 miniport!
      set NDIS_Level = $(NDIS3_Level)
   else-ifstr(i) $(m_WinNTVersion) == "3.50"
      ; Uh-oh... NT 3.50... abort!
      set Error = "This driver release only supports Microsoft Windows NT versions 3.51 and 4.0."
      set to = fatal
      set from = fatal
      goto fatal
   endif    
   Debug-Output "Current Product Version we're installing is "$(ProductVersion)
    
   ; If NDIS4: this code detects whether the machine has more than one processor.
   ; Default is to set hasSMP to NO.
   set hasSMP = "NO"
   ifstr(i) $(NDIS_Level) == $(NDIS4_Level)
      set Processor = ""
      OpenRegKey $(!REG_H_LOCAL) "" "HARDWARE\DESCRIPTION\System\CentralProcessor\1" $(!REG_KEY_READ) KeyProc1
      ifstr(i) $(KeyProc1) != ""
         ; Machine has at least two processors   
         set hasSMP = "YES"
         CloseRegKey $(KeyProc1)
         Debug-Output "(NDIS 4) Detected SMP Machine; setting hasSMP to YES"
      endif
   endif

   ; On older INFs, we used "Microsoft" for the manufacturer.
   ; Newer installs such as this one uses "IBM" (correctly!).
   ; This code detects where our software is located in the 
   ; HKEY_LOCAL_MACHINE\Software tree so that the upgrade
   ; and removal functions work properly.
   set KeyProduct = ""
   set CurrentManufacturer = ""
   set CurrentProductKeyName = ""
   OpenRegKey $(!REG_H_LOCAL) "" $(OldProductKeyName) $(MAXIMUM_ALLOWED) KeyProduct
   Ifstr(i) $(KeyProduct) != $(KeyNull)
      Debug-Output "Fixing setup for wrong manufacturer."
      set CurrentManufacturer = $(OldManufacturer)
      set CurrentProductKeyName = $(OldProductKeyName)
      CloseRegKey $(KeyProduct)
   else
      set CurrentManufacturer = $(Manufacturer)
      set CurrentProductKeyName = $(ProductKeyName)
   endif

   ; The old Full MAC version of this driver used the option "IBMTRP".
   ; Correct it here so that, once we upgrade the component, it will still
   ; work.
   ifstr(i) $(Option) == "IBMTRP"
      set Option = "TRP"
   endif

   ; Code to correct some unattended installations that don't set
   ; SrcDir correctly...
   ifstr(i) $(!STF_GUI_UNATTENDED) == "YES"
      Debug-Output "Doing unattended installation..."
      ifstr(i) $(!OEMNetOption) == "YES"
         ifstr(i) $(!OEMNetDrive) != ""
            Debug-Output "Correcting SrcDir to point to !OEMNetDrive"
            set SrcDir = $(!OEMNetDrive)
         endif
      endif
   endif
   
   ; If ForceNDIS is set, check it fpr a NDIS version. Default to
   ; use the automatically detected version of NDIS 4.0.
   ifstr(i) $(ForceNDIS) == $(NDIS3_Level)
      set NDIS_Level = $(NDIS3_Level)
      Debug-Output "NDIS 3.1 forced"
   else-ifstr(i) $(ForceNDIS) == $(NDIS4_Level)
      Debug-Output "NDIS 4.0 forced"
      set NDIS_Level = $(NDIS4_Level)
   else
      Debug-Output "Using Automatically Detected NDIS Level"
   endif

   set to   = Begin
   set from = Begin

   set CommonStatus = STATUS_SUCCESSFUL

   EndWait

;   -----------------------------------------------------------------
;   Begin   -   Determine what option we are being called with
;   -----------------------------------------------------------------

Begin = +

   ifstr(i) $(!NTN_InstallMode) == DeInstall
      set from = fatal
      set to   = fatal
      goto RemoveAdapter
   else-ifstr(i) $(!NTN_InstallMode) == Update
      set from = fatal
      set to   = fatal
      goto UpgradeSoftware
   else-ifstr(i) $(!NTN_InstallMode) == Bind
      set from = fatal
      set to   = fatal
      goto BindingAdapter
   else-ifstr(i) $(!NTN_InstallMode) == Configure
      set CommonStatus = STATUS_REBOOT
      Debug-Output "$(ProductKeyName)      = "$(CurrentProductKeyName)
      Debug-Output "$(!NTN_RegBase)        = "$(!NTN_RegBase)
      ifstr(i) $(CurrentProductKeyName) == $(!NTN_RegBase)
         Shell $(UtilityInf),RegistryErrorString,CANNOT_CONFIGURE_SOFTWARE
         ifint $($ShellCode) != $(!SHELL_CODE_OK)
            goto ShellCodeError
         endif
         set Error = $($R0)
         set from  = end
         set to    = end
         Debug-Output "Going to NonFatalInfo"
         goto NonFatalInfo
      endif
      set from = fatal
      set to   = fatal
      goto ConfigureAdapter
   else
      set OEM_ABANDON_OPTIONS = {}
      set OEM_ABANDON_SOFTWARE = FALSE
      set OEM_ABANDON_ON = TRUE
      set from = fatal
      set to = fatal
      goto InstallAdapter
   endif

;   -----------------------------------------------------------------
;   InstallAdapter   -
;   -----------------------------------------------------------------

InstallAdapter = +

   Debug-Output "Inside InstallAdapter"
   Debug-Output "ProductKeyName = "$(CurrentProductKeyName)

   set KeyProduct = ""
   OpenRegKey $(!REG_H_LOCAL) "" $(CurrentProductKeyName) $(MAXIMUM_ALLOWED) KeyProduct

   Debug-Output "Just after OpenRegKey"
   Debug-Output "KeyProduct = "$(KeyProduct)
   Debug-Output "KeyNull = "$(KeyNull)

   Ifstr $(KeyProduct) == $(KeyNull)
      set OldVersionExisted = $(FALSE)
      goto DetectAndInstall
   endif

;   -----------------------------------------------------------------
;   OldInstall   -
;   -----------------------------------------------------------------

OldInstall = +

   CloseRegKey $(KeyProduct)
   
   ifstr(i) $(!NTN_RegBase) == $(CurrentProductKeyName)
      Debug-Output "(!NTN_RegBase)="$(!NTN_RegBase)
      Debug-Output "(ProductKeyName)="$(CurrentProductKeyName)
      Debug-Output "(ProductSoftwareTitle)="$(ProductSoftwareTitle)
      Debug-Output "(ProductVersion)="$(ProductVersion)
      Shell $(UtilityInf), VerExistedDlg, $(ProductSoftwareTitle),+
         $(ProductVersion)
      
      ifint $($ShellCode) != $(!SHELL_CODE_OK)
         goto ShellCodeError
      endif
      
      goto end
   
   else
      
      Shell $(UtilityInf), CardExistedDlg
      
      ifint $($ShellCode) != $(!SHELL_CODE_OK)
         goto ShellCodeError
      endif
      
      ifstr(i) $($R1) != "OK"
         Set CommonStatus = STATUS_USERCANCEL
         goto end
      endif
      
      set OldVersionExisted = $(TRUE)
   
   endif

;   -----------------------------------------------------------------
;   DetectAndInstall   -  Check to see if the adapter exists.  If so,
;                         copy everything needed, and set default
;                         parameters regardless of whether the install
;                         is attended or unattended..
;   -----------------------------------------------------------------

DetectAndInstall = +

   Debug-Output "Detecting any PCI Token Ring adapters..."

   ;   ------------------------------------------------------------
   ;   Start of PCI logic
   ;   ------------------------------------------------------------


   set Vendor_ID = $(IBM_VENDOR_ID)
   set Device_ID = $(PIT_DEVICE_ID)

   Shell $(UtilityInf), GetPCIInformation, $(Vendor_ID), $(Device_ID)

   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      ifstr(i) $(AdapterList) == {}
         set PCI_List = {{0,-1,0}}
      endif
      goto ShellCodeError
   else
      set PCI_List = $($R0)
   endif

   ifstr(i) $(PCI_List) != {}
      Debug-Output "PCI_List = "$(PCI_List)
      ForListDo $(PCI_List)
         Set BusSlotPCI = $($) 
         Set BusNumber     =   *($(BusSlotPCI),1)
         Set SlotNumber    =   *($(BusSlotPCI),2)
         Set NetcardId     =   $(PIT_ADAPTER_ID)
         Set BusSlotPCI    =   {$(BusNumber),$(SlotNumber),$(NetcardId)}
         Set AdapterList   =   >($(AdapterList),$(BusSlotPCI))
      EndForListDo   ; End of PCI_List
   endif

   Debug-Output "AdapterList ="$(AdapterList)

   ;   ------------------------------------------------------------
   ;   End of PCI logic
   ;   ------------------------------------------------------------

   ifstr(i) $(AdapterList) == {}
      Debug-Output "Did not find any PCI Token-Ring Adapters"
      set Error = $(CANNOT_FIND_ANY_CARD)
      set CommonStatus = STATUS_USERCANCEL
      set from = "end"
      goto nonfatal
   endif

   ifint $(OldVersionExisted) == $(FALSE)
      goto NewDriverInstall
   else
      goto AfterNewDriverInstall
   endif

NewDriverInstall = +

   ;   -------------------------------------------------------------
   ;   If new install: Copy the driver, INF, DLL and Help files.
   ;   -------------------------------------------------------------

   Debug-Output "Preparing to copy installation files..."

   Debug-Output "STF_CWDDIR = "$(!STF_CWDDIR)
   Debug-Output "STF_SRCDIR = "$(!STF_SRCDIR)
    
   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

   Debug-Output "Manufacturer = "$(CurrentManufacturer)
   Debug-Output "ProductSoftwareName = "$(ProductSoftwareName)
   Debug-Output "ProductSoftwareTitle = "$(ProductSoftwareTitle)
   Debug-Output "STF_CONTEXTINFNAME = "$(STF_CONTEXTINFNAME)
   Debug-Output "ProductSoftwareImagePath = "$(ProductSoftwareImagePath)
   Debug-Output "NetEventDLL = "$(NetEventDLL)

   Debug-Output "Finished file copy."


   Shell $(UtilityInf), AddSoftwareComponent, $(CurrentManufacturer), +
      $(ProductSoftwareName), +
      $(ProductSoftwareName), +
      $(ProductSoftwareTitle), $(STF_CONTEXTINFNAME), +
      $(ProductSoftwareImagePath), "kernel", "NDIS", {}, "",+
      $(NetEventDLL)

   Set OEM_ABANDON_SOFTWARE = TRUE

   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      goto ShellCodeError
   endif

   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),$(SoftwareType)},+
      {MajorVersion,$(NoTitle),$(!REG_VT_DWORD),$(ProductMajorVersion)},+
      {MinorVersion,$(NoTitle),$(!REG_VT_DWORD),$(ProductMinorVersion)},+
      {Title,$(NoTitle),$(!REG_VT_SZ),$(ProductSoftwareTitle)},+
      {Description,$(NoTitle),$(!REG_VT_SZ),$(ProductSoftwareDescription)},+
      {ServiceName,$(NoTitle),$(!REG_VT_SZ),$(ProductSoftwareName)},+
      {InstallDate,$(NoTitle),$(!REG_VT_DWORD),*($(Now),1)}}

   Debug-Output "NewValueList = "$(NewValueList)
   Debug-Output "SoftProductKey ="$(SoftProductKey)
   Debug-Output "SoftNetRuleKey ="$(SoftNetRuleKey)
   Debug-Output "SoftServiceKey ="$(SoftServiceKey)
   Debug-Output "SoftParameterKey ="$(SoftParameterKey)
   Debug-Output "SoftLinkageKey ="$(SoftLinkageKey)

   Shell  $(UtilityInf), AddValueList, $(SoftProductKey), $(NewValueList)

   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      goto ShellCodeError
   endif

   set RegistryErrorIndex = $($R0)
   Ifstr(i) $(RegistryErrorIndex) != "NO_ERROR"
      EndWait
      CloseRegKey $(SoftProductKey)
      CloseRegKey $(SoftNetRuleKey)
      CloseRegKey $(SoftServiceKey)
      CloseRegKey $(SoftParameterKey)
      CloseRegKey $(SoftLinkageKey)
      goto FatalRegistry
   endif

   set NewValueList = {{type,$(NoTitle),$(!REG_VT_SZ),$(NetRuleSoftwareType)},+
      {use,$(NoTitle),$(!REG_VT_SZ),$(NetRuleSoftwareUse)}, +
      {bindform,$(NoTitle),$(!REG_VT_SZ),$(NetRuleSoftwareBindForm)}, +
      {class,$(NoTitle),$(!REG_VT_MULTI_SZ),$(NetRuleSoftwareClass)}, +
      {bindable,$(NoTitle),$(!REG_VT_MULTI_SZ),$(NetRuleSoftwareBindable)}, +
      {InfOption,$(NoTitle),$(!REG_VT_SZ),$(Option)}}

   Debug-Output "NewValueList = "$(NewValueList)

   Shell  $(UtilityInf), AddValueList, $(SoftNetRuleKey), $(NewValueList)

   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      goto ShellCodeError
   endif

   set RegistryErrorIndex = $($R0)
   CloseRegKey $(SoftProductKey)
   CloseRegKey $(SoftNetRuleKey)
   CloseRegKey $(SoftServiceKey)
   CloseRegKey $(SoftParameterKey)
   CloseRegKey $(SoftLinkageKey)
   
   Ifstr(i) $(RegistryErrorIndex) != "NO_ERROR"
      EndWait
      goto FatalRegistry
   endif

AfterNewDriverInstall = +

   ;
   ;  Loop through the Adapter List and install as many instances of the Token
   ;  Ring Adapter that we have.
   ;

   ForListDo $(AdapterList)

      Set BusSlotPci = $($)
      Set BusNumber  = *($(BusSlotPci),1)
      Set SlotNumber = *($(BusSlotPci),2)
      Set NetcardId  = *($(BusSlotPci),3)

      ;       -------------------------------------------------
      ;       If netcard is already installed, skip this entry
      ;       -------------------------------------------------

      Debug-Output "BusSlotPci = "$(BusSlotPci)
      Debug-Output "BusNumber = "$(BusNumber)
      Debug-Output "SlotNumber = "$(SlotNumber)
      Debug-Output "NetcardId = "$(NetcardId)

      Set AlreadyInstalled = "NO"

      ;   Make a list of all the installed netcards
      ;   OpenRegKey gets a handle to a Key

      OpenRegKey +
         $(!REG_H_LOCAL),+
         "",+
         $(NetworkCardKeyName),+
         $(MAXIMUM_ALLOWED),+
         IE_KeyNetcards

      Ifstr $(IE_KeyNetcards) == $(KeyNull)
         set RegistryErrorIndex = UNABLE_OPEN_NETWORKCARD_SECTION
         goto FatalRegistry
      endif

      EnumRegKey $(IE_KeyNetcards) IE_KeyNameList

      ;       Compare all the NetworkCards entries to see whether
      ;       they match the current bus number, slot number, title,
      ;       and product name.

   Debug-Output "IE_KeyNameList ="$(IE_KeyNameList)

   ForListDo  $(IE_KeyNameList)
      set IE_KeyName = *($($),1)
      OpenRegKey +
         $(IE_KeyNetcards),+
         "",+
         $(IE_KeyName),+
         $(MAXIMUM_ALLOWED),+
         IE_Card

      Debug-Output "IE_Card = "$(IE_Card)

      Ifstr $(IE_Card) == $(KeyNull)
         set RegistryErrorIndex = UNABLE_OPEN_NETWORKCARD_SECTION
         goto FatalRegistry
      endif

      GetRegValue $(IE_Card),"Description", DescriptionInfo
      GetRegValue $(IE_Card),"ProductName", ProductNameInfo
      set CardDescription     = *($(DescriptionInfo), 4)
      set CardProductName     = *($(ProductNameInfo), 4)

      Debug-Output "CardDescription = "$(CardDescription)
      Debug-Output "ProductHardwareDescription = "$(ProductHardwareDescription)
      Debug-Output "CardProductName = "$(CardProductName)
      Debug-Output "ProductHardwareName = "$(ProductHardwareName)

      ifstr(i) $(CardProductName) == $(ProductHardwareName)

         ;       The product type matches.  Now check for a
         ;       match on bus number and slot number.
         
         GetRegValue $(IE_Card), "ServiceName", ServiceNameInfo

         Set ServiceName = *($(ServiceNameInfo), 4)

         Debug-Output "ServiceName ="$(ServiceName)

         OpenRegKey +
            $(!REG_H_LOCAL),+
            "",+
            "SYSTEM\CurrentControlSet\Services\"$(ServiceName)"\Parameters",+
            $(MAXIMUM_ALLOWED),+
            IE_KeyService

         Ifstr $(IE_KeyService) == $(KeyNull)
            set RegistryErrorIndex = UNABLE_OPEN_NETWORKCARD_SECTION
            goto FatalRegistry
         endif

         ;       We are now in the parameters key for the adapter
         ;       to which we are comparing the current adapter

         GetRegValue $(IE_KeyService), "BusNumber", BusInfo
         set CardBusNum = *($(BusInfo), 4)

         GetRegValue $(IE_KeyService), "SlotNumber", SlotInfo
         set CardSlotNum = *($(SlotInfo), 4)

         Debug-Output "CardBusNum ="$(CardBusNum)
         Debug-Output "BusNumber ="$(BusNumber)

         ifint $(CardBusNum) == $(BusNumber)
            ifint $(CardSlotNum) == $(SlotNumber)
               Set AlreadyInstalled = "YES"
            endif
         endif

      endif
   EndForListDo

   ifstr(i) $(AlreadyInstalled) == "YES"
      goto NextAdapter
   endif

   ;       -------------------------------------------------
   ;       The netcard has not yet been installed.  Add
   ;       it now.
   ;       -------------------------------------------------

;  Determine the CardId parameter first, as well as the ProductHardwareTitle.
;  The latter parameter is only used in installation mode.

   ifint $(NetcardId) == $(PIT_ADAPTER_ID)
      set ProductHardwareTitle = $(TRP_TITLE)
      set CardId = $(PIT_ADAPTER_ID)
   endif


SetINFDefaults =+

;  The following sections is used during a new installation and by
;  the configure adapter section to determine the default values for 
;  parameters.
;
;  Parameters needed:
;
;  AdapterBusType    REG_VT_DWORD   5     (1=ISA,3=MCA,5=PCI,8=PCMCIA)
;  BusNumber         REG_VT_DWORD   --->  (set by PCI autodetect logic)
;  BusType           REG_VT_DWORD   5     (1=ISA,3=MCA,5=PCI,8=PCMCIA)
;  CardId            REG_VT_DWORD   *
;  DataRate          REG_VT_SZ      AUTO  (AUTO,M16,M4)
;  EnableTxEofInt    REG_VT_SZ      YES   (YES,NO)
;  FullDuplex        REG_VT_SZ      YES   (YES,NO)
;  LLCOnly           REG_VT_SZ      YES   (YES,NO)
;  LoopBack          REG_VT_SZ      NO    (YES,NO)
;  MaxTransmits      REG_VT_DWORD   31    (1-128)
;  MaxTxFrameSize    REG_VT_DWORD   4096  (14-18000)
;  MediaType         REG_VT_DWORD   2     (1=Ethernet,2=Token Ring)
;  MinRcvBuffs       REG_VT_DWORD   40    (1-200)
;  NetAddress        REG_VT_SZ      **    (12 digit valid LAA MAC address) 
;  RcvBuffSize       REG_VT_DWORD   4096  (256-18000)
;  SlotNumber        REG_VT_DWORD   --->  (set by PCI autodetect logic)
;  SMP_Mode          REG_VT_SZ      ***   (YES,NO)
;  TraceQuiet        REG_VT_SZ      ****  (YES,NO)
;  TxPriMax          REG_VT_DWORD   6     (0-6)
;  TxPriThresh       REG_VT_DWORD   1     (1-6)
;
;  * CardId is dependant on the actual card installed. Look in
;  the file constant section for hints.
;
;  ** NetAddress must be a valid LAA, that is, between 400000000000 and
;  7FFFFFFFFFFF hexidecimal.
; 
;  *** SMP_Mode is set to yes if the workstation has at least two
;  processors.
;
;  **** Needed only for NDIS 3.1 drivers, set in FillInValueList shell
;  section.
;
;  Set default values for first time install.  This will set the default
;  configuration for adapters that are being installed for the first time.
;  The user can then bring up the properties for the adapter to configure the
;  adapter after this has been done.

;  If this driver can support SMP, do it. (Workstation must be running
;  Windows NT 4.0 and have at least two processors).

   ifstr(i) $(hasSMP) == "YES"
      set SMP_Mode      = "YES"
   else
      set SMP_Mode      = "NO"
   endif

;  Set the rest of the parameters
   set AdapterBusType   = "5" ; PCI
   set BusType          = "5" ; PCI
   set DataRate         = "AUTO"
   set EnableTxEofInt   = "YES"
   set FullDuplex       = "YES"
   set LLCOnly          = "YES"   
   set LoopBack         = "NO"   
   set MaxTransmits     = "31"
   set MaxTxFrameSize   = "4096"
   set MediaType        = "2" ; 802.5 Token Ring   
   set MinRcvBuffs      = "40"
   set NetAddress       = ""   
   set RcvBuffSize      = "4096"   
   set TxPriMax         = "6"
   set TxPriThresh      = "1"
   
   ifstr(i) $(hasRNIC) == "YES"
      set SecondaryInstance = $(RNIC_Not)
      set RNICStatus = 0
   endif

   ; The above section is called from Configure mode to reset common
   ; defaults for the driver. If called from configure, jump back to 
   ; configuration section.
   ifstr(i) $(!NTN_InstallMode) == Configure
      goto AfterSetINFDefaults
   endif
   
   ; Create the Hardware Component
   Shell $(UtilityInf), AddHardwareComponent, +
      $(ProductHardwareName),+
      $(STF_CONTEXTINFNAME),+
      $(CurrentProductKeyName)

   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      goto ShellCodeError
   endif

   Debug-Output "ProductKeyName ="$(CurrentProductKeyName)

   ifint $($R4) != -1
     Set OEM_ABANDON_OPTIONS = >($(OEM_ABANDON_OPTIONS), $(!NTN_SoftwareBase)"\Microsoft\Windows NT\CurrentVersion\NetworkCards\"$($R4))
   endif

   set RegistryErrorIndex = $($R0)

   Ifstr(i) $(RegistryErrorIndex) != "NO_ERROR"
     EndWait
     CloseRegKey $($R1)
     CloseRegKey $($R2)
     CloseRegKey $($R3)
     goto FatalRegistry
   endif

   Set HardNetCardKey      = $($R1)
   Set HardNetRuleKey      = $($R2)
   Set HardParameterKey    = $($R3)
   Set AdapterNumber       = $($R4)

   Debug-Output "HardNetCardkey = "$(HardNetCardKey)
   Debug-Output "HardNetRuleKey = "$(HardNetRuleKey)
   Debug-Output "HardParameterKey = "$(HardParameterKey)
   Debug-Output "AdapterNumber = "$(AdapterNumber)
   Debug-Output "NetcardId = "$(NetcardId)
   Debug-Output "SlotNumber = "$(SlotNumber)


   ; Here's where we set the pretty name of the driver.   
   set MyTitle = "["$(AdapterNumber)"] "$(ProductHardwareTitle)
   Debug-Output "MyTitle = "$(MyTitle)
      
   Set MyService = $(ProductSoftwareName)$(AdapterNumber)

   Set NewValueList = {{Manufacturer,$(NoTitle),$(!REG_VT_SZ),$(CurrentManufacturer)},+
      {Title,$(NoTitle),$(!REG_VT_SZ),$(MyTitle)},+
      {Description,$(NoTitle),$(!REG_VT_SZ),$(ProductHardwareDescription)},+
      {ProductName,$(NoTitle),$(!REG_VT_SZ),$(ProductHardwareName)},+
      {ServiceName,$(NoTitle),$(!REG_VT_SZ),$($R5)},+
      {InstallDate,$(NoTitle),$(!REG_VT_DWORD),*($(Now),1)}}
   
   Debug-Output "NewValueList = "$(NewValueList)
   Debug-Output "HardNetCardKey = "$(HardNetCardKey)

   Shell  $(UtilityInf), AddValueList, $(HardNetCardKey), $(NewValueList)

   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      goto ShellCodeError
   endif

   set TempProdName = """"$(ProductHardwareName)$(AdapterNumber)""""
   set TempBindForm = $(TempProdName)$(NetRuleHardwareBindForm)
   set NewValueList = {{type,$(NoTitle),$(!REG_VT_SZ),$(NetRuleHardwareType)},+
      {bindform,$(NoTitle),$(!REG_VT_SZ),$(TempBindForm)}, +
      {class,$(NoTitle),$(!REG_VT_MULTI_SZ),$(NetRuleHardwareClass)}, +
      {InfOption,$(NoTitle),$(!REG_VT_SZ),$(Option)}}

   Debug-Output $(NewValueList)
   Debug-Output "TempProdName ="$(TempProdName)
   Debug-Output "HardNetRuleKey ="$(HardNetRuleKey)

   Shell  $(UtilityInf), AddValueList, $(HardNetRuleKey), $(NewValueList)

   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      goto ShellCodeError
   endif
   
   Shell "",FillInNewValueList

   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      goto ShellCodeError
   endif

   set NewValueList = $($R0)
   Debug-Output "NewValueList = "$(NewValueList)
   Debug-Output "HardParameterKey = "$(HardParameterKey)

   Shell  $(UtilityInf), AddValueList, $(HardParameterKey), $(NewValueList)

   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      goto ShellCodeError
   endif

   ifstr(i) $(!STF_GUI_UNATTENDED) == "YES"
      Shell "" ,AddDefaultNetCardParameters,$(HardParameterKey)
   endif

   CloseRegKey $(HardNetCardKey)
   CloseRegKey $(HardNetRuleKey)
   CloseRegKey $(HardParameterKey)

NextAdapter = +

   EndForListDo

LastAdapter = +

   EndWait

   goto successful

;   -----------------------------------------------------------------
;   ConfigureAdapter    -   Entry point for configuration mode
;   -----------------------------------------------------------------

ConfigureAdapter = +

   OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_RegBase) $(MAXIMUM_ALLOWED) NetCardKey
   ifstr(i) $(NetCardKey) == ""
      set CommonStatus = STATUS_USERCANCEL
      goto successful
   endif
   GetRegValue $(NetCardKey) "ServiceName" ServiceInfo
   set ServiceName = *($(ServiceInfo),4)
   GetRegValue $(NetCardKey) "Title" TitleInfo
   set MyTitle = *($(TitleInfo),4)
   CloseRegKey $(NetCardKey)

   OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_ServiceBase)"\"$(ServiceName)"\Parameters" $(MAXIMUM_ALLOWED) ParamKey
   ifstr(i) $(ParamKey) == ""
      goto successful
   endif

   ; Before going any further: is this adapter a secondary adapter
   ; in an RNIC situation? If so, stop the user from configuring
   ; anything and display a nice message.
   
   GetRegValue $(ParamKey) "RNICStatus" RNICValue
   set RNICStatus = *($(RNICValue), 4)
   
   ifint $(RNICStatus) == "2" 
      ; The adapter is secondary. Tell the user, then gracefully exit.
      set Error = "Secondary adapters in a redundant NIC relationship cannot be configured."
      set to = UnsupportedAction
      set from = UnsupportedAction
      goto UnsupportedAction
   endif    

   ; Set defaults for anything that can be changed in the GUI
   ; in case they aren't in the registry already.

   goto SetINFDefaults           ;(in install section above)
   
AfterSetINFDefaults = +

   ; Initialize ParmList
   set ParmList            = "OptionID="$(Option)",MyTitle="$(MyTitle)",hasSMP="$(hasSMP)",MSS="$(hasMSS)",DriverFile="$(DriverFile)",InstanceName="$(ServiceName)",HasRNIC="$(hasRNIC)

   ; Read from the registry and override defaults with values we find 
   ; there.
   EnumRegValue $(ParamKey) ValueList

   ForListDo $(ValueList)

      set ValueItem = $($)
      set Key       = *($(ValueItem),1)
      set Value     = *($(ValueItem),4)

      ifstr(i)  $(Key) == "AdapterBusType"
         set AdapterBusType         = $(Value)

      else-ifstr(i)  $(Key) == "BusNumber"
         set BusNumber         = $(Value)

      else-ifstr(i)  $(Key) == "BusType"
         set BusType         = $(Value)
         
      else-ifstr(i)  $(Key) == "CardId"
         set CardId         = $(Value)

      else-ifstr(i)  $(Key) == "DataRate"
         set DataRate         = $(Value)

      else-ifstr(i)  $(Key) == "EnableTxEofInt"
         set EnableTxEofInt   = $(Value)

      else-ifstr(i)  $(Key) == "FullDuplex"
         set FullDuplex       = $(Value)

      else-ifstr(i)  $(Key) == "LLCOnly"
         set LLCOnly          = $(Value)

      else-ifstr(i)  $(Key) == "LoopBack"
         set LoopBack         = $(Value)

      else-ifstr(i)  $(Key) == "MaxTransmits"
         set MaxTransmits      = $(Value)
      
      else-ifstr(i)  $(Key) == "MaxTxFrameSize"
         set MaxTxFrameSize     = $(Value)

      else-ifstr(i)  $(Key) == "MediaType"
         set MediaType         = $(Value)

      else-ifstr(i)  $(Key) == "MinRcvBuffs"
         set MinRcvBuffs       = $(Value)
      
      else-ifstr(i)  $(Key) == "NetAddress"
         set NetAddress       = $(Value)

      else-ifstr(i)  $(Key) == "RcvBuffSize"
         set RcvBuffSize      = $(Value)
         
      else-ifstr(i)  $(Key) == "RNICStatus"
         set RNICStatus      = $(Value)

      else-ifstr(i)  $(Key) == "SecondaryBusNumber"
         set SecondaryBusNumber     = $(Value)

      else-ifstr(i)  $(Key) == "SecondaryInstance"
         set SecondaryInstance     = $(Value)

      else-ifstr(i)  $(Key) == "SecondarySlotNumber"
         set SecondarySlotNumber     = $(Value)

      else-ifstr(i)  $(Key) == "SlotNumber"
         set SlotNumber     = $(Value)

      else-ifstr(i)  $(Key) == "SMP_Mode"
         set SMP_Mode          = $(Value)
      
      else-ifstr(i)  $(Key) == "TxPriMax"
         set TxPriMax         = $(Value)
      
      else-ifstr(i)  $(Key) == "TxPriThresh"
         set TxPriThresh      = $(Value)
      
      endif
      
   EndForListDo

   ; Finish setting up the rest of the ParmList

   set ParmList = $(ParmList)",AdapterBusType="$(AdapterBusType)
   set ParmList = $(ParmList)",BusNumber="$(BusNumber)
   set ParmList = $(ParmList)",BusType="$(BusType)
   set ParmList = $(ParmList)",CardId="$(CardId)
   set ParmList = $(ParmList)",DataRate="$(DataRate)
   set ParmList = $(ParmList)",EnableTxEofInt="$(EnableTxEofInt)
   set ParmList = $(ParmList)",FullDuplex="$(FullDuplex)
   set ParmList = $(ParmList)",LLCOnly="$(LLCOnly)
   set ParmList = $(ParmList)",LoopBack="$(LoopBack)
   set ParmList = $(ParmList)",MaxTransmits="$(MaxTransmits)
   set ParmList = $(ParmList)",MaxTxFrameSize="$(MaxTxFrameSize)
   set ParmList = $(ParmList)",MediaType="$(MediaType)
   set ParmList = $(ParmList)",MinRcvBuffs="$(MinRcvBuffs)
   set ParmList = $(ParmList)",NetAddress="$(NetAddress)
   set ParmList = $(ParmList)",RcvBuffSize="$(RcvBuffSize)
   set ParmList = $(ParmList)",RNICStatus="$(RNICStatus)
   set ParmList = $(ParmList)",SecondaryBusNumber="$(SecondaryBusNumber)
   set ParmList = $(ParmList)",SecondaryInstance="$(SecondaryInstance)
   set ParmList = $(ParmList)",SecondarySlotNumber="$(SecondarySlotNumber)
   set ParmList = $(ParmList)",SlotNumber="$(SlotNumber)
   set ParmList = $(ParmList)",SMP_Mode="$(SMP_Mode)
   set ParmList = $(ParmList)",TxPriMax="$(TxPriMax)
   set ParmList = $(ParmList)",TxPriThresh="$(TxPriThresh)         

   Debug-Output "ParmList ="$(ParmList)
    
   ; Save the value of "RNICStatus" and "SecondaryInstance" for checking later.
   set Old_RNICStatus = $(RNICStatus)
   set Old_SecondaryInstance = $(SecondaryInstance)
   
   Debug-Output "RNICStatus = "$(RNICStatus)" Old_RNICStatus = "$(Old_RNICStatus)
   Debug-Output "SecondaryInstance = "$(SecondaryInstance)" Old_SecondaryInstance = "$(Old_SecondaryInstance)
   
   ; Load the tokstp2 DLL and bring up the GUI
   LoadLibrary "X" $(InstallDLL) hDLL
   LibraryProcedure Result $(hDLL) InstallTokenRing $(ParmList)
   FreeLibrary $(hDLL)

   ;   Extract parameters from result string. We are only interested in
   ;   the parameters that are changable from tokstp2
   
   Split-String $(Result) "," ResultList
   ForListDo $(ResultList)
      Set Token = $($)
      ifstr $(Token) != ","
         Split-String $(Token) "=" KeyEqualsValue
         Set Key     =   *($(KeyEqualsValue), 1)
         Set Value   =   *($(KeyEqualsValue), 3)
         ifstr $(Key) == "STATUS"
            ifstr $(Value) != "OK"
               Set CommonStatus = STATUS_USERCANCEL
               Debug-Output "Cancel button pressed in InstallTokenRing()"
               goto end
            endif
         else-ifstr  $(Key) == "AdapterBusType"
            set AdapterBusType         = $(Value)
         else-ifstr  $(Key) == "BusNumber"
            set BusNumber         = $(Value)
         else-ifstr  $(Key) == "BusType"
            set BusType         = $(Value)
         else-ifstr  $(Key) == "CardId"
            set CardId         = $(Value)
         else-ifstr  $(Key) == "DataRate"
            set DataRate         = $(Value)
         else-ifstr  $(Key) == "EnableTxEofInt"
            set EnableTxEofInt   = $(Value)         
         else-ifstr  $(Key) == "FullDuplex"
            set FullDuplex       = $(Value)
         else-ifstr  $(Key) == "LLCOnly"
            set LLCOnly          = $(Value)       
         else-ifstr  $(Key) == "LoopBack"
            set LoopBack         = $(Value)            
         else-ifstr  $(Key) == "MaxTransmits"
            set MaxTransmits      = $(Value)            
         else-ifstr  $(Key) == "MaxTxFrameSize"
            set MaxTxFrameSize     = $(Value)
         else-ifstr  $(Key) == "MediaType"
            set MediaType         = $(Value)         
         else-ifstr  $(Key) == "MinRcvBuffs"
            set MinRcvBuffs       = $(Value)         
         else-ifstr  $(Key) == "NetAddress"
            set NetAddress       = $(Value)
         else-ifstr  $(Key) == "RcvBuffSize"
            set RcvBuffSize      = $(Value)
         else-ifstr  $(Key) == "RNICStatus"
            set RNICStatus      = $(Value)
         else-ifstr  $(Key) == "SecondaryBusNumber"
            set SecondaryBusNumber = $(Value)
         else-ifstr  $(Key) == "SecondaryInstance"
            set SecondaryInstance  = $(Value)
         else-ifstr  $(Key) == "SecondarySlotNumber"
            set SecondarySlotNumber = $(Value)
         else-ifstr  $(Key) == "SlotNumber"
            set SlotNumber     = $(Value)
         else-ifstr  $(Key) == "SMP_Mode"
            set SMP_Mode          = $(Value)         
         else-ifstr  $(Key) == "TxPriMax"
            set TxPriMax         = $(Value)
         else-ifstr  $(Key) == "TxPriThresh"
            set TxPriThresh      = $(Value)
         endif
      endif
   EndForListDo

   ; Remove the parameters & rebuild the parameters based on user input

   EnumRegValue $(ParamKey) OldValueList

   ForListDo $(OldValueList)
      set ValueItem = $($)
      set ValueName = *($(ValueItem),1)
      ; Don't remove CoS 4 IP and RTSW Parms!
      ifcontains(i) $(ValueName) not-in { +
         "RTSWMode", +
         "RTSWEnable", +
         "RTSWHoldingTime", +
         "RTSWSubnetMask", +
         "RTSWTableSize", +
         "TCPPortRange1", +
         "TCPPortRange2", +
         "TCPPortRange3", +         
         "TCPPortRange4", +
         "TCPPortRange5", +                  
         "UDPPortRange1", +
         "UDPPortRange2", +
         "UDPPortRange3", +         
         "UDPPortRange4", +
         "UDPPortRange5" +
         }
         DeleteRegValue $(ParamKey) $(ValueName)
      endif
   EndForListDo

   ;   Build the new value list.
   Shell "",FillInNewValueList
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      goto ShellCodeError
   endif

   set NewValueList = $($R0)
   Debug-Output $(NewValueList)

   Shell  $(UtilityInf), AddValueList, $(ParamKey), $(NewValueList)


   ; RNIC Setup (NetRules/Internal Bookkeeping)
   
   ; CASE 1: If this is a new primary adapter in an RNIC situation, we need to
   ; do the following:
   ;
   ; (1a) find the secondary adapter's Parameter Key registry Handle,
   ;      add the "RNICStatus" value to the parameter list and set 
   ;      it to "2"
   ;
   ; (1b) find the secondary adapter's NetRules Key registry Handle and
   ;      remove the "type" value
 
   
   ; CASE 2: If this is a old primary adapter whose backup adapter has switched,
   ; then we need to do the following:
   ; 
   ; (2a) find the old secondary adapter's Parameter Key registry Handle,
   ;      change the "RNICStatus" value to "0"
   ;
   ; (2b) find the new secondary adapter's Parameter Key registry Handle,
   ;      add the "RNICStatus" value to the parameter list and set 
   ;      it to "2"
   ;
   ; (2c) find the old secondary adapter's NetRules Key registry Handle and
   ;      replace the "type" value 
   ;
   ; (2d) find the secondary adapter's NetRules Key registry Handle and
   ;      remove the "type" value
   
   ; CASE 3: Similarly, if this adapter was a primary, but is no longer a primary
   ;      adapter, it's secondary must be fixed according to (2a) and (2b).
   
   
   ; Determine the cases here. Check to see if the Secondary instance changed.
   
   ifstr $(SecondaryInstance) != $(Old_SecondaryInstance)
      
      ; We need to get the hardware base key for the secondary adapter, if we have
      ; a secondary adapter. In order to do this, we need the adapter number of the 
      ; secondary adapter. We'll get this by splitting the secondary adapter
      ; instance string by using "P" as the delimiter (I know...this is ugly --sgp).
      ; So, if the instance string is "IBMTRPx", Split-String will return 
      ; {"IBMTR","P","x"}.  We'll then use the last element in the list as the end of
      ; the RegBase key "SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\x\NetRules"
   
      ifstr $(SecondaryInstance) != $(RNIC_Not)
         Split-String $(SecondaryInstance) "P" HackedUp
         set SecondNum = *($(HackedUp), 3)
         Debug-Output "SecondNum = "$(SecondNum)
      endif
      ifstr $(Old_SecondaryInstance) != $(RNIC_Not)
         Split-String $(Old_SecondaryInstance) "P" HackedUp
         set Old_SecondNum = *($(HackedUp), 3)
         Debug-Output "Old_SecondNum = "$(Old_SecondNum)
      endif
      
      ; Set up some "informational strings"
      set PrimaryString = $(ProductHardwareDescription)" [Redundant NIC primary adapter, "$(SecondaryInstance)" acting as secondary]"
      set SecondaryString = $(ProductHardwareDescription)" [Redundant NIC secondary adapter]"
      
      ifint $(RNICStatus) == 1
         ifint $(Old_RNICStatus) == 0
            ; CASE 1: RNICStatus 0 >> 1 (New RNIC Setup)
            
            Debug-Output "RNIC Case 1 -- New RNIC Setup)"
            ; (1a) Open the secondary adapter's parameter key
            OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_ServiceBase)"\"$(SecondaryInstance)"\Parameters" $(MAXIMUM_ALLOWED) TempKey
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif
            ; Change the RNICStatus key to 2 (secondary)
            set NewValueList = {RNICStatus,0,$(!REG_VT_DWORD),2}
            SetRegValue $(TempKey) $(NewValueList)
            CloseRegKey $(TempKey)
            ; (1b) Open the secondary adapter's NetRules key
            OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\"$(SecondNum)"\NetRules" $(MAXIMUM_ALLOWED) TempKey
            Debug-Output $(!NTN_RegBase)"\NetRules"
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif
            ; Delete the type value
            DeleteRegValue $(TempKey) type
            CloseRegKey $(TempKey)
            
            OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_RegBase) $(MAXIMUM_ALLOWED) TempKey
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif
            set NewValueList = {Description,0,$(!REG_VT_SZ),$(PrimaryString)}
            SetRegValue $(TempKey) $(NewValueList)
            CloseRegKey $(TempKey)
            
            OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\"$(SecondNum) $(MAXIMUM_ALLOWED) TempKey
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif             
            set NewValueList = {Description,0,$(!REG_VT_SZ),$(SecondaryString)}
            SetRegValue $(TempKey) $(NewValueList)
            CloseRegKey $(TempKey)
                        
                    
         else-ifint $(Old_RNICStatus) == 1
            ; CASE 2: RNICStatus 1 >> 1 (Changed backup adapters)
            
            Debug-Output "RNIC Case 2 -- Existing RNIC Setup, Changed Secondary adapters"
            ; (2a) Open the old secondary adapter's parameter key
            OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_ServiceBase)"\"$(Old_SecondaryInstance)"\Parameters" $(MAXIMUM_ALLOWED) TempKey
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif
            ; Change the RNICStatus key to 0 (eligible)
            set NewValueList = {RNICStatus,0,$(!REG_VT_DWORD),0}
            SetRegValue $(TempKey) $(NewValueList)
            CloseRegKey $(TempKey)
            ; (2b) Open the secondary adapter's parameter key
            OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_ServiceBase)"\"$(SecondaryInstance)"\Parameters" $(MAXIMUM_ALLOWED) TempKey
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif
            ; Change the RNICStatus key to 2 (secondary)
            set NewValueList = {RNICStatus,0,$(!REG_VT_DWORD),2}
            SetRegValue $(TempKey) $(NewValueList)
            CloseRegKey $(TempKey)
            ; (2c) Open the old secondary adapter's NetRules key
            OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\"$(Old_SecondNum)"\NetRules" $(MAXIMUM_ALLOWED) TempKey
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif
            ; Replace the type value
            set NewValueList = {type,0,$(!REG_VT_SZ),$(NetRuleHardwareType)}
            SetRegValue $(TempKey) $(NewValueList) 
            CloseRegKey $(TempKey)
            ; (2d) Open the secondary adapter's NetRules key
            OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\"$(SecondNum)"\NetRules" $(MAXIMUM_ALLOWED) TempKey
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif
            ; Delete the type value
            DeleteRegValue $(TempKey) type
            CloseRegKey $(TempKey)
            
            OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_RegBase) $(MAXIMUM_ALLOWED) TempKey
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif
            set NewValueList = {Description,0,$(!REG_VT_SZ),$(PrimaryString)}
            SetRegValue $(TempKey) $(NewValueList)
            CloseRegKey $(TempKey)
            
            OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\"$(SecondNum) $(MAXIMUM_ALLOWED) TempKey
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif             
            set NewValueList = {Description,0,$(!REG_VT_SZ),$(SecondaryString)}
            SetRegValue $(TempKey) $(NewValueList)
            CloseRegKey $(TempKey)
            
            OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\"$(Old_SecondNum) $(MAXIMUM_ALLOWED) TempKey
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif             
            set NewValueList = {Description,0,$(!REG_VT_SZ),$(ProductHardwareDescription)}
            SetRegValue $(TempKey) $(NewValueList)
            CloseRegKey $(TempKey)
            
                       
         endif
      else-ifint $(RNICStatus) == 0
         ifint $(Old_RNICStatus) == 1
            ; CASE 3: RNICStatus 1 >> 0 (Removed adapters from RNIC status)
            
            Debug-Output "RNIC Case 3 -- RNIC Dissolution"
            ; (3a) Open the secondary adapter's parameter key
            OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_ServiceBase)"\"$(Old_SecondaryInstance)"\Parameters" $(MAXIMUM_ALLOWED) TempKey
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif
            ; Change the RNICStatus key to 0 (eligible)
            set NewValueList = {RNICStatus,0,$(!REG_VT_DWORD),0}
            SetRegValue $(TempKey) $(NewValueList)
            CloseRegKey $(TempKey)
            ; (3b) Open the secondary adapter's NetRules key
            OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\"$(Old_SecondNum)"\NetRules" $(MAXIMUM_ALLOWED) TempKey
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif
            ; Replace the type value
            set NewValueList = {type,0,$(!REG_VT_SZ),$(NetRuleHardwareType)}
            SetRegValue $(TempKey) $(NewValueList)
            CloseRegKey $(TempKey)
            
            ; Set up some informational strings
            OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_RegBase) $(MAXIMUM_ALLOWED) TempKey
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif
            set NewValueList = {Description,0,$(!REG_VT_SZ),$(ProductHardwareDescription)}
            SetRegValue $(TempKey) $(NewValueList)
            CloseRegKey $(TempKey)
            
            OpenRegKey $(!REG_H_LOCAL) "" "SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\"$(Old_SecondNum) $(MAXIMUM_ALLOWED) TempKey
            ifstr(i) $(TempKey) == ""
               goto fatal
            endif
            set NewValueList = {Description,0,$(!REG_VT_SZ),$(ProductHardwareDescription)}
            SetRegValue $(TempKey) $(NewValueList)
            CloseRegKey $(TempKey)         
         endif
              
      endif
 
   ; Finally, since the RNIC stuff changed, we need to initiate another bindings review.
   ; Setting CommonStatus to "STATUS_REBIND" should do the trick.  
   set CommonStatus = STATUS_REBIND
   
   endif


   goto successful

BindingAdapter =+

   set Error = "Binding: Sorry, not yet implemented."
   goto fatal

RemoveAdapter = +

   ; Find our parameter key
   
   OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_RegBase) $(MAXIMUM_ALLOWED) NetCardKey
   ifstr(i) $(NetCardKey) == ""
      goto FatalRegistry
   endif
    
   GetRegValue $(NetCardKey) "ServiceName" ServiceInfo
   set ServiceName = *($(ServiceInfo),4)

   OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_ServiceBase)"\"$(ServiceName)"\Parameters" $(MAXIMUM_ALLOWED) ParamKey
   ifstr(i) $(ParamKey) == ""
      goto FatalRegistry
   endif

   ; Before going any further: is this adapter currently in an
   ; RNIC situation? If so, stop the user from configuring
   ; anything and display a nice message.
   
   GetRegValue $(ParamKey) "RNICStatus" RNICValue
   set RNICStatus = *($(RNICValue), 4)
   
   ifint $(RNICStatus) == "1" 
      ; The adapter is in a RNIC relationship, and it's a primary adapter. Tell the user, then gracefully exit.
      set Error = "Removing the primary adapter in a redundant NIC pair is not supported. To uninstall this adapter, you must enter the Redundant NIC properties for this adapter and change the secondary adapter to 'Redundant NIC Disabled'. After doing this, you will be allowed to remove the adapter."
      set to = UnsupportedAction
      set from = UnsupportedAction
      goto UnsupportedAction
   endif
   ifint $(RNICStatus) == "2"
      ; The adapter is in a RNIC relationship, and it's a secondary adapter.
      set Error = "Removing the secondary adapter in a redundant NIC pair is not supported. To uninstall this adapter, you must enter the Redundant NIC properties for the primary adapter in the redundant NIC pair and change the secondary adapter to 'Redundant NIC Disabled'. After doing this, you will be allowed to remove the adapter."
      set to = UnsupportedAction
      set from = UnsupportedAction
      goto UnsupportedAction
   endif
   
   CloseRegKey $(ParamKey)
   CloseRegKey $(NetCardKey)
   
   Debug-Output "Removing adapter components..."
   Ifstr(i) $(CurrentProductKeyName) == $(!NTN_RegBase)

      Shell $(UtilityInf), RemoveSoftwareComponent, +
         $(CurrentManufacturer), +
         $(ProductSoftwareName)

      ifint $($ShellCode) != $(!SHELL_CODE_OK)
         goto ShellCodeError
      endif

      set RegistryErrorIndex = $($R0)

      Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
         goto FatalRegistry
      endif

   else

      Shell $(UtilityInf), RemoveHardwareComponent, +
         $(CurrentManufacturer), +
         $(ProductSoftwareName), +
         $(!NTN_RegBase)

      ifint $($ShellCode) != $(!SHELL_CODE_OK)
         goto ShellCodeError
      endif

      set RegistryErrorIndex = $($R0)

      Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
         goto FatalRegistry
      endif

   endif

   goto end

UpgradeSoftware = +

   Debug-Output "Entering Upgrade Software Section..."

   set KeyProduct = ""
   OpenRegKey $(!REG_H_LOCAL) "" $(CurrentProductKeyName) $(MAXIMUM_ALLOWED) KeyProduct
   Ifstr(i) $(KeyProduct) != $(KeyNull)
      Debug-Output "Beginning upgrade of software component "$(KeyProduct)
      Shell $(UtilityInf), GetInfFileNameFromRegistry, $(KeyProduct)
      ifint $($ShellCode) != $(!SHELL_CODE_OK)
         goto ShellCodeError
      endif

      set !UG_Filename = $($R0)
    
      install "Install-Update"
      ifstr(i) $(STF_INSTALL_OUTCOME) != STF_SUCCESS
         goto fatal
      endif
      SetRegValue $(KeyProduct) {MajorVersion,$(NoTitle),$(!REG_VT_SZ),$(ProductMajorVersion)}
      SetRegValue $(KeyProduct) {MinorVersion,$(NoTitle),$(!REG_VT_SZ),$(ProductMinorVersion)}
      CloseRegKey $(KeyProduct)
      Debug-Output "Finished upgrade of software component "$(KeyProduct)
   else
      Debug-Output = "ACK!  Can't find software component to upgrade...bailing out!"
      goto fatalregistry
   endif
   goto end
   
UnsupportedAction = +
   Shell $(SubroutineInf) SetupMessage, $(!STF_LANGUAGE), "NONFATAL", $(Error)
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      goto ShellCodeError
   endif
   set CommonStatus = STATUS_USERCANCEL
   goto end


successful = +
   goto end

abandon = +
   ForListDo $(OEM_ABANDON_OPTIONS)
      Shell $(UtilityInf), RemoveHardwareComponent, $(CurrentManufacturer), +
         $(ProductSoftwareName), $($)
      ifint $($ShellCode) != $(!SHELL_CODE_OK)
         goto ShellCodeError
      endif
      set RegistryErrorIndex = $($R0)
      Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
         goto FatalRegistry
      endif
   EndForListDo

   Ifstr(i) $(OEM_ABANDON_SOFTWARE) == TRUE
   Shell $(UtilityInf), RemoveSoftwareComponent, $(CurrentManufacturer), +
      $(ProductSoftwareName), FALSE
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      goto ShellCodeError
   endif
   set RegistryErrorIndex = $($R0)
   Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
       goto FatalRegistry
   endif
   endif
   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) == ""
      Set Severity = NONFATAL
      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 abandon
   endif
   goto end

end = +
   goto term
   exit

term = +

   Return $(CommonStatus)

;---------------------------------------------------------------------
; Files sections

[Files-NDIS4MP]
1, IBMTRP.N4_,          SIZE=66000,    RENAME=IBMTRP.SYS

[Files-NDIS3MP]
1, IBMTRP.N3_,          SIZE=66000,    RENAME=IBMTRP.SYS

[Files-Support]
1, TOKSTP2.DL_,         SIZE=120000,   RENAME=TOKSTP2.DLL,  OVERWRITE=VERIFYSOURCEOLDER
1, TOKSTP2.HL_,         SIZE=20000,    RENAME=TOKSTP2.HLP,  OVERWRITE=VERIFYSOURCEOLDER
1, TOKSTP2.CN_,         SIZE=1000,     RENAME=TOKSTP2.CNT,  OVERWRITE=VERIFYSOURCEOLDER
1, IBMSGNET.DL_,        SIZE=1900,     RENAME=IBMSGNET.DLL, OVERWRITE=VERIFYSOURCEOLDER

[Files-INF]
1, OEMSETUP.INF,        SIZE=71000,    RENAME=$(!UG_Filename)

;---------------------------------------------------------------------
; Installation Sections

[Install-Option]
   
   set STF_VITAL = ""

   ifstr(i) $(NDIS_Level) == $(NDIS4_Level)
      ; WinNT 4.x
      AddSectionFilesToCopyList Files-NDIS4MP $(SrcDir) $(!STF_WINDOWSSYSPATH)\drivers
   else
      ; assume WinNT 3.51
      AddSectionFilesToCopyList Files-NDIS3MP $(SrcDir) $(!STF_WINDOWSSYSPATH)\drivers 
   endif

   AddSectionFilesToCopyList Files-Support $(SrcDir) $(!STF_WINDOWSSYSPATH)

   set !STF_NCPA_FLUSH_COPYLIST = TRUE
   CopyFilesInCopyList

   Exit


[Install-Update]
    
   set STF_VITAL        = ""
   set STF_OVERWRITE    = "VERIFYSOURCEOLDER"

   ifstr(i) $(NDIS_Level) == $(NDIS4_Level)
      ; WinNT 4.x
      AddSectionFilesToCopyList Files-NDIS4MP $(SrcDir) $(!STF_WINDOWSSYSPATH)\drivers
   else
      ; assume WinNT 3.51
      AddSectionFilesToCopyList Files-NDIS3MP $(SrcDir) $(!STF_WINDOWSSYSPATH)\drivers
   endif

   AddSectionFilesToCopyList Files-Support $(SrcDir) $(!STF_WINDOWSSYSPATH)

   AddSectionFilesToCopyList Files-INF $(SrcDir) $(!STF_WINDOWSSYSPATH)

   set !STF_NCPA_FLUSH_COPYLIST = TRUE
   CopyFilesInCopyList
   exit

;---------------------------------------------------------------------
; Shell sections used during installation

[AddDefaultNetCardParameters]

   ; This section of code reads values out of the unattended install
   ; answer file, if any parameters exist.  Answer file keywords
   ; are CASE SENSITIVE and will override any defaults which may
   ; have been already set in the INF, so be careful!

   set KeyParameter = $($0)
   ForListDo $(!NetCardParameterName)
      set Name = $($)
      set Value = *($(!NetCardParameterValue), $(#))
      ifcontains(i) $(Name) in { +
         "NetAddress", +
         "LoopBack", +
         "FullDuplex", +
         "DataRate", +
         "EnableTxEofInt", +
         "LLCOnly", +
         "SMP_Mode", +
         "RTSWMode", +
         "RTSWEnable", +
         "RTSWSubnetMask", +
         "TCPPortRange1", +
         "TCPPortRange2", +
         "TCPPortRange3", +         
         "TCPPortRange4", +
         "TCPPortRange5", +                  
         "UDPPortRange1", +
         "UDPPortRange2", +
         "UDPPortRange3", +         
         "UDPPortRange4", +
         "UDPPortRange5" +        
         }
         set Type = $(!REG_VT_SZ)
      else
         set Type = $(!REG_VT_DWORD)
      endif
      Debug-Output "** Unattended Install: Answer File Parm Name = "$(Name)" with value = "$(Value)
      SetRegValue $(KeyParameter) {$(Name),0,$(Type),$(Value)}
   EndForListDo
   Return

[FillInNewValueList]

   ;   Build the new value list.

   Set NewValueList = {}

   Set List = {AdapterBusType,0,$(!REG_VT_DWORD),$(!P:AdapterBusType)}
   Set NewValueList = >($(NewValueList),$(List))

   ifstr $(!P:BusNumber) != ""
      Set List = {BusNumber,0,$(!REG_VT_DWORD),$(!P:BusNumber)}
      Set NewValueList = >($(NewValueList),$(List))
   endif

   Set List = {BusType,0,$(!REG_VT_DWORD),$(!P:BusType)}
   Set NewValueList = >($(NewValueList),$(List))

   Set List = {CardId,0,$(!REG_VT_DWORD),$(!P:CardId)}
   Set NewValueList = >($(NewValueList),$(List))

   ifstr $(!P:DataRate) != ""
      Set List = {DataRate,0,$(!REG_VT_SZ),$(!P:DataRate)}
      Set NewValueList = >($(NewValueList),$(List))
   endif

   ifstr $(!P:EnableTxEofInt) != ""
      Set List = {EnableTxEofInt,0,$(!REG_VT_SZ),$(!P:EnableTxEofInt)}
      Set NewValueList = >($(NewValueList),$(List))   
   endif

   ifstr $(!P:FullDuplex) != ""
      Set List = {FullDuplex,0,$(!REG_VT_SZ),$(!P:FullDuplex)}
      Set NewValueList = >($(NewValueList),$(List))   
   endif
   
   ifstr $(!P:LLCOnly) != ""
      Set List = {LLCOnly,0,$(!REG_VT_SZ),$(!P:LLCOnly)}
      Set NewValueList = >($(NewValueList),$(List))   
   endif

   ifstr $(!P:LoopBack) != ""
      Set List = {LoopBack,0,$(!REG_VT_SZ),$(!P:LoopBack)}
      Set NewValueList = >($(NewValueList),$(List))
   endif

   ifint $(!P:MaxTransmits) != ""
      Set List = {MaxTransmits,0,$(!REG_VT_DWORD),$(!P:MaxTransmits)}
      Set NewValueList = >($(NewValueList),$(List))
   endif

   ifint $(!P:MaxTxFrameSize) != ""
      Set List = {MaxTxFrameSize,0,$(!REG_VT_DWORD),$(!P:MaxTxFrameSize)}
      Set NewValueList = >($(NewValueList),$(List))
   endif

   Set List = {MediaType,0,$(!REG_VT_DWORD),$(!P:MediaType)}
   Set NewValueList = >($(NewValueList),$(List))
   
   ifint $(!P:MinRcvBuffs) != ""
      Set List = {MinRcvBuffs,0,$(!REG_VT_DWORD),$(!P:MinRcvBuffs)}
      Set NewValueList = >($(NewValueList),$(List))
   endif

   ifstr $(!P:NetAddress) != ""
      Set List = {NetAddress,0,$(!REG_VT_SZ),$(!P:NetAddress)}
      Set NewValueList = >($(NewValueList),$(List))
   endif

   ifint $(!P:RcvBuffSize) != ""
      Set List = {RcvBuffSize,0,$(!REG_VT_DWORD),$(!P:RcvBuffSize)}
      Set NewValueList = >($(NewValueList),$(List))   
   endif
   
   ifint $(!P:RNICStatus) != ""
      Set List = {RNICStatus,0,$(!REG_VT_DWORD),$(!P:RNICStatus)}
      Set NewValueList = >($(NewValueList),$(List))
   endif      
   
   ifstr $(!P:SecondaryInstance) != "XXXXXX"
      set List = {SecondaryBusNumber,0,$(!REG_VT_DWORD),$(!P:SecondaryBusNumber)}
      set NewValueList = >($(NewValueList),$(List))
      set List = {SecondarySlotNumber,0,$(!REG_VT_DWORD),$(!P:SecondarySlotNumber)}
      set NewValueList = >($(NewValueList),$(List))
   endif
   
   ifstr $(!P:SecondaryInstance) != ""
      ifstr $(!P:SecondaryInstance) != "XXXXXX"
         set List = {SecondaryInstance,0,$(!REG_VT_SZ),$(!P:SecondaryInstance)}
         set NewValueList = >($(NewValueList),$(List))
      endif
   endif

   ifstr $(!P:SlotNumber) != ""
      Set List = {SlotNumber,0,$(!REG_VT_DWORD),$(!P:SlotNumber)}
      Set NewValueList = >($(NewValueList),$(List))
   endif

   ifstr $(!P:SMP_Mode) != ""
      Set List = {SMP_Mode,0,$(!REG_VT_SZ),$(!P:SMP_Mode)}
      Set NewValueList = >($(NewValueList),$(List))
   endif
      
   Set List = {TraceHead,0,$(!REG_VT_DWORD),$(!P:TraceHead)}
   Set NewValueList = >($(NewValueList),$(List))

   ifint $(!P:TxPriMax) != ""
      Set List = {TxPriMax,0,$(!REG_VT_DWORD),$(!P:TxPriMax)}
      Set NewValueList = >($(NewValueList),$(List))
   endif

   ifint $(!P:TxPriThresh) != ""
      Set List = {TxPriThresh,0,$(!REG_VT_DWORD),$(!P:TxPriThresh)}
      Set NewValueList = >($(NewValueList),$(List))
   endif
   
   
   ;   NDIS 3.1 Only Stuff Here
   ;
   ifstr(i) $(!P:NDIS_Level) == $(!P:NDIS3_Level)
      set List = {TraceQuiet,0,$(!REG_VT_SZ),"YES"}
      set NewValueList = >($(NewValueList),$(List))
   endif

   Debug-Output "FillInNewValueList returning: "$(NewValueList)

   return $(NewValueList)
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: ftp, load: 2.77