Dcax25.inf Driver File Contents (ISCASNA3.EXE)

;
;; Modified	when		why
;  rmh001	10-Mar-94	Title is DCA X.25/QLLC Link Service
;						Link Service service name is DCAX25x
;  rmh001	14-Mar-94	Use MSFT-provided link services
;  rmh003	15-Mar-94	Device name is DCADL$nn
;
; DCA Change Log
;
; 08/25/93 David Ehrlich - Started with IBMX25.INF (RC1)
;			 - Changed all "IBM" to "DCA" execpt for IDD_IBMxxxxx
;			 - Changed all "ibm" to "dca"
;			 - Changed string item under [Source Media Descriptions]
;			 - Changed string items under [OptionsTextENG]
;			 - Changed 2 definitions of NetRulesTitle
;			 - Numerous changes to implement board configuration
;			   the same way it is being done for DCA SDLC.
;
; 08/31/93 David Ehrlich - Added code to check and set Data1LS and Data2LS
;			   entries in the ExtraParameters section of DCASYNC.
;			   They will be the name of the link service that
;			   DCAISCAConfigurationData1 and
;			   DCAISCAConfigurationData2 cooraspond to.
;			 - Added [FilesFor_hwsetup_DCAX25DD] section.
;
; 09/2/93 David Ehrlich  - Changed default setting of LNUA from
;			   "000000000000000" to ""
;
; 10/08/93 David Ehrlich - Added Microsoft RC 2 changes
;

;************************************************************************
;************************************************************************
;
; DCAX25.INF
;
;	DCA X25 Link Service and Device Driver INF file
;
; History:
;   t-danfr	Aug 05, 92	Initial Design
;
; Notes:
;	1) This file is based on the template.inf file that is distributed
;	   to IHV/ISV's.
;
;************************************************************************
;************************************************************************

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; INITIALIZATION SECTION
; ----------------------
; This section is responsible for defining the product variables.  It is the
; highest level of definition.  Installation programs will use this section
; to figure out available options etc.
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

;========================================================================
;
; SOURCE MEDIA DESCRIPTIONS
; -------------------------
; The IHV should list all the diskette labels here.  The source media
; description is used during copy to prompt the user for a diskette
; if the source is diskettes.  The TAGFILE field is used to confirm that
; the proper disk is being used.
;
; FORMAT:
; The format includes an enumeration constant and a name for the disk,
; as well as a number of possible flags (including the TAGFILE flag.)
; 	1 = "Diskette 1 Label", TAGFILE = "Disk1.Tag"
; 	2 = "Diskette 2 Label", TAGFILE = "Disk2.Tag"
; 	...
;
; REFERENCES:
; TODO - Add a reference to somewhere
;
;========================================================================

[Source Media Descriptions]
1 = "SNA Link Service diskette (DCA)"

;========================================================================
;
; OPTION TYPE
; -----------
; This identifies the Option type we are dealing with.  The different
; possible types are:
;
; COMPUTER, DISPLAY, MOUSE, KEYBOARD, LAYOUT, SCSI, PRINTER, ...
;
;   Types specific to networking:
;     NetAdapter,	A netcard/adapter combination or just a netcard
;     NetDriver, 	A netcard driver
;     NetTransport,	A complete NDIS-compliant TDI transport stack
;     NetService,	An NT networking service
;     NetWork,		A complete network ensemble
;     NetProvider,	A complete network which supports NT MPR protocol
;
; TODO - do we want to mention all those types or just the ones relevant to us?
;
; REFERENCES:
; TODO - Add a reference to somewhere
;
;========================================================================

[Identification]
    OptionType = NetService

;========================================================================
;
; LANGUAGES SUPPORTED
; -------------------
; The languages supported by the IHV INF, For every language supported
; we need to have a separate text section for every displayable text
; section.
;
; REFERENCES:
; TODO - Add a reference to somewhere
;
;========================================================================

[LanguagesSupported]
    ENG

;========================================================================
;
; OPTION LIST
; -----------
; This section lists the IHV Option key names.  These keys are locale
; independent and used to represent the option in a locale independent
; manner.
;
; REFERENCES:
; TODO - Add a reference to somewhere
;
;========================================================================

[Options]
	DCAX25LS
	DCAX25DD
	
;========================================================================
;
; OPTION TEXT SECTION
; -------------------
; These are text strings used to identify the option to the user.  There
; are separate sections for each language supported.
;
; FORMAT:
; The format of the section name is "OptionsText" concatenated with the
; Language represented by the section.
;	[OptionsTextLNG1]
;		...
;	[OptionsTextLNG2]
;		...
;
; REFERENCES:
; TODO - Add a reference to somewhere
;
;========================================================================

[OptionsTextENG]
	DCAX25LS = "DCA X.25 (QLLC) Link Service"
	DCAX25DD = "DCA SDLC/X.25 Device Driver"

;========================================================================
;
; SNA OPTION LIST
; ---------------
; This is the list of options available to the SNA Server user.  This is
; the list presented to the user from the SNA Server setup as the
; available options.  Like the normal options list, it is locale independent.
;
; REFERENCES:
; TODO - Add a reference to somewhere
;
;========================================================================

[SNAOptions]
	DCAX25LS

;========================================================================
;
; SNA OPTION ADDITIONALS
; ----------------------
; This section specifies the additional installations that should be performed
; for each of the main options.  The SNA Server setup will invoke this INF
; file with each of these additional options in order followed by the main
; option.
;
; FORMAT:
; The format for the section name is "SNAOptionAdds" concatenated with the
; option name.
;	[SNAOptionAddsSNAOPT1]
;		...
;	[SNAOptionAddsSNAOPT2]
;		...
;
; REFERENCES:
; TODO - Add a reference to somewhere
;
;========================================================================

[SNAOptionAddsDCAX25LS]
	DCAX25DD

;========================================================================
;
; INSTALLATION STEPS SECTION
; --------------------------
; In this section, the IHV gets to define which steps will be taken in the
; installation procedure.  There are three variables and they all must be
; defined.
;
; FORMAT:
; The format is "InstallSteps" concatenated with the option name
;	[InstallStepsOPT1]
; 		...
;
;========================================================================

[InstallStepsDCAX25LS]
	AddFilesToCopyList	= YES
	CopyFilesInCopyList	= YES

[InstallStepsDCAX25DD]
	AddFilesToCopyList	= YES
	CopyFilesInCopyList	= NO

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; DIALOG CONSTANTS SECTION
; ------------------------
; This section is responsible for defining dialog constants.  It is
; meant to be used to simplify programming this INF file as well as reading
; it.
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

[DialogConstants]
	Radio1 	= "1"
	Radio2 	= "2"
	Radio3 	= "3"
	Radio4 	= "4"
	Radio5 	= "5"
	Radio6 	= "6"
	Radio7 	= "7"
	Radio8 	= "8"
	Radio9 	= "9"

;++++++++++++++++++++++++++++++++++++
;
; ProgressCopyVars:
; These variables specify the look of the gauge that comes up
; when copying files.
;
;++++++++++++++++++++++++++++++++++++
[ProgressCopyVars]
ProCaption      = "File copy in progress"
ProCancel       = "&Cancel"
ProCancelMsg    = $(ProductTitle)$(!LF)"is not fully installed."$(!LF)+
                  "Are you sure you want to cancel before all"$(!LF)+
                  "the files are copied?"
ProCancelCap    = $(SetupTitle)" Warning"
ProText1        = "Copying "
ProText2        = "        to"

[HelpContextIDs]
	IDD_IBMX25DDCONFIG = 101
	IDD_IBMX25LSCONFIG = 102

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; FILE CONSTANTS SECTION
; ----------------------
; This section is responsible for defining some general product information
; that will be used mostly for the registry
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

;++++++++++++++++++++++++++++++++++++
;
; File Names Subsection:
; This subsection contains useful filenames for use as macros.
;
;++++++++++++++++++++++++++++++++++++

[FileConstants]

!UtilityInf	= $(!SNARootDir)"\SETUPUTL.INF"
!SubroutineInf	= $(!STF_WINDOWSSYSPATH)"\SUBROUTN.INF"
DialogLibrary   = $(!SNARootDir)"\SETUP.SRL"
ThisFile	= "DCAX25"
ThisInf		= $(ThisFile)".INF"
ThisSrl		= $(ThisFile)".SRL"
ThisHlp		= $(ThisFile)".HLP"
HlpMin		= "100"
HlpMax		= "103"
$ShellCode	= 0

;++++++++++++++++++++++++++++++++++++
;
; Product Information Subsection:
; This subsection contains lots of product information that will be used
; mostly in the registry.
;
; For the SNAServiceType value, please refer to the "SNAServiceTypes" section
; in the SETUPUTL.INF file.  Also, only Link Services have this value, all
; others should have a NULL string ("") for this value.
;
;++++++++++++++++++++++++++++++++++++

[FileConstantsDCAX25LS]
;
; Product Info
;
ProductVersion  		= "1.0"
ProductName			= "DCAX25LS"
ProductFullName			= $(ProductName)"_"$(ProductVersion)"_"$(Instance)
ProductRegBase			= $(!NTN_SoftwareBase)"\Microsoft"
ProductType			= "Link"
ProductImagePath		= "SNALINK.EXE"
ProductDepends			= {}
ProductParams			= {}
ProductExtraParams		= {}
ProductExclusive		= $(FALSE)
ProductDLL			= "IBMX25.DLL"		;;rmh002
ProductServicePrefix		= "DCAX25"
ProductServiceQuery		= $(TRUE)
;
; Registry Key Information
;
SNAServiceType			= "CESX25"
;
; NetRules Stuff
;
NetRulesClass			= "snax25link snalink"
NetRulesTitle			= "DCA X.25 Link Service"
NetRulesUse			= "service yes yes"
NetRulesBindable		= "snax25link snasyncdriver non non 100"
NetRulesType                    = "dcax25_"$(Instance)" snax25link"
FullInfName		    	= $(!SNARootDir)"\system\hwsetup\"$(ThisInf)
SoftwareType			= "service"

[FileConstantsDCAX25DD]
;
; Product Info
;
ProductVersion  		= "1.0"
ProductName			= "DCASYNCDD"
ProductFullName			= $(ProductName)"_"$(ProductVersion)"_"$(Instance)
ProductRegBase			= $(!NTN_SoftwareBase)"\Microsoft"
ProductType			= "Driver"
ProductImagePath		= "DCASYNC.SYS"
ProductDepends			= {}
ProductParams			= {}
ProductExtraParams		= {}
ProductExclusive		= $(TRUE)
ProductDLL			= ""
ProductServicePrefix		= "DCASYNC"
ProductServiceQuery		= $(FALSE)
;
; Registry Key Information
;
SNAServiceType			= "DRIVER"
;
; NetRules Stuff
;
NetRulesClass			= "snasyncdriver basic yes"
NetRulesTitle			= "DCA SDLC/X.25 Device Driver"
NetRulesUse			= "driver yes yes"
NetRulesBindable		= ""
NetRulesType			= "dcasyncdd snasyncdriver"
FullInfName		    	= $(!SNARootDir)"\system\hwsetup\"$(ThisInf)
SoftwareType			= "driver"

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; GENERAL CONSTANTS SECTION
; -------------------------
; This section is responsible for defining some general constants that
; are used in this INF script.  These constants include flow control
; variables, exit codes, and registry reference numbers.
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

[GeneralConstants]

;++++++++++++++++++++++++++++++++++++
;
; Flow Control Variables:
; From will generally represents the label we just came from while To
; represents the label we are headed to.
;
;++++++++++++++++++++++++++++++++++++

from	= ""
to	= ""

;++++++++++++++++++++++++++++++++++++
;
; Booleans:
;
;++++++++++++++++++++++++++++++++++++

TRUE	= 1
FALSE	= 0
!True   = "1"
!False  = "0"

;++++++++++++++++++++++++++++++++++++
;
; Other values
;
;++++++++++++++++++++++++++++++++++++

NOTIFY	= 2

;++++++++++++++++++++++++++++++++++++
;
; Registry Initialization Parameters:
;
;++++++++++++++++++++++++++++++++++++

NoTitle		= 0
KeyNull 	= ""
KeyProduct	= ""
KeyParameters	= ""

;++++++++++++++++++++++++++++++++++++
;
; Other Initialization Parameters:
;
;++++++++++++++++++++++++++++++++++++

ExitState		= "Active"
OldVersionExisted	= $(FALSE)

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; LANGUAGE-DEPENDENT DIALOG CONSTANTS SECTION
; -------------------------------------------
; This section is responsible for defining dialog constants that are
; language dependent.
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

;++++++++++++++++++++++++++++++++++++
;
; Common Button Names:
;
;++++++++++++++++++++++++++++++++++++

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

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; LANGUAGE-DEPENDENT FILE CONSTANTS SECTION
; -----------------------------------------
; This section is responsible for defining language dependent information.
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

[FileConstantsENG]

;
; The following name should include the name of the IHV as per the example
;
SetupTitle	= "DCA X.25 Link Service Setup"

[FileConstantsDCAX25LS_ENG]
ProductTitle	= "DCA X.25 Link Service"
ProductDesc	= "DCA X.25 Link Service for "$(!SNA_ProductName)

[FileConstantsDCAX25DD_ENG]
ProductTitle	= "DCA SDLC/X.25 Device Driver"
ProductDesc	= "DCA SDLC/X.25 Device Driver for "$(!SNA_ProductName)

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; DATE SECTION
; ------------
; This section is responsible for establishing the value of the "Now"
; variable.  This variable is a list of the following format:
;	{ Seconds from 1-1-1970, Year, Month, Day, Hour, Minute, Second }
;	
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

[LoadSetupLibrary]
  LoadLibrary "x" $(!STF_WINDOWSSYSPATH)\setupdll.dll !LIBHANDLE
  exit

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

[FreeSetupLibrary]
  FreeLibrary $(!LIBHANDLE)
  exit


;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; INPUT DIALOGS SECTION
; ---------------------
; This section should contain all the information about the input dialogs.
;
; FORMAT:
; The format of the section name is the string name concatenated with the
; Language represented by the section.
;	[InputDialog1LNG1]
;		...
;	[InputDialog2LNG1]
;		...
;	
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

[DoX25LSConfigENG]
DlgTemplate		= IDD_IBMX25LSCONFIG
DlgType			= "RadioCombination"
Caption			= $(!P:SetupTitle)
DlgText1		= "Service Name: "$(ServiceName)
EditLabel1		= "&Title:"
EditLabel2		= "Local &NUA Address:"
EditLabel3		= "T&1 Timeout (0.1s):"
EditLabel4		= "N&2 Retry Limit:"
EditLabel5		= "Outgoing SVC:"
EditLabel6		= "Two-Way SVC:"
EditLabel7		= "Incoming SVC:"
EditLabel8		= "PVC:"
EditGroup1		= "Channel Ran&ges"
EditTextIn		= { $(ServiceTitle), $(LNUA), +
			    $(T1Timeout),    $(N2Retry), +
			    $(OSVCRng),      $(2SVCRng), +
			    $(ISVCRng),      $(PVCRng) }
EditTextLim		= { 40, 15, 3, 3, 9, 9, 9, 9 }

ComboLabel2		= "&W: Default L3 Window Size:"
ComboListIn2		= { "1", "2", "3", "4", "5", "6", "7" }
ComboListOut2		= $(L3Window)

ComboLabel3		= "&P: Default L3 Packet Size:"
ComboListIn3		= { "64", "128", "256", "512" }
ComboListOut3		= $(L3PktSz)

ComboLabel4		= "&K: L2 Window Size:"
ComboListIn4		= { "1", "2", "3", "4", "5", "6", "7" }
ComboListOut4		= $(L2Window)

ComboLabel5		= "&Interrupt"
ComboLabel6		= "I/&O Address"
ComboLabel7		= "&DMA Channel"

NotifyFields		= { "NO", "NO", "NO", "NO" }
RadioGroup1		= "&Line Type"
RadioText1		= "Leased"
RadioText2		= "Switched: Server-Stored Number"
RadioText3		= "Switched: Modem-Stored Number"
RadioText4		= "Switched: Manual Dial"
RadioGroup2		= "Data &Rate"
RadioText5		= "High"
RadioText6		= "Low"
RadioGroup3		= "&Encoding"
RadioText7		= "NRZ"
RadioText8		= "NRZI"
RadioOptionsGreyed	= {}
CheckText1		= "Accept Re&verse Charge"
CheckText2		= "&Startup Restart"
CheckText3		= "Select Standb&y"
CheckText4		= "Incoming &Filter"
CBOptionsGreyed		= {}
HelpContext		= #( HelpContextIDs, $(DlgTemplate), 1 )

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; INPUT DIALOGS SCRIPTS
; ---------------------
; This section should contain all the scripts for doing input dialogs.
; Each script may return as many parameters as it wants, so long as the
; first parameter is the status and is one of the following:
;
; 		STATUS_SUCCESSFUL
;		STATUS_FAILED
;		STATUS_USERCANCEL
;		STATUS_USERBACK
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;
; DoX25LSConfig:
;
; DESCRIPTION:  This shell script pops up a dialog to get the configuration
;				of this product.
;
; INPUT:        $($0) : Service Name
;		$($1) : Current Title
;		$($2) : Current Driver Index
;		$($3) : Current Local NUA Address
;		$($4) : Current L3 Window Size
;		$($5) : Current L3 Packet Size
;		$($6) : Current L2 Window Size
;		$($7) : Current T1 Timeout
;		$($8) : Current N2 Retry Limit
;		$($9) : Current Accept Reverse Charge
;		$($10): Current Startup Restart
;		$($11): Current Select Standby
;		$($12): Current Outgoing SVC Range
;		$($13): Current Two-Way SVC Range
;		$($14): Current Incoming SVC Range
;		$($15): Current PVC Range
;		$($16): Current Data Rate
;		$($17): Current Encoding
;		$($18): Current Incoming Filter status
;		$($19): Current Line Type
;		$($20): Current Manual Dial setting
;
; OUTPUT:       $($R0): STATUS: One of the above
;		$($R1): Changes flag
;		$($R2)
;		 ...   : New values of above variables
;		$($R20): In their respective slots
;
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()

[DoX25LSConfig]
	
	set ServiceName		= $($0)
	set ServiceTitle	= $($1)
	set DriverIndex		= $($2)
	set LNUA		= $($3)
	set L3Window		= $($4)
	set L3PktSz		= $($5)
	set L2Window		= $($6)
	set T1Timeout		= $($7)
	set N2Retry		= $($8)
	set AcceptRevCh		= $($9)
	set Restart		= $($10)
	set Standby		= $($11)
	set OSVCRng		= $($12)
	set 2SVCRng		= $($13)
	set ISVCRng		= $($14)
	set PVCRng		= $($15)
	set DataRate		= $($16)
	set NRZI		= $($17)
	set FilterIncoming	= $($18)
	set LineType		= $($19)
	set FRadio4		= $($20)

	set SvDriverIndex	= $($2)
	set SvLNUA		= $($3)
	set SvL3Window		= $($4)
	set SvL3PktSz		= $($5)
	set SvL2Window		= $($6)
	set SvT1Timeout		= $($7)
	set SvN2Retry		= $($8)
	set SvAcceptRevCh	= $($9)
	set SvRestart		= $($10)
	set SvStandby		= $($11)
	set SvOSVCRng		= $($12)
	set Sv2SVCRng		= $($13)
	set SvISVCRng		= $($14)
	set SvPVCRng		= $($15)
	set SvDataRate		= $($16)
	set SvNRZI		= $($17)
	set SvFilterIncoming	= $($18)
	set SvLineType		= $($19)
	set SvRadio4		= $($20)

	set Status  = STATUS_SUCCESSFUL
	set Changes = 0

	;
	; Read in all registry entries related to DCASYNC
	;
	OpenRegKey $(!REG_H_LOCAL), "", "SYSTEM\CurrentControlSet\Services\DCASYNC\Parameters\ExtraParameters", $(!REG_KEY_READ), KeyDriver
	ifstr(i) $(KeyDriver) == $(KeyNull)
		DCASYNCcfg1 = 0
	  	DCASYNCcfg2 = 0
	  	DCASYNCls1  = ""
	  	DCASYNCls2  = ""
	else
	  	GetRegValue $(KeyDriver) "DCAISCAConfigData1" DCASYNCcfg1
	  	GetRegValue $(KeyDriver) "DCAISCAConfigData2" DCASYNCcfg2
	  	GetRegValue $(KeyDriver) "Data1LS" 	      DCASYNCls1
	  	GetRegValue $(KeyDriver) "Data2LS"	      DCASYNCls2

	  	set DCASYNCcfg1 = *( $(DCASYNCcfg1), 4 )
	  	set DCASYNCcfg2 = *( $(DCASYNCcfg2), 4 )
	  	set DCASYNCls1  = *( $(DCASYNCls1),  4 )
	  	set DCASYNCls2  = *( $(DCASYNCls2),  4 )

	  	CloseRegKey $(KeyDriver)
	endif

	;
	; See if this is a new LS, and if so then is there is room to
	; hold it
	;
	ifstr(i) $(ServiceName) == $(DCASYNCls1)
	  	goto ConfigLS010
	endif
	ifstr(i) $(ServiceName) == $(DCASYNCls2)
	  	goto ConfigLS010
	endif
	ifstr(i) $(DCASYNCls1) == ""
	  	goto ConfigLS010
	endif
	ifstr(i) $(DCASYNCls2) == ""
	  	goto ConfigLS010
	endif

	shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) +
     NONFATAL "The maximum of 2 DCA SDLC/X.25 boards are already configured."
	Return $(Status), $(Changes), $(ServiceTitle), $(DriverIndex), +
	       $(LNUA), $(L3Window), $(L3PktSz), $(L2Window), $(T1Timeout), +
	       $(N2Retry), $(AcceptRevCh), $(Restart), $(Standby), +
	       $(OSVCRng), $(2SVCRng), $(ISVCRng), $(PVCRng), $(DataRate), +
	       $(NRZI), $(FilterIncoming), $(LineType), $(FRadio4)

ConfigLS010 =+
	read-syms DialogConstants
	read-syms DialogConstants$(!STF_LANGUAGE)
	read-syms DoX25LSConfig$(!STF_LANGUAGE)

	;
	; Set up choices based on bus type
	;
	ifstr(i) $(!STF_BUSTYPE) == "MCA"
	  set ComboListIn5 = { "3", "4", "7" }
	  set ComboListIn6 = { "380-387", "388-38F", "3A0-3A7", "3A8-3AF" }
	  set ComboListIn7 = { "1", "5", "7", "None" }
	else
	  set ComboListIn5 = { "3", "4", "7" }
	  set ComboListIn6 = { "380-387", "388-38F", "3A0-3A7", "370-377" }
	  set ComboListIn7 = { "1", "3", "None" }
	endif

	;
	; Figure out if this is a new or modify config and set DriverParams
	; accordingly.
	;
	set DriverParams = 0
	ifstr(i) $(ServiceName) == $(DCASYNCls1)
	  	set DriverParams = $(DCASYNCcfg1)
	endif
	ifstr(i) $(ServiceName) == $(DCASYNCls2)
	  	set DriverParams = $(DCASYNCcfg2)
	endif
	ifint $(DriverParams) == 0
	  	set DriverParams = "310"
	endif

	;
	; Figure out what board settings were previously chosen.
	;
	set Temp = $(DriverParams)
	ifint      $(Temp) > 700
	  	set ComboListOut5 = "7"
	  	set-sub Temp = $(Temp),700
	else-ifint $(Temp) > 400
	  	set ComboListOut5 = "4"
	  	set-sub Temp = $(Temp),400
	else
	  	set ComboListOut5 = "3"
	  	set-sub Temp = $(Temp),300
	endif

	ifint      $(Temp) >= 50
	  	set ComboListOut6 = "3A8-3AF"
	  	set-sub Temp = $(Temp),50
	else-ifint $(Temp) >= 40
	  	set ComboListOut6 = "370-377"
	  	set-sub Temp = $(Temp),40
	else-ifint $(Temp) >= 30
	  	set ComboListOut6 = "3A0-3A7"
	  	set-sub Temp = $(Temp),30
	else-ifint $(Temp) >= 20
	  	set ComboListOut6 = "388-38F"
	  	set-sub Temp = $(Temp),20
	else
	  	set ComboListOut6 = "380-387"
	  	set-sub Temp = $(Temp),10
	endif

	ifint      $(Temp) == 1
	  	set ComboListOut7 = "1"
	else-ifint $(Temp) == 3
	  	set ComboListOut7 = "3"
	else-ifint $(Temp) == 5
	  	set ComboListOut7 = "5"
	else-ifint $(Temp) == 7
	  	set ComboListOut7 = "7"
	else
	  	set ComboListOut7 = "None"
	endif

	set ComboListItemsIn  = { ComboListIn2,  ComboListIn3,  ComboListIn4,  ComboListIn5,  ComboListIn6,  ComboListIn7 }
	set ComboListItemsOut = { ComboListOut2, ComboListOut3, ComboListOut4, ComboListOut5, ComboListOut6, ComboListOut7 }

	set-add Temp = $(LineType), 1
	set RadioIn1 = *( {1,3,2}, $(Temp) )
	ifstr(i) $(FRadio4) == $(!True)
	  	set RadioIn1 = "4"
	endif

	ifint $(DataRate) == 0
		set RadioIn2 = $(Radio6)
	else
		set RadioIn2 = $(Radio5)
	endif
	ifint $(NRZI) == 0
		set RadioIn3 = $(Radio7)
	else
		set RadioIn3 = $(Radio8)
	endif
	set RadioIn = { $(RadioIn1), $(RadioIn2), $(RadioIn3) }

	set TmpCheckItemsIn = { $(AcceptRevCh), $(Restart), $(Standby), +
							$(FilterIncoming) }
	set CheckItemsIn = {}
	ForListDo $(TmpCheckItemsIn)
		ifint $($) == 0
			set CheckItemsIn = >( $(CheckItemsIn), "OFF" )
		else
			set CheckItemsIn = >( $(CheckItemsIn), "ON" )
		endif
	EndForListdo

begin = +
	set Status = STATUS_SUCCESSFUL

RefreshDlg =+
	ui start $(DlgTemplate) $(!IHVDLGHANDLE)

	ifstr(i) $(DLGEVENT)		== "Exit"
		set Status = STATUS_USERCANCEL
	else
		set Status = STATUS_SUCCESSFUL
		set Error  = {}

		;
		; Compute new driver index
		;
;---
	  ifstr(i) $(DCASYNCls1) == ""
    	    ifstr(i) $(DCASYNCls2) == ""
; Nothing in the first slot and nothing in the second, assume first
; index entry as appropriate
              ifstr(i) $(!NTN_InstallMode) == install
          	ifstr(i) $(!STF_BUSTYPE) == "MCA"
          	   set DriverIndex = "05"
        	else
          	   set DriverIndex = "03"
                endif
	      else
	      ; Must be config
                 set DriverIndex = "03"
                 ifstr(i)      $(!BBDeviceName) == "DCADL$03"
                      set DriverIndex = "03"
                 else-ifstr(i) $(!BBDeviceName) == "DCADL$04"
                       set DriverIndex = "04"
                 else-ifstr(i) $(!BBDeviceName) == "DCADL$05"
                       set DriverIndex = "05"
                 else-ifstr(i) $(!BBDeviceName) == "DCADL$06"
                       set DriverIndex = "06"
                 endif
	      endif
	    else
; We had a second slot entry assume the proper idx
              ifstr(i) $(!NTN_InstallMode) == install
      	       ifstr(i) $(!STF_BUSTYPE) == "MCA"
      		set DriverIndex = "06"
    	       else
      		set DriverIndex = "04"
	       endif
	      else
                set DriverIndex = "03"
                ifstr(i)      $(!BBDeviceName) == "DCADL$03"
                      set DriverIndex = "03"
                else-ifstr(i) $(!BBDeviceName) == "DCADL$04"
                      set DriverIndex = "04"
                else-ifstr(i) $(!BBDeviceName) == "DCADL$05"
                      set DriverIndex = "05"
                else-ifstr(i) $(!BBDeviceName) == "DCADL$06"
                      set DriverIndex = "06"
                endif
	     endif
	    endif
	  else
; This is if we had one in the first slot. So set the idx for
; the first one
            ifstr(i) $(!NTN_InstallMode) == install
	     ; We are installing
	      ifstr(i) $(!STF_BUSTYPE) == "MCA"
      	        set DriverIndex = "06"
    	      else
      	        set DriverIndex = "04"
	      endif
            else
	    ; We must be configuring
             set DriverIndex = "03"
             ifstr(i)      $(!BBDeviceName) == "DCADL$03"
                  set DriverIndex = "03"
             else-ifstr(i) $(!BBDeviceName) == "DCADL$04"
                   set DriverIndex = "04"
             else-ifstr(i) $(!BBDeviceName) == "DCADL$05"
                   set DriverIndex = "05"
             else-ifstr(i) $(!BBDeviceName) == "DCADL$06"
                   set DriverIndex = "06"
             endif
            endif

	  endif


;---
		;
	  	; Compute new driver params
	  	;
	  	set DriverParams = 0

	  	ifint      $(ComboListOut5) == 3
	    		set-add DriverParams = $(DriverParams),300
	  	else-ifint $(ComboListOut5) == 4
	    		set-add DriverParams = $(DriverParams),400
	  	else
	    		set-add DriverParams = $(DriverParams),700
	  	endif

	  	ifstr(i) $(ComboListOut6) == "380-387"
	    		set-add DriverParams = $(DriverParams),10
	  	endif
	  	ifstr(i) $(ComboListOut6) == "388-38F"
	    		set-add DriverParams = $(DriverParams),20
	  	endif
	  	ifstr(i) $(ComboListOut6) == "3A0-3A7"
	    		set-add DriverParams = $(DriverParams),30
	  	endif
	  	ifstr(i) $(ComboListOut6) == "370-377"
	    		set-add DriverParams = $(DriverParams),40
	  	endif

	  	ifint      $(ComboListOut7) == 1
	    		set-add DriverParams = $(DriverParams),1
	  	else-ifint $(ComboListOut7) == 3
	    		set-add DriverParams = $(DriverParams),3
	  	else
	    		set-add DriverParams = $(DriverParams),0
	  	endif

	  	;
	  	; See if new driver params conflicts with another X.25 driver
	  	;
	  	set DPOther = 0
	  	ifstr(i) $(ServiceName) == "SnaX251"
	    		ifstr(i) $(DCASYNCls1) == "SnaX252"
	      			set DPOther = $(DCASYNCcfg1)
	    		endif
	    		ifstr(i) $(DCASYNCls2) == "SnaX252"
	      			set DPOther = $(DCASYNCcfg2)
	    		endif
	  	else
	    		ifstr(i) $(DCASYNCls1) == "SnaX251"
	      			set DPOther = $(DCASYNCcfg1)
	    		endif
	    		ifstr(i) $(DCASYNCls2) == "SnaX251"
	      			set DPOther = $(DCASYNCcfg2)
	    		endif
	  	endif
	  	ifint $(DPOther) == 0
	    		set DPOther = "999"
	  	endif
	  	set DPThis = $(DriverParams)

	    	;
	    	; Check the IRQ
	    	;
	    	set-div i1 = $(DPThis),  100
	    	set-div i2 = $(DPOther), 100
	    	ifint $(i1) == $(i2)
	      		shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL "This interrupt setting is in conflict with the other DCA X.25 board."
	      		ui pop 1
	      		goto RefreshDlg
	    	else
	      		set-mul tem     = $(i1), 100
	      		set-sub DPThis  = $(DPThis),  $(tem)
	      		set-mul tem     = $(i2), 100
	      		set-sub DPOther = $(DPOther), $(tem)
	    	endif

	    	;
	    	; Check the I/O address
	    	;
	    	set-div i1 = $(DPThis),  10
	    	set-div i2 = $(DPOther), 10
	    	ifint $(i1) == $(i2)
	      		shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL "This I/O address setting is in conflict with the other DCA X.25 board."
	      		ui pop 1
	      		goto RefreshDlg
	    	else
	      		set-mul tem     = $(i1), 10
	      		set-sub DPThis  = $(DPThis),  $(tem)
	      		set-mul tem     = $(i2), 10
	      		set-sub DPOther = $(DPOther), $(tem)
	    	endif
	
	    	;
	    	; Check the DMA
	    	;
	    	set-div i1 = $(DPThis),  1
	    	set-div i2 = $(DPOther), 1
 	    	ifint $(i1) == $(i2)
	      		ifint $(i1) > 0
                		shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL "This DMA channel setting is in conflict with the other DCA X.25 board."
	        		ui pop 1
	        		goto RefreshDlg
	      		endif
	    	endif

		set LNUA      = *( $(EditTextOut), 2 )
		set L3Window  = $(ComboListOut2)
		set L3PktSz   = $(ComboListOut3)
		set L2Window  = $(ComboListOut4)

		set T1Timeout = *( $(EditTextOut), 3 )
		ifint $(T1Timeout) < 1
		  set Error = >( $(Error), ERROR_T1 )
		else-ifint $(T1Timeout) > 100
		  set Error = >( $(Error), ERROR_T1 )
		endif

		set N2Retry = *( $(EditTextOut), 4 )
		ifint $(N2Retry) < 1
		  set Error = >( $(Error), ERROR_N2 )
		else-ifint $(N2Retry) > 100
		  set Error = >( $(Error), ERROR_N2 )
		endif

		ifstr(i) *( $(CheckItemsOut), 1 ) == "OFF"
		  set AcceptRevCh = 0
		else
		  set AcceptRevCh = 1
		endif

		ifstr(i) *( $(CheckItemsOut), 2 ) == "OFF"
		  set Restart = 0
		else
		  set Restart = 1
		endif

		ifstr(i) *( $(CheckItemsOut), 3 ) == "OFF"
		  set Standby = 0
		else
		  set Standby = 1
		endif

        ;
        ; Check the SVC/PVC range parameters for validity
        ; and range.
        ;
        set errflag = 0
        set errindex = 0

        ForListDo { 1 2 3 4 }
          ifint $(errflag) == 0

            ;
            ; Check for two fields separated by a dash.
            ;
            set-add index = $(#), 4
            set item = *($(EditTextOut),$(index))

            ifstr(i) $(item) == ""
              set n = 0
              set m = 0
              set t$(#) = 0
            else
              Split-String *($(EditTextOut),$(index)), "-", list
              QueryListSize size $(list)
              ifint $(size) != 3
                set errflag = 1
                set errindex = $(#)
              endif

              ifint $(errflag) == 1
                goto _nerr
              endif

              set n = *($(list),1)
              set m = *($(list),3)

              ;
              ; Check the two fields are numeric with the first
              ; less than or equal to the second.
              ;
              ifint $(n) > 0
                goto _nok
              else-ifstr $(n) == "0"
                goto _nok
              else
                set errflag = 1
                set errindex = $(#)
              endif

              _nok =+
              ifint $(m) > 0
                goto _mok
              else-ifstr $(m) == "0"
                goto _mok
              else
                set errflag = 1
                set errindex = $(#)
              endif

              _mok =+
              ifint $(errflag) == 0

                ifint $(n) > $(m)
                  set errflag = 2
                  set errindex = $(#)
                endif

                ifint $(errflag) > 0
                  goto _nerr
                endif

                ;
                ; Save the fields for later totalling.
                ;
                set-sub t$(#) = $(m), $(n)

              else
                set t$(#) = 0
              endif

            endif  ; item == ""
          endif  ; errflag == 0

        _nerr =+
        EndForlistDo

        set desclist = { "Outgoing SVC", "Two-Way SVC", "Incoming SVC", "PVC" }

        ifint $(errflag) == 1
          shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) STATUS +
            "Please enter the "*($(desclist),$(errindex))" range value as two numbers"+
            " separated by a hyphen, for example, ""1018-1024""."
          goto RefreshDlg

        else-ifint $(errflag) == 2
          shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) STATUS +
            "Please enter the "*($(desclist),$(errindex))" range value so that the"+
            " first number is less than or equal to the second."
          goto RefreshDlg

        endif

        ;
        ; Add up ranges and check total < 16.
        ;
        set total = 0
        ForListDo { 1 2 3 4 }
          set-add total = $(total), $(t$(#))
        EndForListDo

        ifint $(total) > 16
          shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) STATUS +
            "The sum total of all four channel ranges cannot be greater than 16."
          goto RefreshDlg
        endif

        ;
        ; All range values should be okay at this point.
        ;
	    set OSVCRng  = *( $(EditTextOut), 5 )
	    set 2SVCRng  = *( $(EditTextOut), 6 )
	    set ISVCRng  = *( $(EditTextOut), 7 )
	    set PVCRng   = *( $(EditTextOut), 8 )
		set LineType = *( {0,2,1,1}, *( $(RadioOut), 1 ))

		ifstr(i) *( $(RadioOut), 1 ) == "4"
		  set FRadio4 = $(!True)
		else
		  set FRadio4 = $(!False)
		endif

		ifint *( $(RadioOut), 2 ) == $(Radio5)
			set DataRate = 1
		else-ifint *( $(RadioOut), 2 ) == $(Radio6)
			set DataRate = 0
		endif

		ifint *( $(RadioOut), 3 ) == $(Radio7)
			set NRZI = 0
		else-ifint *( $(RadioOut), 3 ) == $(Radio8)
			set NRZI = 1
		endif

		ifstr(i) *( $(CheckItemsOut), 4 ) == "OFF"
			set FilterIncoming = 0
		else
			set FilterIncoming = 1
		endif

	        ;
	        ; Check title against those configured for other link services
	        ;
	        set TmpTitle = *( $(EditTextOut), 1 )

	        ifstr(i) $(TmpTitle) == ""
	          shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL +
	                "Please enter at least one character for the link service title."
	          ui pop 1
	          goto RefreshDlg
	        endif

                set TmpFlag  = $(!False)
	        ForListDo $(!LinkServiceList)
	          ifstr(i) $(TmpTitle) == *( $($), 2 )
	            set TmpSvcName = *( $($), 1 )
	            ifstr(i) $(ServiceName) != $(TmpSvcName)
	              set TmpFlag = $(!True)
	            endif
	          endif
	        EndForListDo

	        ifstr(i) $(TmpFlag) == $(!False)
	          set ServiceTitle = *( $(EditTextOut), 1 )
	        else
	          shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL +
	                "The title """$(TmpTitle)""" is already in use by link service "$(TmpSvcName)"."
	          ui pop 1
	          goto RefreshDlg
	        endif

		ForListDo $(Error)
			set Status = STATUS_REPEAT
			ifstr(i) $($) == ERROR_T1
				shell $(!P:SubroutineInf) SetupMessage $(!STF_LANGUAGE) +
					  "NONFATAL" +
					  "The T1 Timeout parameter must be a number"$(!LF)+
					  "between 1 and 100."$(!LF)$(!LF)+
					  "Please reconfigure."
			endif
			ifstr(i) $($) == ERROR_N2
				shell $(!P:SubroutineInf) SetupMessage $(!STF_LANGUAGE) +
				      "NONFATAL" +
					  "The N2 Retry parameter must be a number"$(!LF)+
					  "between 1 and 100."$(!LF)$(!LF)+
					  "Please reconfigure."
			endif
		EndForListDo

		ifstr(i) $(DriverIndex) != $(SvDriverIndex)
		  set Changes = 1
		endif
		ifstr(i) $(LNUA) != $(SvLNUA)
		  set Changes = 1
		endif
		ifstr(i) $(L3Window) != $(SvL3Window)
		  set Changes = 1
		endif
		ifstr(i) $(L3PktSz) != $(SvL3PktSz)
		  set Changes = 1
		endif
		ifstr(i) $(L2Window) != $(SvL2Window)
		  set Changes = 1
		endif
		ifstr(i) $(T1Timeout) != $(SvT1Timeout)
		  set Changes = 1
		endif
		ifstr(i) $(N2Retry) != $(SvN2Retry)
		  set Changes = 1
		endif
		ifstr(i) $(AcceptRevCh) != $(SvAcceptRevCh)
		  set Changes = 1
		endif
		ifstr(i) $(Restart) != $(SvRestart)
		  set Changes = 1
		endif
		ifstr(i) $(Standby) != $(SvStandby)
		  set Changes = 1
		endif
		ifstr(i) $(OSVCRng) != $(SvOSVCRng)
		  set Changes = 1
		endif
		ifstr(i) $(2SVCRng) != $(Sv2SVCRng)
		  set Changes = 1
		endif
		ifstr(i) $(ISVCRng) != $(SvISVCRng)
		  set Changes = 1
		endif
		ifstr(i) $(PVCRng) != $(SvPVCRng)
		  set Changes = 1
		endif
		ifstr(i) $(DataRate) != $(SvDataRate)
		  set Changes = 1
		endif
		ifstr(i) $(NRZI) != $(SvNRZI)
		  set Changes = 1
		endif
		ifstr(i) $(FilterIncoming) != $(SvFilterIncoming)
		  set Changes = 1
		endif
		ifstr(i) $(LineType) != $(SvLineType)
		  set Changes = 1
		endif
		ifstr(i) $(FRadio4) != $(SvFRadio4)
		  set Changes = 1
		endif
	endif

	ifstr(i) $(Status) == STATUS_REPEAT
		goto begin
	endif

	;
	; Write the new driver params and ls type to the registry
	;
	OpenRegKey $(!REG_H_LOCAL), "", "SYSTEM\CurrentControlSet\Services\DCASYNC\Parameters\ExtraParameters", $(!REG_KEY_READWRITE), KeyDriver
        ifstr(i) $(KeyDriver) == $(KeyNull)
        	set ErrMesg = "Can't Find Device Driver Service Entry."
        	set ErrProc = "DoSDLCLSConfig"
        	set ErrFunc = "OpenRegKey"
        	goto fatal_registry
	endif

	ifstr(i) $(ServiceName) == $(DCASYNCls1)
        	SetRegValue $(KeyDriver) { "DCAISCAConfigData1", $(NoTitle), $(!REG_VT_DWORD), $(DriverParams) }
		goto ConfigLS090
	endif
	ifstr(i) $(ServiceName) == $(DCASYNCls2)
        	SetRegValue $(KeyDriver) { "DCAISCAConfigData2", $(NoTitle), $(!REG_VT_DWORD), $(DriverParams) }
		goto ConfigLS090
	endif
	ifstr(i) $(DCASYNCls1) == ""
        	SetRegValue $(KeyDriver) { "DCAISCAConfigData1", $(NoTitle), $(!REG_VT_DWORD), $(DriverParams) }
            	SetRegValue $(KeyDriver) { "Data1LS",		 $(NoTitle), $(!REG_VT_SZ),     $(ServiceName)  }
		goto ConfigLS090
	else
            	SetRegValue $(KeyDriver) { "DCAISCAConfigData2", $(NoTitle), $(!REG_VT_DWORD), $(DriverParams) }
            	SetRegValue $(KeyDriver) { "Data2LS", 	     	 $(NoTitle), $(!REG_VT_SZ),    $(ServiceName)  }
		goto ConfigLS090
	endif

ConfigLS090 =+

	CloseRegKey $(KeyDriver)

	ui pop 1

	Return $(Status), $(Changes), $(ServiceTitle), +
 			  $(DriverIndex), $(LNUA), $(L3Window), $(L3PktSz), +
 			  $(L2Window), $(T1Timeout), $(N2Retry), $(AcceptRevCh), +
 			  $(Restart), $(Standby), $(OSVCRng), $(2SVCRng), +
 			  $(ISVCRng), $(PVCRng), $(DataRate), $(NRZI), +
 			  $(FilterIncoming), $(LineType), $(FRadio4)

;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;
; Identify
;
; DESCRIPTION:   To verify that this INF deals with the same 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)

;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;
; ReturnOptions
;
; DESCRIPTION:   To return the option list supported by this INF and the
;                localised text list representing the options.
;
;
; INPUT:         $($0):  Language used. ( ENG | FRN | ... )
;
; OUTPUT:        $($R0): STATUS: STATUS_SUCCESSFUL |
;                                STATUS_NOLANGUAGE
;                                STATUS_FAILED
;
;                $($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)
        goto returnoptions
    else
        set Status = STATUS_NOLANGUAGE
        goto finish_ReturnOptions
    endif

;++++++++++++++++++++++++++++++++++++
;
; returnoptions:
; get the options from the Options and OptionsText sections and set appropriate
; return values.
;
;++++++++++++++++++++++++++++++++++++
returnoptions = +
    set OptionList     = ^(Options, 1)
    set OptionTextList = ^(OptionsText$($0), 1)
    set Status         = STATUS_SUCCESSFUL

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

;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;
; ReturnSNAOptions
;
; DESCRIPTION:   To return the option list supported by this INF and
;                recognized by SNA Server.  This script also returns
;                the localized text list representing those options.
;
;
; INPUT:         None
;
; OUTPUT:        $($R0): STATUS: STATUS_SUCCESSFUL |
;                                STATUS_NOLANGUAGE
;                                STATUS_FAILED
;
;                $($R1): Option List
;                $($R2): Option Text List
;
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()

[ReturnSNAOptions]

    set Status				= STATUS_FAILED
    set SNAOptionList     	= {}
    set SNAOptionTextList 	= {}

	set LANG				= $(!STF_LANGUAGE)

    ;
    ; Check if the language requested is supported
    ;
    set LanguageList = ^(LanguagesSupported, 1)
    ifcontains(i) $(LANG) in $(LanguageList)
        goto returnSNAoptions
    else
        set Status = STATUS_NOLANGUAGE
        goto finish_ReturnSNAOptions
    endif

;++++++++++++++++++++++++++++++++++++
;
; returnSNAoptions:
; get the options from the Options and OptionsText sections and set appropriate
; return values.
;
;++++++++++++++++++++++++++++++++++++
returnSNAoptions = +
    set SNAOptionList     	= ^(SNAOptions, 1)
    set OptionList			= ^(Options, 1)
    set SNAOptionTextList	= {}
    set Status				= STATUS_SUCCESSFUL

	;
    ; Check that each of the SNA Options is a valid option and compile
    ; the list of text descriptions
    ;
	ForListDo $(SNAOptionList)
		ifcontains $($) in $(OptionList)
			set SNAOptionTextList = >( $(SNAOptionTextList), +
									   #(OptionsText$(LANG), $($), 1) )
		else
			set Status = STATUS_FAILED
			goto finish_ReturnSNAOptions
		endif
		; TODO: whenever language gets checked, they use an (i) check.
		;       the question is: are section names case sensitive or case
		;       insensitive.  if they are case insensitive, might as well
		;       make this a case insensitive check.  if they are case
		;       sensitive, report this as a bug.
		;       CODENAME: CASECHECK
	EndForListDo

;++++++++++++++++++++++++++++++++++++
;
; finish_ReturnSNAOptions:
;
;++++++++++++++++++++++++++++++++++++
finish_ReturnSNAOptions = +
    Return $(Status) $(SNAOptionList) $(SNAOptionTextList)

;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;
; ReturnSNAAdds
;
; DESCRIPTION:   To return the list of dependencies and their text
;                descriptions for a particular option.
;
;
; INPUT:         $($0):  Option used.
;
; OUTPUT:        $($R0): STATUS: STATUS_SUCCESSFUL |
;                                STATUS_NOLANGUAGE
;                                STATUS_FAILED
;
;                $($R1): Dependency List
;                $($R2): Dependency Text List
;
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()

[ReturnSNAAdds]

    set Status				= STATUS_FAILED
    set SNAAddList     		= {}
    set SNAAddTextList 		= {}

	set LANG				= $(!STF_LANGUAGE)
    ;
    ; Check if the language requested is supported
    ;
    set LanguageList = ^(LanguagesSupported, 1)
    ifcontains(i) $(LANG) in $(LanguageList)
        goto returnSNAadds
    else
        set Status = STATUS_NOLANGUAGE
        goto finish_ReturnSNAAdds
    endif

;++++++++++++++++++++++++++++++++++++
;
; returnSNAadds:
; get the additional options for an option and compile their text list
;
;++++++++++++++++++++++++++++++++++++
returnSNAadds = +
	set SNAAddList			= ^(SNAOptionAdds$($0), 1)
    set OptionList			= ^(Options, 1)
    set Status				= STATUS_SUCCESSFUL

	;
    ; Check that each of the SNA Dependencies is a valid option and compile
    ; the list of text descriptions
    ;
	ForListDo $(SNAAddList)
		ifcontains $($) in $(OptionList)
			set   SNAAddTextList  = >( $(SNAAddTextList), +
									   #(OptionsText$(LANG), $($), 1) )
		else
			set Status = STATUS_FAILED
			goto finish_ReturnSNAAdds
		endif
		; TODO: Check CODENAME: CASECHECK
	EndForListDo

;++++++++++++++++++++++++++++++++++++
;
; finish_ReturnSNAAdds:
;
;++++++++++++++++++++++++++++++++++++
finish_ReturnSNAAdds = +
    Return $(Status) $(SNAAddList) $(SNAAddTextList)

;************************************************************************
;************************************************************************
;                    SNA INVOCATION SECTION
;************************************************************************
;************************************************************************

;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;
; SnaInvocation
;
; DESCRIPTION:   To perform operations requested by the SNA Setup
;
; INPUT:     	 NTN_XXXXX  and STF_XXXXX  variables defined
;
; OUTPUT:    	 $($R0): STATUS: STATUS_SUCCESSFUL |
;              	                 STATUS_NOLANGUAGE |
;                                STATUS_USERCANCEL |
;                                STATUS_FAILED
;
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()

[SnaInvocation]

    set LongOption = $(!NTN_InfOption)
    set Changes    = 0
    set Instance   = "xx"

    Split-String $(LongOption) "_" OptionList
    QueryListSize OptionSize $(OptionList)

    ifint $(OptionSize) == 3
    	set Option   = *( $(OptionList), 1 )
    	set Instance = *( $(OptionList), 3 )
    else
    	set Option = $(LongOption)
    endif

    ;
    ; These three variables describe the execution of the installation.
    ;   AddCopy adds the files in the file list to the copy list
    ;   DoCopy actually copies the files on the spot
    ;
    ifstr(i) $(!NTN_InstallMode) == install
    	read-syms InstallSteps$(Option)
        set !AddCopy  = $(AddFilesToCopyList)
        set !DoCopy   = $(CopyFilesInCopyList)

	ifstr(i) $(!NTN_InfType) == "LOCAL"
	  set !AddCopy = NO
	  set !DoCopy  = NO
	endif
    Else
        set !AddCopy  = NO
        set !DoCopy   = NO
    Endif

    shell "" CommonSection $(Option) $(Instance)

    set Status     = $($R0)
    set ReturnData = $($R1)
    set Changes    = $($R2)

    Return $(Status) $(ReturnData) $(Changes)

;************************************************************************
;************************************************************************
;                    NCPA INVOCATION SECTION
;************************************************************************
;************************************************************************


;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;
; InstallOption
;
; DESCRIPTION:   To perform operations requested by the NCPA
;
; INPUT:     	 NTN_XXXXX  and STF_XXXXX  variables defined
;
; OUTPUT:    	 $($R0): STATUS: STATUS_SUCCESSFUL |
;              	                 STATUS_NOLANGUAGE |
;                                STATUS_USERCANCEL |
;                                STATUS_FAILED
;
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()

[InstallOption]

    set LongOption = $(!NTN_InfOption)
    set Changes    = 0
    set Instance   = "xx"

    set !SNA_ProductName = "SNA Server"

    Split-String $(LongOption) "_" OptionList
    QueryListSize OptionSize $(OptionList)

    ifint $(OptionSize) == 3
    	set Option   = *( $(OptionList), 1 )
    	set Instance = *( $(OptionList), 3 )
    else
    	set Option = $(LongOption)
    endif

    ;
    ; These three variables describe the execution of the installation.
    ;   AddCopy adds the files in the file list to the copy list
    ;   DoCopy actually copies the files on the spot
    ;
    ifstr(i) $(!NTN_InstallMode) == "install"
    	read-syms InstallSteps$(Option)
        set !AddCopy  = YES
        set !DoCopy   = YES
    else
    	set !AddCopy  = NO
    	set !DoCopy   = NO
    Endif

    ;
    ; Set SNA Root Directory before reading File Constants
    ;
    OpenRegKey $(!REG_H_LOCAL), "", +
        "Software\Microsoft\SNA Server\2.0\Setup", +
        $(!REG_KEY_READ), KeySNAServices
    ifstr(i) $(KeySNAServices) != {}
      GetRegValue $(KeySNAServices) "RootDir" RootDirValue
      ifstr(i) $(RootDirValue) != ""
        set !SNARootDir = *( $(RootDirValue), 4 )
      endif
    endif

    shell $(!UtilityInf) GetBusType
    ifstr(i) $($R0) == STATUS_SUCCESSFUL
      set !STF_BUSTYPE = $($R1)
    else
      set !STF_BUSTYPE = "ISA"
    endif

	ifstr(i) $(!NTN_InstallMode) != "install"
		read-syms FileConstants
		read-syms FileConstants$(Option)

		OpenRegKey $(!REG_H_LOCAL), "", +
				   $(ProductRegBase)"\"$(ProductFullName)"\CurrentVersion", +
				   $(!REG_KEY_READWRITE), KeyServiceIndex
		ifstr(i) $(KeyServiceIndex) == ""
			set ErrMesg = "Can't Find This Product Instance."
			set ErrProc = "InstallOption"
			set ErrFunc = "OpenRegKey (1)"
			goto fatal_registry
		endif
		GetRegValue $(KeyServiceIndex), "SNAVersion", SNAVersionInfo
		set !SNAVersion = *( $(SNAVersionInfo), 4 )
		CloseRegKey $(KeyServiceIndex)

		;
		; This is a Hack.
		; Since the NCPA can (now) only configure and remove components, we'll
		; assume that it's going to access them inside the SNA Server
		; root directory and not in floppy like install would.  Therefore,
		; DriverDir = SNARootDir.
		; At some future point in time, we might consider putting a path in the
		; registry.
		;
		set !DriverDir = $(!SNARootDir)"\system\hwsetup\"

	else
		;
		; This case shouldn't happen, but I honestly don't know how to deal
		; with it when it does.  I guess I can check if SNA Server is
		; installed, and if it's not, tell the user that it must be installed
		; before link services can be installed
		;
		set Hosed = "Probably"
	endif

	LoadLibrary "" $(DialogLibrary) !DLGHANDLE
			
    shell "" CommonSection $(Option) $(Instance)
    set Status = $($R0)

    ifstr(i) $($R2) == 1
      shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) "STATUS" +
            "For the changed parameters to be noticed, you must stop and"$(!LF)+
            "restart this link service with the "$(!SNA_ProductName)" Admin program."

    else-ifstr(i) $($R2) == 2
      shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) "STATUS" +
            "You must reboot for the changed parameters to be noticed."
    endif

    FreeLibrary $(!DLGHANDLE)

    Return $(Status)

fatal_registry = +

    set Error = +
		"Fatal Registry Error:"$(!LF)+
		$(ErrMesg)$(!LF)+
		"File: "$(ThisInf)$(!LF)+
		"Procedure: "$(ErrProc)$(!LF)+
		"Function: "$(ErrFunc)

	shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) "FATAL" $(Error)

	Return STATUS_FAILED {} $(Changes)

;************************************************************************
;************************************************************************
;                   COMMON SECTION
;************************************************************************
;************************************************************************

;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;
; CommonSection
;
; DESCRIPTION:	To carry out the install/config/etc. operations
;
; INPUT:	NTN_XXXXX  and STF_XXXXX  variables defined
;		$($0):  Option to be used
;		$($1):  Instance to be used
;
; OUTPUT:	$($R0): STATUS:	STATUS_SUCCESSFUL |
;				STATUS_NOLANGUAGE |
;				STATUS_EXISTS     |
;				STATUS_USERCANCEL |
;				STATUS_FAILED
;
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()

[CommonSection]

    StartWait

    set Option   = $($0)
    set Instance = $($1)
    set Index    = "CurrentVersion"
    set RetData  = {}
    set Changes  = 0

    ;
    ; Check if the language requested is supported
    ;
    set LanguageList = ^(LanguagesSupported, 1)
    ifcontains(i) $(!STF_LANGUAGE) in $(LanguageList)
        goto languageexists
    else
        set Status = STATUS_NOLANGUAGE
        goto end
    endif

	
;++++++++++++++++++++++++++++++++++++
;
; languageexists:
;
;++++++++++++++++++++++++++++++++++++
languageexists = +

    ;
    ; Define some constants, read some variable sections, and set the date
    ;

    StartWait

    read-syms GeneralConstants

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

    install LoadSetupLibrary
    detect date
    install FreeSetupLibrary

    SetHelpFile $(!DriverDir)$(ThisHlp) $(HlpMin) $(HlpMax)

    LoadLibrary "" $(!DriverDir)$(ThisSrl) !IHVDLGHANDLE
    ifstr(i) $(!IHVDLGHANDLE) == ""
    	goto set_status_failed
    endif
	
    set to   = Begin
    set from = Begin

    ;
    ; Assume that all is well as we begin
    ;
    set CommonStatus = STATUS_SUCCESSFUL

    EndWait


;++++++++++++++++++++++++++++++++++++
;
; Begin:
; Set up the operation-mode-based variables and gaily welcome
; the user.  if the "install mode" variable is improperly set,
; assume this is a new installation.
;
;++++++++++++++++++++++++++++++++++++
Begin = +
    ifstr(i)      $(!NTN_InstallMode) 	== deinstall
      set StartLabel = remove_component
    else-ifstr(i) $(!NTN_InstallMode)	== fullremove
      set StartLabel = remove_component
    else-ifstr(i) $(!NTN_InstallMode)	== snaremove
      set StartLabel = remove_component
    else-ifstr(i) $(!NTN_InstallMode)	== getbindings
      set StartLabel = getbind_component
    else-ifstr(i) $(!NTN_InstallMode) 	== bind
      set StartLabel = bind_component
    else-ifstr(i) $(!NTN_InstallMode) 	== configure
      set StartLabel = config_component
    else				;; install
      set StartLabel = install_component
    endif

    goto set_defaults_$(Option)

    ;++++++++++++++++++++++++++++++++++++
    ;
    ; set_defaults_DCAX25LS
    ;
    ;++++++++++++++++++++++++++++++++++++
	set_defaults_DCAX25LS = +
		set ServiceName		= $(Option)
		set ServiceTitle	= $(ProductTitle)
		set ServiceDesc		= $(ProductDesc)
		set DriverIndex		= "03" ; DCA SDLC 1
		set LNUA		= ""
		set L3Window		= "2"
		set L3PktSz		= "128"
		set L2Window		= "7"
		set T1Timeout		= "30"
		set N2Retry		= "10"
		set AcceptRevCh		= "0"
		set Restart		= "1"
		set Standby		= "0"
		set OSVCRng		= ""
		set 2SVCRng		= "0001-0004"
		set ISVCRng		= ""
		set PVCRng		= ""
		set DataRate		= "1"
		set NRZI		= "0"
		set FilterIncoming	= "1"
		set LineType		= "0" ; Leased
		set Radio4Flag		= "0"
		goto finish_defaults

    ;++++++++++++++++++++++++++++++++++++
    ;
    ; set_defaults_DCAX25DD
    ;
    ;++++++++++++++++++++++++++++++++++++
	set_defaults_DCAX25DD = +
		set ServiceName	  = $(Option)
		set ServiceTitle  = $(ProductTitle)
		set ServiceDesc	  = $(ProductDesc)
		goto finish_defaults

;++++++++++++++++++++++++++++++++++++
;
; finish_defaults:
;
;++++++++++++++++++++++++++++++++++++
finish_defaults = +
    set from 	= end
    set to 	= end
    goto $(StartLabel)

;++++++++++++++++++++++++++++++++++++
;
; install_component:
;
;++++++++++++++++++++++++++++++++++++
install_component = +

	;
	; First, check if there are any existing services of this product
	; already in the registry.
	;
	shell $(!UtilityInf) FindSNAProductServices, $(ProductRegBase), +
						    $(ProductFullName)
	ifint $($ShellCode) != 0
		goto ShellCodeError
	endif

	set Status		= $($R0)
	set SvcIndexList	= $($R1)
	set SvcNameList		= $($R2)
	set SvcTitleList	= $($R3)
	set SvcDescList		= $($R4)

	ifstr(i) $(Status) == STATUS_FAILED
		set ErrMesg = "Can't Find This Product."
		set ErrProc = "install_component"
		set ErrFunc = "FindSNAProductServices"
		goto fatal_registry
	endif

	;
	; if there are no services of this product installed, it could mean
	; that the product doesn't exist.  Either way, we are installing service
	; index "01" and on to modify params.
	;

	QueryListSize SvcIndexListSize $(SvcIndexList)

	set ProductExists = $(TRUE)

	ifint $(SvcIndexListSize) == 0
		ifstr(i) $(Status) == STATUS_NOSUCHPRODUCT
		  set ProductExists = $(FALSE)
		endif
		set Instance = "01"
		goto install_nextstep
	endif

	;
	; If there is one instance of this service and this product is an
	; exclusive install, return with the appropriate status.
	;
	ifint $(ProductExclusive) != $(FALSE)
	  ifint $(SvcIndexListSize) == 1
	    set Status = STATUS_EXISTS
	    ifint $(ProductExclusive) == $(NOTIFY)
	      shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE), +
	            "NONFATAL", +
	            "This product is already installed and"$(!LF)+
	            "can only be installed once."
	    endif
	    goto end
	  endif
	endif

	shell $(!UtilityInf) FindNextAvailableIndex $(SvcIndexList)
	ifint $($ShellCode) != 0
		goto ShellCodeError
	endif

	set Status   = $($R0)
	set Instance = $($R1)

	ifstr(i) $(Status) != STATUS_SUCCESSFUL
		goto end
	endif

;++++++++++++++++++++++++++++++++++++
;
; install_nextstep:
; we have a service index and are ready to start the
; process of installing an instance.
;
;++++++++++++++++++++++++++++++++++++
install_nextstep = +
	read-syms FileConstants$(Option)

        set TmpStr = ""
        ifint $(Instance) < 10
          split-string $(Instance) "0" TmpList
          QueryListSize TmpSize $(TmpList)
          ifstr(i) *($(TmpList),1) != "0"
            set TmpStr = $(TmpStr)*($(TmpList),1)
          endif
          ifint $(TmpSize) > 1
            set TmpStr = $(TmpStr)*($(TmpList),2)
          endif
        else
          set TmpStr = $(Instance)
        endif

        set ServiceTitle = $(ProductTitle)" #"$(TmpStr)

	ifint $(ProductServiceQuery) == $(TRUE)
		shell $(!UtilityInf) EnterServiceName, +
					$(ProductTitle), +
					$(ProductServicePrefix), +
					$(Instance)
		ifint $($ShellCode) != 0
			goto ShellCodeError
		endif
	
		set Status	 = $($R0)
		set ServiceName  = $($R1)
	
		ifstr(i) $(Status) != STATUS_SUCCESSFUL
			goto end
		endif
	else
		set ServiceName = $(ProductServicePrefix)
	endif
	
	goto modify_params

;++++++++++++++++++++++++++++++++++++
;
; config_component:
; get the current values for all the parameters and prepare them for
; modify_params.
;
;++++++++++++++++++++++++++++++++++++
config_component = +
	read-syms FileConstants$(Option)

	;
	; Try and open this product and see if it's even installed.
	;

	shell $(!UtilityInf) FindSNAProductServices $(ProductRegBase), +
						   $(ProductFullName)
	ifint $($ShellCode) != 0
		goto ShellCodeError
	endif

	set Status       = $($R0)
	set SvcIndexList = $($R1)
	set SvcNameList	 = $($R2)
	set SvcTitleList = $($R3)
	set SvcDescList  = $($R4)

	ifstr(i) $(Status) != STATUS_SUCCESSFUL
		set ErrMesg = "Can't Find This Product."
		set ErrProc = "config_component"
		set ErrFunc = "FindSNAProductServices"
		goto fatal_registry
	endif

	shell $(!UtilityInf) GrepUniqueServiceInfo "Index", +
			 			   $(Instance), +
						   $(SvcIndexList), +
						   $(SvcNameList),+
						   $(SvcTitleList),+
						   $(SvcDescList)
	ifint $($ShellCode) != 0
		goto ShellCodeError
	endif

	set Status       = $($R0)
	set ServiceIndex = $($R1)
	set ServiceName  = $($R2)
	set ServiceTitle = $($R3)
	set ServiceDesc  = $($R4)

	ifstr(i) $(Status) != STATUS_SUCCESSFUL
		goto end
	endif

;++++++++++++++++++++++++++++++++++++
;
; read_params:
; read the parameters from the SCA and assign them to the appropriate
; variables.
;
;++++++++++++++++++++++++++++++++++++
read_params = +

	;
	; Find the entry in the Service Control Architecture and get a handle
	; to the Parameters Key and to the ExtraParameters key if one exists.
	;

	shell $(!UtilityInf) FindSNAService, $(ServiceName)
	ifint $($ShellCode) != 0
		goto ShellCodeError
	endif

	set Status		= $($R0)
	set KeyService		= $($R1)
	set KeyParameters	= $($R2)
	set KeyExtraParams	= $($R3)

	ifstr(i) $(Status) != STATUS_SUCCESSFUL
		CloseRegKey $(KeyService)
		CloseRegKey $(KeyParameters)
		CloseRegKey $(KeyExtraParams)
		set ErrMesg = "Can't Find Service Entry For Instance "$(ServiceName)
		set ErrProc = "read_params"
		set ErrFunc = "FindSNAService"
		goto fatal_registry
	endif

	set OldVersionExisted = $(TRUE)

	set ValueName = ""
	set ValueData = ""
	set ValueStr  = ""
	set ValueList = {}

	;
	; Get the old values from the parameters key
	;
	EnumRegValue $(KeyParameters) ValueList

	;
	; if there's an ExtraParameters subkey, add those values to the list
	;
	ifstr(i) $(KeyExtraParams) != $(KeyNull)
		EnumRegValue $(KeyExtraParams) ExtraValueList
		ForListDo $(ExtraValueList)
			set ValueList = >( $(ValueList), $($) )
		EndForListDo
	endif

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

		goto assign_value_$(Option)

		;++++++++++++++++++++++++++++++++++++
		;
		; assign_value_DCAX25LS:
		;
		;++++++++++++++++++++++++++++++++++++
		assign_value_DCAX25LS = +
			
			ifstr(i)      $(ValueName) == "DriverNumber"
				set DriverNumber = $(ValueData)
                        else-ifstr(i) $(ValueName) == "DeviceName"
                                set DeviceName = $(ValueData)
                                set DriverIndex = "03"
				set !BBDeviceName = $(ValueData)
				ifstr(i)      $(DeviceName) == "DCADL$03"
					set DriverIndex = "03"
				else-ifstr(i) $(DeviceName) == "DCADL$04"
					set DriverIndex = "04"
				else-ifstr(i) $(DeviceName) == "DCADL$05"
					set DriverIndex = "05"
				else-ifstr(i) $(DeviceName) == "DCADL$06"
					set DriverIndex = "06"
				endif
			else-ifstr(i) $(ValueName) == "LNUA"
				set LNUA = $(ValueData)
			else-ifstr(i) $(ValueName) == "L3Window"
				set L3Window = $(ValueData)
			else-ifstr(i) $(ValueName) == "L3PktSz"
				set L3PktSz = $(ValueData)
			else-ifstr(i) $(ValueName) == "L2Window"
				set L2Window = $(ValueData)
			else-ifstr(i) $(ValueName) == "T1Timeout"
				set T1Timeout = $(ValueData)
			else-ifstr(i) $(ValueName) == "N2Retry"
				set N2Retry = $(ValueData)
			else-ifstr(i) $(ValueName) == "AcceptRevCh"
				set AcceptRevCh = $(ValueData)
			else-ifstr(i) $(ValueName) == "Restart"
				set Restart = $(ValueData)
			else-ifstr(i) $(ValueName) == "Standby"
				set Standby = $(ValueData)
			else-ifstr(i) $(ValueName) == "OSVCRng"
				set OSVCRng = $(ValueData)
			else-ifstr(i) $(ValueName) == "2SVCRng"
				set 2SVCRng = $(ValueData)
			else-ifstr(i) $(ValueName) == "ISVCRng"
				set ISVCRng = $(ValueData)
			else-ifstr(i) $(ValueName) == "PVCRng"
				set PVCRng = $(ValueData)
			else-ifstr(i) $(ValueName) == "DataRate"
				set DataRate = $(ValueData)
			else-ifstr(i) $(ValueName) == "NRZI"
				set NRZI = $(ValueData)
			else-ifstr(i) $(ValueName) == "FilterIncoming"
				set FilterIncoming = $(ValueData)
			else-ifstr(i) $(ValueName) == "LineType"
				set LineType = $(ValueData)
			else-ifstr(i) $(ValueName) == "Radio4Flag"
				ifstr(i) $(ValueData) == "1"
					set Radio4Flag = $(!True)
				else
					set Radio4Flag = $(!False)
				endif
			endif
			goto finish_assign_value

		;++++++++++++++++++++++++++++++++++++
		;
		; assign_value_DCAX25DD:
		;
		;++++++++++++++++++++++++++++++++++++
		assign_value_DCAX25DD = +
			goto finish_assign_value

		;++++++++++++++++++++++++++++++++++++
		;
		; finish_assign_value:
		;
		;++++++++++++++++++++++++++++++++++++
		finish_assign_value = +
	
	EndForListDo

	goto assign_extra_$(Option)

	;++++++++++++++++++++++++++++++++++++
	;
	; assign_extra_DCAX25LS:
	;
	;++++++++++++++++++++++++++++++++++++
	assign_extra_DCAX25LS = +
		goto finish_assign_extra
	
	;++++++++++++++++++++++++++++++++++++
	;
	; assign_extra_DCAX25DD:
	;
	;++++++++++++++++++++++++++++++++++++
	assign_extra_DCAX25DD = +
		goto finish_assign_extra
	
	;++++++++++++++++++++++++++++++++++++
	;
	; finish_assign_extra:
	;
	;++++++++++++++++++++++++++++++++++++
	finish_assign_extra = +

    goto modify_params

;++++++++++++++++++++++++++++++++++++
;
; modify_params:
; allow the user to bang away at the parameters until they are happy
;
;++++++++++++++++++++++++++++++++++++
modify_params = +
	
	set from = modify_params

	goto modify_params_$(Option)

	;++++++++++++++++++++++++++++++++++++
	;
	; modify_params_DCAX25LS:
	;
	;++++++++++++++++++++++++++++++++++++
	modify_params_DCAX25LS = +

		shell "" DoX25LSConfig $(ServiceName), $(ServiceTitle), +
				$(DriverIndex), $(LNUA), $(L3Window), +
				$(L3PktSz),$(L2Window), $(T1Timeout), +
				$(N2Retry), $(AcceptRevCh), $(Restart), +
				$(Standby), $(OSVCRng), $(2SVCRng), +
				$(ISVCRng), $(PVCRng), $(DataRate), $(NRZI), +
				$(FilterIncoming), $(LineType), $(Radio4Flag)
		ifint $($ShellCode) != 0
			goto ShellCodeError
		endif

		set Status = $($R0)
		ifstr(i) $(Status) != STATUS_SUCCESSFUL
			goto end
		else
			set Changes		= $($R1)
			set ServiceTitle  	= $($R2)
			set DriverIndex		= $($R3)
			set LNUA		= $($R4)
			set L3Window		= $($R5)
			set L3PktSz		= $($R6)
			set L2Window		= $($R7)
			set T1Timeout		= $($R8)
			set N2Retry		= $($R9)
			set AcceptRevCh		= $($R10)
			set Restart		= $($R11)
			set Standby		= $($R12)
			set OSVCRng		= $($R13)
			set 2SVCRng		= $($R14)
			set ISVCRng		= $($R15)
			set PVCRng		= $($R16)
			set DataRate		= $($R17)
			set NRZI		= $($R18)
			set FilterIncoming	= $($R19)
			set LineType		= $($R20)
			set Radio4Flag		= $($R21)
			set DriverNumber	= $(DriveIndex)
			set DeviceName		= "DCADL$"$(DriverIndex)
		endif
		
		goto finish_modify_params

	;++++++++++++++++++++++++++++++++++++
	;
	; modify_params_DCAX25DD:
	;
	;++++++++++++++++++++++++++++++++++++
	modify_params_DCAX25DD = +
		goto finish_modify_params

	;++++++++++++++++++++++++++++++++++++
	;
	; finish_modify_params:
	;
	;++++++++++++++++++++++++++++++++++++
	finish_modify_params = +
		goto adjust_params

;++++++++++++++++++++++++++++++++++++
;
; adjust_params:
; if there is an old version, the registry keys and values exist and all we
; have to do is modify them.  otherwise, if we're installing from scratch,
; we have to create those keys and values.
;
;++++++++++++++++++++++++++++++++++++
adjust_params = +

    ifint $(OldVersionExisted) == $(TRUE)
		ifstr(i) $(!NTN_InstallMode) == "configure"
		    goto write_params
		endif
    endif

;++++++++++++++++++++++++++++++++++++
;
; create_regvals:
; create the necessary parts of the registry
;
;++++++++++++++++++++++++++++++++++++
create_regvals = +

	Shell $(!UtilityInf) +
	      CreateSNAService, +
	        $(ServiceName), +
	        $(SNAServiceType), +
	        $(ProductImagePath), +
	        $(ProductDepends), +
	        $(ProductParams), +
	        $(ProductExtraParams), +
	        $(!SNARootDir)"\System\"$(ProductImagePath), +
	        7

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

	set Status			= $($R0)
	set KeyService		= $($R1)
	set KeyParameters	= $($R2)
	set KeyExtraParams	= $($R3)

	ifstr(i) $(Status) != STATUS_SUCCESSFUL
		CloseRegKey $(KeyService)
		CloseRegKey $(KeyParameters)
		CloseRegKey $(KeyExtraParams)
		set ErrMesg = "Can't Create Service Entry For Instance."
		set ErrProc = "create_regvals"
		set ErrFunc = "CreateSNAService"
		goto fatal_registry
	endif

	Shell $(!UtilityInf) CreateSNARegEntry, $(ProductRegBase), +
					       $(ProductFullName)

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

	set Status		= $($R0)
	set KeyProductBase	= $($R1)
	set KeyProduct		= $($R2)
	set KeyServiceIndex	= $($R3)
	set KeyNetRules		= $($R4)

	ifstr(i) $(Status) != STATUS_SUCCESSFUL
		CloseRegKey $(KeyProductBase)
		CloseRegKey $(KeyProduct)
		CloseRegKey $(KeyServiceIndex)
		CloseRegKey $(KeyNetRules)
		set ErrMesg = "Can't Create Product Entry For Instance."
		set ErrProc = "create_regvals"
		set ErrFunc = "CreateSNARegEntry"
		goto fatal_registry
	endif

	shell $(!UtilityInf) AddValueList, $(KeyServiceIndex), +
	    {	{ ServiceName , $(NoTitle), $(!REG_VT_SZ), $(ServiceName)  }, +
		{ InfName     , $(NoTitle), $(!REG_VT_SZ), $(FullInfName)  }, +
		{ SoftwareType, $(NoTitle), $(!REG_VT_SZ), $(SoftwareType) }, +
		{ SNAVersion  , $(NoTitle), $(!REG_VT_SZ), $(!SNAVersion)  } }

	set NROption	= $(Option)"_"$(Instance)
	set NRTitle	= $(NetRulesTitle)
	set NRClass	= { $(NetRulesClass) }
	set NRBindForm	= $(ServiceName)" yes yes container"
	set NRUse	= $(NetRulesUse)
	set NRBindable	= { $(NetRulesBindable) }
	set NetRulesValues = { +
			{ InfName  , $(NoTitle), $(!REG_VT_SZ),       $(FullInfName)  }, +
			{ InfOption, $(NoTitle), $(!REG_VT_SZ),       $(NROption)     }, +
			{ title    , $(NoTitle), $(!REG_VT_SZ),       $(NRTitle)      }, +
			{ use      , $(NoTitle), $(!REG_VT_SZ),       $(NRUse)        }, +
			{ bindform , $(NoTitle), $(!REG_VT_SZ),       $(NRBindForm)   }, +
                        { type     , $(NoTitle), $(!REG_VT_SZ),       $(NetRulesType) }, +
                             }
        ;
        ; Here we enumerate all installed link services of this type, looking
        ; for the "class" and "bindable" regvals.  We only write these values
        ; if we have no other installed links of this type, or we don't find
        ; these two values among the links we examine.
        ;
        ; Enum on KeyProductBase, SplitString each on "_", compare first string
        ; with ProductName, if match look in CurrentVersion\NetRules for these
        ; two values.
        ;
        set Found = $(!False)
        EnumRegKey $(KeyProductBase) TmpList
        ForListDo $(TmpList)
          set TmpName = *( $($), 1 )

          Split-String $(TmpName) "_" TmpSplit
          ifstr(i) *( $(TmpSplit), 1 ) == $(ProductName)

            OpenRegKey $(KeyProductBase), "", +
                       $(TmpName)"\CurrentVersion\NetRules", +
                       $(!REG_KEY_READ), TmpNRKey

            ifstr(i) $(TmpNRKey) != $(KeyNull)
                EnumRegValue $(TmpNRKey) TmpNRList

              ForListDo $(TmpNRList)
                ifstr(i) *($($),1) == "class"
                  set Found = $(!True)
                  endif
              EndForListDo

              CloseRegKey $(TmpNRKey)
            endif
          endif
        EndForListDo

        set TmpList   = {}
        set TmpName   = {}
        set TmpSplit  = {}
        set TmpNRList = {}

        ifstr(i) $(Found) == $(!False)
          set NetRulesValues = >( $(NetRulesValues), +
            { class, $(NoTitle), $(!REG_VT_MULTI_SZ), $(NRClass) } )
          set NetRulesValues = >( $(NetRulesValues), +
            { bindable, $(NoTitle), $(!REG_VT_MULTI_SZ), $(NRBindable) } )
        endif

        shell $(!UtilityInf) AddValueList $(KeyNetRules) $(NetRulesValues)

        ifint $(ProductExists) == $(FALSE)
                read-syms ProgressCopyVars
                install InstallRemove
        endif

    goto write_params

;++++++++++++++++++++++++++++++++++++
;
; write_params:
;
;++++++++++++++++++++++++++++++++++++
write_params = +

	ifstr $(KeyProductBase) == $(KeyNull)
		shell $(!UtilityInf) FindSNARegEntry, +
		                    $(ProductRegBase), +
		                    $(ProductFullName)
		ifint $($ShellCode) != 0
			goto ShellCodeError
		endif

		set Status          = $($R0)
		set KeyProductBase  = $($R1)
		set KeyProduct      = $($R2)
		set KeyServiceIndex = $($R3)
		set KeyNetRules     = $($R4)

		ifstr(i) $(Status) != STATUS_SUCCESSFUL
			CloseRegKey $(KeyProductBase)
			CloseRegKey $(KeyProduct)
			CloseRegKey $(KeyServiceIndex)
			CloseRegKey $(KeyNetRules)
			set ErrMesg = "Can't Find Product Entry For Instance."
			set ErrProc = "write_params"
			set ErrFunc = "FindSNARegEntry"
			goto fatal_registry
		endif
	endif

	ifstr $(KeyService) == $(KeyNull)
		shell $(!UtilityInf) FindSNAService, $(ServiceName)
		ifint $($ShellCode) != 0
			goto ShellCodeError
		endif

		set Status		= $($R0)
		set KeyService 		= $($R1)
		set KeyParameters	= $($R2)
		set KeyExtraParams	= $($R3)

		ifstr(i) $(Status) != STATUS_SUCCESSFUL
			CloseRegKey $(KeyService)
			CloseRegKey $(KeyParameters)
			CloseRegKey $(KeyExtraParams)
			set ErrMesg = "Can't Find Service Entry For Instance."
			set ErrProc = "write_params"
			set ErrFunc = "FindSNAService"
			goto fatal_registry
		endif
	endif

	goto write_params_$(Option)

	;++++++++++++++++++++++++++++++++++++
	;
	; write_params_DCAX25LS:
	;
	;++++++++++++++++++++++++++++++++++++
	write_params_DCAX25LS = +
		ifstr(i) $(Radio4Flag) == $(!True)
			set RadioVal = "1"
		else
			set RadioVal = "0"
		endif
		set FullOption    = $(Option)"_"$(Instance)
		set ProductParams = { +
			{ IHVDLL       , $(NoTitle), $(!REG_VT_SZ), $(ProductDLL)  },+
			{ InfName      , $(NoTitle), $(!REG_VT_SZ), $(FullInfName) },+
			{ InfOption    , $(NoTitle), $(!REG_VT_SZ), $(FullOption)  },+
			{ DriverName   , $(NoTitle), $(!REG_VT_SZ), "DCASYNC"      } +
			}
		set ProductExtraParams = { +	
                        { DeviceName    , $(NoTitle),$(!REG_VT_SZ),    $(DeviceName)    },+
			{ LNUA		, $(NoTitle),$(!REG_VT_SZ)   , $(LNUA)		},+
			{ L1Init	, $(NoTitle),$(!REG_VT_DWORD), 1		},+
			{ L2Start	, $(NoTitle),$(!REG_VT_DWORD), 1		},+
			{ L3Window	, $(NoTitle),$(!REG_VT_DWORD), $(L3Window)	},+
			{ L3PktSz	, $(NoTitle),$(!REG_VT_DWORD), $(L3PktSz)	},+
			{ L2Window	, $(NoTitle),$(!REG_VT_DWORD), $(L2Window)	},+
			{ DiscAction	, $(NoTitle),$(!REG_VT_DWORD), 2		},+
			{ T1Timeout	, $(NoTitle),$(!REG_VT_DWORD), $(T1Timeout)	},+
			{ N2Retry	, $(NoTitle),$(!REG_VT_DWORD), $(N2Retry)	},+
			{ AcceptRevCh	, $(NoTitle),$(!REG_VT_DWORD), $(AcceptRevCh)	},+
			{ Restart	, $(NoTitle),$(!REG_VT_DWORD), $(Restart)	},+
			{ Standby	, $(NoTitle),$(!REG_VT_DWORD), $(Standby)	},+
			{ OSVCRng	, $(NoTitle),$(!REG_VT_SZ)   , $(OSVCRng)	},+
			{ 2SVCRng	, $(NoTitle),$(!REG_VT_SZ)   , $(2SVCRng)	},+
			{ ISVCRng	, $(NoTitle),$(!REG_VT_SZ)   , $(ISVCRng)	},+
			{ PVCRng	, $(NoTitle),$(!REG_VT_SZ)   , $(PVCRng)	},+
			{ DataRate	, $(NoTitle),$(!REG_VT_DWORD), $(DataRate)	},+
			{ NRZI		, $(NoTitle),$(!REG_VT_DWORD), $(NRZI)		},+
			{ FilterIncoming, $(NoTitle),$(!REG_VT_DWORD), $(FilterIncoming)},+
			{ LineType      , $(NoTitle),$(!REG_VT_DWORD), $(LineType)	},+
			{ Radio4Flag    , $(NoTitle),$(!REG_VT_DWORD), $(RadioVal)	} +
			}

		goto finish_write_params

	;++++++++++++++++++++++++++++++++++++
	;
	; write_params_DCAX25DD:
	;
	;++++++++++++++++++++++++++++++++++++
	write_params_DCAX25DD = +
		set FullOption    = $(Option)"_"$(Instance)
		set ProductParams = { +
			{ InfName      , $(NoTitle), $(!REG_VT_SZ)   , $(FullInfName)   },+
			{ InfOption    , $(NoTitle), $(!REG_VT_SZ)   , $(FullOption)    } +
			}
		set ProductExtraParams = {}
		goto finish_write_params

	;++++++++++++++++++++++++++++++++++++
	;
	; finish_write_params:
	;
	;++++++++++++++++++++++++++++++++++++
	finish_write_params = +

		shell $(!UtilityInf) AddValueList, $(KeyServiceIndex), +
			{ +
			{ Title      , $(NoTitle), $(!REG_VT_SZ), $(ServiceTitle) }, +
			{ Description, $(NoTitle), $(!REG_VT_SZ), $(ServiceDesc)  } +
			}
		ifint $($ShellCode) != 0
			goto ShellCodeError
		endif

		shell $(!UtilityInf) AddValueList, $(KeyParameters), +
			{ +
			{ Title      , $(NoTitle), $(!REG_VT_SZ), $(ServiceTitle) }, +
			{ Description, $(NoTitle), $(!REG_VT_SZ), $(ServiceDesc)  } +
			}
		ifint $($ShellCode) != 0
			goto ShellCodeError
		endif

		ifstr(i) $(ProductParams) != {}
			shell $(!UtilityInf) AddValueList, $(KeyParameters), +
							  $(ProductParams)
			ifint $($ShellCode) != 0
				goto ShellCodeError
			endif
		endif

		ifstr(i) $(ProductExtraParams) != {}	
			shell $(!UtilityInf) AddValueList, $(KeyExtraParams), +
							  $(ProductExtraParams)
			ifint $($ShellCode) != 0
				goto ShellCodeError
			endif
		endif
	
		set RetData = >( $(RetData), { $(Instance), +
						$(ServiceName), +
						$(ServiceTitle), +
						$(ServiceDesc), +
						$(!NTN_InstallMode), +
						} )

		CloseRegKey $(KeyProductBase)
		CloseRegKey $(KeyProduct)
		CloseRegKey $(KeyServiceIndex)
		CloseRegKey $(KeyNetRules)
		CloseRegKey $(KeyService)
		CloseRegKey $(KeyParameters)
		CloseRegKey $(KeyExtraParams)

	    goto successful

;++++++++++++++++++++++++++++++++++++
;
; getbind_component:
;
;++++++++++++++++++++++++++++++++++++
getbind_component = +
	goto getbind_$(Option)

	;++++++++++++++++++++++++++++++++++++
	;
	; getbind_DCAX25LS:
	;
	;++++++++++++++++++++++++++++++++++++
	getbind_DCAX25LS = +
		set RetData = { {"01", "DCAX25DD", "", "", "getbindings"} }
		goto finish_getbind_component

	;++++++++++++++++++++++++++++++++++++
	;
	; getbind_DCAX25DD:
	;
	;++++++++++++++++++++++++++++++++++++
	getbind_DCAX25DD = +
		goto finish_getbind_component

	;++++++++++++++++++++++++++++++++++++
	;
	; finish_getbind_component:
	;
	;++++++++++++++++++++++++++++++++++++
	finish_getbind_component = +
		goto successful

;++++++++++++++++++++++++++++++++++++
;
; bind_component:
;
;++++++++++++++++++++++++++++++++++++
bind_component = +

	set Error = "Sorry.  No Bindings Feature Yet."	
	goto fatal_msg

;++++++++++++++++++++++++++++++++++++
;
; remove_component:
;
;++++++++++++++++++++++++++++++++++++
remove_component = +
	read-syms FileConstants$(Option)
	;
	; we need to set ourselved up with these variables for later use
	;
	shell $(!UtilityInf) FindSNAProductServices $(ProductRegBase), +
						   $(ProductFullName)
	ifint $($ShellCode) != 0
		goto ShellCodeError
	endif

	set Status 		 = $($R0)
	set SvcIndexList = $($R1)
	set SvcNameList	 = $($R2)
	set SvcTitleList = $($R3)
	set SvcDescList  = $($R4)

	ifstr(i) $(Status) == STATUS_NOSUCHPRODUCT
		goto successful
	endif

	ifstr(i) $(Status) == STATUS_FAILED
		set ErrMesg = "Can't Open Product Entry In Registry."
		set ErrProc = "remove_component"
		set ErrFunc = "FindSNAProductServices"
		goto fatal_registry
	endif

	;
	; This will be a counter that will be used to decide whether or not
	; the product key should be removed at the end
	;
	QueryListSize SvcIndexListSize $(SvcIndexList)

	ifstr(i) $(!NTN_InstallMode) == "fullremove"
		set RemoveMode = "Full"
		goto remove_all_pieces
	endif

	set RemoveMode = "Partial"

	ifstr(i) $(!NTN_InstallMode) == "snaremove"
		; Hack.  Here we search for bindings and remove only if nothing
		; else needs this piece.
		ifstr(i) $(Option) == "DCAX25DD"
			set PN = #( FileConstantsDCAX25LS, ProductName, 1)
			set PV = #( FileConstantsDCAX25LS, ProductVersion, 1)
			shell $(!UtilityInf) FindSNAProductServices $(ProductRegBase) +
								   $(PN)"_"$(PV)
			set _Status = $($R0)
			set _List   = $($R1)

			ifstr(i) $(_List) != {}
				goto successful
			endif
			shell $(!UtilityInf) FindSNAProductServices $(ProductRegBase) +
								   "DCASDLCLS_1.0"
			set _Status = $($R0)
			set _List   = $($R1)
			ifstr(i) $(_Status) == STATUS_FAILED
				goto set_status_failed
			endif
			ifstr(i) $(_List) != {}
				goto successful
			endif
		endif
	endif

	shell $(!UtilityInf) GrepUniqueServiceInfo "Index", +
						   $(Instance), +
						   $(SvcIndexList), +
						   $(SvcNameList), +
						   $(SvcTitleList), +
						   $(SvcDescList)
	ifint $($ShellCode) != 0
		goto ShellCodeError
	endif

	set Status 		= $($R0)
	set RemoveIndex = $($R1)
	set RemoveName  = $($R2)
	set RemoveTitle = $($R3)
	set RemoveDesc  = $($R4)

	goto remove_one_piece

;++++++++++++++++++++++++++++++++++++
;
; remove_all_pieces:
;
;++++++++++++++++++++++++++++++++++++
remove_all_pieces = +

	ForListDo $(SvcIndexList)

		ifstr(i) $(KeyProductBase) != $(KeyNull)
			CloseRegKey $(KeyProductBase)
		endif

		set RemoveIndex = $($)

		shell $(!UtilityInf) GrepUniqueServiceInfo "Index", +
							   $(RemoveIndex), +
							   $(SvcIndexList), +
							   $(SvcNameList), +
							   $(SvcTitleList), +
							   $(SvcDescList)
		ifint $($ShellCode) != 0
			goto ShellCodeError
		endif

		set Status	= $($R0)
		set RemoveIndex	= $($R1)
		set RemoveName	= $($R2)
		set RemoveTitle	= $($R3)
		set RemoveDesc	= $($R4)
		
		ifstr(i) $(Status) != STATUS_SUCCESSFUL
			goto end
		endif

		set TInstance = $(Instance)
		set Instance  = $(RemoveIndex)
		read-syms FileConstants$(Option)
		set Instance  = $(TInstance)

		goto remove_one_piece
		
		;++++++++++++++++++++++++++++++++++++
		;
		; remove_next_piece:
		;
		;++++++++++++++++++++++++++++++++++++
		remove_next_piece = +

	EndForListDo

	goto remove_product

;++++++++++++++++++++++++++++++++++++
;
; remove_one_piece:
;
;++++++++++++++++++++++++++++++++++++
remove_one_piece = +
	shell $(!UtilityInf) FindSNARegEntry, $(ProductRegBase), +
					     $(ProductFullName)
	ifint $($ShellCode) != 0
		goto ShellCodeError
	endif

	set Status		= $($R0)
	set KeyProductBase	= $($R1)
	set KeyProduct		= $($R2)
	set KeyServiceIndex	= $($R3)
	set KeyNetRules		= $($R4)

	ifstr(i) $(Status) != STATUS_SUCCESSFUL
		CloseRegKey $(KeyProductBase)
		CloseRegKey $(KeyProduct)
		CloseRegKey $(KeyProductVer)
		CloseRegKey $(KeyNetRules)
		set ErrMesg = "Can't Find Product Entry For Instance."
		set ErrProc = "remove_one_piece"
		set ErrFunc = "FindSNARegEntry"
		goto fatal_registry
	endif

	;
	; If we're coming in as the device driver, check to see if
	; any other SNA components (i.e., other sync link services)
	; are bound to it -- if so, don't remove the driver!
	;
	ifstr(i) $(Option) == "DCAX25DD"
	  set Another = $(!False)

	  set KeySM = $(KeyNull)
	  OpenRegKey $(!REG_H_LOCAL) "" "Software\Microsoft" $(!REG_KEY_READ) KeySM
	  ifstr(i) $(KeySM) != $(KeyNull)

	    EnumRegKey $(KeySM) TmpList
	    ForListDo $(TmpList)  ; look at every key under Software\Microsoft

	      ifstr(i) $(Another) == $(!False)  ; skip the rest if we found one

		set KeyCV = $(KeyNull)
		OpenRegKey $(KeySM) "" *($($),1)"\CurrentVersion" $(!REG_KEY_READ) KeyCV
		ifstr(i) $(KeyCV) != $(KeyNull)

		  set SnaVerValue = ""
		  GetRegValue $(KeyCV) "SNAVersion" SnaVerValue
		  ifstr(i) $(SnaVerValue) != ""  ; it's an SNA component

		    set SWTypeValue = ""
		    GetRegValue $(KeyCV) "SoftwareType" SWTypeValue
		    ifstr(i) $(SWTypeValue) != ""  ; it's an SNA component
		    ifstr(i) *($(SWTypeValue),4) == "service"  ; link service

		      set SvcNameValue = ""
		      GetRegValue $(KeyCV) "ServiceName" SvcNameValue
		      ifstr(i) $(SvcNameValue) != ""
		      set LoopSvcName = *($(SvcNameValue),4)
		      ifstr(i) $(LoopSvcName) != $(ServiceName)  ; REVIEW: must be link service svcname
		      ifstr(i) $(LoopSvcName) != "SnaServr"

			; Now we know we're a link service and we're not the
			; same one we're trying to remove.  Let's see what
			; we're bound to.

			set KeyLnk = $(KeyNull)
			OpenRegKey $(!REG_H_LOCAL) "" +
			  "System\CurrentControlSet\Services\"$(LoopSvcName)"\Linkage" +
			  $(!REG_KEY_READ) KeyLnk
			ifstr(i) $(KeyLnk) != $(KeyNull)

			  set BindValue = ""
			  GetRegValue $(KeyLnk) "Bind" BindValue
			  ifstr(i) $(BindValue) != ""

			    set BindList = *($(BindValue),4)
			    ForListDo $(BindList)

			      Split-String $($) "\" BindStr
			      QueryListSize BindSize $(BindStr)
			      set BindCmp = *($(BindStr),$(BindSize))

			      ; The acid test...
			      ifstr(i) $(BindCmp) == $(ProductServicePrefix)
				set Another = $(!True)
			      endif

			    EndForListDo
			  endif

			  CloseRegKey $(KeyLnk)

			endif  ; KeyLnk
		      endif  ; SvcName != SNA Server
		      endif  ; SvcName != this link SvcName
		      endif  ; SvcNameValue
		    endif  ; SWType == service
		    endif  ; SWTypeValue
		  endif  ; SNAVersion exists

		  CloseRegKey $(KeyCV)

		endif  ; KeyCV
	      endif  ; Another == False

	    EndForListDo
	    CloseRegKey $(KeySM)

	  endif  ; KeySM
	endif  ; DCAX25DD

	ifstr(i) $(Another) == $(!True)
	  goto successful  ; Bail out, don't remove this component!
	endif

	;
	; Get rid of this service instance in the product keys
	;
	CloseRegKey $(KeyServiceIndex)
	CloseRegKey $(KeyNetRules)
	DeleteRegTree $(KeyProduct) $(RemoveIndex)
	CloseRegKey $(KeyProduct)

	;
	; If deleteing link service then set its cooraspoding DCAISCAConfigurationData
	; value to 0 in DCASYNC
	;
	OpenRegKey $(!REG_H_LOCAL), "", "SYSTEM\CurrentControlSet\Services\DCASYNC\Parameters\ExtraParameters", $(!REG_KEY_READWRITE), KeyDriver
        ifstr(i) $(KeyDriver) != $(KeyNull)
		GetRegValue $(KeyDriver) "Data1LS" DCASYNCls1
	  	GetRegValue $(KeyDriver) "Data2LS" DCASYNCls2
		set DCASYNCls1  = *( $(DCASYNCls1),  4 )
		set DCASYNCls2  = *( $(DCASYNCls2),  4 )

	  	ifstr(i) $(RemoveName) == $(DCASYNCls1)
            		SetRegValue $(KeyDriver) { "DCAISCAConfigData1", $(NoTitle), $(!REG_VT_DWORD), 0  }
            		SetRegValue $(KeyDriver) { "Data1LS", 	     	 $(NoTitle), $(!REG_VT_SZ),    "" }
	  	endif
	  	ifstr(i) $(RemoveName) == $(DCASYNCls2)
            		SetRegValue $(KeyDriver) { "DCAISCAConfigData2", $(NoTitle), $(!REG_VT_DWORD), 0  }
            		SetRegValue $(KeyDriver) { "Data2LS", 	     	 $(NoTitle), $(!REG_VT_SZ),    "" }
	  	endif

	  	CloseRegKey $(KeyDriver)
	endif

	shell $(!UtilityInf) DeleteSNAService $(RemoveName)

        ;
        ; Special Hack Alert:
        ;
        ; When we have multiple instances of the same type of link
        ; service installed, only ONE of those instances may have
        ; the "class" and "bindable" values present under their
        ; NetRules key.  If the link service we've just deleted
        ; was the one that had those values, we need to search the
        ; remaining instances (if any) for those values, and if not
        ; found, we must add them to the first instance we find.
        ; What a hassle.
        ;

        set Found = $(!False)
        set SaveName = ""

        OpenRegKey $(!REG_H_LOCAL), "", "Software\Microsoft", +
                   $(!REG_KEY_READ), KeySM

        ifstr(i) $(KeySM) != $(KeyNull)
          EnumRegKey $(KeySM) TmpList

          ForListDo $(TmpList)
            ifstr(i) $(Found) == $(!False)

              set TmpName = *( $($), 1 )
              Split-String $(TmpName) "_" TmpSplit

              ifstr(i) *( $(TmpSplit), 1 ) == $(ProductName)
                ifstr(i) $(TmpName) != $(ProductFullName)

                  OpenRegKey $(KeySM), "", +
                             $(TmpName)"\CurrentVersion\NetRules", +
                             $(!REG_KEY_READ), TmpNRKey
                  ifstr(i) $(TmpNRKey) != $(KeyNull)

                    ifstr(i) $(SaveName) == ""
                      set SaveName = $(TmpName)
                    endif

                    EnumRegValue $(TmpNRKey) TmpNRList
                    ForListDo $(TmpNRList)
                      ifstr(i) *( $($), 1 ) == "class"
                        set Found = $(!True)
                      endif
                    EndForListDo

                    CloseRegKey $(TmpNRKey)
                  endif
                endif
              endif
            endif
          EndForListDo

          set TmpList   = {}
          set TmpName   = ""
          set TmpSplit  = ""
          set TmpNRList = {}

          ifstr(i) $(Found) == $(!False)
            ifstr(i) $(SaveName) != ""

              OpenRegKey $(KeySM), "", +
                         $(SaveName)"\CurrentVersion\NetRules", +
                         $(!REG_KEY_READWRITE), TmpNRKey

              ifstr(i) $(TmpNRKey) != $(KeyNull)
                shell $(!UtilityInf) AddValueList $(TmpNRKey), +
                  {{ class,    $(NoTitle), $(!REG_VT_MULTI_SZ), {$(NetRulesClass)}}, +
                   { bindable, $(NoTitle), $(!REG_VT_MULTI_SZ), {$(NetRulesBindable)}}}
                CloseRegKey $(TmpNRKey)
              endif
            endif
          endif

          CloseRegKey $(KeySM)
        endif

        ;
        ; Done with that NetRules weirdness.  Let's get on with it:
        ;

	set-sub SvcIndexListSize = $(SvcIndexListSize), 1

	OpenRegKey $(!REG_H_LOCAL), "", $(ProductRegBase), +
		   $(!REG_KEY_READWRITE), KeyProductTemp
	ifstr(i) $(KeyProductTemp) != ""
	  DeleteRegTree $(KeyProductTemp) $(ProductFullName)
	  CloseRegKey $(KeyProductTemp)
	endif

;	;
;	; Delete the EventLog entry for the device driver.
;	;
;	OpenRegKey $(!REG_H_LOCAL), "", +
;		   "System\CurrentControlSet\Services\EventLog\System", +
;		   $(!REG_KEY_READWRITE), KeyProduct

;	ifstr(i) $(!NTN_InstallMode) == "fullremove"
;	  ifstr(i) $(KeyProduct) != $(KeyNull)
;	    DeleteRegTree $(KeyProduct), "DCASYNCDD"
;	  endif
;	endif

;	CloseRegKey $(KeyProduct)

	ifstr(i) $(!NTN_InstallMode) == "fullremove"
	  install InstallRemove
	endif

	set RetData = >( $(RetData), { $(RemoveIndex), +
					   $(RemoveName), +
					   $(RemoveTitle), +
					   $(RemoveDesc), +
					   $(!NTN_InstallMode), +
					 } )

	ifstr(i) $(RemoveMode) == "Full"
	  goto remove_next_piece
	endif

;++++++++++++++++++++++++++++++++++++
;
; remove_product:
;
;++++++++++++++++++++++++++++++++++++
remove_product = +
	goto finish_remove_component

;++++++++++++++++++++++++++++++++++++
;
; finish_remove_component:
;
;++++++++++++++++++++++++++++++++++++
finish_remove_component = +
	goto successful


;++++++++++++++++++++++++++++++++++++
;++++++++++++++++++++++++++++++++++++
;
; Escape Hatches:
;
;++++++++++++++++++++++++++++++++++++
;++++++++++++++++++++++++++++++++++++

;++++++++++++++++++++++++++++++++++++
;
; successful:
; this part actually copies the files if the DoCopy variable is on
;
;++++++++++++++++++++++++++++++++++++
successful = +
	set Status = STATUS_SUCCESSFUL
	goto end

;++++++++++++++++++++++++++++++++++++
;
; warning_msg:
; a warning display
;
;++++++++++++++++++++++++++++++++++++
warning_msg = +

	; TODO: This is how the template does warnings.  Do we have a better way?
	;       Do we want to do it differently?
	;       CODENAME: WARNINGS
	
    Shell $(!SubroutineInf) SetupMessage, $(!STF_LANGUAGE), "WARNING", $(Error)
    ifint $($ShellCode) != 0
		goto ShellCodeError
    endif
	
	set DLGEVENT = $($R1)

    ifstr(i) $(DLGEVENT) == "OK"
	   	goto $(to)
    else-ifstr(i) $(DLGEVENT) == "CANCEL"
	   	goto $(from)
    else
    	set Status = STATUS_FAILED
	   	goto end
    endif

;++++++++++++++++++++++++++++++++++++
;
; nonfatal_msg:
; a non-fatal display
;
;++++++++++++++++++++++++++++++++++++
nonfatal_msg = +

	; TODO: See CODENAME: WARNINGS

    Shell $(!SubroutineInf) SetupMessage, $(!STF_LANGUAGE), "NONFATAL", $(Error)
    ifint $($ShellCode) != 0
		goto ShellCodeError
    endif

	set DLGEVENT = $($R1)

    ifstr(i) $(DLGEVENT) == "OK"
        goto $(from)
    else
        goto "end"
    endif

;++++++++++++++++++++++++++++++++++++
;
; fatal_registry:
; something failed in the registry access
;
;++++++++++++++++++++++++++++++++++++
fatal_registry = +

    set Error = +
		"Fatal Registry Error:"$(!LF)+
		$(ErrMesg)$(!LF)+
		"File: "$(ThisInf)$(!LF)+
		"Procedure: "$(ErrProc)$(!LF)+
		"Function: "$(ErrFunc)

    goto fatal_msg

;++++++++++++++++++++++++++++++++++++
;
; fatal_msg:
; a fatal error display
;
;++++++++++++++++++++++++++++++++++++
fatal_msg =	+

	; TODO: See CODENAME: WARNINGS

    Shell $(!SubroutineInf) SetupMessage, $(!STF_LANGUAGE), "FATAL", $(Error)
    ifint $($ShellCode) != 0
		goto ShellCodeError
    endif

    goto set_status_failed

;++++++++++++++++++++++++++++++++++++
;
; ShellCodeError:
; a shell error to be displayed
;
;++++++++++++++++++++++++++++++++++++
ShellCodeError = +

	; TODO: See CODENAME: WARNINGS

    set DlgType      = "MessageBox"
    set STF_MB_TITLE = "Error: "$(SetupTitle)
    set STF_MB_TEXT  = "Shell Code Error"
    set STF_MB_TYPE  = 1
    set STF_MB_ICON  = 3
    set STF_MB_DEF   = 1
    ui start "Error Message"
    goto set_status_failed

;++++++++++++++++++++++++++++++++++++
;
; set_status_failed:
; last step before exiting
;
;++++++++++++++++++++++++++++++++++++
set_status_failed = +

    set Status = STATUS_FAILED
    goto end

;++++++++++++++++++++++++++++++++++++
;
; end:
; this exit point sets the CommonStatus to the current status
; then returns the status and return data
;
;++++++++++++++++++++++++++++++++++++
end = +
	ifstr(i) $(!IHVDLGHANDLE) != ""
		FreeLibrary $(!IHVDLGHANDLE)
		set !IHVDLGHANDLE = ""
	endif
	set CommonStatus = $(Status)
    Return $(CommonStatus) $(RetData) $(Changes)

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
;
; INSTALLATION AND FILE SECTION
; -----------------------------
; This section is responsible for installing the component and listing all
; the necessary files etc.
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

;========================================================================
;
; INSTALL
; -------
; The IHV should follow the following template for this section.  It is
; responsible for file copying and registry initialization.
;
;========================================================================

[InstallRemove]
    set STF_OVERWRITE = "ALWAYS"

	set SNADirList  = { "hwsetup", "system" }
	set SNAToList   = { "system\hwsetup", "system" }

	ifstr(i) $(!NTN_InstallMode) == "install"
	    ifstr(i) $(!AddCopy) == "YES"
			ForListDo $(SNADirList)
				ifstr(i) $($) != "hwsetup"
					set Ext = $(ThisFile)
				else
					set Ext = ""
				endif
				set To = *( $(SNAToList), $(#) )
				AddSectionFilesToCopyList "FilesFor_"$($)"_"$(Option) +
										  $(!DriverDir)$(Ext), +
										  $(!SNARootDir)"\"$(To)
			EndForListDo
		else
			AddSectionFilesToCopyList "FilesFor_system_"$(Option) +
			                          $(!DriverDir)"dcax25\"$(Ext), +
			                          $(!SNARootDir)"\system"
			CopyFilesInCopyList
	    endif
	
	    ifstr(i) $(!DoCopy) == "YES"
			CopyFilesInCopyList
	    endif
	else
		set !_FileRemoveList = {}
		ForListDo $(SNADirList)
			set SNADir   = *( $(SNAToList), $(#) )
			set FullPath = $(!SNARootDir)"\"$(SNADir)
			set FileList = ^( "FilesFor_"$($)"_"$(Option), 2 )
			ForListDo $(FileList)
				set !_FileRemoveList = >( $(!_FileRemoveList), +
										   $(FullPath)"\"$($) )
			EndForListDo
		EndForListDo
	endif
		
    exit

;========================================================================
;
; FILES
; -----
; These should list the files to be installed for each particular option.
;
; FORMAT:
; The format is "FilesFor_" concatenated with the directory where they will
;   end up, another underscore, and the option whose files these are.
;   Currently, directories that can take files are:
;     ihvinf - the inf file, its help and libraries
;     ntbin  - executables
;     ntsys  - system files
; The format includes an enumeration constant and a name for each file, as well
; as a number of possible flags
;	1,		file1.spu
;	1,		file2.spu
;	...
;
;========================================================================

[FilesFor_hwsetup_DCAX25LS]
1,	dcax25.inf
1,	dcax25.hlp
1,	dcax25.srl

[FilesFor_system_DCAX25LS]
;;rmh002 1,	dcax25.dll

[FilesFor_hwsetup_DCAX25DD]

[FilesFor_system_DCAX25DD]
1,	dcasync.sys

Download Driver Pack

How To Update Drivers Manually

After your driver has been downloaded, follow these simple steps to install it.

  • Expand the archive file (if the download file is in zip or rar format).

  • If the expanded file has an .exe extension, double click it and follow the installation instructions.

  • Otherwise, open Device Manager by right-clicking the Start menu and selecting Device Manager.

  • Find the device and model you want to update in the device list.

  • Double-click on it to open the Properties dialog box.

  • From the Properties dialog box, select the Driver tab.

  • Click the Update Driver button, then follow the instructions.

Very important: You must reboot your system to ensure that any driver updates have taken effect.

For more help, visit our Driver Support section for step-by-step videos on how to install drivers for every file type.

server: web5, load: 1.32