996CDv20/WindowsNT/BcmServ/oemsetnt.inf Driver File Contents (996_cd_v20.exe)

Driver Package File Name: 996_cd_v20.exe
File Size: 44.5 MB

;*******************************************************************************
; The information contained in this file is confidential and proprietary to
; Broadcom Corporation.  No part of this file may be reproduced or
; distributed, in any form or by any means for any purpose, without the
; express written permission of Broadcom Corporation.
;
; (c) COPYRIGHT 2000 Broadcom Corporation, ALL RIGHTS RESERVED.
;
;
; Module Description:
;
;
; History:
;    09/15/00 Hao-Yang feng    Ver: 1.1.6
;    04/17/00 Hav Khauv        Initial version.
;*******************************************************************************



[Identification]
    OptionType = NetTransport


[Options]
    Blf


[DebugControl]
    !DebugOutputControl = 0


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


[LanguagesSupported]
    ENG, English


[OptionsTextENG]
    Blf = "Broadcom Advanced Server Program Driver"


[FileConstants]
    MAXIMUM_ALLOWED                 = 33554432
    NoTitle                         = 0
    EthernetMediaType               = 1

    UtilityInf                      = "UTILITY.INF"
    SubroutineInf                   = "SUBROUTN.INF"

    Manufacturer                    = "Broadcom"
    ProductMajorVersion             = "3"
    ProductMinorVersion             = "0"
    ProductBuildVersion             = "1"
    ProductVersion           = $(ProductMajorVersion)"."$(ProductMinorVersion)"."$(ProductBuildVersion)

    NetEventDll     = "%SystemRoot%\System32\netevent.dll;%SystemRoot%\System32\drivers\baspnt4.sys"
    BlfDriverPath   = "\SystemRoot\System32\drivers\baspnt4.sys"
    BlfDll          = "baspnt4.dll"
    B57dtectDll     = "b57dtect.dll"

    TransportProductDescription      = $(Manufacturer)" Intermediate Driver"
    TransportProductName             = "Blfp"
    TransportProductKeyName          = $(!NTN_SoftwareBase)"\"$(Manufacturer)+
                                       "\"$(TransportProductName)+
                                       "\CurrentVersion"
    TransportSoftwareType            = "transport"

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

    MiniportProductDescription       = $(Manufacturer)" Ndis Miniport Driver"
    MiniportProductName              = "Blfm"
    MiniportProductKeyName           = $(!NTN_SoftwareBase)"\"$(Manufacturer)+
                                       "\"$(MiniportProductName)+
                                       "\CurrentVersion"
    MiniportSoftwareType             = "driver"

    MiniportNetRuleSoftwareUse       = $(MiniportSoftwareType)
    MiniportNetRuleSoftwareClass     = {"blfmDriver basic"}
    MiniportNetRuleSoftwareType      = "blfmSys ndisDriver blfmDriver"
    MiniportNetRuleSoftwareBindForm  = """blfmSys"" yes no container"
    MiniportNetRuleSoftwareBindable  = {"blfmDriver blfmAdapter non "+
                                        "exclusive 100"}

    MiniportNetRuleHardwareType      = "blfm blfmAdapter"
    MiniportNetRuleHardwareBindForm  = " yes yes container"
    MiniportNetRuleHardwareClass     = {"blfmAdapter basic"}
    MiniportNetRuleHardwareBlock     = {"blfpTransport blfmAdapter"}

    RegistryNetCardKey = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\"+
                         "NetworkCards\"
    RegistryServicesKey = "SYSTEM\CurrentControlSet\Services\"
    RegistryProductOptionsKey = "SYSTEM\CurrentControlSet\Control\ProductOptions"


[FileConstantsENG]
    FunctionBlfTitle = "Broadcom Advanced Server Program Driver"

    TransportProductSoftwareTitle = $(FunctionBlfTitle)

    TransportProductSoftwareDisplayName = $(FunctionBlfTitle)+" "+
        "load balances inbound and outbound network traffic.  It will also "+
        "redirect all traffic to a standby adapter in an event of network "+
        "failure."

    MiniportProductSoftwareTitle       = "BASP Virtual Adapter Driver"
    MiniportProductSoftwareDisplayName = "BASP Virtual Adapter Driver"

    MiniportProductHardwareTitle = "BASP Virtual Adapter"

    MsgShellErrorTitle = "Error: "$(FunctionBlfTitle)
    MsgShellErrorText  = "Shell Code Error."

    MsgProductAlreadyInstalled = "Previous version has already installed.  "+
                                 "To reinstall, remove the previous version "+
                                 "first."
    MsgPlatformNotSupported = "This version of Windows is not supported."
    MsgCannotFindBlfDll = "Cannot find baspnt4.dll file."
    MsgNeedMoreAdapters = "Broadcom Advanced Server Program driver requires "+
                          "at least one Ethernet adapters."
    MsgRegistryKeyDoesNotExist = "Open registry key failed."
    MsgMessageBoxTitle = $(TransportProductSoftwareTitle)
    MsgInvalidSetting = "An invalid configuration has been detected. "+
        "Please go back in the Network Control Panel and reconfigure the "+
        $(TransportProductSoftwareTitle)".  Current settings make cause the "+
        "system to behave erratically."
    MsgDowngrade = "Cannot downgrade to an older driver.  To downgrade, "+
        "you must uninstall first and then re-install the older driver."
    MsgCannotFindB57dtectDll = "Cannot load B57dtect.dll file."

[Source Media Descriptions]
    1 = "Broadcom Advanced Server Program Driver Diskette"


[Files-Blf]
    1, baspnt4.sys, SIZE=999

[Files-Dll]
    1, baspnt4.dll, SIZE=999

[Files-Other]
    1, b57dtect.dll, SIZE=65

[Files-Inf]
    1, oemsetup.inf, SIZE=1000, RENAME=$(!UG_Filename)



;*******************************************************************************
; Description:
;    
; Input:
;    None.
;
; Output:
;    None.
;*******************************************************************************
[ShowShellErrorMessage]
    read-syms DebugControl
    debug-output "### ShowShellErrorMessage"

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

    set DlgType      = "MessageBox"
    set STF_MB_TITLE = $(MsgShellErrorTitle)
    set STF_MB_TEXT  = $(MsgShellErrorText)
    set STF_MB_TYPE  = 1
    set STF_MB_ICON  = 3
    set STF_MB_DEF   = 1

    ui start "Error Message"

    return



;*******************************************************************************
; Description:
;    
; Input:
;    $($0) = "WARNING", "FATAL", "NONFATAL", or "STATUS"
;    $($1) = Registery fatal text code.
;
; Output:
;    STATUS_FAILED
;    STATUS_SUCCESSFUL
;*******************************************************************************
[ShowRegistryErrorMessage]
    read-syms DebugControl
    debug-output "### ShowRegistryErrorMessage"

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

    set Severity = $($0)
    set RegStrCode = $($1)

    shell $(UtilityInf) RegistryErrorString $(RegStrCode)
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
        shell "" ShowShellErrorMessage
        return STATUS_FAILED
    endif

    set RegText = $($R0)

    shell $(SubroutineInf) SetupMessage $(!STF_LANGUAGE) $(Severity) $(RegText)

    return STATUS_SUCCESSFUL



;*******************************************************************************
; Description:
;    Displays shell error message.
;    
; Input:
;    $($0) = "WARNING", "FATAL", "NONFATAL", or "STATUS"
;    $($1) = Fatal text string.
;
; Output:
;    None.
;*******************************************************************************
[ShowErrorMessage]
    read-syms DebugControl
    debug-output "### ShowErrorMessage"

    read-syms FileConstants

    shell $(SubroutineInf) SetupMessage $(!STF_LANGUAGE) $($0) $($1)
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
        shell "" ShowShellErrorMessage
    endif

    return



;*******************************************************************************
; Description:
;    
; Input:
;    $($0):  OptionID to install
;
; Output:
;   STATUS_FAILED
;   STATUS_SUCCESSFUL
;*******************************************************************************
[InstallTransport]
    read-syms DebugControl
    debug-output "### InstallTransport"

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

    set OptionId = $($0)
    debug-output "OptionId : "$(OptionId)

    ; Store current date in $(Now).
    detect CurrentDate

    ; Create registry keys for the transport driver.
    shell $(UtilityInf), AddSoftwareComponent, $(Manufacturer), +
        $(TransportProductName), $(TransportProductName), +
        $(TransportProductSoftwareDisplayName), $(STF_CONTEXTINFNAME), +
        $(BlfDriverPath), "transport", "TDI", {}, "", $(NetEventDll)
    ifstr(i) $($R0) != NO_ERROR
        debug-output "AddSoftwareComponent failed: Transport protocol."

        closeregkey $($R1)
        closeregkey $($R2)
        closeregkey $($R3)
        closeregkey $($R4)
        closeregkey $($R5)

        shell "" ShowRegistryErrorMessage "FATAL" $($R0)

        return STATUS_FAILED
    endif

    ; $R1 contains handle to "SOFTWARE\Broadcom\CurrentVersion".
    ; $R2 contains handle to "SOFTWARE\Broadcom\CurrentVersion\NetRules".
    ; $R3 contains handle to "SYSTEM\CurrentControlSet\Blfp".
    ; $R4 contains handle to "SYSTEM\CurrentControlSet\Blfp\Parameters".
    ; $R5 contains handle to "SYSTEM\CurrentControlSet\Blfp\Linkage".

    set ProductKey = $($R1)
    set NetRuleKey = $($R2)
    set ServiceKey = $($R3)
    set ParameterKey = $($R4)
    set LinkageKey = $($R5)

    ; Initialize "SOFTWARE\Broadcom\CurrentVersion" hive.
    set NewValueList = { +
        { SoftwareType, $(NoTitle), $(!REG_VT_SZ),          +
            $(TransportSoftwareType) },                     +
        { MajorVersion, $(NoTitle), $(!REG_VT_DWORD),       +
            $(ProductMajorVersion) },                       +
        { MinorVersion, $(NoTitle), $(!REG_VT_DWORD),       +
            $(ProductMinorVersion) },                       +
        { BuildVersion, $(NoTitle), $(!REG_VT_DWORD),       +
            $(ProductBuildVersion) },                       +
        { Title,        $(NoTitle), $(!REG_VT_SZ),          +
            $(TransportProductSoftwareTitle) },             +
        { Description,  $(NoTitle), $(!REG_VT_SZ),          +
            $(TransportProductDescription) },               +
        { ServiceName,  $(NoTitle), $(!REG_VT_SZ),          +
            $(TransportProductName)},                       +
        { Review,       $(NoTitle), $(!REG_VT_DWORD), 1 },  +
        { InstallDate,  $(NoTitle), $(!REG_VT_DWORD),       +
            *($(Now),1) } }
    shell $(UtilityInf), AddValueList, $(ProductKey), $(NewValueList)
    ifstr $($R0) != NO_ERROR
        debug-output "Initialize Broadcom\CurrentVersion hive failed."

        closeRegKey $(ProductKey)
        closeRegKey $(NetRuleKey)
        closeRegKey $(ServiceKey)
        closeRegKey $(LinkageKey)
        closeRegKey $(ParameterKey)

        shell "" ShowRegistryErrorMessage "FATAL" $($R0)

        return STATUS_FAILED
    endif

    ; Initialize the "SOFTWARE\Broadcom\CurrentVersion\NetRules" hive.
    set NewValueList = { +
        { type,         $(NoTitle), $(!REG_VT_SZ),          +
            $(TransportNetRuleSoftwareType) },              +
        { use,          $(NoTitle), $(!REG_VT_SZ),          +
            $(TransportNetRuleSoftwareUse) },               +
        { class,        $(NoTitle), $(!REG_VT_MULTI_SZ),    +
            $(TransportNetRuleSoftwareClass) },             +
        { bindform,     $(NoTitle), $(!REG_VT_SZ),          +
            $(TransportNetRuleSoftwareBindForm) },          +
        { bindable,     $(NoTitle), $(!REG_VT_MULTI_SZ),    +
            $(TransportNetRuleSoftwareBindable) },          +
        { InfOption,    $(NoTitle), $(!REG_VT_SZ),          +
            $(OptionId)} }
    shell $(UtilityInf), AddValueList, $(NetRuleKey), $(NewValueList)
    ifstr $($R0) != NO_ERROR
        debug-output "Initialize CurrentVersion\NetRules hive failed."

        closeregkey $(ProductKey)
        closeregkey $(NetRuleKey)
        closeregkey $(ServiceKey)
        closeregkey $(LinkageKey)
        closeregkey $(ParameterKey)

        shell "" ShowRegistryErrorMessage "FATAL" $($R0)

        return STATUS_FAILED
    endif

    ; Initialize the "SYSTEM\CurrentControlSet\Blfp\Parameters" hive.
    Set NewValueList = { +
        { BlfParams,    $(NoTitle),     $(!REG_VT_SZ),      +
            "nothing here yet"} }
    shell $(UtilityInf), AddValueList, $(ParameterKey), $(NewValueList)
    ifstr $($R0) != NO_ERROR
        debug-output "Initialize \Blfp\Parameters hive failed."

        closeregkey $(ProductKey)
        closeregkey $(NetRuleKey)
        closeregkey $(ServiceKey)
        closeregkey $(LinkageKey)

        shell "" ShowRegistryErrorMessage "FATAL" $($R0)

        return STATUS_FAILED
    endif

    closeregkey $(ProductKey)
    closeregkey $(NetRuleKey)
    closeregkey $(ServiceKey)
    closeregkey $(LinkageKey)
    closeregkey $(ParameterKey)

    debug-output "Transport protocol installed."

    return STATUS_SUCCESSFUL



;*******************************************************************************
; Description:
;    
; Input:
;    $($0)      Physical or virtual adapter info.
;    $($1)      Virtual adapter list. (for updating physical adapter upperbind
;               key)
;
; Output:
;    $($R0)     STATUS_FAILED or STATUS_SUCCESSFUL
;*******************************************************************************
[UpdateMiniport]
    read-syms DebugControl
    debug-output "### UpdateMiniport"

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

    set AdapterInfo = $($0)

    set ProductName = *($(AdapterInfo), 3)
    set ServiceName = *($(AdapterInfo), 4)
    set AdapterNum = *($(AdapterInfo), 6)
    set MemberType = *($(AdapterInfo), 7)
    set TeamId = *($(AdapterInfo), 8)
    set TeamName = *($(AdapterInfo), 9)
    set VlanID = *($(AdapterInfo), 11)
    set VlanName = *($(AdapterInfo), 12)
    set TeamType = *($(AdapterInfo), 13)
    set MACAddr = *($(AdapterInfo), 14)
    set AdvancedFailover = *($(AdapterInfo), 15)
    set NICType = *($(AdapterInfo), 16)
    set NicCat = *($(AdapterInfo), 17)
    set VID = *($(AdapterInfo), 18)
    set DID = *($(AdapterInfo), 19)
    set SVID = *($(AdapterInfo), 20)
    set SID = *($(AdapterInfo), 21)

    debug-output "========== UpdateMiniport"
    debug-output "ProductName: "$(ProductName)
    debug-output "ServiceName: "$(ServiceName)
    debug-output "AdapterNum: "$(AdapterNum)
    debug-output "MemberType: "$(MemberType)
    debug-output "TeamName: "$(TeamName)
    debug-output "TeamId: "$(TeamId)
    debug-output "VlanID: "$(VlanID)
    debug-output "VlanName: "$(VlanName)
    debug-output "TeamType: "$(TeamType)
    debug-output "MACAddr: "$(MACAddr)
    debug-output "AdvancedFailover: "$(AdvancedFailover)
    debug-output "NICType: "$(NICType)
    debug-output "NicCat: "$(NicCat)
    debug-output "VID: "$(VID)
    debug-output "DID: "$(DID)
    debug-output "SVID: "$(SVID)
    debug-output "SID: "$(SID)

    ; Physical or virtual adapter.
    ifstr(i) $(ProductName) == $(MiniportProductName)
        ; Update "Services\Blfm[n]\Parameters" key.
        debug-output "Updating Services\Blfm[n]\Parameters key."

        openregkey $(!REG_H_LOCAL) "" $(RegistryServicesKey)+
            $(ServiceName)"\Parameters" $(MAXIMUM_ALLOWED) ParamKey
        ifstr(i) $(ParamKey) == ""
            debug-output "Update virtual adapter param key failed."
            shell "" ShowErrorMessage "FATAL" $(MsgRegistryKeyDoesNotExist)
            return STATUS_FAILED
        endif

        ; Update TeamId and TeamName.
        Set NewValueList = {                                               +
            { TeamId,       $(NoTitle), $(!REG_VT_DWORD), $(AdapterNum) }, +
            { TeamName,     $(NoTitle), $(!REG_VT_SZ), $(TeamName) },      +
            { VlanID,       $(NoTitle), $(!REG_VT_DWORD), $(VlanID) },     +
            { VlanName,     $(NoTitle), $(!REG_VT_SZ), $(VlanName) },      +
            { TeamType,     $(NoTitle), $(!REG_VT_DWORD), $(TeamType) },   +
            { VAName,       $(NoTitle), $(!REG_VT_SZ), "\Device\"$(ServiceName) } }
        shell $(UtilityInf), AddValueList, $(ParamKey), $(NewValueList)
        ifstr $($R0) != NO_ERROR
            debug-output "Initialize Services\Blfm[x]\Parameters hive failed."
            shell "" ShowErrorMessage "FATAL" $($R0)
            return STATUS_FAILED
        endif

        closeregkey $(ParamKey)
    else
        ; Physical adapter.

        ifstr(i) $(TeamName) == ""
            ; This physical adapter is not part of a team.
            debug-output "Physical adapter does not belong to a team."

            ; Remove "Services\[RealNicx]\Parameters\Blfp" key if there is any.
            openregkey $(!REG_H_LOCAL) "" $(RegistryServicesKey)+
                $(ServiceName)"\Parameters" $(MAXIMUM_ALLOWED) ParamKey
            ifstr(i) $(ParamKey) != ""
                deleteregtree $(ParamKey) $(TransportProductName)
                DeleteRegValue $(ParamKey) "NetworkAddress"
                DeleteRegValue $(ParamKey) "VlanEnable"
                DeleteRegValue $(ParamKey) "AdvancedFailover"
                flushregkey $(ParamKey)
                closeregkey $(ParamKey)
            endif
        else
            ; This adapter is part of a team.
            debug-output "Physical adapter is part of "$(TeamName)" team."

            ; Create "Services\[RealNicx]\Parameters\Blfp" key if it does not
            ; exist yet.
            set TransportParamKeyName = $(RegistryServicesKey)$(ServiceName)+
                "\Parameters\"$(TransportProductName)
            createregkey $(!REG_H_LOCAL) { $(TransportParamKeyName), +
                $(NoTitle), GenericClass } "" $(MAXIMUM_ALLOWED) ""  +
                TransportParamKey
            ifstr(i) $(TransportParamKey) == ""
                ; Key already existed, just open for reading.
                openregkey $(!REG_H_LOCAL) "" $(TransportParamKeyName) +
                    $(MAXIMUM_ALLOWED) TransportParamKey
            endif

            ifstr(i) $(TransportParamKey) != ""
                ; Update "Services\[RealNicx]\Parameters\Blfp" key.
                debug-output "Updating Services\"$(ServiceName)+
                    "\Parameters\Blfp."

                Set UpperBindings = { }
                Set VirtualAdapterList = $($1)
                forlistdo $(VirtualAdapterList)
                    set VirtualAdapter = $($)
                    ifstr(i) *($(VirtualAdapter), 9) == $(TeamName)
                        Set BindServiceName = *($(VirtualAdapter), 4)
                        Set BindDevice = $(BindServiceName)
                        Set UpperBindings = >($(UpperBindings), $(BindDevice))
                    endif
                endforlistdo

                Set NewValueList = {                                          +
                    { TeamId,       $(NoTitle), $(!REG_VT_DWORD),             +
                        $(TeamId) },                                          +
                    { MemberType,   $(NoTitle), $(!REG_VT_DWORD),             +
                        $(MemberType) },                                      +
                    { TeamName,     $(NoTitle), $(!REG_VT_SZ), $(TeamName) }, +
                    { TeamType,     $(NoTitle), $(!REG_VT_DWORD),             +
                        $(TeamType) },                                        +
                    { UpperBindings,$(NoTitle), $(!REG_VT_MULTI_SZ),          +
                    $(UpperBindings) },                                       +
                    { AdvancedFailover, $(NoTitle), $(!REG_VT_DWORD),         +
                    $(AdvancedFailover) } }

                shell $(UtilityInf), AddValueList, $(TransportParamKey), +
                    $(NewValueList)
                ifstr $($R0) != NO_ERROR
                    debug-output "Initialize \Blfm[x]\Parameters hive failed."
                    shell "" ShowErrorMessage "FATAL" $($R0)
                    return STATUS_FAILED
                endif
            else
                debug-output "Cannot open "$(TransportParamKeyName)"."
            endif

            closeregkey $(TransportParamKey)

            ; Put in team attributes.
            openregkey $(!REG_H_LOCAL) "" $(RegistryServicesKey)+
                $(ServiceName)"\Parameters" $(MAXIMUM_ALLOWED) ParamKey
            ifstr(i) $(ParamKey) != ""
                ifint $(TeamType) == 1
                    Set NewValueList = {                                      +
                        { NetworkAddress, $(NoTitle), $(!REG_VT_SZ),          +
                            $(MACAddr) } }
                    shell $(UtilityInf), AddValueList, $(ParamKey),           +
                        $(NewValueList)
                else
                    DeleteRegValue $(ParamKey) "NetworkAddress"
                endif

                Set HasVlan = "0"
                Set VirtualAdapterList = $($1)
                forlistdo $(VirtualAdapterList)
                    set VirtualAdapter = $($)
                    ifstr(i) *($(VirtualAdapter), 9) == $(TeamName)
                        ifstr(i) *($(VirtualAdapter), 12) != ""
                            Set HasVlan = "1"
                        endif
                    endif
                endforlistdo

                ifint $(HasVlan) == 1
                    Set NewValueList = {                                  +
                        { VlanEnable, $(NoTitle), $(!REG_VT_DWORD),       +
                            "1" } }
                    shell $(UtilityInf), AddValueList, $(ParamKey),       +
                        $(NewValueList)
                else
                    DeleteRegValue $(ParamKey) "VlanEnable"
                endif

                flushregkey $(ParamKey)
                closeregkey $(ParamKey)
            endif
        endif
    endif

    return STATUS_SUCCESSFUL



;*******************************************************************************
; Description:
;    
; Input:
;    $($0):     Virtual adapter info.
;    $($1):     OptionID to install
;
; Output:
;    $($R0)     STATUS_FAILED or STATUS_SUCCESSFUL
;    $($R1)     Virtual adapter with update info.
;*******************************************************************************
[InstallVirtualMiniport]
    read-syms DebugControl
    debug-output "### InstallVirtualMiniport"

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

    Detect CurrentDate

    set VirtualAdapter = $($0)
    set OptionId = $($1)

    debug-output "OptionId : "$(OptionId)

    debug-output "Install a new virtual miniport: "$(VirtualAdapter)

    ; Check to see if the software component is installed.  If not, install
    ; it.
    openregkey $(!REG_H_LOCAL) "" $(MiniportProductKeyName) $(MAXIMUM_ALLOWED) +
        ProductKey
    ifstr(i) $(ProductKey) == ""
        debug-output "Create the software component."

        shell $(UtilityInf), AddSoftwareComponent, $(Manufacturer), +
            $(MiniportProductName), $(MiniportProductName), +
            $(MiniportProductSoftwareDisplayName), $(STF_CONTEXTINFNAME), +
            $(BlfDriverPath), "kernel", "NDIS", {}, "", $(NetEventDll)
        ifstr(i) $($R0) != NO_ERROR
            debug-output "Add miniport software component failed."

		    closeregkey $($R1)
		    closeregkey $($R2)
		    closeregkey $($R3)
		    closeregkey $($R4)
		    closeregkey $($R5)

            shell "" ShowRegistryErrorMessage "FATAL" $($R0)

            return STATUS_FAILED
        endif

        ; $R1 contains handle to "SOFTWARE\Broadcom\CurrentVersion".
        ; $R2 contains handle to "SOFTWARE\Broadcom\CurrentVersion\NetRules".
        ; $R3 contains handle to "SYSTEM\CurrentControlSet\Blfp".
        ; $R4 contains handle to "SYSTEM\CurrentControlSet\Blfp\Parameters".
        ; $R5 contains handle to "SYSTEM\CurrentControlSet\Blfp\Linkage".

        set ProductKey   = $($R1)
        set NetRuleKey   = $($R2)
        set ServiceKey   = $($R3)
        set ParameterKey = $($R4)
        set LinkageKey   = $($R5)

        set NewValueList = {                                +
            { SoftwareType, $(NoTitle), $(!REG_VT_SZ),      +
                $(MiniportSoftwareType) },                  +
            { MajorVersion, $(NoTitle), $(!REG_VT_DWORD),   +
                $(ProductMajorVersion) },                   +
            { MinorVersion, $(NoTitle), $(!REG_VT_DWORD),   +
                $(ProductMinorVersion) },                   +
            { BuildVersion, $(NoTitle), $(!REG_VT_DWORD),   +
                $(ProductBuildVersion) },                   +
            { Title,        $(NoTitle), $(!REG_VT_SZ),      +
                $(MiniportProductSoftwareTitle) },          +
            { Description,  $(NoTitle), $(!REG_VT_SZ),      +
                $(MiniportProductDescription) },            +
            { ServiceName,  $(NoTitle), $(!REG_VT_SZ),      +
                $(MiniportProductName) },                   +
            { InstallDate,  $(NoTitle), $(!REG_VT_DWORD),   +
                *($(Now),1) } }

        shell $(UtilityInf), AddValueList, $(ProductKey), $(NewValueList)
        ifstr(i) $($R0) != NO_ERROR
            debug-output "Cannot create miniport software key."

            closeregkey $(ProductKey)
            closeregkey $(NetRuleKey)
            closeregkey $(ServiceKey)
            closeregkey $(ParameterKey)
            closeregkey $(LinkageKey)

            shell "" ShowRegistryErrorMessage "FATAL" $($R0)

            return STATUS_FAILED
        endif

        set NewValueList = {                                    +
            { type,         $(NoTitle), $(!REG_VT_SZ),          +
                $(MiniportNetRuleSoftwareType) },               +
            { use,          $(NoTitle), $(!REG_VT_SZ),          +
                $(MiniportNetRuleSoftwareUse) },                +
            { bindform,     $(NoTitle), $(!REG_VT_SZ),          +
                $(MiniportNetRuleSoftwareBindForm) },           +
            { class,        $(NoTitle), $(!REG_VT_MULTI_SZ),    +
                $(MiniportNetRuleSoftwareClass) },              +
            { bindable,     $(NoTitle), $(!REG_VT_MULTI_SZ),    +
                $(MiniportNetRuleSoftwareBindable) },           +
            { InfOption,    $(NoTitle), $(!REG_VT_SZ),          +
                $(OptionId) } }

        shell $(UtilityInf), AddValueList, $(NetRuleKey), $(NewValueList)
        ifstr(i) $($R0) != NO_ERROR
            debug-output "### Cannot create the miniport netrules."

            closeregkey $(ProductKey)
            closeregkey $(NetRuleKey)
            closeregkey $(ServiceKey)
            closeregkey $(ParameterKey)
            closeregkey $(LinkageKey)

            shell "" ShowRegistryErrorMessage "FATAL" $($R0)

            return STATUS_FAILED
        endif

        closeregkey $(NetRuleKey)
        closeregkey $(ServiceKey)
        closeregkey $(ParameterKey)
        closeregkey $(LinkageKey)
    endif

    closeregkey $(ProductKey)

    debug-output "Create the hardware component."

    ; Create "SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards\".
    shell $(UtilityInf), AddHardwareComponent, $(MiniportProductName), +
        $(STF_CONTEXTINFNAME), $(MiniportProductKeyName)
    ifstr(i) $($R0) != NO_ERROR
        debug-output "### Add hardware component error."

        closeregkey $($R1)
        closeregkey $($R2)
        closeregkey $($R3)

        shell "" ShowRegistryErrorMessage "FATAL" $($R0)

        return STATUS_FAILED
    endif

    set HardNetCardKey      = $($R1)
    set HardNetRuleKey      = $($R2)
    set HardParameterKey    = $($R3)
    set AdapterNumber       = $($R4)
    set AdapterServiceName  = $($R5)

    ; Fill in the info.
    ifstr(i) *($(VirtualAdapter), 12) == ""
        set NetCardTitle = $(MiniportProductHardwareTitle)" ("+
            *($(VirtualAdapter), 9)")"
    else
        set NetCardTitle = $(MiniportProductHardwareTitle)" ("+
            *($(VirtualAdapter), 9)"/"*($(VirtualAdapter), 12)")"
    endif

    set VirtualAdapter = { $(MiniportProductDescription), $(Manufacturer),  +
        $(MiniportProductName), $(AdapterServiceName),                      +
        $(MiniportProductHardwareTitle), $(AdapterNumber), "0",             +
        $(AdapterNumber), *($(VirtualAdapter), 9), "0",                     +
        *($(VirtualAdapter), 11), *($(VirtualAdapter), 12),                 +
        *($(VirtualAdapter), 13), *($(VirtualAdapter), 14),                 +
        *($(VirtualAdapter), 15), *($(VirtualAdapter), 16) }

    set NewValueList = {                                                +
        { Manufacturer, $(NoTitle), $(!REG_VT_SZ),                      +
            $(Manufacturer) },                                          +
        { Title,        $(NoTitle), $(!REG_VT_SZ),                      +
            "["$(AdapterNumber)"] "$(NetCardTitle) },                   +
        { Description,  $(NoTitle), $(!REG_VT_SZ),                      +
            $(MiniportProductDescription) },                            +
        { ProductName,  $(NoTitle), $(!REG_VT_SZ),                      +
            $(MiniportProductName) },                                   +
        { ServiceName,  $(NoTitle), $(!REG_VT_SZ),                      +
            $(AdapterServiceName) },                                    +
        { Hidden,       $(NoTitle), $(!REG_VT_DWORD), 1 },              +
        { InstallDate,  $(NoTitle), $(!REG_VT_DWORD), *($(Now), 1) } }

    shell $(UtilityInf), AddValueList, $(HardNetCardKey), $(NewValueList)
    ifstr(i) $($R0) != NO_ERROR
        debug-output "### Add netrule shell error."

        closeregkey $(HardNetCardKey)
        closeregkey $(HardNetRuleKey)
        closeregkey $(HardParameterKey)

        shell "" ShowRegistryErrorMessage "FATAL" $($R0)

        return STATUS_FAILED
    endif

    set NewValueList = {                                            +
        { MediaType,        $(NoTitle), $(!REG_VT_DWORD),           +
            $(EthernetMediaType) },                                 +
        { TeamId,           $(NoTitle), $(!REG_VT_DWORD),           +
            $(AdapterNumber) },                                     +
        { TeamName,         $(NoTitle), $(!REG_VT_SZ),              +
            *($(VirtualAdapter), 9) },                              +
        { VlanID,           $(NoTitle), $(!REG_VT_DWORD),           +
            *($(VirtualAdapter), 11) },                             +
        { VlanName,         $(NoTitle), $(!REG_VT_SZ),              +
            *($(VirtualAdapter), 12) },                             +
        { TeamType,         $(NoTitle), $(!REG_VT_DWORD),           +
            *($(VirtualAdapter), 13) },                             +
        { VAName,           $(NoTitle), $(!REG_VT_SZ),              +
            "\Device\"*($(VirtualAdapter), 4) } }

    shell $(UtilityInf), AddValueList, $(HardParameterKey), $(NewValueList)
    ifstr(i) $($R0) != NO_ERROR
        debug-output "### Add parameter shell error."

        closeregkey $(HardNetCardKey)
        closeregkey $(HardNetRuleKey)
        closeregkey $(HardParameterKey)

        shell "" ShowRegistryErrorMessage "FATAL" $($R0)

        return STATUS_FAILED
    endif

    set TempProdName = """"$(MiniportProductName)$(AdapterNumber)""""
    set TempBindForm = $(TempProdName)$(MiniportNetRuleHardwareBindForm)

    set NewValueList = { +
        { type,         $(NoTitle), $(!REG_VT_SZ),          +
            $(MiniportNetRuleHardwareType) },               +
        { bindform,     $(NoTitle), $(!REG_VT_SZ),          +
            $(TempBindForm) },                              +
        { block,        $(NoTitle), $(!REG_VT_MULTI_SZ),    +
            $(MiniportNetRuleHardwareBlock) },              +
        { class,        $(NoTitle), $(!REG_VT_MULTI_SZ),    +
            $(MiniportNetRuleHardwareClass) },              +
        { InfOption,    $(NoTitle), $(!REG_VT_SZ),          +
            $(OptionId)} }

    shell $(UtilityInf), AddValueList, $(HardNetRuleKey), $(NewValueList)
    ifstr(i) $($R0) != NO_ERROR
        debug-output "### Add hardware component error."

        closeregkey $(HardNetCardKey)
        closeregkey $(HardNetRuleKey)
        closeregkey $(HardParameterKey)

        shell "" ShowRegistryErrorMessage "FATAL" $($R0)

        return STATUS_FAILED
    endif

    closeregkey $(HardNetCardKey)
    closeregkey $(HardNetRuleKey)
    closeregkey $(HardParameterKey)

    debug-output "Updated virtual adapter info: "$(VirtualAdapter)

    return STATUS_SUCCESSFUL $(VirtualAdapter)



;*******************************************************************************
; Description:
;    
; Input:
;    None.
;
; Output:
;    None.
;*******************************************************************************
[Install-Option]
    debug-output "### Install-Option"

    ; Copy files.
    set STF_VITAL = ""
    ifstr(i) $(AddCopy) == "YES"
        AddSectionFilesToCopyList Files-Blf $(SrcDir) +
            $(!STF_WINDOWSSYSPATH)\drivers
        AddSectionFilesToCopyList Files-Dll $(SrcDir) $(!STF_WINDOWSSYSPATH)
        AddSectionFilesToCopyList Files-Other $(SrcDir) $(!STF_WINDOWSSYSPATH)
    endif

    ifstr(i) $(DoCopy) == "YES"
       set !STF_NCPA_FLUSH_COPYLIST = TRUE
       CopyFilesInCopyList
    endif

    exit



;*******************************************************************************
; Description:
;    
; Input:
;
; Output:
;*******************************************************************************
[Install-Update]
    debug-output "### Install-Update"


    debug-output "### SrcDir="$(SrcDir)

    set STF_VITAL = ""
    set STF_OVERWRITE = "VERIFYSOURCEOLDER"


    debug-output "### UG_Filename="$(!UG_Filename)

    AddSectionFilesToCopyList Files-Dll $(SrcDir) $(!STF_WINDOWSSYSPATH)
    AddSectionFilesToCopyList Files-Other $(SrcDir) $(!STF_WINDOWSSYSPATH)
    AddSectionFilesToCopyList Files-Inf $(SrcDir) $(!STF_WINDOWSSYSPATH)
    AddSectionFilesToCopyList Files-Blf $(SrcDir) $(!STF_WINDOWSSYSPATH)\drivers

    set !STF_NCPA_FLUSH_COPYLIST = TRUE

    CopyFilesInCopyList

    exit
    


;*******************************************************************************
; Description:
;    
; Input:
;    None.
;
; Output:
;    $($R0)     Physical adapter list.
;    $($R1)     Virtual adapter list.
;*******************************************************************************
[BuildAdapterList]
    read-syms DebugControl
    debug-output "### BuildAdapterList"

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

    ; Get adapter info from the registry.
    openregkey $(!REG_H_LOCAL) "" $(RegistryNetCardKey) $(MAXIMUM_ALLOWED) +
        NetCardKey
    ifstr $(NetCardKey) == ""
        return {} {}
    endif

    set NetCardValueList = { }
    enumregkey $(NetCardKey) NetCardValueList

    ; Physical and virtual adapter list.  Each entry in the list consists of:
    ; 
    ; Information from NetworkCards hive.
    ;    1: Adapter description
    ;    2: Adapter manufacturer
    ;    3: Adapter product name
    ;    4: Adapter service name
    ;    5: Adapter title
    ;    6: Adapter number
    ;
    ; Information from "Services\[ServiceName]\Parameters\Blfp" hive.
    ;    7: Member type: 0 = unassigned, 1 = standby
    ;
    ; Information from "Services\Blfm[n]\Parameters" or
    ; "Services\[ServiceName]\Parameters\Blfp" hive.
    ;    8: Virtual adapter team id or 0 == unassigned
    ;
    ; Information from "Services\Blfm[n]\Parameters".
    ;    9: Team name.
    ;
    ; Return code from the DLL.  Valid only if this is a virtual adapter.
    ;   10: 0-Unchanged, 1-New, 2-Modified, or 3-Deleted
    ;
    ; Information from "Services\Blfm[n]\Parameters" hive.
    ;   11: VLAN id or 0 == unassigned, 11-bit unsigned value
    ;
    ; Information from "Services\Blfm[n]\Parameters" hive.
    ;   12: VLAN name or "" == unassigned
    ;
    ; Information from "Services\Blfm[n]\Parameters" hive.
    ;   13: Team type or 0 == Broadcom LBFO, 1 = 802.3ad, 2 = FEC/GEC
    ;
    ; Information from "Services\Blfm[n]\Parameters" hive.
    ;   14: If TeamType == 1, read "NetworkAddress" value
    ;
    ; Information from "Services\[ServiceName]\Parameters\Blfp" hive.
    ;   15: AdvancedFailover (0 = Disabled, 1 = Enabled)
    ;
    ;
    ;
    ; Virtual NIC
    ; ===========
    ;
    ; Blfm[n]
    ;   |
    ;   +----Parameters
    ;            |
    ;            |----TeamId (0 = unassigned or n)
    ;            |
    ;            |----TeamName
    ;            |
    ;            |----VlanID (11-bit unsigned value)
    ;            |
    ;            |----VlanName
    ;            |
    ;            |----TeamType (0 = Broadcom LBFO, 2 = 802.3ad, 1= FEC/GEC)
    ;            |
    ;            |----NetworkAddress
    ;            |
    ;            |----Other parameters
    ;            |
    ;            +----tcpip
    ;                   |
    ;                   Tcpip parameters
    ;
    ;
    ; Miniport instance
    ; =================
    ; 
    ; RealNic[n]
    ;    |
    ;    +----Parameters
    ;             |
    ;             |----NetworkAddress
    ;             |
    ;             +----tcpip
    ;             |
    ;             +----Blfp
    ;                   |
    ;                   |----TeamId (0 = unassigned or Virtual NIC instance #)
    ;                   |
    ;                   |----MemberType (0 = unassigned, 1 = standby, 2 = Virt)
    ;                   |
    ;                   |----TeamName
    ;                   |
    ;                   |----TeamType (0 = Broadcom LBFO, 2 = 802.3ad, 1= FEC/GEC)
    ;                   |
    ;                   |----UpperBindings (which virtual adapters to bind to)
    ;                   |
    ;                   |----AdvancedFailover (0 = Disabled, 1 = Enabled)
    ;                   |
    ;                   |----Other parameters

    LoadLibrary $(MsgCannotFindB57dtectDll) $(!STF_WINDOWSSYSPATH)"\"+
        $(B57dtectDll) HwdtectDll

    set PhysicalAdapterList = {}
    set VirtualAdapterList = {}

    ; loop through the keys in "NetworkCards" hive.
    forlistdo $(NetCardValueList)
        set AdapterNumber = *($($), 1)
        set AdapterProductName = ""
        set AdapterServiceName = ""
        set AdapterDescription = ""
        set AdapterManufacturer = ""
        set AdapterTitle = ""

        ; Get the information from the "NetworkCards\[x]" hive.
        openregkey $(!REG_H_LOCAL) "" $(RegistryNetCardKey)$(AdapterNumber) +
            $(MAXIMUM_ALLOWED) AdapterKey
        ifstr $(AdapterKey) == ""
            debug-output "Cannot open "$(RegistryNetCardKey)$(AdapterNumber)"."
        else
            set ValueList = { }
            enumregvalue $(AdapterKey) ValueList

            forlistdo $(ValueList)
                set ValueName = *($($), 1)
                set ValueData = *($($), 4)

                ifstr(i) $(ValueName) == "Description"
                    set AdapterDescription = $(ValueData)
                else-ifstr(i) $(ValueName) == "Manufacturer"
                    set AdapterManufacturer = $(ValueData)
                else-ifstr(i) $(ValueName) == "ProductName"
                    set AdapterProductName = $(ValueData)
                else-ifstr(i) $(ValueName) == "ServiceName"
                    set AdapterServiceName = $(ValueData)
                else-ifstr(i) $(ValueName) == "Title"
                    set AdapterTitle = $(ValueData)
                endif
            endforlistdo
        endif
        closeregkey $(AdapterKey)

        debug-output "================="
        debug-output "Description: "$(AdapterDescription)
        debug-output "ProductName: "$(AdapterProductName)
        debug-output "ServiceName: "$(AdapterServiceName)
        debug-output "Title: "$(AdapterTitle)

        set AdapterMemberType = 0
        set AdapterTeamId = 0
        set AdapterTeamName = ""
        set MediaType = 0
        set AdapterVlanID = 0
        set AdapterVlanName = ""
        set AdapterTeamType = 0
        set AdvancedFailover = 0
        set NICType = 0
        set NicCat = 0
        set VID = 0
        set DID = 0
        set SVID = 0
        set SID = 0

        ifstr(i) $(AdapterProductName) == $(MiniportProductName)
            debug-output "Virtual adapter."

            ; Get the information from "Services\[ServiceName]\Parameters" hive.
            openregkey $(!REG_H_LOCAL) "" $(RegistryServicesKey)+
                $(AdapterServiceName)"\Parameters" $(MAXIMUM_ALLOWED) +
                ServicesKey
            ifstr $(ServicesKey) == ""
                debug-output "Cannot open "$(RegistryServicesKey)+
                    $(AdapterServiceName)"\Parameters."
            else
                set ValueList = { }
                enumregvalue $(ServicesKey) ValueList

                forlistdo $(ValueList)
                    set ValueName = *($($), 1)
                    set ValueData = *($($), 4)

                    ifstr(i) $(ValueName) == "TeamId"
                        set AdapterTeamId = $(ValueData)
                    else-ifstr(i) $(ValueName) == "TeamName"
                        set AdapterTeamName = $(ValueData)
                    else-ifstr(i) $(ValueName) == "VlanID"
                        set AdapterVlanID = $(ValueData)
                    else-ifstr(i) $(ValueName) == "VlanName"
                        set AdapterVlanName = $(ValueData)
                    else-ifstr(i) $(ValueName) == "TeamType"
                        set AdapterTeamType = $(ValueData)
                    endif
                endforlistdo
                closeregkey $(ServicesKey)

            endif
        else
            debug-output "Physical adapter."

            ; Get the information from "Services\[ServiceName]\Parameters\Blfp"
            ; hive.
            openregkey $(!REG_H_LOCAL) "" $(RegistryServicesKey)+
                $(AdapterServiceName)"\Parameters\"$(TransportProductName) +
                $(MAXIMUM_ALLOWED) ServicesKey
            ifstr $(ServicesKey) == ""
                debug-output "Cannot open "$(RegistryServicesKey)+
                    $(AdapterServiceName)"\Parameters\"+
                    $(TransportProductName)"."
            else
                set ValueList = { }
                enumregvalue $(ServicesKey) ValueList

                forlistdo $(ValueList)
                    set ValueName = *($($), 1)
                    set ValueData = *($($), 4)

                    ifstr(i) $(ValueName) == "MemberType"
                        set AdapterMemberType = $(ValueData)
                    else-ifstr(i) $(ValueName) == "TeamName"
                        set AdapterTeamName = $(ValueData)
                    else-ifstr(i) $(ValueName) == "TeamId"
                        set AdapterTeamId = $(ValueData)
                    else-ifstr(i) $(ValueName) == "TeamType"
                        set AdapterTeamType = $(ValueData)
                    else-ifstr(i) $(ValueName) == "AdvancedFailover"
                        set AdvancedFailover = $(ValueData)
                    endif
                endforlistdo
                closeregkey $(ServicesKey)
            endif

            ; Get the media type.  Only accept ethernet adapter.
            openregkey $(!REG_H_LOCAL) "" $(RegistryServicesKey)+
                $(AdapterServiceName)"\Parameters" $(MAXIMUM_ALLOWED) +
                ServicesKey
            ifstr $(ServicesKey) == ""
                debug-output "Cannot open the adapter service key."
            else
                set ValueList = { }
                getregvalue $(ServicesKey) "MediaType" ValueList
                set MediaType = *($(ValueList), 4)

                set ValueList = { }
                getregvalue $(ServicesKey) "NetworkAddress" ValueList
                set AdapterMACAddr = *($(ValueList), 4)

                set ValueList = { }
                getregvalue $(ServicesKey) "BusNumber" ValueList
                set BusNum = 255
                ifstr *($(ValueList), 4) != ""
                    set BusNum = *($(ValueList), 4)
                endif

                set ValueList = { }
                getregvalue $(ServicesKey) "SlotNumber" ValueList
                set DeviceNum = 255
                ifstr *($(ValueList), 4) != ""
                    set DeviceNum = *($(ValueList), 4)
                endif

                set ValueList = { }
                set FunctionNum = 255
                getregvalue $(ServicesKey) "FunctionNumber" ValueList
                ifstr *($(ValueList), 4) != ""
                    set FunctionNum = *($(ValueList), 4)
                endif

                debug-output "AdapterMACAddr: "$(AdapterMACAddr)
                debug-output "BusNum: "$(BusNum)
                debug-output "DeviceNum: "$(DeviceNum)
                debug-output "FunctionNum: "$(FunctionNum)

                set VID = "0xFFFF"
                set DID = "0xFFFF"
                set SVID = "0xFFFF"
                set SID = "0xFFFF"
                ifint $(BusNum) != 255
                    ifint $(DeviceNum) != 255
                        ifint $(FunctionNum) != 255
                            ; Get vendor ID.
                            LibraryProcedure VID $(HwdtectDll) B57dtectPortIo +
                                "PciRd16" $(BusNum) $(DeviceNum) +
                                $(FunctionNum) "0x00"
                            debug-output "VID: "$(VID)

                            ; Get device id.
                            LibraryProcedure DID $(HwdtectDll) B57dtectPortIo +
                                "PciRd16" $(BusNum) $(DeviceNum) +
                                $(FunctionNum) "0x02"
                            debug-output "DID: "$(DID)

                            ; Get subvendor ID.
                            LibraryProcedure SVID $(HwdtectDll) B57dtectPortIo +
                                "PciRd16" $(BusNum) $(DeviceNum) +
                                $(FunctionNum) "0x2c"
                            debug-output "SVID: "$(SVID)

                            ; Get subsystem id.
                            LibraryProcedure SID $(HwdtectDll) B57dtectPortIo +
                                "PciRd16" $(BusNum) $(DeviceNum) +
                                $(FunctionNum) "0x2e"
                            debug-output "SID: "$(SID)

                            ; Get three bytes class code.
                            ; It has to be '0x020000' as ethernet class.
                            LibraryProcedure CCode1 $(HwdtectDll) +
                                B57dtectPortIo "PciRd8" $(BusNum) +
                                $(DeviceNum) $(FunctionNum) "0x09"
                            debug-output "CCode1: "$(CCode1)

                            LibraryProcedure CCode2 $(HwdtectDll) +
                                B57dtectPortIo "PciRd16" $(BusNum) +
                                $(DeviceNum) $(FunctionNum) "0x0A"
                            debug-output "CCode2: "$(CCode2)

                            ; If this is not enthernet card, don't use the IDs.
                            ifstr(i) $(CCode1) != "0x00"
                                set VID = "0xFFFF"
                                set DID = "0xFFFF"
                                set SVID = "0xFFFF"
                                set SID = "0xFFFF"
                            endif

                            ifstr(i) $(CCode2) != "0x0200"
                                set VID = "0xFFFF"
                                set DID = "0xFFFF"
                                set SVID = "0xFFFF"
                                set SID = "0xFFFF"
                            endif
                        endif
                    endif
                endif


                closeregkey $(ServicesKey)
            endif
        endif

        debug-output "MemberType: "$(AdapterMemberType)
        debug-output "TeamId: "$(AdapterTeamId)
        debug-output "TeamName: "$(AdapterTeamName)

        set AdapterInfo = { $(AdapterDescription), $(AdapterManufacturer), +
            $(AdapterProductName), $(AdapterServiceName), $(AdapterTitle), +
            $(AdapterNumber), $(AdapterMemberType), $(AdapterTeamId),      +
            $(AdapterTeamName), 0, $(AdapterVlanID), $(AdapterVlanName),   +
            $(AdapterTeamType), $(AdapterMACAddr), $(AdvancedFailover),    +
            $(NICType), $(NICType), $(VID), $(DID), $(SVID), $(SID) }
        ifstr(i) $(AdapterProductName) == $(MiniportProductName)
            set VirtualAdapterList = >($(VirtualAdapterList), $(AdapterInfo))
        else
            ; Reject non-ethernet adapters.
            ifstr(i) $(MediaType) == 1
                set PhysicalAdapterList = >($(PhysicalAdapterList), +
                    $(AdapterInfo))
            endif
        endif
    endforlistdo

    FreeLibrary $(HwdtectDll)
    closeregkey $(NetCardKey)

    debug-output "========== Physical adapter list."
    forlistdo $(PhysicalAdapterList)
        debug-output $($)
        debug-output "=="
    endforlistdo

    debug-output "========== Virtual adapter list."
    forlistdo $(VirtualAdapterList)
        debug-output $($)
        debug-output "=="
    endforlistdo

    return $(PhysicalAdapterList) $(VirtualAdapterList)



;*******************************************************************************
; Description:
;    
; Input:
;    $($0):  OptionID to install
;
; Output:
;   STATUS_FAILED
;   STATUS_SUCCESSFUL
;*******************************************************************************
[RunGuiSetup]
    read-syms DebugControl
    debug-output "### RunGuiSetup"

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

    set OptionId = $($0)
    debug-output "OptionId : "$(OptionId)

    ; Build the virtual and physical adapter list.
    shell "" BuildAdapterList
    set PhysicalAdapterList = $($R0)
    set VirtualAdapterList = $($R1)

    ; Make sure we have at least one physical adapters.
    QueryListSize PhysicalAdapterCount $(PhysicalAdapterList)
    ifint $(PhysicalAdapterCount) < 1
        shell "" ShowErrorMessage "NONFATAL" $(MsgNeedMoreAdapters)
        return STATUS_SUCCESSFUL
    endif

    ; Load the configuration dll.
    LoadLibrary $(MsgCannotFindBlfDll) $(BlfDll) DllHandle

    ; Display the dialog box.
    LibraryProcedure ReturnCode $(DllHandle) BLF_ShowDialog +
        $(PhysicalAdapterList) $(VirtualAdapterList)
    ifstr(i) $(ReturnCode) != STATUS_LIST_MODIFIED
        FreeLibrary $(DllHandle)
        return STATUS_USERCANCEL
    endif

    ; Get the new physical adapter list.
    LibraryProcedure PhysicalAdapterList $(DllHandle) BLF_GetAdapterList +
        PHYSICAL_ADAPTER_LIST
    debug-output "New physical adapter list: "$(PhysicalAdapterList)

    ; Get the new virtual adapter list.
    LibraryProcedure VirtualAdapterList $(DllHandle) BLF_GetAdapterList +
        VIRTUAL_ADAPTER_LIST
    debug-output "New virtual adapter list: "$(VirtualAdapterList)

    ; Install new virtual adapters.
    set NewVirtualAdapterList = { }
    forlistdo $(VirtualAdapterList)
        set VirtualAdapter = $($)

        ; Determine if the virtual adapter was 1-new, 2-modified, 3-removed.
        ifint *($(VirtualAdapter), 10) == 1
            debug-output "New virtual adapter, team name = "+
                *($(VirtualAdapter), 9);
            
            shell "" InstallVirtualMiniport $(VirtualAdapter) $(OptionId)
            ifstr(i) $($R0) == STATUS_SUCCESSFUL
                set VirtualAdapter = $($R1)
            else
                debug-output "Create Virtual miniport failed."
            endif 
        endif

        ifstr(i) $(VirtualAdapter) != ""
            set NewVirtualAdapterList = >($(NewVirtualAdapterList), +
                $(VirtualAdapter))
        endif
    endforlistdo

    set VirtualAdapterList = $(NewVirtualAdapterList)

    ; Remove and update virtual adapters.
    set NewVirtualAdapterList = { }
    forlistdo $(VirtualAdapterList)
        set VirtualAdapter = $($)

        ; Determine if the virtual adapter was 1-new, 2-modified, 3-removed.
        ifint *($(VirtualAdapter), 10) == 3
            debug-output "Remove virtual adapter, team name = "+
                *($(VirtualAdapter), 9);
            
            shell "" RemoveVirtualMiniport $(VirtualAdapter)

            set VirtualAdapter = ""
        else-ifint *($(VirtualAdapter), 10) != 1
            debug-output "Update virtual adapter, team name = "+
                *($(VirtualAdapter), 9);

            shell "" UpdateMiniport $(VirtualAdapter) $(VirtualAdapterList)
        else
            debug-output "New virtual adapter, team name = "+
                *($(VirtualAdapter), 9);
        endif

        ifstr(i) $(VirtualAdapter) != ""
            set VirtualAdapter = { *($(VirtualAdapter), 1),             +
                *($(VirtualAdapter), 2), *($(VirtualAdapter), 3),       +
                *($(VirtualAdapter), 4), *($(VirtualAdapter), 5),       +
                *($(VirtualAdapter), 6), *($(VirtualAdapter), 7),       +
                *($(VirtualAdapter), 8), *($(VirtualAdapter), 9), "0",  +
                *($(VirtualAdapter), 11), *($(VirtualAdapter), 12),     +
                *($(VirtualAdapter), 13), *($(VirtualAdapter), 14),     +
                *($(VirtualAdapter), 15), *($(VirtualAdapter), 16) } 

            set NewVirtualAdapterList = >($(NewVirtualAdapterList), +
                $(VirtualAdapter))
        endif
    endforlistdo

    set VirtualAdapterList = $(NewVirtualAdapterList)

    ; All virtual adapters got 'pAdapterNum'. We need to adjust the Team ID
    ; of VLAN virtual adapter to the correct Team ID.
    set NewVirtualAdapterList = { }
    forlistdo $(VirtualAdapterList)
        set VirtualAdapter = $($)
        set AdapterNum = *($(VirtualAdapter), 6)
        forlistdo $(VirtualAdapterList)
            set VlanAdapter = $($)
            ifstr(i) *($(VirtualAdapter), 9) == *($(VlanAdapter), 9)
                ifint $(AdapterNum) > *($(VlanAdapter), 6)
                    set AdapterNum = *($(VlanAdapter), 6)
                endif
            endif
        endforlistdo

        set VirtualAdapter = { *($(VirtualAdapter), 1),             +
            *($(VirtualAdapter), 2), *($(VirtualAdapter), 3),       +
            *($(VirtualAdapter), 4), *($(VirtualAdapter), 5),       +
            $(AdapterNum), *($(VirtualAdapter), 7),                 +
            $(AdapterNum), *($(VirtualAdapter), 9), "0",            +
            *($(VirtualAdapter), 11), *($(VirtualAdapter), 12),     +
            *($(VirtualAdapter), 13), *($(VirtualAdapter), 14),     +
            *($(VirtualAdapter), 15), *($(VirtualAdapter), 16) } 

        set NewVirtualAdapterList = >($(NewVirtualAdapterList), +
            $(VirtualAdapter))
    endforlistdo

    set VirtualAdapterList = $(NewVirtualAdapterList)

    forlistdo $(VirtualAdapterList)
        set VirtualAdapter = $($)
        shell "" UpdateMiniport $(VirtualAdapter) $(VirtualAdapterList)
    endforlistdo

    ; If a team was deleted, remove all references to the team.
    set NewPhysicalAdapterList = { }
    forlistdo $(PhysicalAdapterList)
        set HasTeam = "0"
        set AdapterInfo = $($)
        forlistdo $(VirtualAdapterList)
            set VirtualAdapter = $($)
            ifstr(i) *($(AdapterInfo), 9) == *($(VirtualAdapter), 9)
                set HasTeam = "1"
            endif
        endforlistdo

        ifint $(HasTeam) != 1
            ; set TeamId field to 0 and TeamName = "".
            set AdapterInfo = { *($(AdapterInfo), 1), *($(AdapterInfo), 2), +
                *($(AdapterInfo), 3), *($(AdapterInfo), 4),                 +
                *($(AdapterInfo), 5), *($(AdapterInfo), 6),                 +
                *($(AdapterInfo), 7), 0, "", *($(AdapterInfo), 10),         +
                *($(AdapterInfo), 11), *($(AdapterInfo), 12),               +
                *($(AdapterInfo), 13), *($(AdapterInfo), 14),               +
                *($(AdapterInfo), 15), *($(AdapterInfo), 16) }
        endif

        set NewPhysicalAdapterList = >($(NewPhysicalAdapterList), +
            $(AdapterInfo))
    endforlistdo

    set PhysicalAdapterList = $(NewPhysicalAdapterList)

    ; Assign team Ids.
    debug-output "Assigning team id to all the physical adapters."
    set NewPhysicalAdapterList = { }

    forlistdo $(PhysicalAdapterList)
        set PhysicalAdapter = $($)
        set PhysicalAdapterTeamId = *($(PhysicalAdapter), 8)

        forlistdo $(VirtualAdapterList)
            set VirtualAdapter = $($)
            debug-output "Virtual adapter: "$(VirtualAdapter)

            ifstr(i) *($(PhysicalAdapter), 9) == *($(VirtualAdapter), 9)
                set PhysicalAdapterTeamId = *($(VirtualAdapter), 8)
                debug-output "New team id: "$(PhysicalAdapterTeamId)
            endif

        endforlistdo

        set PhysicalAdapter = { *($(PhysicalAdapter), 1),         +
            *($(PhysicalAdapter), 2), *($(PhysicalAdapter), 3),   +
            *($(PhysicalAdapter), 4), *($(PhysicalAdapter), 5),   +
            *($(PhysicalAdapter), 6), *($(PhysicalAdapter), 7),   +
            $(PhysicalAdapterTeamId), *($(PhysicalAdapter), 9),   +
            *($(PhysicalAdapter), 10), *($(PhysicalAdapter), 11), +
            *($(PhysicalAdapter), 12), *($(PhysicalAdapter), 13), +
            *($(PhysicalAdapter), 14), *($(PhysicalAdapter), 15), +
            *($(PhysicalAdapter), 16) }

        debug-output "Physical adapter: "$(PhysicalAdapter)

        set NewPhysicalAdapterList = >($(NewPhysicalAdapterList), +
            $(PhysicalAdapter))
    endforlistdo

    set PhysicalAdapterList = $(NewPhysicalAdapterList)

    debug-output "The new physical adapter list after assigning ids. "+
        $(PhysicalAdapterList)

    ; Update all the physical adapters.
    forlistdo $(PhysicalAdapterList)
        shell "" UpdateMiniport $($) $(VirtualAdapterList)
    endforlistdo

    FreeLibrary $(DllHandle)

    return STATUS_SUCCESSFUL



;*******************************************************************************
; Description:
;    
; Input:
;    $($0)      Virtual adapter to remove
;
; Output:
;    $($R0)     STATUS_FAILED or STATUS_SUCCESSFUL
;*******************************************************************************
[RemoveVirtualMiniport]
    read-syms DebugControl
    debug-output "### RemoveVirtualMiniport"

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

    set VirtualAdapter = $($0)
    debug-output "Virtual adapter to remove: "$(VirtualAdapter)

    ; Get the adapter instance.
    set AdapterInstance = *($(VirtualAdapter), 6)

    ; Remove the virtual adapter.
    shell $(UtilityInf), RemoveHardwareComponent, $(Manufacturer), +
        $(MiniportProductName), $(RegistryNetCardKey)$(AdapterInstance)
    ifstr(i) $($R0) != NO_ERROR
        debug-output "Cannot remove the virtual adapter."
        shell "" ShowShellErrorMessage
        return STATUS_FAILED
    endif

    return STATUS_SUCCESSFUL



;*******************************************************************************
; Description:
;    
; Input:
;    $($0)  Physical adapter list.
;    $($1)  virtual adapter list.
;
; Output:
;    $($R0) STATUS_FAILED or STATUS_SUCCESSFUL.
;*******************************************************************************
[ModifyBindings]
    read-syms DebugControl
    debug-output "### ModifyBindings"

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

    set PhysicalAdapterList = $($0)
    set VirtualAdapterList = $($1)

    ; Load the configuration dll.
    LoadLibrary $(MsgCannotFindBlfDll) $(BlfDll) DllHandle

    LibraryProcedure ReturnCode $(DllHandle) BLF_ConfigBinding +
            $(PhysicalAdapterList) $(VirtualAdapterList)
    ifstr(i) $(ReturnCode) != STATUS_SUCCESSFUL
        FreeLibrary $(DllHandle)
        return STATUS_FAILED
    endif

    FreeLibrary $(DllHandle)

    return STATUS_SUCCESSFUL



;*******************************************************************************
; Description:
;    
; Input:
;    None.
;
; Output:
;    $($R0): STATUS: STATUS_SUCCESSFUL
;    $($R1): Option Type (COMPUTER ...)
;    $($R2): Diskette description
;*******************************************************************************
[Identify]
    read-syms DebugControl
    debug-output "### Identify"

    read-syms Identification

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

    return $(Status) $(Identifier) $(Media)



;*******************************************************************************
; Description:
;
; Input:
;    $($0):  Language used.  (ENG|FRN|...)
;
; Output:
;    $($R0): STATUS: STATUS_SUCCESSFUL
;                    STATUS_NOLANGUAGE
;                    STATUS_FAILED
;                    STATUS_NOTSUPPORTED
;
;    $($R1): Option List
;    $($R2): Option Text List
;*******************************************************************************
[ReturnOptions]
    read-syms DebugControl
    debug-output "### ReturnOptions"

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

    ifcontains(i) $($0) in $(LanguageList)
        set Status         = STATUS_SUCCESSFUL
        set OptionList     = ^(Options, 1)
        set OptionTextList = ^(OptionsText$($0), 1)
    else
        debug-output "Language not supported."
        set Status = STATUS_NOLANGUAGE
    endif

    return $(Status) $(OptionList) $(OptionTextList)



;*******************************************************************************
; Description:
;    This section performs the following tasks:
;       Copy files representing Options.
;       Configure the installed option.
;       Update the registry for the installed option
;
; Input:
;    $($0):  Language to use
;    $($1):  OptionID to install
;    $($2):  SourceDirectory
;    $($3):  AddCopy  (YES | NO)
;    $($4):  DoCopy   (YES | NO)
;    $($5):  DoConfig (YES | NO)
;
; Output:
;    $($R0): STATUS: STATUS_SUCCESSFUL |
;                    STATUS_NOLANGUAGE |
;                    STATUS_USERCANCEL |
;                    STATUS_FAILED
;*******************************************************************************
[InstallOption]
    read-syms DebugControl
    debug-output "### InstallOption"
    set OptionId = $($1)
    set SrcDir   = $($2)
    set AddCopy  = $($3)
    set DoCopy   = $($4)
    set DoConfig = $($5)

    debug-output "OptionId : "$(OptionId)
    debug-output "SrcDir : "$(SrcDir)
    debug-output "AddCopy : "$(AddCopy)
    debug-output "DoCopy : "$(DoCopy)
    debug-output "DoConfig : "$(DoConfig)

    Set LanguageList = ^(LanguagesSupported, 1)
    ifcontains(i) $($0) not-in $(LanguageList)
        return STATUS_NOLANGUAGE
    endif

    set-title $(Function$(OptionId)Title)

    ifstr(i) $(!NTN_InstallMode) == Deinstall
        shell "" RemoveSection $(OptionId)
        set Status = $($R0)
    else-ifstr(i) $(!NTN_InstallMode) == Update
        shell "" UpdateSection  $(OptionId) $(SrcDir)
        set Status = $($R0)
    else-ifstr(i) $(!NTN_InstallMode) == Bind
        shell "" BindSection $(OptionId)
        set Status = $($R0)
    else-ifstr(i) $(!NTN_InstallMode) == Configure
        shell "" ConfigureSection $(OptionId)
        set Status = $($R0)
    else
        startwait
        shell "" InstallSection $($1) $($2) $($3) $($4) $($5)
        endwait

        set Status = $($R0)
        ifstr(i) $(Status) != STATUS_SUCCESSFUL
            ifstr(i) $(Status) != STATUS_WAS_INSTALLED
                ifstr(i) $(Status) != STATUS_UNSUPPORTED
                    shell "" RemoveSection $(OptionId)
                endif
            endif
        endif
    endif

    return $(Status)



;*******************************************************************************
; Description:
;    
; Input:
;    $($0):  OptionID to install
;
; Output:
;    $($R0) Status
;*******************************************************************************
[RemoveSection]
    read-syms DebugControl
    debug-output "### RemoveSection"

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

    set OptionId = $($0)

    openregkey $(!REG_H_LOCAL) "" $(TransportProductKeyName) +
        $(MAXIMUM_ALLOWED) KeyProduct

    ifstr $(KeyProduct) == ""
        debug-output "Cannot get registry key."
        shell "" ShowErrorMessage "FATAL" $(MsgRegistryKeyDoesNotExist)
        return STATUS_FAILED
    endif

    shell $(UtilityInf), GetInfFileNameFromRegistry, $(KeyProduct)

    ifint $($ShellCode) != $(!SHELL_CODE_OK)
        Debug-Output "Cannot get inf name from the registry."
        shell "" ShowShellErrorMessage
        return STATUS_FAILED
    endif

    set !UG_Filename = $($R0)
    debug-output "### UG_Filename="$(!UG_Filename)

    ; Build the physical and virtual adapter list.
    shell "" BuildAdapterList
    set PhysicalAdapterList = $($R0)
    set VirtualAdapterList = $($R1)

    ; remove all the virtual adapters.
    forlistdo $(VirtualAdapterList)
        set VirtualAdapter = $($)

        shell "" RemoveVirtualMiniport $(VirtualAdapter)
        ifstr(i) $($R0) != STATUS_SUCCESSFUL
            debug-output "Cannot remove virtual miniport: "$(VirtualAdapter)
        endif
    endforlistdo

    ; Remove all references to teams.
    set NewPhysicalAdapterList = { }
    forlistdo $(PhysicalAdapterList)
        set AdapterInfo = $($)

        ; set TeamId field to 0 and TeamName = "".
        set AdapterInfo = { *($(AdapterInfo), 1), *($(AdapterInfo), 2), +
            *($(AdapterInfo), 3), *($(AdapterInfo), 4),                 +
            *($(AdapterInfo), 5), *($(AdapterInfo), 6),                 +
            *($(AdapterInfo), 7), 0, "", *($(AdapterInfo), 10),         +
            *($(AdapterInfo), 11), *($(AdapterInfo), 12),               +
            *($(AdapterInfo), 13), *($(AdapterInfo), 14),               +
            *($(AdapterInfo), 15), *($(AdapterInfo), 16) }

        set NewPhysicalAdapterList = >($(NewPhysicalAdapterList), +
            $(AdapterInfo))
    endforlistdo

    set PhysicalAdapterList = $(NewPhysicalAdapterList)

    ; Update the physical adapter settings.  All the physical adapter should
    ; already have the TeamName removed.
    debug-output "Updated physical adapters: "$(PhysicalAdapterList)
    forlistdo $(PhysicalAdapterList)
        shell "" UpdateMiniport $($) $(VirtualAdapterList)
    endforlistdo

    shell "" BindSection $(OptionId)

    ; Remove the transport.
    debug-output "Removing the transport protocol."
    shell $(UtilityInf), RemoveSoftwareComponent, $(Manufacturer), +
        $(TransportProductName)
    ifstr(i) $($R0) != NO_ERROR
        debug-output "Remove transport failed."

        shell "" ShowRegistryErrorMessage "FATAL" $($R0)
    endif

    AddfileToDeleteList $(!STF_WINDOWSSYSPATH)"\drivers\basfnt4.sys"
    AddfileToDeleteList $(!STF_WINDOWSSYSPATH)"\basfnt4.dll"
    AddfileToDeleteList $(!STF_WINDOWSSYSPATH)"\drivers\baspnt4.sys"
    AddfileToDeleteList $(!STF_WINDOWSSYSPATH)"\baspnt4.dll"
    AddfileToDeleteList $(!STF_WINDOWSSYSPATH)"\"$(!UG_Filename)

    return STATUS_SUCCESSFUL



;*******************************************************************************
; Description:
;    
; Input:
;    $($0):  OptionID to install
;    $($1):  SourceDirectory
;
; Output:
;    $($R0) Status
;*******************************************************************************
[UpdateSection]
    read-syms DebugControl
    debug-output "### UpdateSection"

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

    set OptionId = $($0)
    set SrcDir   = $($1)

    ; Check to see if the is server machine.
    openregkey $(!REG_H_LOCAL) "" $(RegistryProductOptionsKey) +
        $(MAXIMUM_ALLOWED) ProductOptionsKey
    ifstr $(ProductOptionsKey) != ""
        set ValueList = { }
        getregvalue $(ProductOptionsKey) "ProductType" ValueList
        set ProductType = *($(ValueList), 4)
        ifstr(i) $(ProductType) == "WinNT"
            closeregkey $(ProductOptionsKey)
            shell "" ShowErrorMessage "FATAL" $(MsgPlatformNotSupported)
            return STATUS_FAILED
        endif
    endif

    closeregkey $(ProductOptionsKey)

    openregkey $(!REG_H_LOCAL) "" $(TransportProductKeyName) +
        $(MAXIMUM_ALLOWED) KeyProduct

    ifstr $(KeyProduct) == ""
        debug-output "Cannot get registry key."
        shell "" ShowErrorMessage "FATAL" $(MsgRegistryKeyDoesNotExist)
        return STATUS_FAILED
    endif

    debug-output "TransportProductKeyName: "$(TransportProductKeyName)
    getregvalue $(ProductKey), "MajorVersion", VersionInfo
    set MajorVersion = *($(VersionInfo), 4)
    debug-output "VersionInfo: "$(VersionInfo)
    debug-output "Major version: "$(MajorVersion)
    getregvalue $(ProductKey), "MinorVersion", VersionInfo
    set MinorVersion = *($(VersionInfo), 4)
    debug-output "VersionInfo: "$(VersionInfo)
    debug-output "Minor version: "$(MinorVersion)
    getregvalue $(ProductKey), "BuildVersion", VersionInfo
    set BuildVersion = *($(VersionInfo), 4)
    debug-output "VersionInfo: "$(VersionInfo)
    debug-output "Build version: "$(BuildVersion)

    set-mul OldVersion = $(MajorVersion), 1000
    set-add OldVersion = $(OldVersion), $(MinorVersion)
    set-mul OldVersion = $(OldVersion), 1000
    set-add OldVersion = $(OldVersion), $(BuildVersion)
    debug-output "OldVersion: "$(OldVersion)

    set-mul NewVersion = $(ProductMajorVersion), 1000
    set-add NewVersion = $(NewVersion), $(ProductMinorVersion)
    set-mul NewVersion = $(NewVersion), 1000
    set-add NewVersion = $(NewVersion), $(ProductBuildVersion)
    debug-output "NewVersion: "$(NewVersion)

    ifint $(OldVersion) > $(NewVersion)
        debug-output "Oldversion: "$(OldVersion)",   NewVersion: "$(NewVersion)
        shell "" ShowErrorMessage "FATAL" $(MsgDowngrade)
        return STATUS_USERCANCEL
    endif


    shell $(UtilityInf), GetInfFileNameFromRegistry, $(KeyProduct)

    ifint $($ShellCode) != $(!SHELL_CODE_OK)
        Debug-Output "Cannot get inf name from the registry."
        shell "" ShowShellErrorMessage
        return STATUS_FAILED
    endif

    set !UG_Filename = $($R0)
    ifstr(i) $(!UG_Filename) != ""
        install "Install-Update"
    endif

    setregvalue $(KeyProduct) { MajorVersion, $(NoTitle), $(!REG_VT_SZ), +
        $(ProductMajorVersion) }
    setregvalue $(KeyProduct) { MinorVersion, $(NoTitle), $(!REG_VT_SZ), +
        $(ProductMinorVersion) }
    setregvalue $(KeyProduct) { BuildVersion, $(NoTitle), $(!REG_VT_SZ), +
        $(ProductBuildVersion) }

    closeregkey $(KeyProduct)

    return STATUS_SUCCESSFUL



;*******************************************************************************
; Description:
;    
; Input:
;    $($0):  OptionID to install
;
; Output:
;    $($R0) Status
;*******************************************************************************
[BindSection]
    read-syms DebugControl
    debug-output "### BindSection"

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

    set OptionId = $($0)

    ; Build the virtual and physical adapter list.
    shell "" BuildAdapterList
    set PhysicalAdapterList = $($R0)
    set VirtualAdapterList = $($R1)
    debug-output "PhysicalAdapterList = "$(PhysicalAdapterList)

    shell "" ModifyBindings $(PhysicalAdapterList) $(VirtualAdapterList)

    set Status = $($R0)

    return $(Status)



;*******************************************************************************
; Description:
;    
; Input:
;    $($0):  OptionID to install
;
; Output:
;    $($R0)  STATUS_FAILED or STATUS_SUCCESSFUL
;*******************************************************************************
[ConfigureSection]
    read-syms DebugControl
    debug-output "### ConfigureSection"

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

    set OptionId = $($0)

    shell "" RunGuiSetup $(OptionId)

    return $($R0)



;*******************************************************************************
; Description:
;    
; Input:
;    $($0):  OptionID to install
;    $($1):  SourceDirectory
;    $($2):  AddCopy  (YES | NO)
;    $($3):  DoCopy   (YES | NO)
;    $($4):  DoConfig (YES | NO)
;
; Output:
;    $($R0)  STATUS_FAILED, STATUS_SUCCESSFUL, STATUS_WAS_INSTALLED,
;            STATUS_UNSUPPORTED or STATUS_USERCANCEL
;*******************************************************************************
[InstallSection]
    read-syms DebugControl
    debug-output "### InstallSection"

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

    set OptionId = $($0)
    set SrcDir   = $($1)
    set AddCopy  = $($2)
    set DoCopy   = $($3)
    set DoConfig = $($4)

    debug-output "OptionId : "$(OptionId)
    debug-output "SrcDir : "$(SrcDir)
    debug-output "AddCopy : "$(AddCopy)
    debug-output "DoCopy : "$(DoCopy)
    debug-output "DoConfig : "$(DoConfig)

    ; Check to see if the transport is already installed.
    openregkey $(!REG_H_LOCAL) "" $(TransportProductKeyName) +
        $(MAXIMUM_ALLOWED) TransportProductKey
    ifstr $(TransportProductKey) != ""
        closeregkey $(TransportProductKey)
        shell "" ShowErrorMessage "FATAL" $(MsgProductAlreadyInstalled)
        return STATUS_WAS_INSTALLED
    endif
    closeregkey $(TransportProductKey)

    ; Check to see if the is server machine.
    openregkey $(!REG_H_LOCAL) "" $(RegistryProductOptionsKey) +
        $(MAXIMUM_ALLOWED) ProductOptionsKey
    ifstr $(ProductOptionsKey) != ""
        set ValueList = { }
        getregvalue $(ProductOptionsKey) "ProductType" ValueList
        set ProductType = *($(ValueList), 4)
        ifstr(i) $(ProductType) == "WinNT"
            closeregkey $(ProductOptionsKey)
            shell "" ShowErrorMessage "FATAL" $(MsgPlatformNotSupported)
            return STATUS_UNSUPPORTED
        endif
    endif

    closeregkey $(ProductOptionsKey)

    ifstr(i) $(DoCopy) == "YES"
        debug-output "DoCopy"

        shell $(UtilityInf) DoAskSource $(!STF_CWDDIR) $(SrcDir) YES
        ifint $($ShellCode) != $(!SHELL_CODE_OK)
            shell "" ShowShellErrorMessage
            return STATUS_FAILED
        else-ifstr(i) $($R0) == STATUS_FAILED
            shell "" ShowRegistryErrorMessage "FATAL" ASK_SOURCE_FAIL
            return STATUS_FAILED
        else-ifstr(i) $($R0) == STATUS_USERCANCEL
            debug-output "User cancelled."
            return STATUS_USERCANCEL
        endif

        set SrcDir = $($R1)
    endif

    ; Copy the files
    install "Install-Option"
    ifstr(i) $(STF_INSTALL_OUTCOME) != STF_SUCCESS
        debug-output "Copy file failed."

        shell "" ShowRegistryErrorMessage "FATAL" UNABLE_COPY_FILE

        return STATUS_FAILED
    endif

    ; Install the protocol driver.
    shell "" InstallTransport $(OptionId)
    ifstr(i) $($R0) != STATUS_SUCCESSFUL
        return STATUS_FAILED
    endif

    ; Gui setup.
    shell "" RunGuiSetup $(OptionId)

    ifstr(i) $($R0) != STATUS_SUCCESSFUL
        ifstr(i) $($R0) != STATUS_USERCANCEL
            return STATUS_FAILED
        endif
    endif

    return STATUS_SUCCESSFUL

server: web1, load: 0.98