;/****************************************************************************/
;/* oemsetup.inf                                                             */
;/*                                                                          */
;/* installation script for Madge Blue+ Network Adapter Cards                */
;/* version 1.06                                                             */
;/* August 1995                                                              */
;/****************************************************************************/

;/****************************************************************************/
;/* Required section 1 - [Identify]                                          */
;/****************************************************************************/

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


;/****************************************************************************/
;/* [Identify] Support sections                                              */
;/****************************************************************************/

[Identification]
    OptionType = NetAdapter


;/****************************************************************************/
;/* Required section 2 - [ReturnOptions]                                     */
;/****************************************************************************/

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


;/****************************************************************************/
;/* [ReturnOptions] Support sections                                         */
;/****************************************************************************/

[Options]
    BLUTOK

; PlatformsSupported appears to support an optional second parameter to
; the [ReturnOptions] section.

[PlatformsSupported]
    ISA
    EISA
    MCA


;/****************************************************************************/
;/* Required section 3 - [InstallOption]                                     */
;/****************************************************************************/

[InstallOption]
    set Option   = $($1)
    set SrcDir   = $($2)
    set AddCopy  = $($3)
    set DoCopy   = $($4)
    set DoConfig = $($5)

    set !DebugOutputControl = 1

    ; Check language is OK
    set LanguageList = ^(LanguagesSupported, 1)
    Ifcontains(i) $($0) NOT-IN $(LanguageList)
	Return STATUS_NOLANGUAGE
    endif

    Debug-Output "BLUTOK.INF: STF_CWDDIR is: "$(!STF_CWDDIR)
    set-subst LF = "\n"
    read-syms GeneralConstants
    read-syms FileConstants

    ;    Shell $(UtilityInf), GetBindingInfo, "IBM"
    ;    ifint $($ShellCode) != $(!SHELL_CODE_OK)
    ;        Debug-Output "ShellCode error: cannot get an error string."
    ;        goto ShellCodeError
    ;    endif
    ;    set NetRuleSoftwareBindable = $($R1)

    ; set NetRuleSoftwareBindable - can't use GetBindingInfo without MS help!
    set NetRuleSoftwareBindable = {"blutokDriver blutokAdapter non exclusive 100"}

    read-syms DialogConstants$($0)
    ifstr(i) $(!NTN_Origination) == "NCPA"
	set Continue = $(OK)
    endif

    read-syms FileConstants$($0)

    detect date

    sethelpfile blutok.hlp $(BLUE_HELP_BASE) $(BLUE_HELP_LIMIT)

    set-title  $(FunctionTitle)
    set to   = Begin
    set from = Begin
    set CommonStatus = STATUS_SUCCESSFUL
    EndWait

Begin = +
    set ActivateDetection = FALSE

    Ifstr(i) $(!NTN_InstallMode) == deinstall
	set StartLabel = removeadapter
    else-Ifstr(i) $(!NTN_InstallMode) == bind
	set StartLabel = bindingadapter
    else-Ifstr(i) $(!NTN_InstallMode) == Update
	set StartLabel = UpgradeSoftware
    else-Ifstr(i) $(!NTN_InstallMode) == configure
	set CommonStatus = STATUS_REBOOT
;        set ActivateDetection = TRUE
	set StartLabel = configureadapter
	Ifstr(i) $(ProductKeyName) == $(!NTN_RegBase)
	    Debug-Output "Cannot configure the IBM software."
	    Shell $(UtilityInf),RegistryErrorString,CANNOT_CONFIGURE_SOFTWARE
	    ifint $($ShellCode) != $(!SHELL_CODE_OK)
		Debug-Output "ShellCode error: cannot get an error string."
		goto ShellCodeError
	    endif
	    set Error = $($R0)
	    set from = end
	    set to = end
	    goto nonfatalinfo
	endif
    else
	set StartLabel = installadapter
	set OEM_ABANDON_OPTIONS  = {}
	set OEM_ABANDON_SOFTWARE = FALSE
	set OEM_ABANDON_ON       = TRUE
; Let's not do any detection just yet...
;        set ActivateDetection    = TRUE
    endif

    set IOBaseAddress = 1

    Debug-Output "BluTok.INF: =================================================="
    Debug-Output "BluTok.INF: STF_CWDDIR is: "$(!STF_CWDDIR)
    Debug-Output "BluTok.INF: STF_LANGUAGE is: "$(!STF_LANGUAGE)
    Debug-Output "BluTok.INF: Option is: "$(Option)
    Debug-Output "BluTok.INF: NTN_ORIGINATION is: "$(!NTN_Origination)
    Debug-Output "BluTok.INF: !STF_NCDETECT  is: "$(!STF_NCDETECT)
;    Debug-Output "BluTok.INF: !STF_NCOPTION  is: "$(!STF_NCOPTION)
;    Debug-Output "BluTok.INF: !STF_NCDETCARD is: "$(!STF_NCDETCARD)
;    Debug-Output "BluTok.INF: !STF_NCDETINFO is: "$(!STF_NCDETINFO)
    Debug-Output "BluTok.INF: =================================================="

    Set DetectedCard = FALSE
    Ifstr(i) $(ActivateDetection) != TRUE
	Goto skipdetection
    Endif
    Set TypeList = {{IOADDR, IOADDR_Addr_List, IOBaseAddress}}
    Debug-Output "BluTok.INF: Calling Param_BuildTypeLists"
    Shell $(ParamInf) Param_BuildTypeLists $(Option) $(TypeList)
    Set Status = $($R0)
    ifstr(i) $(Status) != STATUS_SUCCESSFUL
	Goto fataldetect
    Endif
    Debug-Output "BluTok.INF: Calling Param_SetDefaults"
    Shell $(ParamInf) Param_SetDefaults {}
    Ifstr(i) $(!STF_NCDETECT) == YES
	Ifstr(i) $(!STF_NCOPTION) == $(Option)
	   Set DetectedCard = TRUE
	   Debug-Output "BluTok.INF: Setting DetectedCard to TRUE"
	Endif
    Endif

skipdetection =+
    set from = $(fatal)
    set to = $(fatal)
    goto $(StartLabel)

installadapter = +
    ; ProductKeyName = \HKEY_LOCAL_MACHINE\SOFTWARE\Madge\BluTok\CurrentVersion
    OpenRegKey $(!REG_H_LOCAL) "" $(ProductKeyName) $(MAXIMUM_ALLOWED) KeyProduct
    Ifstr $(KeyProduct) != $(KeyNull)
	CloseRegKey $(KeyProduct)
	ifstr(i) !(NTN_RegBase) == $(ProductKeyName)
	   Shell $(UtilityInf), VerExistedDlg, $(ProductSoftwareTitle),+
	       $(ProductVersion)
	   ifint $($ShellCode) != $(!SHELL_CODE_OK)
	       Debug-Output "ShellCode error: cannot get an error string."
	       goto ShellCodeError
	   endif
	   goto end
	else
	   Shell $(UtilityInf), CardExistedDlg
	   ifint $($ShellCode) != $(!SHELL_CODE_OK)
	       Debug-Output "ShellCode error: cannot get an error string."
	       goto ShellCodeError
	   endif
	   ifstr(i) $($R1) != "OK"
	       set CommonStatus = STATUS_USERCANCEL
	       goto end
	   endif
	   set OldVersionExisted = $(TRUE)
	endif
    endif
    Ifstr(i) $(DetectedCard) != TRUE
	Goto adaptersetup
    Endif
    StartWait
    Shell $(ParamInf) Param_QueryCard $(!STF_NCDETCARD)
    EndWait
    Ifstr(i) $($R0) != STATUS_SUCCESSFUL
	Goto adaptersetup
    Endif
    Set DetectedParams = $($R1)
    Debug-Output "BluTok.INF: Calling Param_SetDefaults to merge detected params"
    Shell $(ParamInf) Param_SetDefaults $(DetectedParams)
    goto adapteroptions

configureadapter = +
    Ifstr $(KeyProduct) == $(KeyNull)
	OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_RegBase) $(MAXIMUM_ALLOWED) KeyProduct
	Ifstr $(KeyProduct) == $(KeyNull)
	    set RegistryErrorIndex = CANNOT_FIND_COMPONENT_SERVICE
	    Debug-Output "Cannot find component product key"
	    goto fatalregistry
	Endif
    Endif
    Debug-Output "BluTok.INF: Shelling to FindService"
    Shell $(UtilityInf) FindService, $(KeyProduct)
    Ifint $($ShellCode) != $(!SHELL_CODE_OK)
	Debug-Output "BluTok.INF: FindService shell failure"
	Goto ShellCodeError
    Endif
    Ifstr(i) $($R0) != NO_ERROR
	Debug-Output "BluTok.INF: FindService Shell error: "$($R0)
	Goto fatalregistry
    endif
    set KeyParameters = $($R2)
    CloseRegKey $($R1)
    Ifstr $(KeyParameters) == $(KeyNull)
	set RegistryErrorIndex = "CANNOT_FIND_COMPONENT_SERVICE"
	Debug-Output "Cannot find component service"
	goto fatalregistry
    endif
    set OldVersionExisted = $(TRUE)
    set ValueName = ""
    set ValueData = ""
    set ValueStr  = ""
    set ValueList = {}
    EnumRegValue $(KeyParameters) ValueList
    ForListDo $(ValueList)
	set ValueItem = $($)
	set ValueName = *($(ValueItem),1)
	set ValueData = *($(ValueItem),4)
	Ifstr(i) $(ValueName) == "IOBaseAddress"
	   set IOBaseAddress = $(ValueData)
	else-Ifstr(i) $(ValueName) == "NetworkAddress"
	   set NetworkAddress = $(ValueData)
	else-ifstr(i) $(ValueName) == "BusType"
	    set BusInterfaceType = $(ValueData)
	else-ifstr(i) $(ValueName) == "BusNumber"
	    set BusNumber = $(ValueData)
	else-ifstr(i) $(ValueName) == "MaxFrameSize"
	    set MaxFrameSize = $(ValueData)
	endif
    EndForListDo
    ifstr(i) $(IOBaseAddress) == ""
	set IOBaseAddress = 1
    endif

adaptersetup =+
;    Shell $(ParamInf) Param_ParameterConfidence
;    Ifstr(i) $($R0) != STATUS_SUCCESSFUL
;        Debug-Output "BluTok.INF: parameter confidence too low to bypass configuration"
;        Goto adapteroptions
;    Endif
;    Ifstr(i) $(DetectedCard) == TRUE
;        Ifstr(i) $(!STF_INSTALL_MODE) != CUSTOM
;            Goto adapterverify
;        Endif
;    Endif

    goto adapteroptions

adapteroptions = +
    set from = adapteroptions
    ifstr(i) $(!STF_GUI_UNATTENDED) == "YES"
	ifstr(i) $(!AutoNetInterfaceType) != ""
	    set BusInterfaceType = $(!AutoNetInterfaceType)
	else
	    set BusInterfaceType = 1    
	endif
	ifstr(i) $(!AutoNetBusNumber) != ""
	    set BusNumber = $(!AutoNetBusNumber)
	else
	    set BusNumber = 0
	endif
	goto adapterverify
    endif

    ; We need our own installation dll for resources...

    ifint $(OldVersionExisted) != $(TRUE)

	shell $(UtilityInf) DoAskSource $(!STF_CWDDIR) $(SrcDir) NO

	ifint $($ShellCode) != S(!SHELL_CODE_OK)
	   goto ShellCodeError
	else-ifstr(i) $($R0) == STATUS_FAILED
	    shell $(UtilityInf) RegistryErrorString ASK_SOURCE_FAIL
	    ifint $($ShellCode) != $(!SHELL_CODE_OK)
		goto ShellCodeError
	    endif
	    set Error = $($R0)
	    goto fatal
	else-ifstr(i) $($R0) == STATUS_USERCANCEL
	    goto successful
	endif

	Set SrcDir = $($R1)

	; Now we could install the DLL here, but we might as well do it all at
	; once when we install the driver... This might upset the help though...

	LoadLibrary #("Source Media Descriptions", 1, 1) +
	    $(SrcDir)\blutok.dll BluHandle
    else
	LoadLibrary "" $(!STF_WINDOWSSYSPATH)\blutok.dll BluHandle
    endif

    ; Set input variables for the dialog

    set RadioIn = {$(IOBaseAddress)}
    read-syms FileDependentDlg$(!STF_LANGUAGE)

    set oldNetworkAddress = $(NetworkAddress)
    set oldMaxFrameSize   = $(MaxFrameSize)

    ; Display the dialog and process result

display_dialog = +
    ui start "InputDlg" $(BluHandle)

    ifstr(i) $(DLGEVENT) == "CONTINUE"
	set IOBaseAddress  = *($(RadioOut),1)
	set NetworkAddress = *($(EditTextOut),1)
	set MaxFrameSize   = *($(EditTextOut),2)
    else-ifstr(i) $(DLGEVENT) == "BACK"
	set CommonStatus = STATUS_USERCANCEL
	Debug-Output "Action: exit. Bye."
	ui pop 1
	goto end
    else
	ui pop 1
	Debug-Output "Action: unknown. Bye."
	goto end
    endif

    ; Sanity check the values we've been given

    ifint $(MaxFrameSize) > 17839
	set Error = "Maximum frame size must be less than 17839"
	set from = display_dialog
	goto nonfatalinfo
    endif

    ifint $(MaxFrameSize) != 0
	ifint $(MaxFrameSize) < 96
	    set Error = "Maximum frame size must be greater than 96"
	    set from = display_dialog
	    goto nonfatalinfo
	endif
    endif

    ifstr $(NetworkAddress) != ""

	set FLibraryErrCtl = 1
	LibraryProcedure Result $(BluHandle) BlueCheckAddress $(NetworkAddress)
	set FLibraryErrCtl = 0

	ifstr(i) *($(Result),1) != STATUS_SUCCESS
	    set Error = $(Result)
	    set from = display_dialog
	    goto nonfatalinfo
	endif

	set NetworkAddress = *($(Result),2)

    endif

    ui pop 1

    ifstr(i) $(!STF_NCDETINFO) == {}
	Shell $(UtilityInf),GetBusTypeDialog,$(ProductHardwareDescription) $(BusInterfaceType) $(BusNumber)
	ifint $($ShellCode) != $(!SHELL_CODE_OK)
	    Debug-Output "ShellCode error."
	    goto ShellCodeError
	endif
	set BusInterfaceType = $($R1)
	set BusNumber = $($R2)
    else
	set BusInterfaceType = *($(!STF_NCDETINFO),5)
	set BusNumber = *($(!STF_NCDETINFO),6)
    endif

adapterverify =+
    Ifstr(i) $(DetectedCard) != TRUE
	Goto skipoptions
    Endif
    Debug-Output "BluTok.INF: Calling Param_VerifyCard"
    Shell $(ParamInf) Param_VerifyCard $(!STF_NCDETCARD)
    Ifstr(i) $($R0) == STATUS_SUCCESSFUL
	Debug-Output "BluTok.INF: Param_VerifyCard succeeded"
	Goto skipoptions
    Endif
    Set from = adapteroptions
    Set to = skipoptions
    Shell $(UtilityInf),RegistryErrorString,VERIFY_WARNING
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
	Debug-Output "ShellCode error: cannot get an error string."
	goto ShellCodeError
    endif
    set Error = $($R0)
    Goto Warning

skipoptions =+
    ifint $(OldVersionExisted) == $(TRUE)
	ifstr(i) $(!NTN_InstallMode) == configure
	    goto writeparameters
	endif
    endif
    StartWait
    ifint $(OldVersionExisted) == $(FALSE)

	; The software has never been installed before, so first copy from disk

	ifstr(i) $(!NTN_InstallMode) == "install"
	   
	   ; No need to ask for source directory - already done that above...

	   install "Install-Option"

	   ifstr(i) $(STF_INSTALL_OUTCOME) != STF_SUCCESS
	      Shell $(UtilityInf) RegistryErrorString "UNABLE_COPY_FILE"
	      ifint $($ShellCode) != $(!SHELL_CODE_OK)
		  goto ShellCodeError
	      endif
	      set Error = $($R0)
	      goto fatal
	   endif
	endif

	; We have loaded the software - now make the correct registry entries

	Shell $(UtilityInf), AddSoftwareComponent, $(Manufacturer), +
	    $(ProductSoftwareName), +
	    $(ProductSoftwareName), +
	    $(ProductSoftwareTitle), $(STF_CONTEXTINFNAME), +
	    $(ProductSoftwareImagePath), "kernel", "NDIS", {}, "",+
	    $(NetEventDLL)
	Set OEM_ABANDON_SOFTWARE = TRUE
	ifint $($ShellCode) != $(!SHELL_CODE_OK)
	    Debug-Output "ShellCode error"
	    goto ShellCodeError
	endif
	set RegistryErrorIndex = $($R0)
	Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
	    EndWait
	    Debug-Output "Registry error: add software components"
	    CloseRegKey $($R1)
	    CloseRegKey $($R2)
	    CloseRegKey $($R3)
	    CloseRegKey $($R4)
	    CloseRegKey $($R5)
	    goto fatalregistry
	endif
	Set SoftProductKey      = $($R1)
	Set SoftNetRuleKey      = $($R2)
	Set SoftServiceKey      = $($R3)
	Set SoftParameterKey    = $($R4)
	Set SoftLinkageKey      = $($R5)
	set NewValueList = {{SoftwareType,$(NoTitle),$(!REG_VT_SZ),$(SoftwareType)},+
			   {MajorVersion,$(NoTitle),$(!REG_VT_DWORD),$(ProductMajorVersion)},+
			   {MinorVersion,$(NoTitle),$(!REG_VT_DWORD),$(ProductMinorVersion)},+
			   {Title,$(NoTitle),$(!REG_VT_SZ),$(ProductSoftwareTitle)},+
			   {Description,$(NoTitle),$(!REG_VT_SZ),$(ProductSoftwareDescription)},+
			   {ServiceName,$(NoTitle),$(!REG_VT_SZ),$(ProductSoftwareName)},+
			   {InstallDate,$(NoTitle),$(!REG_VT_DWORD),*($(Now),1)}}
	Shell  $(UtilityInf), AddValueList, $(SoftProductKey), $(NewValueList)
	ifint $($ShellCode) != $(!SHELL_CODE_OK)
	    Debug-Output "ShellCode error."
	    goto ShellCodeError
	endif
	set RegistryErrorIndex = $($R0)
	Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
	    EndWait
	    Debug-Output "Resgitry error: add value list."
	    CloseRegKey $(SoftProductKey)
	    CloseRegKey $(SoftNetRuleKey)
	    CloseRegKey $(SoftServiceKey)
	    CloseRegKey $(SoftParameterKey)
	    CloseRegKey $(SoftLinkageKey)
	    goto fatalregistry
	endif
	set NewValueList = {{type,$(NoTitle),$(!REG_VT_SZ),$(NetRuleSoftwareType)},+
			    {use,$(NoTitle),$(!REG_VT_SZ),$(NetRuleSoftwareUse)}, +
			    {bindform,$(NoTitle),$(!REG_VT_SZ),$(NetRuleSoftwareBindForm)}, +
			    {class,$(NoTitle),$(!REG_VT_MULTI_SZ),$(NetRuleSoftwareClass)}, +
			    {bindable,$(NoTitle),$(!REG_VT_MULTI_SZ),$(NetRuleSoftwareBindable)}, +
			    {InfOption,$(NoTitle),$(!REG_VT_SZ),$(Option)}}
	Shell  $(UtilityInf), AddValueList, $(SoftNetRuleKey), $(NewValueList)
	ifint $($ShellCode) != $(!SHELL_CODE_OK)
	    Debug-Output "ShellCode error."
	    goto ShellCodeError
	endif
	set RegistryErrorIndex = $($R0)
	CloseRegKey $(SoftProductKey)
	CloseRegKey $(SoftNetRuleKey)
	CloseRegKey $(SoftServiceKey)
	CloseRegKey $(SoftParameterKey)
	CloseRegKey $(SoftLinkageKey)
	Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
	    EndWait
	    Debug-Output "Resgitry error: add value list."
	    goto fatalregistry
	endif
    endif

    ; Installing new software converges with just installing new hardware here

    Shell $(UtilityInf), AddHardwareComponent, $(ProductHardwareName),$(STF_CONTEXTINFNAME),$(ProductKeyName)
    ifint $($R4) != -1
	Set OEM_ABANDON_OPTIONS = >($(OEM_ABANDON_OPTIONS), $(!NTN_SoftwareBase)"\Microsoft\Windows NT\CurrentVersion\NetworkCards\"$($R4))
    endif
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
	Debug-Output "Cannot add hardware component"
	goto ShellCodeError
    endif
    set RegistryErrorIndex = $($R0)
    Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
	EndWait
	Debug-Output "Registry error: add hardware component"
	CloseRegKey $($R1)
	CloseRegKey $($R2)
	CloseRegKey $($R3)
	goto fatalregistry
    endif
    set KeyParameters = $($R3)
    set KeyAdapterRules = $($R2)
    set AdapterNumber = $($R4)
    set NewValueList = {{Manufacturer,$(NoTitle),$(!REG_VT_SZ),$(Manufacturer)},+
		       {Title,$(NoTitle),$(!REG_VT_SZ),"["$($R4)"] "$(ProductHardwareTitle)},+
		       {Description,$(NoTitle),$(!REG_VT_SZ),$(ProductHardwareDescription)},+
		       {ProductName,$(NoTitle),$(!REG_VT_SZ),$(ProductHardwareName)},+
		       {ServiceName,$(NoTitle),$(!REG_VT_SZ),$($R5)},+
		       {InstallDate,$(NoTitle),$(!REG_VT_DWORD),*($(Now),1)}}
    Shell  $(UtilityInf), AddValueList, $($R1), $(NewValueList)
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
	Debug-Output "ShellCode error"
	goto ShellCodeError
    endif
    CloseRegKey $($R1)

    ; ProductHardwareName = BluTok
    ; NetRuleHardwareBindForm = yes yes container
    ; => TempBindForm = BluTok? yes yes container
    set TempProdName = """"$(ProductHardwareName)$(AdapterNumber)""""
    set TempBindForm = $(TempProdName)$(NetRuleHardwareBindForm)
    set NewValueList = {{type,$(NoTitle),$(!REG_VT_SZ),$(NetRuleHardwareType)},+
			{bindform,$(NoTitle),$(!REG_VT_SZ),$(TempBindForm)}, +
			{class,$(NoTitle),$(!REG_VT_MULTI_SZ),$(NetRuleHardwareClass)}, +
			{InfOption,$(NoTitle),$(!REG_VT_SZ),$(Option)}}
    Shell  $(UtilityInf), AddValueList, $(KeyAdapterRules), $(NewValueList)
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
	Debug-Output "ShellCode error."
	goto ShellCodeError
    endif
    set RegistryErrorIndex = $($R0)
    Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
	EndWait
	Debug-Output "Resgitry error: add value list."
	CloseRegKey $(KeyParameters)
	CloseRegKey $(KeyAdapterRules)
	goto fatalregistry
    endif
    CloseRegKey $(KeyAdapterRules)
    goto writeparameters

    ; Installation converges with configuration here to write card parameters

writeparameters = +
    set NewValueList = {{IoBaseAddress,$(NoTitle),$(!REG_VT_DWORD),$(IOBaseAddress)},+
		       {BusType,$(NoTitle),$(!REG_VT_DWORD),$(BusInterfaceType)},+
		       {BusNumber,$(NoTitle),$(!REG_VT_DWORD),$(BusNumber)},+
		       {MediaType,$(NoTitle),$(!REG_VT_DWORD),2}}

    ; Add optional parameters

    ifint $(MaxFrameSize) != 0
	set NewValueList = >($(NewValueList),+
		       {MaxFrameSize,$(NoTitle),$(!REG_VT_DWORD),$(MaxFrameSize)})
    endif
    ifstr $(NetworkAddress) != ""
	set NewValueList = >($(NewValueList),+
		       {NetworkAddress,$(NoTitle),$(!REG_VT_SZ),$(NetworkAddress)})
    endif

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

    ; Delete redundant optional parameters

    ifstr $(NetworkAddress) == ""
	ifstr $(oldNetworkAddress) != ""
	    DeleteRegValue $(KeyParameters) NetworkAddress
	endif
    endif

    ifint $(MaxFrameSize) == 0
	ifint $(oldMaxFrameSize) != 0
	    DeleteRegValue $(KeyParameters) MaxFrameSize
	endif
    endif

    ; Final tidy up...

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

    ifint $($ShellCode) != $(!SHELL_CODE_OK)
	Debug-Output "ShellCode error."
	goto ShellCodeError
    endif
    set RegistryErrorIndex = $($R0)
    CloseRegKey $(KeyParameters)
    Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
	Debug-Output "Registry error: Add value list"
	goto fatalregistry
    endif
    EndWait
    goto successful

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

removeadapter = +
    Ifstr(i) $(ProductKeyName) == $(!NTN_RegBase)
	Shell $(UtilityInf), RemoveSoftwareComponent, $(Manufacturer), +
	    $(ProductSoftwareName)
	ifint $($ShellCode) != $(!SHELL_CODE_OK)
	    Debug-Output "ShellCode error"
	    goto ShellCodeError
	endif
	set RegistryErrorIndex = $($R0)
	Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
	    goto fatalregistry
	endif
    else
	Shell $(UtilityInf), RemoveHardwareComponent, $(Manufacturer), +
	    $(ProductSoftwareName), $(!NTN_RegBase)
	ifint $($ShellCode) != $(!SHELL_CODE_OK)
	    Debug-Output "ShellCode error"
	    goto ShellCodeError
	endif
	set RegistryErrorIndex = $($R0)
	Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
	    goto fatalregistry
	endif
    endif
    goto end

UpgradeSoftware = +
    OpenRegKey $(!REG_H_LOCAL) "" $(ProductKeyName) $(MAXIMUM_ALLOWED) KeyProduct
    Ifstr $(KeyProduct) != $(KeyNull)
	install "Install-Update"
	ifstr(i) $(STF_INSTALL_OUTCOME) != STF_SUCCESS
	    goto fatal
	endif
	SetRegValue $(KeyProduct) {MajorVersion,$(NoTitle),$(!REG_VT_SZ),$(ProductMajorVersion)}
	SetRegValue $(KeyProduct) {MinorVersion,$(NoTitle),$(!REG_VT_SZ),$(ProductMinorVersion)}
	CloseRegKey $(KeyProduct)
    else
	goto fatalregistry
    endif
    goto end

; From here on we have the exit points -
;  successful - set CommonStatus to return value e.g. STATUS_SUCCESS
;  abandon    - set OEM_ABANDON_OPTIONS to list of adapter card id's
;                 e.g. { BluTok01 }
;               set OEM_ABANDON_SOFTWARE to TRUE/FALSE
;               set CommonStatus to return value
;  warning    - set Error to a string to be displayed in message box
;               set to to "Continue" destination
;               set from to "Cancel" destination
;               set CommonStatus for "Exit"
;  nonfatalinfo/nonfatal -
;               set Error (you don't have to, but then you get the registry
;                 error SETUP_FAIL)
;               set from to "OK" destination
;               set CommonStatus for nonfatal for "Cancel" destination
; fatalregistry -
;               set RegistryErrorIndex
;               set OEM_ABANDON_ON to TRUE/FALSE
; fataldetect - set OEM_ABANDON_ON to TRUE/FALSE
; fatal       - set Error optionally
;             - set OEM_ABANDON_ON to TRUE/FALSE
;             - set CommonStatus
; ShellCodeError -
;               set OEM_ABANDON_ON to TRUE/FALSE

successful = +
    goto end

abandon = +
    ForListDo $(OEM_ABANDON_OPTIONS)
	Shell $(UtilityInf), RemoveHardwareComponent, $(Manufacturer), +
	    $(ProductSoftwareName), $($)
	ifint $($ShellCode) != $(!SHELL_CODE_OK)
	    Debug-Output "ShellCode error"
	    goto ShellCodeError
	endif
	set RegistryErrorIndex = $($R0)
	Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
	    goto fatalregistry
	endif
    EndForListDo
    Ifstr(i) $(OEM_ABANDON_SOFTWARE) == TRUE
	Shell $(UtilityInf), RemoveSoftwareComponent, $(Manufacturer), +
	    $(ProductSoftwareName), FALSE
	ifint $($ShellCode) != $(!SHELL_CODE_OK)
	    Debug-Output "ShellCode error"
	    goto ShellCodeError
	endif
	set RegistryErrorIndex = $($R0)
	Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
	    goto fatalregistry
	endif
    endif
    goto end

warning = +
    Shell $(subroutineinf) SetupMessage, $(!STF_LANGUAGE), "WARNING", $(Error)
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
	goto ShellCodeError
    endif
    ifstr(i) $($R1) == "OK"
	goto $(to)
    else-ifstr(i) $($R1) == "CANCEL"
	goto $(from)
    else
	goto "end"
    endif

nonfatalinfo = +
    Set CommonStatus = STATUS_USERCANCEL
    Set Severity = STATUS
    goto nonfatalmsg

nonfatal = +
    Set Severity = NONFATAL
    goto nonfatalmsg

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

fatalregistry = +
    Shell $(UtilityInf) RegistryErrorString $(RegistryErrorIndex)
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
	goto ShellCodeError
    endif
    set Error = $($R0)
    goto fatal

fataldetect = +
    Shell $(UtilityInf),RegistryErrorString,CANNOT_DETECT
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
	Debug-Output "ShellCode error: cannot get an error string."
	goto ShellCodeError
    endif
    set Error = $($R0)
    Goto fatal

fatal = +
    ifstr(i) $(Error) == ""
	Shell $(UtilityInf) RegistryErrorString "SETUP_FAIL"
	ifint $($ShellCode) != $(!SHELL_CODE_OK)
	    goto ShellCodeError
	endif
	set Error = $($R0)
    endif
    Shell $(subroutineinf) SetupMessage, $(!STF_LANGUAGE), "FATAL", $(Error)
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
	goto ShellCodeError
    endif
    goto setfailed

ShellCodeError = +
    set DlgType      = "MessageBox"
    set STF_MB_TITLE = $(ShellCodeErrorTitle)
    set STF_MB_TEXT  = $(ShellCodeErrorText)
    set STF_MB_TYPE  = 1
    set STF_MB_ICON  = 3
    set STF_MB_DEF   = 1
    ui start "Error Message"
    goto setfailed

setfailed = +
    set CommonStatus = STATUS_FAILED
    ifstr(i) $(OEM_ABANDON_ON) == TRUE
	set OEM_ABANDON_ON = FALSE
	goto abandon
    endif
    goto end

end = +
    ; This is the only safe place to free the library handle without rewriting
    ; all the error handling code...

    ifstr $(BluHandle) != $(KeyNull)
	FreeLibrary $(BluHandle)
    endif

    goto term

term = +
    Return $(CommonStatus)


;/****************************************************************************/
;/* [InstallOption] Support sections                                         */
;/****************************************************************************/

[GeneralConstants]
    from                = ""
    to                  = ""
    retaddr             = ""
    KeyNull             = ""
    StringNull          = ""
    MAXIMUM_ALLOWED     = 33554432
    RegistryErrorIndex  = NO_ERROR
    KeyProduct          = ""
    KeyParameters       = ""
    TRUE                = 1
    FALSE               = 0
    NoTitle             = 0
    ExitState           = "Active"
    OldVersionExisted   = $(FALSE)
    DriverPath          = $(!STF_NTPATH)\drivers

[FileConstants]
    UtilityInf              = "UTILITY.INF"
    ParamInf                = "NCPARAM.INF"
    subroutineinf           = "SUBROUTN.INF"
    SoftwareType            = "driver"
    NetEventDLL             = "%SystemRoot%\System32\netevent.dll"
    IoLogMsgDLL             = "%SystemRoot%\System32\IoLogMsg.dll"
    Manufacturer            = "Madge"
    ProductMajorVersion     = "3"
    ProductMinorVersion     = "5"
    ProductVersion          = $(ProductMajorVersion)"."$(ProductMinorVersion)
    ProductSoftwareName     = "BluTok"
    ProductSoftwareImagePath = "\SystemRoot\System32\drivers\BluTok.sys"
    NetRuleSoftwareType     = "blutokSys ndisDriver blutokDriver"
    NetRuleSoftwareUse      = $(SoftwareType)
    NetRuleSoftwareBindForm = """BluTokSys"" yes no container"
    NetRuleSoftwareClass    = {"blutokDriver basic"}
    ProductHardwareName     = "BluTok"
    NetRuleHardwareType     = "blutok blutokAdapter"
    NetRuleHardwareBindForm = " yes yes container"
    NetRuleHardwareClass    = {"blutokAdapter basic"}
    ProductKeyName  = $(!NTN_SoftwareBase)"\"$(Manufacturer)"\"$(ProductSoftwareName)"\CurrentVersion"
    ParamKeyName    = $(!NTN_ServiceBase)"\"$(ProductHardwareName)"\Parameters"
    BLUE_HELP_BASE  = 6000
    BLUE_HELP_LIMIT = 6000

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

[Install-Option]
    set STF_VITAL = ""
    ifstr(i) $(AddCopy) == "YES"
	AddSectionFilesToCopyList Files-$(Option) +
	    $(SrcDir) $(!STF_WINDOWSSYSPATH)\drivers
	AddSectionFilesToCopyList Files-$(Option)-Dll +
	    $(SrcDir) $(!STF_WINDOWSSYSPATH)
    endif
    ifstr(i) $(DoCopy) == "YES"
       set !STF_NCPA_FLUSH_COPYLIST = TRUE
       CopyFilesInCopyList
    endif
    ifstr(i) $(DoConfig) == "YES"
    endif
    Exit

[Install-Update]
    set STF_VITAL        = ""
    set STF_OVERWRITE    = "VERIFYSOURCEOLDER"
    AddSectionFilesToCopyList Files-$(Option) +
	$(SrcDir) $(!STF_WINDOWSSYSPATH)\drivers
    AddSectionFilesToCopyList Files-$(Option)-Dll +
	$(SrcDir) $(!STF_WINDOWSSYSPATH)
    CopyFilesInCopyList
    exit

;/****************************************************************************/
;/* [Source Media Descriptions]                                              */
;/****************************************************************************/

[Source Media Descriptions]
     1 = "Madge Blue+ Installation Disk 2"

[Files-BluTok]
    1, BLUTOK.SYS, SIZE=9999

[Files-BluTok-Dll]
    1, BLUTOK.DLL, SIZE=9999
    1, BLUTOK.HLP, SIZE=9999

;/****************************************************************************/
;/* Language dependent parameters                                            */
;/****************************************************************************/

; These are the allowed languages, followed by the relevant sections for each.

[LanguagesSupported]
    ENG

;/****************************************************************************/
;/* [ReturnOptions] section language support                                 */
;/****************************************************************************/

[OptionsTextENG]
    BLUTOK     = "Madge Blue+ Token Ring Adapter"

;/****************************************************************************/
;/* [InstallOption] section language support                                 */
;/****************************************************************************/

[FileConstantsENG]
    ProCaption   = "Windows NT Setup"
    ProCancel    = "Cancel"
    ProCancelMsg = "Windows NT Networking is not correctly installed.  "+
		   "Are you sure you want to cancel copying files?"
    ProCancelCap = "Network Setup Message"
    ProText1     = "Copying:"
    ProText2     = "To:"
    FunctionTitle               = "Madge Blue+ Adapter Card Setup"
    ProductSoftwareDescription  = "Madge Blue+ Adapter Driver"
    ProductHardwareDescription  = "Madge Blue+ Adapter"
    ProductSoftwareTitle        = "Madge Blue+ Adapter Driver"
    ProductHardwareTitle        = "Madge Blue+ Adapter"
    ShellCodeErrorTitle         = "Error: "$(FunctionTitle)
    ShellCodeErrorText          = "Shell Code Error."

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

[FileDependentDlgENG]
    Group1          = "I/O Port Base Address"
    Radio1          = "&Primary"
    Radio2          = "&Secondary"
    Edit1Label      = "&Network Address:"
    Edit2Label      = "&Max Frame Size:"
    DlgType         = "RadioCombination"
    DlgTemplate     = "BLUE_TOKEN"
    Caption         = $(FunctionTitle)
    ComboListItemsIn = {}
    ComboListItemsOut = {}
    EditTextLim     = {17, 5}
    EditTextIn      = {$(NetworkAddress), $(MaxFrameSize)}
    OptionsGreyed   = {}
    HelpContext     = $(BLUE_HELP_BASE)
    RCCtlFocusOn    = 403

;/****************************************************************************/
;/* End of OEMSETUP.INF                                                      */
;/****************************************************************************/
