OEMSETUP.INF Driver File Contents (tc_tring.exe)

; ------------------------------------------------------------------------
; Microsoft Windows NT and WFW Driver Installation
; Thomas-Conrad Token Ring Drivers
; Copyright 1993,94 Thomas-Conrad Corporation
; v2.04 (950428)
; ------------------------------------------------------------------------
; NOTES: To adapt this OEMSETNT.INF file for another flavor of adapter,
;        look for the 'NOTE: Adapter Adaptation area' comments.
;        The model for this installation calls for one .DLL,
;        one driver .SYS file, and one installation .INF file.  All are
;        copied during installation and deleted during removal.
;        To emit debug statements to the debugger, remove the comments
;        in the first two statements in [InstallOption].  For documentation
;        on this script language, dialogs, whys, wherefores, and weirdies,
;        look to  the 'NT Programmers Guide', chapters 2 and 4, 'ncpainf.doc'
;        from the build 506 NT DDK, and 'setupddk.doc' from  the build
;        506 NT DDK (neither made the release DDK for some reason).
;        The only script language operator we use that's not documented
;        anywhere is the 'tilde' (~), which returns  finds the index of
;        a match within a list.
;
;       This file has been modified from the original to add WFW support
;       and to have the drivers load from subdirectories.
;
;   KARROYO   03/15/95  For WFW add the Ndis 3 TokenRing netcards and
;       associated sections.
;   MANDERSO  03/20/95  Cleaned up for release.  NDIS 2.0 driver has been
;       modified so that the eaglemac will load from a directory where the
;       driver is located. A was used for file location to allow NDIS3
;       driver to copy properly.  A secondary section was added for the
;       EAGLECAF.BIN in case space is necessary for the shipping diskette
;       it will then be able to use the NT file location.

; ------------------------------------------------------------------------


; ------------------------------------------------------------------------
;       This starts the OEMSETUP for WFW
;       Path statement for the driver files is in [Disks].  This requires
;       the setup routine to find files in the wfw subdirectory.
; -----------------------------------------------------------------------


[Disks]
R =, "Thomas-Conrad Token Ring Adapter Driver Disk"

[NETCARD]
tc$4035="Thomas-Conrad TC4035 4 Mbps TokenRing/AT",9200, ndis,tokenring,0x07,tc$tok_inst,tc$tok_4mb_isa_nif
tc$4045="Thomas-Conrad TC4045/TC4145 16/4 TokenRing/AT",9203,ndis,tokenring,0x07,tc$tok_inst,tc$tok_isa_nif
tc$4046="Thomas-Conrad TC4046 16/4 TokenRing/MC",9204,ndis,tokenring,0x07,tc$tok_inst,tc$tok_mc_nif
;ms$tcctok="Thomas-Conrad Real Mode TokenRing Adapter",0009,ndis,tokenring,real,ms$tcctok,ms$tcctok_nif


[tc$tok_inst]
ndis2=R:tcctok.dos
ndis3=R:tctok.386
devdir=R:eaglecaf.bin
devdir=R:eaglemac.bin

_________________________________________________________________________
;  Option flags - for wfw parameters
;  0x01 - Range and default value specify absolute memory addresses
;  0x02 - Parameter is optional
;  0x04 - Parameter value is set by the device driver on the adapter
;  0x08 - User must be queried for value
;  0x10 - NDIS 2.0 value
;  0x20 - NDIS 3.0 value
; Some settings were made mandatory to query user even though default
; values exist.  Including I/O base, Interrupt, DMA, and Ring Speed.
; Ring speed value will overide adapter setting.
___________________________________________________________________________

[tc$tok_4mb_isa_nif]
drivername=TCCTOK$
io=iobase,"Base I/O Port",text,"0x1A20,0x2A20,0x3A20,0x3A40,0x3A60,0x3A80,0x3AA0,0x4AE0",0x1a20,0x38
irq=interrupt,"Interrupt",text,"2,3,5,6,7,10,11,12,15",2,0x38
param=dmachannel,"DMA Channel",text,"5,6,7,1,0",5,0x32
param=speed,"Ring Speed",int,"4",4
param=packetsize,"Packet Size",int,"512,4096,1",4096,0x32
param=netaddress,"Network Address",chars,12,,0x32
param=productid,"Product ID",chars,36,"",0x32

[tc$tok_isa_nif]
drivername=TCCTOK$
io=iobase,"Base I/O Port",text,"0x1A20,0x2A20,0x3A20,0x3A40,0x3A60,0x3A80,0x3AA0,0x4AE0",0x1a20,0x38
irq=interrupt,"Interrupt",text,"2,3,5,6,7,10,11,12,15",2,0x38
param=dmachannel,"DMA Channel",text,"5,6,7,1,0",5,0x38
param=speed,"Ring Speed",text,"4,16",16,0x38
param=packetsize,"Packet Size",int,"512,6096,1",4096,0x32
param=netaddress,"Network Address",chars,12,,0x32
param=productid,"Product ID",chars,36,"",0x32

[tc$tok_mc_nif]
drivername=TCCTOK$
slot=SlotNumber,"Adapter Slot Number",text,"1,2,3,4,5,6,7,8",1,0x28
param=speed,"Ring Speed",text,"4,16",16,0x38
param=packetsize,"Packet Size",int,"512,6096,1",4096,0x32
param=netaddress,"Network Address",chars,12,,0x32
param=productid,"Product ID",chars,36,"",0x32
param=microchannel,"",keyonly,,,0x10




;[ms$tcctok]
;devdir= A:tcctok.dos

;device=tcctok.dos,@devdir\tcctok.dos

_______________________________________________________________________
;NT File Section
_______________________________________________________________________

[Source Media Descriptions]
   1  = "Thomas-Conrad Token Ring Drivers Diskette"

[Files-Driver]
   1, tctoknt.sys,  SIZE=30080
   1, eaglecaf.bin, SIZE=26880

[Files-Dll]
   1, tctoknt.dll,  SIZE=9216

;       This ends the WFW portion of the setup.
; -----------------------------------------------------------------------------

[OptListENG]
; -----------------------------------------------------------------------------
; This list supports multiple adapters of a similar type.
; Format is:  tag = option, irqs, selection , name, title, description
; tag          - tag required by script file, it's ignored for all intents...
; option       - an NCPA variable used to drive option selection
; selection    - displayed in 'Add Network Adapter' dialog box
; name         - base name for adapter in the registry
; title        - 'Installed Adapter Cards' item in the NCPA Network dialog box
; description  - 'Description' item in the NCPA Network dialog box
; -----------------------------------------------------------------------------
;  tag    = option,   selection,               name,     title,                       description
;
OptList_2 = tc$4045e, "Thomas-Conrad TC4045/TC4145 Token Ring Adapter",  "TCTOK",  "TC4045/TC4145 Token Ring Adapter", "Thomas-Conrad 16/4Mbps Token Ring Adapter/AT"
OptList_3 = tc$4046e, "Thomas-Conrad TC4046 Token Ring Adapter",  "TCTOK",  "TC4046 Token Ring Adapter", "Thomas-Conrad 16/4Mbps Token Ring Adapter/MC"

[FileConstants]
   ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   ; NOTE: Adapter Adaptation area
   ; TccBaseName - base filename for .sys, .dll files, binding rules
   ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   Manufacturer             = "Thomas-Conrad"
   TccBaseName              = "tctok"
   SoftwareMajorVersion     = "1"
   SoftwareMinorVersion     = "00s1"
   InterruptTextList        = ^(InterruptChoices, 1)
   InterruptValueList       = ^(InterruptChoices, 2)
   IoBaseTextList           = ^(IoBaseChoices, 1)
   IoBaseValueList          = ^(IoBaseChoices, 2)
   DmaChannelTextList       = ^(DmaChannelChoices, 1)
   DmaChannelValueList      = ^(DmaChannelChoices, 2)
   SpeedTextList            = ^(SpeedChoices, 1)
   SpeedValueList           = ^(SpeedChoices, 2)
   SpeedRadioButtonIdxList  = ^(SpeedChoices, 3)
   SlotNumberTextList       = ^(SlotNumberChoices, 1)
   SlotNumberValueList      = ^(SlotNumberChoices, 2)
   ; - - - - - - - - - - - - - - -
   NetEventDLL              = "%SystemRoot%\System32\netevent.dll"
   IoLogMsgDLL              = "%SystemRoot%\System32\IoLogMsg.dll"
   UtilityInf               = "UTILITY.INF"
   SubroutineInf            = "SUBROUTN.INF"
   SoftwareType             = "driver"
   Exit_Code                = 0
   SoftwareVersion          = $(SoftwareMajorVersion)"."$(SoftwareMinorVersion)
   SoftwareImage            = "\SystemRoot\System32\drivers\"$(TccBaseName)"nt.sys"
   NetRuleSoftwareType      = $(TccBaseName)"Sys ndisDriver "$(TccBaseName)"Driver"
   NetRuleSoftwareBindForm  = """"$(TccBaseName)"Sys"" yes no container"
   NetRuleSoftwareBindable  = {""$(TccBaseName)"Driver "$(TccBaseName)"Adapter non exclusive 100"}
   NetRuleSoftwareClass     = {""$(TccBaseName)"Driver basic"}
   NetRuleSoftwareUse       = $(SoftwareType)
   NetRuleHardwareType      = $(TccBaseName)" "$(TccBaseName)"Adapter"
   NetRuleHardwareClass     = {""$(TccBaseName)"Adapter basic"}
   NetRuleHardwareBindForm  = " yes yes container"
   KeyName_SoftwareRoot     = $(!NTN_SoftwareBase)"\"$(Manufacturer)
   KeyName_Software         = $(KeyName_SoftwareRoot)"\"$(TccBaseName)"\CurrentVersion"

[InterruptChoices]
   Interrupt_1  = "2/9",  2
   Interrupt_2  = "3"  ,  3
   Interrupt_4  = "5"  ,  5
   Interrupt_4  = "6"  ,  6
   Interrupt_5  = "7"  ,  7
   Interrupt_6  = "10" , 10
   Interrupt_7  = "11" , 11
   Interrupt_8  = "12" , 12

[IoBaseChoices]
   IoBaseChoice_1 = "1A20", 6688
   IoBaseChoice_2 = "2A20", 10784
   IoBaseChoice_3 = "3A20", 14880
   IoBaseChoice_4 = "3A40", 14912
   IoBaseChoice_5 = "3A60", 14944
   IoBaseChoice_6 = "3A80", 14976
   IoBaseChoice_7 = "3AA0", 15008
   IoBaseChoice_8 = "4AE0", 19168

[DmaChannelChoices]
   DmaChannelChoice_1 = "5",        5
   DmaChannelChoice_2 = "6",        6
   DmaChannelChoice_3 = "7",        7
   DmaChannelChoice_4 = "1",        1
   DmaChannelChoice_5 = "Disabled", 0

[SpeedChoices]
   SpeedChoice_1 = "4 Mbps",   4, 1
   SpeedChoice_2 = "16 Mbps", 16, 2

[SlotNumberChoices]
   SlotNumberChoice_1 = "Slot 1", 1
   SlotNumberChoice_2 = "Slot 2", 2
   SlotNumberChoice_3 = "Slot 3", 3
   SlotNumberChoice_4 = "Slot 4", 4
   SlotNumberChoice_5 = "Slot 5", 5
   SlotNumberChoice_6 = "Slot 6", 6
   SlotNumberChoice_7 = "Slot 7", 7
   SlotNumberChoice_8 = "Slot 8", 8

[FileConstantsENG]
   ProCaption              = "Windows NT Setup"
   ProCancel               = "Cancel"
   ProCancelMsg            = "Your Thomas-Conrad Windows NT Networking "+
                             "Adapter is not correctly installed.  Are "+
                             "you sure you want to cancel copying files?"
   ProCancelCap            = "Network Setup Message"
   ProText1                = "Copying:"
   ProText2                = "To:"
   ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   ; NOTE: Adapter Adaptation area
   ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   ; SoftwareTitle        - Short name, displayed in NCPA dlg box in
   ;                        'Installed Network Software' window
   ; SoftwareDescription  - Long name, Displayed in NCPA dlg box in
   ;                        'Description' window when software selected
   ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   SoftwareTitle              = "TCC Token Ring Driver"
   SoftwareDescription        = "Thomas-Conrad Token Ring Driver"
   ; - - - - - - - - - - - - - - -

[DialogConstantsENG]
   ; - - - - - - - - - - - - - - -
   ; NOTE: Adapter Adaptation area
   ; - - - - - - - - - - - - - - -
   Help                    = "&Help"
   Exit                    = "Cancel"
   OK                      = "OK"
   HelpContext             = ""
   Continue                = "Continue"
   Cancel                  = "C&ancel"
   ; - - - - - - - - - - - - - - -

[Basic4035DlgENG]
   ; - - - - - - - - - - - - - - -
   ; NOTE: Adapter Adaptation area
   ; - - - - - - - - - - - - - - -
   DlgType                 = "RadioCombination"
   DlgTemplate             = "TCCTOK_4035"
   EditFocusOn             = $(!IDC_COMBO1)
   ReInit                  = NO
   Caption                 = ""
   Combo1List              = $(InterruptTextList)
   Combo1Out               = $(InterruptTextDlgDefault)
   Combo2List              = $(IoBaseTextList)
   Combo2Out               = $(IoBaseTextDlgDefault)
   Combo3List              = $(DmaChannelTextList)
   Combo3Out               = $(DmaChannelTextDlgDefault)
   ComboListItemsIn        = {Combo1List,Combo2List,Combo3List}
   ComboListItemsOut       = {Combo1Out,Combo2Out,Combo3Out}
   RadioIn                 = ""
;; since AdvancedDlgENG is using EditText, we can't...
   EditTextIn              = ""
   EditTextLim             = ""
   NotifyFields            = {NO, NO, NO}
   HelpContext             = ""
   ; - - - - - - - - - - - - - - -


[Basic4045DlgENG]
   ; - - - - - - - - - - - - - - -
   ; NOTE: Adapter Adaptation area
   ; - - - - - - - - - - - - - - -
   DlgType                 = "RadioCombination"
   DlgTemplate             = "TCCTOK_4045"
   EditFocusOn             = $(!IDC_COMBO1)
   ReInit                  = NO
   Caption                 = ""
   Combo1List              = $(InterruptTextList)
   Combo1Out               = $(InterruptTextDlgDefault)
   Combo2List              = $(IoBaseTextList)
   Combo2Out               = $(IoBaseTextDlgDefault)
   Combo3List              = $(DmaChannelTextList)
   Combo3Out               = $(DmaChannelTextDlgDefault)
   ComboListItemsIn        = {Combo1List,Combo2List,Combo3List}
   ComboListItemsOut       = {Combo1Out,Combo2Out,Combo3Out}
   RadioIn                 = { $(SpeedIntDlgDefault) }
;; since AdvancedDlgENG is using EditText, we can't...
   EditTextIn              = ""
   EditTextLim             = ""
   NotifyFields            = {NO, NO, NO}
   HelpContext             = ""
   ; - - - - - - - - - - - - - - -

[Basic4046DlgENG]
   ; - - - - - - - - - - - - - - -
   ; NOTE: Adapter Adaptation area
   ; - - - - - - - - - - - - - - -
   DlgType                 = "RadioCombination"
   DlgTemplate             = "TCCTOK_4046"
   EditFocusOn             = $(!IDC_COMBO1)
   ReInit                  = NO
   Caption                 = ""
   Combo1List              = $(SlotNumberTextList)
   Combo1Out               = $(SlotNumberTextDlgDefault)
   ComboListItemsIn        = {Combo1List}
   ComboListItemsOut       = {Combo1Out}
   RadioIn                 = ""
;; since AdvancedDlgENG is using EditText, we can't...
   EditTextIn              = ""
   EditTextLim             = ""
   NotifyFields            = {NO}
   HelpContext             = ""
   ; - - - - - - - - - - - - - - -

[AdvancedDlgENG]
   ; - - - - - - - - - - - - - - -
   ; NOTE: Adapter Adaptation area
   ; - - - - - - - - - - - - - - -
   DlgType                 = "RadioCombination"
   DlgTemplate             = "TCCTOK_ADVANCED"
   EditFocusOn             = $(IDC_EDIT1)
   ReInit                  = NO
   Caption                 = $(FunctionTitle)
;; since Basic4045DlgENG is using ComboList and Radio, we can't...
;; ComboListItemsIn        = ""
;; ComboListItemsOut       = ""
;; RadioIn                 = ""
   EditField1              = $(PacketSizeTextDlgDefault)
   EditField2              = $(NetAddressTextDlgDefault)
   EditField3              = $(ProductIdTextDlgDefault)
   EditTextIn              = { $(EditField1), $(EditField2), $(EditField3) }
   EditTextLim             = { 5, 17 36 }
   NotifyFields            = ""
   HelpContext             = ""
   ; - - - - - - - - - - - - - - -

[Identify]
   ; ----------------------------------------------------------------
   ; Identify ourselves as an NT installation script file
   ; and tell setup about us and our installation diskette
   ; ----------------------------------------------------------------
   set Status          = STATUS_SUCCESSFUL
   set Identifier      = NetAdapter
   set Media           = #("Source Media Descriptions", 1, 1)
   Return $(Status) $(Identifier) $(Media)

[ReturnOptions]
   ; ----------------------------------------------------------------
   ; If we support the requested language, return the NCPA variable
   ; list and its matching text list, so the user can select an
   ; option to process
   ; ----------------------------------------------------------------
   set Status          = STATUS_FAILED
   set OptionList      = {}
   set OptionTextList  = {}
   set LanguageList    = ^(LanguagesSupported, 1)
   Ifcontains(i) $($0) in $(LanguageList)
      ifstr(i) $($1) == ""
         goto ReturnOptions_Set
      endif
      set PlatformList = ^(PlatformsSupported, 1)
      Ifcontains(i) $($1) in $(PlatformList)
         goto ReturnOptions_Set
      else
         set Status = STATUS_NOTSUPPORTED
         goto ReturnOptions_Exit
      endif
   else
      set Status = STATUS_NOLANGUAGE
      goto ReturnOptions_Exit
   endif
ReturnOptions_Set = +
    set OptionList      = ^(OptList$($0), 1)
    set OptionTextList  = ^(OptList$($0), 2)
    set Status          = STATUS_SUCCESSFUL
ReturnOptions_Exit = +
    Return $(Status) $(OptionList) $(OptionTextList)

[LanguagesSupported]
   ENG

[GeneralConstants]
   from                     = ""
   to                       = ""
   ExitCodeOk               = 0
   ExitCodeCancel           = 1
   ExitCodeFatal            = 2
   Key_Null                 = ""
   MAXIMUM_ALLOWED          = 33554432
   RegistryErrorIndex       = NO_ERROR
   Key_Product              = ""
   Key_HardwareParameters   = ""
   TRUE                     = 1
   FALSE                    = 0
   NoTitle                  = 0
   ExitState                = "Active"
   OldVersionExisted        = $(FALSE)
   DriverPath               = $(!STF_NTPATH)\drivers

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

[ProductType]
   STF_PRODUCT  = Winnt
   STF_PLATFORM = I386

[PlatformsSupported]
   ISA
   EISA
   MCA

[Install-Option]
   Debug-Output "$(STF_CONTEXTINFNAME): Entering Install-Option"
   set STF_VITAL = ""
   ifstr(i) $(AddCopy) == "YES"
      set STF_VITAL = "YES"
      AddSectionFilesToCopyList Files-Driver $(SrcDir)nt $(!STF_WINDOWSSYSPATH)\drivers
      AddSectionFilesToCopyList Files-Dll $(SrcDir)nt $(!STF_WINDOWSSYSPATH)
   endif
   ifstr(i) $(DoCopy) == "YES"
      set STF_VITAL = "YES"
      set !STF_NCPA_FLUSH_COPYLIST = TRUE
      CopyFilesInCopyList
   endif
   ifstr(i) $(DoConfig) == "YES"
   endif
   exit

[Install-Update]
   Debug-Output "$(STF_CONTEXTINFNAME): Entering Install-Update"
   set STF_VITAL        = "YES"
   set STF_OVERWRITE    = "VERIFYSOURCEOLDER"
   AddSectionFilesToCopyList Files-Driver $(SrcDir)nt $(!STF_WINDOWSSYSPATH)\drivers
   AddSectionFilesToCopyList Files-Dll $(SrcDir)nt $(!STF_WINDOWSSYSPATH)
   set !STF_NCPA_FLUSH_COPYLIST = TRUE
   CopyFilesInCopyList
   exit

[Remove-Option]
   Debug-Output "$(STF_CONTEXTINFNAME): Entering Remove-Option"
   set RemoveList = {}
   set RemoveList = >($(RemoveList), $(!STF_WINDOWSSYSPATH)"\drivers\"$(TccBaseName)"nt.sys")
   set RemoveList = >($(RemoveList), $(!STF_WINDOWSSYSPATH)"\drivers\eaglecaf.bin")
   set RemoveList = >($(RemoveList), $(!STF_WINDOWSSYSPATH)"\"$(TccBaseName)"nt.dll")
   set RemoveList = >($(RemoveList), $(STF_CONTEXTINFNAME))
   ForListDo $(RemoveList)
      Debug-Output "Removing .$($)."
      LibraryProcedure Status , $(!LIBHANDLE), DelFile $($)
   EndForListDo
   exit

[InstallOption]
;;   set !DebugOutputControl = 1
;;   set !STF_DISPLAYDEBUGOUTPUT = 1
   set TccOption = $($1)
   set SrcDir    = $($2)
   set AddCopy   = $($3)
   set DoCopy    = $($4)
   set DoConfig  = $($5)
   Debug-Output "$(STF_CONTEXTINFNAME): Entering InstallOption"
   Debug-Output "$(STF_CONTEXTINFNAME): STF_CWDIR: .$(!STF_CWDIR)."
   Debug-Output "$(STF_CONTEXTINFNAME): STF_LANGUAGE: .$(!STF_LANGUAGE)."
   Debug-Output "$(STF_CONTEXTINFNAME): !NTN_RegBase .$(!NTN_RegBase)."
   Debug-Output "$(STF_CONTEXTINFNAME): !NTN_SoftwareBase .$(!NTN_SoftwareBase)."
   Debug-Output "$(STF_CONTEXTINFNAME): TccOption: .$(TccOption). SrcDir: .$(SrcDir)."
   Debug-Output "$(STF_CONTEXTINFNAME): AddCopy: .$(AddCopy). DoCopy: .$(DoCopy). DoConfig: .$(DoConfig)."
   set LanguageList = ^(LanguagesSupported, 1)
   Ifcontains(i) $($0) NOT-IN $(LanguageList)
      Return STATUS_NOLANGUAGE
   endif
   set-subst LF = "\n"
   ; ----------------------------------------------------------------
   ; Pick up the general constants and file constants
   ; ----------------------------------------------------------------
   read-syms GeneralConstants
   read-syms FileConstants
   ; ----------------------------------------------------------------
   ; Pick up the variables for this option (as selected by user)
   ; These would normally reside in FileConstants, but there's no
   ; dynamic selection mechanism supported in a read-syms section.
   ; ----------------------------------------------------------------
   set OptionNameList           = ^(OptList$(!STF_LANGUAGE), 1 )
   set OptionHdwrNameList       = ^(OptList$(!STF_LANGUAGE), 3 )
   set OptionHdwrTitleList      = ^(OptList$(!STF_LANGUAGE), 4 )
   set OptionHdwrDescList       = ^(OptList$(!STF_LANGUAGE), 5 )
   set ProductHdwrName          = *($(OptionHdwrNameList),+
                                  ~($(OptionNameList), $(TccOption)))
   set ProductHdwrTitle         = *($(OptionHdwrTitleList),+
                                  ~($(OptionNameList), $(TccOption)))
   set ProductHdwrDesc          = *($(OptionHdwrDescList),+
                                  ~($(OptionNameList), $(TccOption)))
   Debug-Output "$(STF_CONTEXTINFNAME): ProductHdwrName .$(ProductHdwrName)."
   Debug-Output "$(STF_CONTEXTINFNAME): ProductHdwrTitle .$(ProductHdwrTitle)."
   Debug-Output "$(STF_CONTEXTINFNAME): ProductHdwrDesc .$(ProductHdwrDesc)."
   read-syms DialogConstants$(!STF_LANGUAGE)
   ifstr(i) $(!NTN_Origination) == "NCPA"
      set Continue = "OK"
   endif
   read-syms FileConstants$(!STF_LANGUAGE)
   detect date
   set-title $(FunctionTitle)
   set to   = InstallOptionDispatch
   set from = InstallOptionDispatch
   set CommonStatus = STATUS_SUCCESSFUL
   EndWait

InstallOptionDispatch = +
   Debug-Output "$(STF_CONTEXTINFNAME): Entering InstallOptionDispatch"
   ; ----------------------------------------------------------------
   ; Figure out which label we need to dispatch to and
   ; what our error recovery 'features' will be
   ; ----------------------------------------------------------------
   Ifstr(i) $(!NTN_InstallMode) == deinstall
      set StartLabel = RemoveAdapterFromRegistry
   else-Ifstr(i) $(!NTN_InstallMode) == Update
      set StartLabel = UpgradeSoftware
   else-Ifstr(i) $(!NTN_InstallMode) == bind
      set StartLabel = CheckAdapterBinding
   else-Ifstr(i) $(!NTN_InstallMode) == configure
      set StartLabel = GetAdapterConfigFromRegistry
      ; ----------------------------------------------------------------
      ; We're going to configure, disallow configuring the driver
      ; ----------------------------------------------------------------
      Ifstr(i) $(KeyName_Software) == $(!NTN_RegBase)
         Debug-Output "$(STF_CONTEXTINFNAME): Cannot configure driver software."
         Shell $(UtilityInf), RegistryErrorString, CANNOT_CONFIGURE_SOFTWARE
         ifint $($ShellCode) != $(!SHELL_CODE_OK)
            set ShellErrorSection = UtilityInf:RegistryErrorString
            goto ShellCodeError
         endif
         set Error = $($R0)
         set from = InstallOptionExit
         set to = InstallOptionExit
         goto SetNonFatalInfo
      endif
   else
      set StartLabel = TestForExistingInstallation
      set OEM_ABANDON_OPTIONS = {}
      set OEM_ABANDON_SOFTWARE = FALSE
      set OEM_ABANDON_ON = TRUE
   endif
   ; ----------------------------------------------------------------
   ; Establish defaults for all configurable values
   ; ----------------------------------------------------------------
   ; - - - - - - - - - - - - - - -
   ; NOTE: Adapter Adaptation area
   ; - - - - - - - - - - - - - - -
   set AdapterTypeValue       = 1
   set DmaChannelValue        = *( $(DmaChannelValueList), 1 )
   set InterruptValue         = *( $(InterruptValueList), 1 )
   set IoBaseValue            = *( $(IoBaseValueList), 1 )
   set McaPosIdValue          = 81
   set NetAddressValue        = ""
   set PacketSizeValue        = 16384
   set ProductIdValue         = ""
   set SlotNumberValue        = *( $(SlotNumberValueList), 1 )
   set SpeedValue             = *( $(SpeedValueList), 2 )
   ; - - - - - - - - - - - - - - -
   ; ----------------------------------------------------------------
   ; Set the from/to labels vars for error cases, and dispatch...
   ; ----------------------------------------------------------------
   set from                   = $(FatalError)
   set to                     = $(FatalError)
   goto $(StartLabel)

TestForExistingInstallation = +
   ; ----------------------------------------------------------------
   ; Test the registry for an existing installation.
   ; ----------------------------------------------------------------
   ; Try to open the registry key for the driver so we can determine
   ; if a driver and adapter card are already installed.
   ; ----------------------------------------------------------------
   set OldVersionExisted = $(FALSE)
   Debug-Output "$(STF_CONTEXTINFNAME): Entering TestForExistingInstallation"
   OpenRegKey $(!REG_H_LOCAL) "" $(KeyName_Software) $(MAXIMUM_ALLOWED) Key_Product
   Ifstr $(Key_Product) != $(Key_Null)
      CloseRegKey $(Key_Product)
      ; ----------------------------------------------------------------
      ; Disallow multiple installs of the driver
      ; ----------------------------------------------------------------
      ifstr(i) $(!NTN_RegBase) == $(KeyName_Software)
         Shell $(UtilityInf), VerExistedDlg, $(SoftwareTitle), $(SoftwareVersion)
         ifint $($ShellCode) != $(!SHELL_CODE_OK)
            set ShellErrorSection = UtilityInf:VerExistedDlg
            goto ShellCodeError
         endif
         goto end
      else
         ; ----------------------------------------------------------------
         ; Allow multiple installs of the netcard (with a warning)
         ; ----------------------------------------------------------------
         Shell $(UtilityInf), CardExistedDlg
         ifint $($ShellCode) != $(!SHELL_CODE_OK)
            set ShellErrorSection = UtilityInf:CardExistedDlg
            goto ShellCodeError
         endif
         ifstr(i) $($R1) == "OK"
            set OldVersionExisted = $(TRUE)
         else
            goto InstallOptionExit
         endif
      endif
   endif

CopyAdapterFiles = +
   ; ----------------------------------------------------------------
   ; Copy the adapter files from the diskette.
   ; ----------------------------------------------------------------
   ; If we're already installed and it's configure mode, skip this
   ; and go get the configuration from the user.
   ; If we're not installed and it's install mode, and copy mode
   ; is set, ask the user for the install diskette, then install the
   ; option section (which has the .sys, .dll files enumerated).
   ; Our OEMSETNT.INF file has already been copied to the system
   ; directory and renamed to OEMNADx.inf.
   ; ----------------------------------------------------------------
   Debug-Output "$(STF_CONTEXTINFNAME): Entering CopyAdapterFiles"
   ifint $(OldVersionExisted) == $(TRUE)
      ifstr(i) $(!NTN_InstallMode) == configure
         goto GetAdapterConfigFromUser
      endif
   endif
   StartWait
   ifint $(OldVersionExisted) == $(FALSE)
      ifstr(i) $(!NTN_InstallMode) == "install"
         Ifstr(i) $(DoCopy) == "YES"
            Shell $(UtilityInf), DoAskSource, $(!STF_CWDDIR), $(SrcDir) YES
            Ifint $($ShellCode) != $(!SHELL_CODE_OK)
               set ShellErrorSection = UtilityInf:DoAskSource
               Goto ShellCodeError
            Else-Ifstr(i) $($R0) == STATUS_FAILED
               Shell $(UtilityInf) RegistryErrorString "ASK_SOURCE_FAIL"
               ifint $($ShellCode) != $(!SHELL_CODE_OK)
                  set ShellErrorSection = UtilityInf:RegistryErrorString
                  goto ShellCodeError
               endif
               set Error = $($R0)
               Goto FatalError
            Else-Ifstr(i) $($R0) == STATUS_USERCANCEL
               Goto ProcessSuccessExit
            Endif
            Set SrcDir = $($R1)
         Endif
         install "Install-Option"
         ifstr(i) $(STF_INSTALL_OUTCOME) != STF_SUCCESS
            Shell $(UtilityInf) RegistryErrorString "UNABLE_COPY_FILE"
            ifint $($ShellCode) != $(!SHELL_CODE_OK)
               set ShellErrorSection = UtilityInf:RegistryErrorString
               goto ShellCodeError
            endif
            set Error = $($R0)
            goto FatalError
         endif
      endif
   endif

GetAdapterConfigFromRegistry = +
   ; ----------------------------------------------------------------
   ; Get the existing adapter's configuration from the registry
   ; ----------------------------------------------------------------
   ; If we're install mode, there's no existing configuration, so
   ; skip this and go ask the user for the configuration
   ; ----------------------------------------------------------------
   Debug-Output "$(STF_CONTEXTINFNAME): Entering GetAdapterConfigFromRegistry"
   ifstr(i) $(!NTN_InstallMode) == "install"
      goto GetAdapterConfigFromUser
   else
      ; ----------------------------------------------------------------
      ; Ensure that we have an open product key
      ; ----------------------------------------------------------------
      Ifstr $(Key_Product) == $(Key_Null)
         OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_RegBase) $(MAXIMUM_ALLOWED) Key_Product
         Ifstr $(Key_Product) == $(Key_Null)
            set RegistryErrorIndex = CANNOT_FIND_COMPONENT_SERVICE
            Debug-Output $(STF_CONTEXTINFNAME)": Cannot find component product key"
            goto FatalRegistryError
         Endif
      Endif
      ; ----------------------------------------------------------------
      ; Find our netcard service key and open it
      ; ----------------------------------------------------------------
      Shell $(UtilityInf) FindService, $(Key_Product)
      Ifint $($ShellCode) != $(!SHELL_CODE_OK)
         set ShellErrorSection = UtilityInf:FindService
         Goto ShellCodeError
      Endif
      Ifstr(i) $($R0) != NO_ERROR
         Debug-Output "$(STF_CONTEXTINFNAME): Utility:FindService error: $($R0)"
         Goto FatalRegistryError
      endif
      set Key_HardwareParameters = $($R2)
      ; ----------------------------------------------------------------
      ; Close the service key and open our netcard parameters key
      ; ----------------------------------------------------------------
      CloseRegKey $($R1)
      Ifstr $(Key_HardwareParameters) == $(Key_Null)
         set RegistryErrorIndex = CANNOT_FIND_COMPONENT_SERVICE
         Debug-Output $(STF_CONTEXTINFNAME)": Cannot find component service"
         goto FatalRegistryError
      endif
      set OldVersionExisted = $(TRUE)
      set ValueName = ""
      set ValueData = ""
      set ValueStr  = ""
      set ValueList = {}
      ; ----------------------------------------------------------------
      ; Walk the hardware service parameters value list and pick up
      ; (and save off) any values we're interested in.
      ; ----------------------------------------------------------------
      EnumRegValue $(Key_HardwareParameters) ValueList
      ForListDo $(ValueList)
         set ValueItem = $($)
         set ValueName = *($(ValueItem),1)
         set ValueData = *($(ValueItem),4)
         ; - - - - - - - - - - - - - - -
         ; NOTE: Adapter Adaptation area
         ; - - - - - - - - - - - - - - -
         Ifstr(i) $(ValueName) == "AdapterType"
            set AdapterTypeValue = $(ValueData)
         else-Ifstr(i) $(ValueName) == "DmaChannel"
            set DmaChannelValue  = $(ValueData)
         else-Ifstr(i) $(ValueName) == "Interrupt"
            set InterruptValue  = $(ValueData)
         else-Ifstr(i) $(ValueName) == "IoBase"
            set IoBaseValue  = $(ValueData)
         else-Ifstr(i) $(ValueName) == "NetAddress"
            set NetAddressValue  = $(ValueData)
         else-Ifstr(i) $(ValueName) == "PacketSize"
            set PacketSizeValue  = $(ValueData)
         else-Ifstr(i) $(ValueName) == "ProductId"
            set ProductIdValue  = $(ValueData)
         else-Ifstr(i) $(ValueName) == "Speed"
            set SpeedValue  = $(ValueData)
         else-Ifstr(i) $(ValueName) == "SlotNumber"
            set SlotNumberValue  = $(ValueData)
         endif
         ; - - - - - - - - - - - - - - -
         Debug-Output "$(STF_CONTEXTINFNAME): $(ValueName) == .$(ValueData)."
      EndForListDo
   Endif

GetAdapterConfigFromUser = +
   ; ----------------------------------------------------------------
   ; Get/Confirm the adapter's configuration from/with the user
   ; ----------------------------------------------------------------
   ; Load our DLL so we can get to our dialog box, then render the
   ; current configurable values (that have been previously been set
   ; to defaults or have had registry info plugged in) into textual
   ; defaults for the dialog box
   ; ----------------------------------------------------------------
   Debug-Output "$(STF_CONTEXTINFNAME): Entering GetAdapterConfigFromUser"
   LoadLibrary $(Media) $(!STF_WINDOWSSYSPATH)\$(TccBaseName)nt.dll hLib
   set from = GetAdapterConfigFromUser
GetAdpCfgFromUserOuterLoop = +
   Debug-Output "$(STF_CONTEXTINFNAME): Entering Basic..."
   ; - - - - - - - - - - - - - - -
   ; NOTE: Adapter Adaptation area
   ; - - - - - - - - - - - - - - -
   set InterruptTextDlgDefault   = *($(InterruptTextList),+
                                   ~($(InterruptValueList), +
                                     $(InterruptValue)))
   set IoBaseTextDlgDefault      = *($(IoBaseTextList),+
                                   ~($(IoBaseValueList), +
                                     $(IoBaseValue)))
   set DmaChannelTextDlgDefault  = *($(DmaChannelTextList),+
                                   ~($(DmaChannelValueList), +
                                     $(DmaChannelValue)))
   set SlotNumberTextDlgDefault  = *($(SlotNumberTextList),+
                                   ~($(SlotNumberValueList), +
                                     $(SlotNumberValue)))
   set SpeedIntDlgDefault        = *($(SpeedRadioButtonIdxList),+
                                   ~($(SpeedValueList), +
                                    $(SpeedValue)))
   ; ----------------------------------------------------------------
   ; Get the dialog strings for the appropriate dialog box,
   ; and ask the user for the configuration.
   ; ----------------------------------------------------------------
   ifstr(i) $(TccOption) == "tc$4035e"
      read-syms Basic4035Dlg$(!STF_LANGUAGE)
   else-ifstr(i) $(TccOption) == "tc$4045e"
         read-syms Basic4045Dlg$(!STF_LANGUAGE)
      else
         read-syms Basic4046Dlg$(!STF_LANGUAGE)
      endif
   endif
   ui start "InputDlg" $(hLib)
   ifstr(i) $(DLGEVENT) == "CONTINUE"
      ; ----------------------------------------------------------------
      ; The user accepted, render the returned textual values back into
      ; actual values.  For ISA, it's Interrupt, IoBase, and DmaChannel,
      ; Slot will end up being zero.  For MCA, we're only interested
      ; in Slot, so Interrupt, IoBase, and DmaChannel will end up zero.
      ; ----------------------------------------------------------------
      set InterruptValue  = *($(InterruptValueList),+
                            ~($(InterruptTextList),+
                             $(Combo1Out)))
      set IoBaseValue     = *($(IoBaseValueList),+
                            ~($(IoBaseTextList),+
                             $(Combo2Out)))
      set DmaChannelValue = *($(DmaChannelValueList),+
                            ~($(DmaChannelTextList),+
                             $(Combo3Out)))
      set SlotNumberValue = *($(SlotNumberValueList),+
                            ~($(SlotNumberTextList),+
                              $(Combo1Out)))
      set SpeedValue      = *($(SpeedValueList),+
                            ~($(SpeedRadioButtonIdxList),+
                            *($(RadioOut),1)))
      Debug-Output "$(STF_CONTEXTINFNAME): User Accepted Basic configuration as follows:"
      Debug-Output "$(STF_CONTEXTINFNAME): InterruptValue   == .$(InterruptValue)."
      Debug-Output "$(STF_CONTEXTINFNAME): IoBaseValue      == .$(IoBaseValue)."
      Debug-Output "$(STF_CONTEXTINFNAME): DmaChannelValue  == .$(DmaChannelValue)."
      Debug-Output "$(STF_CONTEXTINFNAME): SlotNumberValue  == .$(SlotNumberValue)."
      Debug-Output "$(STF_CONTEXTINFNAME): SpeedValue       == .$(SpeedValue)."
      ; - - - - - - - - - - - - - - -
      ui pop 1
      FreeLibrary $(hLib)

   else-ifstr(i) $(DLGEVENT) == "EXIT"
GetAdapterAdvancedConfigFromUser = +
      ; ----------------------------------------------------------------
      ; This is a Klooge.  We're using the control ID for exit to get to
      ; the advanced menu, but it beats rolling our own dialog code, eh?
      ; ----------------------------------------------------------------
      Debug-Output "$(STF_CONTEXTINFNAME): Entering Advanced..."
      set PacketSizeTextDlgDefault  = $(PacketSizeValue)
      set NetAddressTextDlgDefault  = $(NetAddressValue)
      set ProductIdTextDlgDefault   = $(ProductIdValue)
      read-syms AdvancedDlg$(!STF_LANGUAGE)
      ui start "AdvancedDlg" $(hLib)
      ifstr(i) $(DLGEVENT) == "CONTINUE"
         set PacketSizeValue  = *($(EditTextOut),1)
         set NetAddressValue  = *($(EditTextOut),2)
         set ProductIdValue   = *($(EditTextOut),3)
         Debug-Output "$(STF_CONTEXTINFNAME): User accepted Advanced configuration as follows:"
         Debug-Output "$(STF_CONTEXTINFNAME): PacketSizeValue == .$(PacketSizeValue)."
         Debug-Output "$(STF_CONTEXTINFNAME): NetAddressValue == .$(NetAddressValue)."
         Debug-Output "$(STF_CONTEXTINFNAME): ProductIdValue  == .$(ProductIdValue)."
      endif
      ; ----------------------------------------------------------------
      ; Done with advanced, remove our dialog and go back to the
      ; earlier one (mca or isa, as appropriate)
      ; ----------------------------------------------------------------
      ui pop 1
      goto GetAdpCfgFromUserOuterLoop

   else-ifstr(i) $(DLGEVENT) == "CANCEL"
      ; ----------------------------------------------------------------
      ; The user cancelled, exit
      ; ----------------------------------------------------------------
      Debug-Output "$(STF_CONTEXTINFNAME): Dialog DLGEVENT = .$(DLGEVENT).  Bye."
      set CommonStatus = STATUS_USERCANCEL
      ui pop 1
      FreeLibrary $(hLib)
      goto InstallOptionExit

   else
      ; ----------------------------------------------------------------
      ; The user did something we can't understand, exit
      ; ----------------------------------------------------------------
      Debug-Output "$(STF_CONTEXTINFNAME): Dialog DLGEVENT = .$(DLGEVENT).  Bye."
      ui pop 1
      FreeLibrary $(hLib)
      goto InstallOptionExit

   endif

AddAdapterSoftwareToRegistry = +
   ; ----------------------------------------------------------------
   ; Add Adapter Software (Driver) information to the registry
   ; ----------------------------------------------------------------
   Ifstr(i) $(!NTN_InstallMode) == configure
      goto AddAdapterConfigurationToRegistry
   Endif
   ifint $(OldVersionExisted) == $(TRUE)
      goto AddAdapterHardwareToRegistry
   Endif
   ; ----------------------------------------------------------------
   ; Add the Software Component (driver) to the registry.
   ; This will create keys and values as follows:
   ;
   ; \SOFTWARE\$(Manufacturer)\$(TccBaseName)\CurrentVersion
   ; \SOFTWARE\$(Manufacturer)\$(TccBaseName)\CurrentVersion:RefCount
   ; \SOFTWARE\$(Manufacturer)\$(TccBaseName)\CurrentVersion:ServiceName
   ; \SOFTWARE\$(Manufacturer)\$(TccBaseName)\CurrentVersion\NetRules
   ; \SYSTEM\CurrentControlSet\$(TccBaseName)
   ; \SYSTEM\CurrentControlSet\$(TccBaseName):DisplayName
   ; \SYSTEM\CurrentControlSet\$(TccBaseName):ErrorControl
   ; \SYSTEM\CurrentControlSet\$(TccBaseName):Group
   ; \SYSTEM\CurrentControlSet\$(TccBaseName):ImagePath
   ; \SYSTEM\CurrentControlSet\$(TccBaseName):Start
   ; \SYSTEM\CurrentControlSet\$(TccBaseName):Type
   ; \SYSTEM\CurrentControlSet\$(TccBaseName)\Linkage
   ; \SYSTEM\CurrentControlSet\$(TccBaseName)\Linkage\Disabled
   ; \SYSTEM\CurrentControlSet\$(TccBaseName)\Parameters
   ; \SYSTEM\CurrentControlSet\$(TccBaseName)\Security
   ; \SYSTEM\CurrentControlSet\$(TccBaseName)\Security:Security
   ; ----------------------------------------------------------------
   Shell $(UtilityInf), +
         AddSoftwareComponent, +
         $(Manufacturer), +
         $(TccBaseName), +
         $(TccBaseName), +
         $(SoftwareTitle), +
         $(STF_CONTEXTINFNAME), +
         $(SoftwareImage), +
         "kernel", "NDIS", {}, "",+
         $(NetEventDLL)
   Set OEM_ABANDON_SOFTWARE = TRUE
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      set ShellErrorSection = UtilityInf:AddSoftwareComponent
      goto ShellCodeError
   endif
   set RegistryErrorIndex = $($R0)
   Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
      EndWait
      Debug-Output $(STF_CONTEXTINFNAME)": AddAdapterSoftware - add component error"
      CloseRegKey $($R1)
      CloseRegKey $($R2)
      CloseRegKey $($R3)
      CloseRegKey $($R4)
      CloseRegKey $($R5)
      goto FatalRegistryError
   endif
   ; ----------------------------------------------------------------
   ; Save the keys we'll use later and close the unused ones
   ; ----------------------------------------------------------------
   Set Key_SoftwareProduct    = $($R1)
   Set Key_SoftwareNetRules   = $($R2)
   CloseRegKey $($R3)
   CloseRegKey $($R4)
   CloseRegKey $($R5)
   ; ----------------------------------------------------------------
   ; Add the Software Product Information values to the registry key
   ; \SOFTWARE\$(Manufacturer)\$(TccBaseName)\CurrentVersion
   ; ----------------------------------------------------------------
   set NewValueList = {+
       {SoftwareType, $(NoTitle), $(!REG_VT_SZ),    $(SoftwareType)},+
       {MajorVersion, $(NoTitle), $(!REG_VT_DWORD), $(SoftwareMajorVersion)},+
       {MinorVersion, $(NoTitle), $(!REG_VT_DWORD), $(SoftwareMinorVersion)},+
       {Title,        $(NoTitle), $(!REG_VT_SZ),    $(SoftwareTitle)},+
       {Description,  $(NoTitle), $(!REG_VT_SZ),    $(SoftwareDescription)},+
       {ServiceName,  $(NoTitle), $(!REG_VT_SZ),    $(TccBaseName)},+
       {InstallDate,  $(NoTitle), $(!REG_VT_DWORD), *($(Now),1)}+
       }
   Shell  $(UtilityInf), AddValueList, $(Key_SoftwareProduct), $(NewValueList)
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      set ShellErrorSection = UtilityInf:AddValueList
      goto ShellCodeError
   endif
   Set RegistryErrorIndex = $($R0)
   Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
      EndWait
      Debug-Output $(STF_CONTEXTINFNAME)": AddAdapterSoftware - add value list error"
      CloseRegKey $(Key_SoftwareProduct)
      CloseRegKey $(Key_SoftwareNetRules)
      goto FatalRegistryError
   endif
   ; ----------------------------------------------------------------
   ; Add the Software Product Net Rules values to the registry key
   ; \SOFTWARE\$(Manufacturer)\$(TccBaseName)\CurrentVersion\NetRules
   ; ----------------------------------------------------------------
   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),       $(TccOption)}+
       }
   Shell  $(UtilityInf), AddValueList, $(Key_SoftwareNetRules), $(NewValueList)
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      set ShellErrorSection = UtilityInf:AddValueList
      goto ShellCodeError
   endif
   Set RegistryErrorIndex = $($R0)
   CloseRegKey $(Key_SoftwareProduct)
   CloseRegKey $(Key_SoftwareNetRules)
   Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
      EndWait
      Debug-Output $(STF_CONTEXTINFNAME)": AddAdapterSoftware - add NetRule error"
      goto FatalRegistryError
   endif

AddAdapterHardwareToRegistry = +
   ; ----------------------------------------------------------------
   ; Add the Hardware Component (net card) the registry
   ; This will create keys and values as follows:
   ;
   ; \SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\...
   ;     ...\$(AdapterNumber)
   ;     ...\$(AdapterNumber)\NetRules
   ; \SYSTEM\CurrentControlSet\Services\...
   ;     ...\$(ProductHdwrName)$(AdapterNumber)
   ;     ...\$(ProductHdwrName)$(AdapterNumber)\Linkage
   ;     ...\$(ProductHdwrName)$(AdapterNumber)\Linkage\Disabled
   ; ----------------------------------------------------------------
   Shell $(UtilityInf), +
         AddHardwareComponent, +
         $(ProductHdwrName), +
         $(STF_CONTEXTINFNAME), +
         $(KeyName_Software)
   ifint $($R4) != -1
      Set OEM_ABANDON_OPTIONS = >($(OEM_ABANDON_OPTIONS), $(!NTN_SoftwareBase)"\Microsoft\Windows NT\CurrentVersion\NetworkCards\"$($R4))
   endif
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      set ShellErrorSection = UtilityInf:AddHardwareComponent
      goto ShellCodeError
   endif
   set RegistryErrorIndex = $($R0)
   Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
      EndWait
      Debug-Output $(STF_CONTEXTINFNAME)": AddAdapterHardware - add component error"
      CloseRegKey $($R1)
      CloseRegKey $($R2)
      CloseRegKey $($R3)
      goto FatalRegistryError
   endif
   set Key_HardwareNetRules   = $($R2)
   set Key_HardwareParameters = $($R3)
   set AdapterNumber          = $($R4)
   ; ----------------------------------------------------------------
   ; Add the Hardware Product Information to the registry key
   ; \SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\...
   ;     ...\$(AdapterNumber)
   ; ----------------------------------------------------------------
   set NewValueList = {+
       {Manufacturer, $(NoTitle), $(!REG_VT_SZ),    $(Manufacturer)},+
       {Title,        $(NoTitle), $(!REG_VT_SZ),    "["$($R4)"] "$(ProductHdwrTitle)},+
       {Description,  $(NoTitle), $(!REG_VT_SZ),    $(ProductHdwrDesc)},+
       {ProductName,  $(NoTitle), $(!REG_VT_SZ),    $(ProductHdwrName)},+
       {ServiceName,  $(NoTitle), $(!REG_VT_SZ),    $($R5)},+
       {InstallDate,  $(NoTitle), $(!REG_VT_DWORD), *($(Now),1)}+
       }
   Shell $(UtilityInf), AddValueList, $($R1),  $(NewValueList)
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      set ShellErrorSection = UtilityInf:AddValueList
      goto ShellCodeError
   endif
   CloseRegKey $($R1)
   set TempProdName = """"$(ProductHdwrName)$(AdapterNumber)""""
   set TempBindForm = $(TempProdName)$(NetRuleHardwareBindForm)
   ; ----------------------------------------------------------------
   ; Add the Hardware Net Rules to the registry key
   ; \SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\...
   ;     ...\$(AdapterNumber)\NetRules
   ; ----------------------------------------------------------------
   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),       $(TccOption)}+
       }
   Shell  $(UtilityInf), AddValueList, $(Key_HardwareNetRules), $(NewValueList)
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      set ShellErrorSection = UtilityInf:AddValueList
      goto ShellCodeError
   endif
   set RegistryErrorIndex = $($R0)
   Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
      EndWait
      Debug-Output $(STF_CONTEXTINFNAME)": AddAdapterHardware - add NetRule error"
      CloseRegKey $(Key_HardwareParameters)
      CloseRegKey $(Key_HardwareNetRules)
      goto FatalRegistryError
   endif
   CloseRegKey $(Key_HardwareNetRules)
   goto AddAdapterConfigurationToRegistry

AddAdapterConfigurationToRegistry = +
   Debug-Output "$(STF_CONTEXTINFNAME): Entering AddAdapterConfigurationToRegistry"
   Shell $(UtilityInf), GetBusTypeNum
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      set ShellErrorSection = UtilityInf:GetBusTypeNum
      goto ShellCodeError
   endif
   set BusTypeValue = $($R1)
   ; ----------------------------------------------------------------
   ; Add the Hardware configuration information to the registry key
   ; \SYSTEM\CurrentControlSet\Services\$(ProductHdwrName)$(AdapterNumber)
   ; ----------------------------------------------------------------
   ; - - - - - - - - - - - - - - -
   ; NOTE: Adapter Adaptation area
   ; - - - - - - - - - - - - - - -
   ifstr(i) $(TccOption) == "tc$4046e"
      set NewValueList = {+
          {AdapterType,    $(NoTitle), $(!REG_VT_DWORD), $(AdapterTypeValue)},+
          {BusType,        $(NoTitle), $(!REG_VT_DWORD), 3},+
          {BusNumber,      $(NoTitle), $(!REG_VT_DWORD), 0},+
          {MediaType,      $(NoTitle), $(!REG_VT_DWORD), 2},+
          {McaPosId,       $(NoTitle), $(!REG_VT_DWORD), $(McaPosIdValue)},+
          {NetAddress,     $(NoTitle), $(!REG_VT_SZ),    $(NetAddressValue)},+
          {PacketSize,     $(NoTitle), $(!REG_VT_DWORD), $(PacketSizeValue)},+
          {ProductId,      $(NoTitle), $(!REG_VT_SZ),    $(ProductIdValue)},+
          {SlotNumber,     $(NoTitle), $(!REG_VT_DWORD), $(SlotNumberValue)},+
          {Speed,          $(NoTitle), $(!REG_VT_DWORD), $(SpeedValue)}+
          }
   else
      set NewValueList = {+
          {AdapterType,    $(NoTitle), $(!REG_VT_DWORD), $(AdapterTypeValue)},+
          {BusType,        $(NoTitle), $(!REG_VT_DWORD), 1},+
          {BusNumber,      $(NoTitle), $(!REG_VT_DWORD), 0},+
          {MediaType,      $(NoTitle), $(!REG_VT_DWORD), 2},+
          {DmaChannel,     $(NoTitle), $(!REG_VT_DWORD), $(DmaChannelValue)},+
          {Interrupt,      $(NoTitle), $(!REG_VT_DWORD), $(InterruptValue)},+
          {IoBase,         $(NoTitle), $(!REG_VT_DWORD), $(IoBaseValue)},+
          {NetAddress,     $(NoTitle), $(!REG_VT_SZ),    $(NetAddressValue)},+
          {PacketSize,     $(NoTitle), $(!REG_VT_DWORD), $(PacketSizeValue)},+
          {ProductId,      $(NoTitle), $(!REG_VT_SZ),    $(ProductIdValue)},+
          {Speed,          $(NoTitle), $(!REG_VT_DWORD), $(SpeedValue)}+
          }
   endif
   ; - - - - - - - - - - - - - - -
   Shell  $(UtilityInf), AddValueList, $(Key_HardwareParameters), $(NewValueList)
   CloseRegKey $(Key_HardwareParameters)
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      set ShellErrorSection = UtilityInf:AddValueList
      goto ShellCodeError
   endif
   set RegistryErrorIndex = $($R0)
   Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
      Debug-Output $(STF_CONTEXTINFNAME)": AddAdapterConfiguration - add value list error"
      goto FatalRegistryError
   endif
   EndWait
   goto ProcessSuccessExit

CheckAdapterBinding =+
   Debug-Output "$(STF_CONTEXTINFNAME): Entering CheckAdapterBinding"
   set Error = "CheckAdapterBinding: not required for this adapter"
   goto FatalError

RemoveAdapterFromRegistry = +
   ; ----------------------------------------------------------------
   ; Remove the adapter by removing the hardware component.
   ; ----------------------------------------------------------------
   ; When the registry reference count reaches zero, the software
   ; component will automatically be removed.  If the last adapter
   ; is being removed from the registry, delete the associated
   ; file as well.  Lastly, remove the \SOFTWARE\$(Manufacturer) key
   ; if it's empty.
   ; ----------------------------------------------------------------
   Debug-Output "$(STF_CONTEXTINFNAME): Entering RemoveAdapterFromRegistry"
   OpenRegKey $(!REG_H_LOCAL) "" $(KeyName_Software) $(MAXIMUM_ALLOWED) KeyToReferenceCount
   Ifstr $(KeyToReferenceCount) == ""
      Debug-Output "$(STF_CONTEXTINFNAME): Could not open Software Base Key"
      set RefCountBeforeRemove = 2
      goto InstallOptionExit
   endif
   GetRegValue $(KeyToReferenceCount),"RefCount", RefCountInfo
   set RefCountBeforeRemove = *($(RefCountInfo), 4)
   CloseRegKey $(KeyToReferenceCount)
   Debug-Output "$(STF_CONTEXTINFNAME): Removing Hardware Component"
   Shell $(UtilityInf), +
         RemoveHardwareComponent, +
         $(Manufacturer), +
         $(TccBaseName), +
         $(!NTN_RegBase)
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      set ShellErrorSection = UtilityInf:RemoveHardwareComponent
      goto ShellCodeError
   endif
   Ifstr(i) $($R0) != NO_ERROR
      Ifstr(i) $($R0) != REF_COUNT_NOT_ZERO
         goto FatalRegistryError
      endif
   endif
   ifint $(RefCountBeforeRemove) == 1
      OpenRegKey $(!REG_H_LOCAL) "" $(KeyName_SoftwareRoot) $(MAXIMUM_ALLOWED) Key_SoftwareRoot
      EnumRegKey $(Key_SoftwareRoot) KeyList
      EnumRegValue $(Key_SoftwareRoot) ValueList
      CloseRegKey $(Key_SoftwareRoot)
      ifstr $(KeyList) == "{}"
         ifstr $(ValueList) == "{}"
            OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_SoftwareBase) $(MAXIMUM_ALLOWED) Key_SoftwareBase
            Debug-Output "$(STF_CONTEXTINFNAME): Deleting Registry Key .$(Key_SoftwareBase).\.$(Manufacturer)."
            DeleteRegKey $(Key_SoftwareBase) $(Manufacturer)
            CloseRegKey $(Key_SoftwareBase)
         endif
      endif
      install Remove-Option
   endif
   goto InstallOptionExit

UpgradeSoftware = +
   Debug-Output "$(STF_CONTEXTINFNAME): Entering UpgradeSoftware"
   ifstr(i) $(KeyName_Software) == $(!NTN_RegBase)
      OpenRegKey $(!REG_H_LOCAL) "" $(KeyName_Software) $(MAXIMUM_ALLOWED) Key_Product
      Ifstr $(Key_Product) != $(Key_Null)
         GetRegValue $(Key_Product),"MajorVersion", VersionInfo
         set Version = *($(VersionInfo), 4)
         Shell $(UtilityInf), GetInfFileNameFromRegistry, $(Key_Product)
         ifint $($ShellCode) != $(!SHELL_CODE_OK)
            set ShellErrorSection = UtilityInf:GetFileNameFromRegistry
            goto ShellCodeError
         endif
         set !UG_Filename = $($R0)
         ifstr(i) $(!UG_Filename) != ""
            install "Install-Update"
            ifstr(i) $(STF_INSTALL_OUTCOME) != STF_SUCCESS
               goto FatalError
            endif
         endif
         SetRegValue $(Key_Product) {MajorVersion, $(NoTitle), $(!REG_VT_SZ), $(SoftwareMajorVersion)}
         SetRegValue $(Key_Product) {MinorVersion, $(NoTitle), $(!REG_VT_SZ), $(SoftwareMinorVersion)}
         ifint $(Version) != $(SoftwareVersion)
            Debug-Output "$(STF_CONTEXTINFNAME): Version .$(Version). != SoftwareVersion .$(SoftwareVersion)."
         endif
         CloseRegKey $(Key_Product)
      else
         goto FatalRegistryError
      endif
   else
      OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_RegBase) $(MAXIMUM_ALLOWED) NetworkCardKey
      Ifstr(i) $(NetworkCardKey) != $(Key_Null)
         GetRegValue $(NetworkCardKey),"ServiceName", ServiceNameInfo
         set ServiceName = *($(ServiceNameInfo), 4)
         OpenRegKey $(NetworkCardKey) "" "NetRules" $(MAXIMUM_ALLOWED) NetRuleKey
         Ifstr(i) $(NetRuleKey) != $(Key_Null)
            Debug-Output "$(STF_CONTEXTINFNAME): NetRuleKey .$(NetRuleKey). != Key_Null .$(Key_Null)."
         else
            goto FatalRegistryError
         endif
         CloseRegKey $(NetRules)
         CloseRegKey $(NetworkCardKey)
      else
         goto FatalRegistryError
      endif
      OpenRegKey $(!REG_H_LOCAL) +
                 "" $(!NTN_ServiceBase)"\"$(ServiceName) +
                 $(MAXIMUM_ALLOWED) +
                 ServiceKey
      Ifstr(i) $(ServiceKey) != $(Key_Null)
         CloseRegKey $(ServiceKey)
      else
         goto FatalRegistryError
      endif
   endif
   goto InstallOptionExit

ProcessSuccessExit = +
   goto InstallOptionExit

ProcessAbandonInstall = +
   ForListDo $(OEM_ABANDON_OPTIONS)
      Shell $(UtilityInf), +
            RemoveHardwareComponent, +
            $(Manufacturer), +
            $(TccBaseName), +
            $($)
      ifint $($ShellCode) != $(!SHELL_CODE_OK)
         set ShellErrorSection = UtilityInf:RemoveHardwareComponent
         goto ShellCodeError
      endif
      set RegistryErrorIndex = $($R0)
      Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
         goto FatalRegistryError
      endif
   EndForListDo
   Ifstr(i) $(OEM_ABANDON_SOFTWARE) == TRUE
      Shell $(UtilityInf), +
            RemoveSoftwareComponent, +
            $(Manufacturer), +
            $(TccBaseName), +
            FALSE
      ifint $($ShellCode) != $(!SHELL_CODE_OK)
         set ShellErrorSection = UtilityInf:RemoveSoftwareComponent
         goto ShellCodeError
      endif
      set RegistryErrorIndex = $($R0)
      Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
         goto FatalRegistryError
      endif
   endif
   goto InstallOptionExit

ProcessWarningMessage = +
   Shell $(SubroutineInf) SetupMessage, $(!STF_LANGUAGE), "WARNING", $(Error)
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      set ShellErrorSection = SubroutineInf:SetupMessage
      goto ShellCodeError
   endif
   ifstr(i) $($R1) == "OK"
      goto $(to)
   else-ifstr(i) $($R1) == "CANCEL"
      goto $(from)
   else
      goto "InstallOptionExit"
   endif

SetNonFatalInfo = +
   Set CommonStatus = STATUS_USERCANCEL
   Set Severity = STATUS
   goto ProcessNonFatalMessage

ProcessNonFatalMessage = +
   ifstr(i) $(Error) == ""
      Set Severity = NONFATAL
      Shell $(UtilityInf) RegistryErrorString "SETUP_FAIL"
      ifint $($ShellCode) != $(!SHELL_CODE_OK)
         set ShellErrorSection = UtilityInf:RegistryErrorString
         goto ShellCodeError
      endif
      set Error = $($R0)
   endif
   Shell $(SubroutineInf) SetupMessage, $(!STF_LANGUAGE), $(Severity), $(Error)
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      set ShellErrorSection = SubroutineInf:SetupMessage
      goto ShellCodeError
   endif
   ifstr(i) $($R1) == "OK"
      goto $(from)
   else
      goto "InstallOptionExit"
   endif

FatalRegistryError = +
   Shell $(UtilityInf) RegistryErrorString $(RegistryErrorIndex)
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      set ShellErrorSection = UtilityInf:RegistryErrorString
      goto ShellCodeError
   endif
   set Error = $($R0)
   goto FatalError

FatalError = +
   ifstr(i) $(Error) == ""
      Shell $(UtilityInf) RegistryErrorString "SETUP_FAIL"
      ifint $($ShellCode) != $(!SHELL_CODE_OK)
         set ShellErrorSection = UtilityInf:RegistryErrorString
         goto ShellCodeError
      endif
      set Error = $($R0)
   endif
   Shell $(SubroutineInf) SetupMessage, $(!STF_LANGUAGE), "FATAL", $(Error)
   ifint $($ShellCode) != $(!SHELL_CODE_OK)
      set ShellErrorSection = UtilityInf:SetupMessage
      goto ShellCodeError
   endif
   goto SetFailedStatusAndExit

ShellCodeError = +
   Debug-Output $(STF_CONTEXTINFNAME)": Shell error, $(ShellErrorSection)"
   set DlgType      = "MessageBox"
   set STF_MB_TITLE = "Error: "$(FunctionTitle)
   set STF_MB_TEXT  = "Shell Code Error"
   set STF_MB_TYPE  = 1
   set STF_MB_ICON  = 3
   set STF_MB_DEF   = 1
   ui start "Error Message"
   goto SetFailedStatusAndExit

SetFailedStatusAndExit = +
   set CommonStatus = STATUS_FAILED
   ifstr(i) $(OEM_ABANDON_ON) == TRUE
      set OEM_ABANDON_ON = FALSE
      goto ProcessAbandonInstall
   endif
   goto InstallOptionExit

InstallOptionExit = +
   Return $(CommonStatus)

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: web2, load: 0.64