;***********************************************************************
;
; ODINSUP.INF
;
;		Novell Ndis to ODI network logical adapter SETUP INF file.
;
;***********************************************************************

;
; The following is the version info for Novell
;

;VeRsIoN=v4.10 Novell Client Install for Windows NT (970414)
;CoPyRiGhT=copyright 1992-1997, by Novell, INC. All rights reserved.

[Identification]
	OptionType = NetAdapter

[PlatformsSupported]
	ISA
	MCA
	EISA
	PCI
	"Jazz-Internal Bus"

[Options]
	ODINSUP

[IRQChoices]
	IRQ_1	= "2",2
	IRQ_2	= "3",3
	IRQ_3	= "4",4
	IRQ_4	= "5",5

[IOBaseAddrChoices]
	IOBase_1	= "0x300",768
	IOBase_2	= "0x320",800
	IOBase_3	= "0x340",832
	IOBase_4	= "0x360",864

[FileConstants]
	UtilityInf		= "UTILITY.INF"
	subroutineinf	= "SUBROUTN.INF"
	NwSubsInf		= "NWSUBS.INF"
	SoftwareType	= "driver"
	Exit_Code		= 0
	DriverToLoad	= ""

	ODINetWareEventFile	= "%SystemRoot%\System32\nls\"$(NLSDirName)"\odintmsg.dll"
	IoLogMsgDLL				= "%SystemRoot%\System32\IoLogMsg.dll"

	ProductSoftwareName			= "ODINSUP"
	ProductSoftwareImagePath	= "\SystemRoot\system32\drivers\odinsup.sys"
	NetRuleSoftwareType			= "odinsupSys ndisDriver odinsupDriver"
	NetRuleSoftwareUse			= $(SoftwareType)
	NetRuleSoftwareBindForm		= """OdinsupSys"" yes no container"
	NetRuleSoftwareClass			= {"odinsupDriver basic"}
	NetRuleSoftwareBindable		= {"odinsupDriver odinsupAdapter non exclusive 100"}

	ProductHardwareName				= "ODINSUP"
	NetRuleHardwareType				= "odinsup odinsupAdapter"
	NetRuleHardwareBindForm			= " yes yes container"
	NetRuleHardwareClass				= {"odinsupAdapter basic"}

	ProductKeyName	= $(!NTN_SoftwareBase)"\"$(Manufacturer)"\"$(ProductSoftwareName)"\CurrentVersion"
	ParamKeyName	= $(!NTN_ServiceBase)"\"$(ProductHardwareName)"\Parameters"

[GeneralConstants]
	from				= ""
	to					= ""
	ExitCodeOk		= 0
	ExitCodeCancel = 1
	ExitCodeFatal	= 2
	
	KeyNull					= ""
	MAXIMUM_ALLOWED		= 33554432
	RegistryErrorIndex	= NO_ERROR
	KeyProduct				= ""
	KeyParameters			= ""
	
	TRUE						= 1
	FALSE						= 0
	NoTitle					= 0
	
	ExitState				= "Active"
	OldVersionExisted		= $(FALSE)
	
	DriverPath									= $(!STF_NTPATH)\drivers
	ProductSoftwareDescription				= "Novell IntranetWare ODI Support for NDIS Protocols Driver"
	ProductHardwareODINSUPDescription	= "Novell IntranetWare ODI Support for NDIS Protocols Adapter"
	
	IRQList				= ^(IRQChoices, 1)
	IRQValues			= ^(IRQChoices, 2)
	IOBaseAddrList		= ^(IOBaseAddrChoices, 1)
	IOBaseAddrValues	= ^(IOBaseAddrChoices, 2)

	Manufacturer			= "Novell"
	ProductMajorVersion	= 4
	ProductMinorVersion	= 00
	ProductVersion			= $(ProductMajorVersion)"."$(ProductMinorVersion)

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


;------------------------------------------------------------------------------
; 1. Identify	To verify that this INF deals with the smae type of options
;		as we are choosing currently.
;
; Input:	none
;
; Output:	$($R0):	STATUS:	STATUS_SUCCESSFUL
;		$($R1):	Option Type (COMPUTER ...)
;		$($R2):	Diskette Description
;------------------------------------------------------------------------------
[Identify]
	read-syms Identification
	set Status	 = STATUS_SUCCESSFUL
	set Identifier = $(OptionType)
	set Media		= #("Source Media Descriptions", 1, 1)

	Return $(Status) $(Identifier) $(Media)


;------------------------------------------------------------------------------
; 2. ReturnOptions	To return the option list supported by this INF and
;			the localized text list representing the options.
; Input:	$($0):	Lang. used (ENG | FRN | ....)
;
; Output:	$($R0):	STATUS:	STATUS_SUCCESSFUL	|
;				STATUS_NOLANGUAGE	|
;				STATUS_FAILED		|
;				STATUS_NOTSUPPORTED
;		$($R1):	Option List
;		$($R2):	Option Text List
;
;------------------------------------------------------------------------------
[ReturnOptions]
	set Status		= STATUS_FAILED
	set OptionList		= {}
	set OptionTextList	= {}

	;
	; Check if the language requested is supported
	;

	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

	;
	; form a list of all the options and another of the text representing
	;

returnoptions = +
	set OptionList			= ^(Options, 1)
	set OptionTextList	= ^(OptionsText$($0), 1)
	set Status				= STATUS_SUCCESSFUL

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



;------------------------------------------------------------------------------
; 2. InstallOption	This section is shelled to by main installation processing
;
; Function:	To copy files representing Options
;		To configure the installed option
;		To update the Registry for the installed option
;
; Input:	$($0):	Lang. 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		|
;				STATUS_NOTSUPPORTED
;
;------------------------------------------------------------------------------

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

	;
	; Check if the language requested is supported
	;

	set LanguageList = ^(LanguagesSupported, 1)
	Ifcontains(i) $($0) in $(LanguageList)
		goto installoption
	else
		set Status	= STATUS_NOLANGUAGE
		goto finish_InstallOption
	endif

installoption = +

	;
	; Tell the common code that we're being called from "main install"
	;

	ifstr(i) $(!NTN_Origination) != "NCPA"
		set !NTN_Origination = "install"
	endif

	;
	; Call the CommonSection
	;

	shell "" CommonSection $(Option)
	set Status = $($R0)
	ifstr(i) $($R1) != ""
		set DriverToLoad = { $($R1) }
	else
		set DriverToLoad = ""
	endif
	Return $(Status) $(DriverToLoad)


[NcpaInvocation]
	set Option			= $(!NTN_InfOption)
	set !SrcDir			= $(!STF_SRCDIR)
	Ifstr(i) $(!NTN_InstallMode) == install
		set !AddCopy	= YES
		set !DoCopy		= YES
		set !DoConfig 	= YES
	Else
		set !AddCopy	= NO
		set !DoCopy		= NO
		set !DoConfig	= NO
	Endif
	shell "" CommonSection $(Option)
	set Status = $($R0)
	Return $(Status)


[CommonSection]
	StartWait
	set Option		= $($0)
	set-subst LF	= "\n"
	read-syms GeneralConstants

	;
	; Find what NLS directory is being used
	;

	set NovellParameters = $(!NTN_SoftwareBase)"\"$(Manufacturer)"\Parameters"
	Debug-OutPut "NovellParameters is "$(NovellParameters)
	OpenRegKey $(!REG_H_LOCAL) "" $(NovellParameters) $(MAXIMUM_ALLOWED) KeyNovellParameters
	ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
		GetRegValue $(KeyNovellParameters) "NWLanguage" LanguageList
		ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
			set NLSDirName = *($(LanguageList), 4)
		endif
		CloseRegKey $(KeyNovellParameters)
	Endif

	;
	; Get NT version
	;

	set CurrentVersion = $(!NTN_SoftwareBase)"\Microsoft\Windows NT\CurrentVersion"
	OpenRegKey $(!REG_H_LOCAL) "" $(CurrentVersion) $(MAXIMUM_ALLOWED) CurrentVersionKey
	ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
		GetRegValue $(CurrentVersionKey) "CurrentVersion" VersionList
		ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
			set VersionListData = *($(VersionList), 4)
			Split-string $(VersionListData) "." SplitVersionList
			Set NTMajorVersion = *($(SplitVersionList), 1)
			Set NTMinorVersion = *($(SplitVersionList), 3)

			Debug-OutPut "ODINSUP.INF: Windows NT current version is "$(VersionListData)
			Debug-OutPut "ODINSUP.INF: Windows NT Major version is "$(NTMajorVersion)
			Debug-OutPut "ODINSUP.INF: Windows NT Minor version is "$(NTMinorVersion)
		else
			Debug-Output "ODINSUP.INF:  Error getting NT version"
		endif
		CloseRegKey $(CurrentVersionKey)
	else
		Debug-Output "ODINSUP.INF:  Error opening "$(CurrentVersion)
	endif

	read-syms FileConstants
	read-syms DialogConstants$(!STF_LANGUAGE)
	read-syms FileConstants$(!STF_LANGUAGE)
	read-syms InstallOption$(!STF_LANGUAGE)
	detect date
	set-title $(FunctionTitle)
	set to	= Begin
	set from = Begin
	set CommonStatus = STATUS_SUCCESSFUL
	EndWait
Begin = +
	Debug-Output "ODINSUP.INF: Begin Install Mode = "$(!NTN_InstallMode)
	Ifstr(i) $(!NTN_InstallMode) == deinstall
		set StartLabel = removeadapter
	else-Ifstr(i) $(!NTN_InstallMode) == Update
		set StartLabel = UpgradeSoftware
	else-Ifstr(i) $(!NTN_InstallMode) == bind
		set StartLabel = bindingadapter
	else-Ifstr(i) $(!NTN_InstallMode) == configure
		set StartLabel = configureadapter
		Ifstr(i) $(ProductKeyName) == $(!NTN_RegBase)
			Debug-Output "ODINSUP.INF: Cannot configure the Novell ODINSUP driver software."
			Shell $(UtilityInf),RegistryErrorString,CANNOT_CONFIGURE_SOFTWARE
			ifint $($ShellCode) != $(!SHELL_CODE_OK)
				Debug-Output "ODINSUP.INF: ShellCode error: cannot get an error string."
				goto ShellCodeError
			endif
			set Error = $($R0)
			set from = end
			set to = end
			goto Warning
		endif
	else
		set StartLabel = installadapter
		set OEM_ABANDON_OPTIONS = {}
		set OEM_ABANDON_SOFTWARE = FALSE
		set OEM_ABANDON_ON = TRUE
	endif
	set IRQValue = *($(IRQList), 2)
	set IOBaseAddrValue = *($(IOBaseAddrList), 1)
	set from = $(fatal)
	set to = $(fatal)
	goto $(StartLabel)
installadapter = +
	Debug-Output "ODINSUP.INF: installadapter "$(ProductKeyName)
	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 $(!STF_ONTEXTINFNAME)": ShellCode error: cannot get an error string."
				goto ShellCodeError
			endif
			goto end
		else
			Shell $(UtilityInf), CardExistedDlg
			ifint $($ShellCode) != $(!SHELL_CODE_OK)
				Debug-Output "ODINSUP.INF: ShellCode error: cannot get an error string."
				goto ShellCodeError
			endif
			ifstr(i) $($R1) != "OK"
				goto end
			endif
			set OldVersionExisted = $(TRUE)
		endif
	endif
	goto adapteroptions
configureadapter = +
	Debug-Output "ODINSUP.INF: configureadapter"
	Ifstr $(KeyProduct) == $(KeyNull)
		OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_RegBase) $(MAXIMUM_ALLOWED) KeyProduct
		Ifstr $(KeyProduct) == $(KeyNull)
			set RegistryErrorIndex = CANNOT_FIND_COMPONENT_SERVICE
			Debug-Output "ODINSUP.INF: Cannot find component product key "$(!NTN_RegBase)
			goto fatalregistry
		Endif
	Endif
	Debug-Output "ODINSUP.INF: Shelling to FindService"
	Shell $(UtilityInf) FindService, $(KeyProduct)
	Ifint $($ShellCode) != $(!SHELL_CODE_OK)
		Debug-Output "ODINSUP.INF: FindService shell failure "$($ShellCode)
		Goto ShellCodeError
	Endif
	Ifstr(i) $($R0) != NO_ERROR
		Debug-Output "ODINSUP.INF: FindService Shell error: "$($R0)
		Goto fatalregistry
	endif
	set KeyParameters = $($R2)
	CloseRegKey $($R1)
	Ifstr $(KeyParameters) == $(KeyNull)
		set RegistryErrorIndex = CANNOT_FIND_COMPONENT_SERVICE
		Debug-Output "ODINSUP.INF: Cannot find component service"
		goto fatalregistry
	endif
	set OldVersionExisted = $(TRUE)
	set ValueName = ""
	set ValueData = ""
	set ValueStr	= ""
	set ValueList = {}
	Set OdiCurBindCardName = ""

	EnumRegValue $(KeyParameters) ValueList

	ForListDo $(ValueList)
		set ValueItem = $($)
		set ValueName = *($(ValueItem),1)
		set ValueData = *($(ValueItem),4)
		Ifstr(i) $(ValueName) == "InterruptNumber"
			set IRQValueIndex = $(ValueData)
		else-ifstr(i) $(ValueName) == "IoBaseAddress"
			set IOBaseAddrIndex = $(ValueData)
		else-ifstr(i) $(ValueName) == "Bind"
			Set OdiCurBindCardName = $(ValueData)
			Debug-Output "ODINSUP is Currently bound to "$(OdiCurBindCardName)
		endif
	EndForListDo
	set IRQValue = *($(IRQList), ~($(IRQValues),$(IRQValueIndex)))
	ifstr(i) $(IRQValue) == ""
		set IRQValue = *($(IRQList), 2)
	endif
	set IOBaseAddrValue = *($(IOBaseAddrList), +
		~($(IOBaseAddrValues),$(IOBaseAddrIndex)))
	ifstr(i) $(IOBaseAddrValue) == ""
		set IOBaseAddrValue = *($(IOBaseAddrList), 1)
	endif
	goto adapteroptions
adapteroptions = +
	Debug-Output "ODINSUP.INF: adapteroptions, NTN_RegBase = "$(!NTN_RegBase)

	set from = adapteroptions
	read-syms FileDependentDlg$(!STF_LANGUAGE)

	;
	; In this block we will determine which installed ODI adapter to bind
	; ODINSUP too.  If multiple ODI adapters are install the user will be
	; allowed to select from a dialog box which adapter to bind too.
	;

	set NetworkCardsKeyName = $(!NTN_SoftwareBase)"\Microsoft\Windows NT\CurrentVersion\NetworkCards"

	OpenRegKey $(!REG_H_LOCAL) "" $(NetworkCardsKeyName) $(MAXIMUM_ALLOWED) NetCardsKey

	Ifstr(i) $(NetCardsKey) == ""
		Debug-Output "Can't Open Registry key "$(NetworkCardsKeyName)
		set CommonStatus = STATUS_USERCANCEL
	Else

		;
		; Get a list of all installed network cards
		;

		EnumRegKey $(NetCardsKey) NetCardsList

		ForListDo $(NetCardsList)
			Set CardNumber = *($($), 1)
			Ifstr(i) $(CardNumber) != ""
				Ifstr(i) $(FirstTime) == 1
					set CardList = $(CardNumber)
					Set FirstTime = 0
				Else
					set CardList = >($(CardList), $(CardNumber))
				Endif
			Endif
		EndForListDo

		Set FirstTime = 0

		;
		; Run though the list of installed adapters and create a list of installed
		; ODI Adapters.
		;

		ForListDo $(CardList)
			Set Card = $($)
	
			OpenRegKey $(NetCardsKey) "" $(Card) $(MAXIMUM_ALLOWED) CardKey
			Ifstr(i) $(CardKey) == ""
				Debug-Output "ODINSUP.INF: Can't open card "$(Card)
			Else
				GetRegValue $(CardKey) "OdiAdapter" OdiValueList
				Ifint $(RegLastError) == $(!REG_ERROR_SUCCESS)
					set OdiAdapter = *($(OdiValueList), 4)
					Ifstr(i) $(OdiAdapter) == "1"
						GetRegValue $(CardKey) "Title" OdiTitleValues
						Set OdiTitle = *($(OdiTitleValues), 4)
						GetRegValue $(CardKey) "ProductName" OdiNameValues
						Set OdiName = *($(OdiNameValues), 4)
						Ifstr(i) $(FirstTime) == 1
							Set OdiOnlyList = $(Card)
							Set OdiTitleList = $(OdiTitle)
							Set OdiCardList = $(OdiName)
							set FirstTime = 0
						Else
							set OdiOnlyList = >($(OdiOnlyList), $(Card))
							Set OdiTitleList = >($(OdiTitleList), $(OdiTitle))
							Set OdiCardList = >($(OdiCardList), $(OdiName))
							Set FirstTime = 2
						Endif
					Endif
				Endif
	
				CloseRegKey $(CardKey)
			Endif
		EndForListDo
	
		Debug-Output "OdiCardList = "$(OdiCardList)
		CloseRegKey $(NetCardsKey)
	Endif

	;
	; If there is only one ODI Adapter installed bind to that adapter otherwise
	; allow the user to select.
	;

	Ifstr(i) $(FirstTime) == 1
		Debug-Output "ODINSUP.INF NO ODI Adapters installed."
		set DlgType			= "MessageBox"
		set STF_MB_TITLE	= $(NoODIAdapterInstalledTitle)
		set STF_MB_TEXT	= $(NoODIAdapterInstalledText)
		set STF_MB_TYPE	= 1
		set STF_MB_ICON	= 3
		set STF_MB_DEF		= 1
		ui start "NoODIAdapter"
	goto end
	Endif

	Ifstr(i) $(FirstTime) == 0
		Set OdiBindToAdapter = ""
		Debug-Output "ODINSUP.INF: Only ONE ODI Adapter Installed "$(OdiBindToAdapter)
	Else

		;
		; allow the user the select the adapter to bind too.
		;

		Debug-Output "ODINSUP.INF More than one ODI Adapter "$(OdiCardList)
		LoadLibrary $(LoadDisk2Text) $(!STF_WINDOWSSYSPATH)"\nls\"$(NLSDirName)"\nwsetupr.dll" NwLibHandle

		Ifstr(i) $(OdiCurBindCardName) != ""
			Debug-Output "OdiCurBindCardName = "$(OdiCurBindCardName)
			Set DefaultOdiTitle = *($(OdiTitleList), ~($(OdiCardList), $(OdiCurBindCardName)))
		Endif

		Ifstr(i) $(DefaultOdiTitle) == ""
			Set DefaultOdiTitle = *($(OdiTitleList), 1)
		Endif

		Debug-Output "DefaultOdiTitle = "$(DefaultOdiTitle)
		SetHelpFile $(!STF_WINDOWSSYSPATH)"\nls\"$(NLSDirName)"\nt4setup.hlp" $(!MinimumID) $(!MaximumID)
		ifint $(NTMajorVersion) < "4"
			SetHelpFile $(!STF_WINDOWSSYSPATH)"\nls\"$(NLSDirName)"\nt3setup.hlp" $(!MinimumID) $(!MaximumID)
		endif

		read-syms OdinsupDlg$(!STF_LANGUAGE)
		ui start "ODINSUP" $(NwLibHandle)
		ui pop 1
	
		ifstr(i) $(DLGEVENT) == "BACK"
			set AdapterSelected = ""
		else
			Set AdapterSelected = *($(DefaultOdiTitle), 1)
		endif

		Debug-Output "AdapterSelected = "$(AdapterSelected)

		Ifstr(i) $(AdapterSelected) == ""
			Debug-Output "ODINSUP.INF: Cancel Selected"
			goto end
		Else
			Set OdiBindToAdapter = *($(OdiCardList), ~($(OdiTitleList), $(AdapterSelected)))
		Endif

		FreeLibrary $(NwLibHandle)
	Endif

	set IRQValueIndex = "3"
	set IOBaseAddrIndex = "300"
	goto nextstep

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

installproduct = +
	ifint $(OldVersionExisted) == $(FALSE)
		Debug-Output "ODINSUP.INF: First Time Install"
		Shell $(UtilityInf), AddSoftwareComponent +
				$(Manufacturer), +
			$(ProductSoftwareName), +
			$(ProductSoftwareName), +
			$(ProductSoftwareTitle), +
			$(STF_CONTEXTINFNAME), +
			$(ProductSoftwareImagePath), +
			"kerneldisable", +
;			"kernelautostart", +
			"NDIS", +
			{"+ODI Drivers"}, +
			"", +
			$(ODINetWareEventFile)

		Set OEM_ABANDON_SOFTWARE = TRUE
		ifint $($ShellCode) != $(!SHELL_CODE_OK)
			Debug-Output "ODINSUP.INF: AddSoftwareComponent ShellCode error "$($ShellCode)
			goto ShellCodeError
		endif
		set RegistryErrorIndex = $($R0)
		set KeyProduct		= $($R1)
		Set SoftNetRulesKey = $($R2)
		Set KeyLinkage	= $($R5)
		SetRegValue $(KeyLinkage) {"OtherDependencies",$(NoTitle),$(!REG_VT_MULTI_SZ),{"+ODI Drivers"}}
		CloseRegKey $($R3)
		CloseRegKey $($R4)
		CloseRegKey $($R5)
		Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
			EndWait
			Debug-Output "ODINSUP.INF: AddSoftwareComponent Registry error "$(RegistryErrorIndex)
			CloseRegKey $(KeyProduct)
			CloseRegKey $(SoftNetRulesKey)
			goto fatalregistry
		endif
		set NewValueList = {{SoftwareType,$(NoTitle),$(!REG_VT_SZ),$(SoftwareType)},+
					{Hidden,$(NoTitle),$(!REG_VT_DWORD),1},+
					{MajorVersion,$(NoTitle),$(!REG_VT_DWORD),$(ProductMajorVersion)},+
					{MinorVersion,$(NoTitle),$(!REG_VT_DWORD),$(ProductMinorVersion)},+
					{Title,$(NoTitle),$(!REG_VT_SZ),$(ProductSoftwareTitle)},+
					{Description,$(NoTitle),$(!REG_VT_SZ),$(ProductSoftwareDescription)},+
					{PathName,$(NoTitle),$(!REG_VT_SZ),$(!STF_CWDDIR)},+
					{ServiceName,$(NoTitle),$(!REG_VT_SZ),$(ProductSoftwareName)},+
					{InstallDate,$(NoTitle),$(!REG_VT_DWORD),*($(Now),1)}}
		shell $(UtilityInf), AddValueList, $(KeyProduct), $(NewValueList)
		ifint $($ShellCode) != $(!SHELL_CODE_OK)
			Debug-Output "ODINSUP.INF: AddValueList ShellCode error "$($ShellCode)
			goto ShellCodeError
		endif
		set RegistryErrorIndex = $($R0)
		Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
			EndWait
			Debug-Output "ODINSUP.INF: AddValueList Registry error "$(RegistryErrorIndex)
			CloseRegKey $(KeyProduct)
			CloseRegKey $(SoftNetRulesKey)
			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)}, +
					{Infname ,$(NoTitle),$(!REG_VT_SZ),$(STF_CONTEXTINFNAME)} }
		shell $(UtilityInf), AddValueList, $(SoftNetRulesKey), $(NewValueList)
		ifint $($ShellCode) != $(!SHELL_CODE_OK)
			Debug-Output "ODINSUP.INF: AddValueList ShellCode error "$($ShellCode)
			goto ShellCodeError
		endif
		set RegistryErrorIndex = $($R0)
		CloseRegKey $(KeyProduct)
		CloseRegKey $(SoftNetRulesKey)
		Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
			EndWait
			Debug-Output "ODINSUP.INF: AddValueList Registry error "$(RegistryErrorIndex)
			goto fatalregistry
		endif
	endif

	; add ODINSUP at board two or later
	Shell $(UtilityInf), AddHardwareComponent, $(ProductHardwareName),$(STF_CONTEXTINFNAME),$(ProductKeyName),"","","2"
	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 "ODINSUP.INF: AddHardwareComponent Shell error "$($ShellCode)
		goto ShellCodeError
	endif
	set RegistryErrorIndex = $($R0)
	Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
		EndWait
		Debug-Output "ODINSUP.INF: AddHardwareComponent Registry error "$(RegistryErrorIndex)
		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)"] "$(ProductHardware$(Option)Title)},+
				{Hidden,$(NoTitle),$(!REG_VT_DWORD),1},+
				{Description,$(NoTitle),$(!REG_VT_SZ),$(ProductHardware$(Option)Description)},+
				{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 "ODINSUP.INF: AddValueList ShellCode error "$($ShellCode)
		goto ShellCodeError
	endif
	CloseRegKey $($R1)
	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)}, +
			{Infname ,$(NoTitle),$(!REG_VT_SZ),$(STF_CONTEXTINFNAME)}}
	shell $(UtilityInf), AddValueList, $(KeyAdapterRules), $(NewValueList)
	ifint $($ShellCode) != $(!SHELL_CODE_OK)
		Debug-Output "ODINSUP.INF: AddValueList ShellCode error "$($ShellCode)
		goto ShellCodeError
	endif
	set RegistryErrorIndex = $($R0)
	Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
		EndWait
		Debug-Output "ODINSUP.INF: AddValueList Registry error "$(RegistryErrorIndex)
		CloseRegKey $(KeyParameters)
		CloseRegKey $(KeyAdapterRules)
		goto fatalregistry
	endif

	CloseRegKey $(KeyAdapterRules)
	goto writeparameters

writeparameters = +
	Shell $(UtilityInf), GetBusTypeNum
	set BusTypeNum = $($R1)
	ifint $($ShellCode) != $(!SHELL_CODE_OK)
		Debug-Output "OEMNADNX.INF: GetBusTypeNum ShellCode error "$($ShellCode)
		goto ShellCodeError
	endif

	set IRQValue = *($(IRQValues), ~($(IRQList),$(IRQValueIndex)))
	set IOBaseAddrValue = *($(IOBaseAddrValues), +
	 ~($(IOBaseAddrList),$(IOBaseAddrIndex)))
;
; BUG, BUG Need to get OdinsupBindName from the registry, if more than one
; board is in the registry need to do a dialog box and allow the user to
; select the adapter.
;
; For now use the last adapter found that's not a Token Ring adapter since
; Odinsup does not support Token Ring at this time.
;

;	set OdiModulesName = $(!NTN_ServiceBase)"\OdiLoad\ODI_Modules"
;	OpenRegKey $(!REG_H_LOCAL) "" $(OdiModulesName) $(MAXIMUM_ALLOWED) KeyOdiModules
;	Ifstr(i) $(KeyOdiModules) == ""
;		goto fatalregistry
;	Endif
;	EnumRegKey $(KeyOdiModules) CardList
;
;	CloseRegKey $(KeyOdiModules)
;
;	set OdinsupBindName = $(Odi"ne2000"
;
;	set FoundEtherCard = 0
;
;	ForListDo $(CardList)
;		set CardName = *($($),1)
;	Split-String $(CardName) " " CardNameParts
;	set CardBaseName = *($(CardNameParts),1)
;	Ifstr(i) CardBaseName != "Token"
;		set FoundEtherCard = 1
;		set OdinsupBindName = $(CardBaseName)
;		Debug-Output "ODINSUP.INF: Bind to adapter "$(CardBaseName)
;	Endif
;	EndForListDo
;
;	Ifint $(FoundEtherCard) == 0
;		Debug-Output "ODINSUP.INF: No ethernet adapters found"
;	Debug-Output "ODINSUP.INF: Odinsup will NOT work on Token Ring"
;	Endif

	ifstr(i) $(OdiBindToAdapter) == ""
		set NewValueList = {{BusType,$(NoTitle),$(!REG_VT_DWORD),$(BusTypeNum)},+
					{MediaType,$(NoTitle),$(!REG_VT_DWORD),1},+
					{BoardInstance,$(NoTitle),$(!REG_VT_DWORD),1} }
	Else
		set NewValueList = {{BusType,$(NoTitle),$(!REG_VT_DWORD),$(BusTypeNum)},+
					{MediaType,$(NoTitle),$(!REG_VT_DWORD),1},+
					{Bind,$(NoTitle),$(!REG_VT_SZ),$(OdiBindToAdapter)},+
					{BoardInstance,$(NoTitle),$(!REG_VT_DWORD),1} }
	Endif

	shell $(UtilityInf), AddValueList, $(KeyParameters), $(NewValueList)
	CloseRegKey $(KeyParameters)
	ifint $($ShellCode) != $(!SHELL_CODE_OK)
		Debug-Output "ODINSUP.INF: AddValueList ShellCode error "$($ShellCode)
		goto ShellCodeError
	endif
	set RegistryErrorIndex = $($R0)
	Ifstr(i) $(RegistryErrorIndex) != NO_ERROR
		Debug-Output "ODINSUP.INF: AddValueList Registry error "$(RegistryErrorIndex)
		goto fatalregistry
	endif
	EndWait
	Set DriverToLoad = $(ProductSoftwareName)
	goto successful

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

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

UpgradeSoftware = +
	Debug-Output "ODINSUP.INF: UpgradeSoftware"
	ifstr(i) $(ProductKeyName) == $(!NTN_RegBase)
		OpenRegKey $(!REG_H_LOCAL) "" $(ProductKeyName) $(MAXIMUM_ALLOWED) KeyProduct
		Ifstr $(KeyProduct) != $(KeyNull)
			GetRegValue $(KeyProduct),"MajorVersion", VersionInfo
			set Version = *($(VersionInfo), 4)
			Split-String $(!NTN_Infname), "\", FilenameList
			QueryListSize ListSize $(FilenameList)
			set !UG_Filename = *($(FilenameList), $(ListSize))
	 		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)}
			ifint $(Version) != $(ProductVersion)
			endif
			CloseRegKey $(KeyProduct)
		else
			goto fatalregistry
		endif
	else
		OpenRegKey $(!REG_H_LOCAL) "" $(!NTN_RegBase) +
			$(MAXIMUM_ALLOWED) NetworkCardKey
		Ifstr(i) $(NetworkCardKey) != $(KeyNull)
			GetRegValue $(NetworkCardKey),"ServiceName", ServiceNameInfo
			set ServiceName = *($(ServiceNameInfo), 4)
			OpenRegKey $(NetworkCardKey) "" "NetRules" +
				$(MAXIMUM_ALLOWED) NetRuleKey
			Ifstr(i) $(NetRuleKey) == $(KeyNull)
				goto fatalregistry
			endif
			CloseRegKey $(NetRules)
			CloseRegKey $(NetworkCardKey)
		else
			goto fatalregistry
		endif
		OpenRegKey $(!REG_H_LOCAL) "" +
			$(!NTN_ServiceBase)"\"$(ServiceName) +
			$(MAXIMUM_ALLOWED) ServiceKey
		Ifstr(i) $(ServiceKey) != $(KeyNull)
			CloseRegKey $(ServiceKey)
		else
			goto fatalregistry
		endif
	endif
	goto end

successful = +
	Debug-Output "ODINSUP.INF: Successful; installing [InstallOption], DoCopy = "$(!DoCopy)
	goto installstep1

installstep1 = +
	goto end

abandon = +
	Debug-Output "ODINSUP.INF: abandon"
	ForListDo $(OEM_ABANDON_OPTIONS)
		Shell $(UtilityInf), RemoveHardwareComponent, $(Manufacturer), +
			$(ProductSoftwareName), $($) 	
		ifint $($ShellCode) != $(!SHELL_CODE_OK)
			Debug-Output "ODINSUP.INF: RemoveHardwareComponent ShellCode error "$($ShellCode)
			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 "ODINSUP.INF: RemoveSoftwareComponent ShellCode error "$($ShellCode)
			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

nonfatal = +
	Shell $(subroutineinf) SetupMessage, $(!STF_LANGUAGE), "NONFATAL", $(Error)
	ifint $($ShellCode) != $(!SHELL_CODE_OK)
		goto ShellCodeError
	endif
	ifstr(i) $($R1) == "OK"
		goto $(from)
	else
		goto "end"
	endif

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

fatal = +
	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 "ShellCodeError"
	goto setfailed

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

end = +
	goto term

term = +
	Return $(CommonStatus) $(DriverToLoad)


[Install-Option]
	set STF_VITAL = ""
	ifstr(i) $(!AddCopy) == "YES"
		AddSectionFilesToCopyList Files-$(Option) $(!STF_SRCDIR) $(!STF_WINDOWSSYSPATH)\drivers
	endif

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

	ifstr(i) $(!DoConfig) == "YES"
	endif
	Exit


[Install-Update]
	Debug-Output "ODINSUP.INF: Install-Update"
	set STF_VITAL 	= ""
	set STF_OVERWRITE	= "VERIFYSOURCEOLDER"
	AddSectionFilesToCopyList Files-$(Option) $(!STF_SRCDIR) $(!STF_WINDOWSSYSPATH)\drivers
	AddSectionFilesToCopyList Files-Inf $(!STF_SRCDIR) $(!STF_WINDOWSSYSPATH)
	CopyFilesInCopyList
	exit


;-----------------------------------------------------------------------
; LANGUAGES SUPPORTED
; -------------------
;
; The languages supported by the OEM INF, For every language supported
; we need to have a separate text section for every displayable text
; section.
;
;-----------------------------------------------------------------------

[LanguagesSupported]
	ENG, ENGLISH


[OptionsTextENG]
	ODINSUP	 = "Novell IntranetWare ODI Support for NDIS Protocols Adapter (ODINSUP)"

[OdinsupDlgENG]
	IDH_NETWARENDISODI	=	907
	Help						= "&Help"
	OK							= "OK"
	Continue					= "Continue"
	Cancel					= "Cancel"
	Advanced 				= "&Advanced"
	DlgType					= "RadioCombination"
	DlgTemplate 			= "ONELIST"
	Caption					= "NetWare NDIS over ODI (ODINSUP) Setup"
	Label1					= "Installed ODI Adapters"
	EditTextIn				= ""
	EditTextLim				= ""
	CBOptionsGreyed		= {}
	HelpContext				= $(IDH_NETWARENDISODI)
	ComboListItemsIn		= { OdiTitleList }
	ComboListItemsOut		= { DefaultOdiTitle }
	NotifyFields			= { "NO" }

[FileConstantsENG]
	ProductSoftwareTitle			= "Novell IntranetWare ODI Support for NDIS Protocols Driver"

	ProductHardwareODINSUPTitle	= "Novell IntranetWare ODI Support for NDIS Protocols Adapter"

	ProCaption		= "Windows NT Setup"
	ProCancel		= "Cance&l"
	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:"

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

[FileDependentDlgENG]
	DlgType				= "RadioCombination"
	DlgTemplate			= "ONELIST"
	Caption				= $(FunctionTitle)
	DlgText				= "Please select values for the following fields:"
	Label1				= "&IRQ Level:"
	Label2				= "I/O &Port Base Addr:"
	Combo1List			= $(IRQList)
	Combo1Out			= $(IRQValue)
	Combo2List			= $(IOBaseAddrList)
	Combo2Out			= $(IOBaseAddrValue)
	ComboListItemsIn	= {Combo1List, Combo2List}
	ComboListItemsOut	= {Combo1Out, Combo2Out}
	EditTextIn			= ""
	EditTextLim			= ""
	CBOptionsGreyed	= {}
	NotifyFields		= {NO, NO}
	HelpContext			= $(!IDH_DB_ODINSUP_INS)


;----------InstallOptionENG-------------------------------------------------
;
; InstallOptionENG:
;
;     This section has all of the strings that are displayed on the screen.
;		They are seperated so that the file can be easily transtated.
;
;------------------------------------------------------------------------
[InstallOptionENG]
	FunctionTitle = "Novell IntranetWare ODI Support for NDIS Setup"

	ShellCodeErrorTitle = "Error:  Novell IntranetWare ODI Support for NDIS Setup"

	ShellCodeErrorText = "Shell Code Error"

	NoODIAdapterInstalledTitle = "NetWare ODINSUP Setup"

	NoODIAdapterInstalledText = "There are NO ODI Adapters installed in "+
		"this Computer.  Please install an ODI Adapter and then install ODINSUP."

	LoadDisk2Text = "Please load the Novell NetWare Client for Windows NT "+
		"disk 2 into drive "


[Source Media Descriptions]
	1	= "Windows NT Setup Disk #1",				TAGFILE = disk1
	2	= "Windows NT Setup CD-ROM Disk",		TAGFILE = disk2
	3	= "NetWare for Windows NT Setup Disk",	TAGFILE = ODINSUP.SYS

[Files-Inf]
	3,	ODINSUP.inf,	SIZE=1000

[Files-ODINSUP]
	3,	odinsup.sys,	SIZE=72192
