Dcasdlc.inf Driver File Contents (ISCASNA3.EXE)

;
;; Modified	when		why
;  rmh001	10-Mar-94	Title is DCA SDLC Link Service
;						Link Service service name is DCASDLCx
;  rmh002	14-Mar-94	Use MSFT-provided link services
;  rmh003	15-Mar-94	Device name is DCADL$nn
;  rmh004	17-Jun-94	Wasn't showing up in setup, due to missing quote
;
; DCA Change Log
;
; 07/27/93 David Ehrlich - Started with IBMSDLC.INF
;			 - 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
;			 - Took out all references to X.25
;			 - Changes in [SDLCDriverNumbersEISA_ENG]
;				      [SDLCDriverNumbersISA_ENG]
;				      [SDLCDriverNumbersMCA_ENG]
;
; 08/04/93 David Ehrlich - Made changes to not have a list box with card
;			   types and then base driver number off of that.
;			   Instead we have 3 list boxes for IRQ, I/O
;			   Address, and DMA Channel.  We then base the
;			   Driver number off of a combination of the 3.
;
; 08/16/93 David Ehrlich - Made changes so that the differences in MCA vs.
;			   ISA/EISA ISCA options are known and shown to the
;			   user.
;			 - Added code to not allow users to configure ISCA
;			   conflicts.
; 08/17/93 David Ehrlich - Merged workstation build 81 changes.
; 08/20/93 David Ehrlich - Merged workstation RC1 changes.
;			 - Changed, again, what we do with DriverNumber.  We
;			   now mimic the IBM setup: 03->non-mca isca #1;
;			   04->non-mca isca #2; 05->mca icsa #1; and
;			   06->mca isca #2.  The configuration info will now
;			   go into ExtraParameters of the DCASYNC service.
;
; 08/25/93 David Ehrlich - Re-added the X.25 references.
;
; 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_DCASDLCDD] section.
;
; 10/08/93 David Ehrlich - Added Microsoft RC 2 changes
; 06/18/96 Edward Suen   - Allowed max three boards (MAX3)

;************************************************************************
;************************************************************************
;
; DCASDLC.INF
;
;	DCA SDLC Link Service and Device Driver INF file
;
; History:
;   t-danfr			Jul 23, 92		Initial Design
;   t-danfr			Aug 05, 92		Update #1
;
; 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]
	DCASDLCLS
	DCASDLCDD
	
;========================================================================
;
; 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]
	DCASDLCLS = "DCA SDLC Link Service"
	DCASDLCDD = "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]
	DCASDLCLS

;========================================================================
;
; 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
;
;========================================================================

[SNAOptionAddsDCASDLCLS]
	DCASDLCDD

;========================================================================
;
; 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]
; 		...
;
;========================================================================

[InstallStepsDCASDLCLS]
	AddFilesToCopyList	= YES
	CopyFilesInCopyList	= YES

[InstallStepsDCASDLCDD]
	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"

;++++++++++++++++++++++++++++++++++++                                           
;                                                                               
; 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_IBMSDLCDDCONFIG = 101
	IDD_IBMSDLCLSCONFIG = 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	= "DCASDLC"
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.
;
;++++++++++++++++++++++++++++++++++++

[FileConstantsDCASDLCLS]
;
; Product Info
;
ProductVersion  		= "1.0"
ProductName			= "DCASDLCLS"
ProductFullName			= $(ProductName)"_"$(ProductVersion)"_"$(Instance)
ProductRegBase			= $(!NTN_SoftwareBase)"\Microsoft"
ProductType			= "Link"
ProductImagePath		= "SNALINK.EXE"
ProductDepends			= {}
ProductParams			= {}
ProductExtraParams		= {}
ProductExclusive		= $(FALSE)
ProductDLL			= "IBMSDLC.DLL"		;;rmh002
ProductServicePrefix		= "DcaSdlc"
ProductServiceQuery		= $(TRUE)
;
; Registry Key Information
;
SNAServiceType			= "CESLINK"
;
; NetRules Stuff
;
NetRulesClass			= "snasdlclink snalink"
NetRulesTitle			= "DCA SDLC Link Service"
NetRulesUse			= "service yes yes"
NetRulesBindable		= "snasdlclink snasyncdriver non non 100"
NetRulesType                    = "dcasdlc_"$(Instance)" snasdlclink"
FullInfName		    	= $(!SNARootDir)"\system\hwsetup\"$(ThisInf)
SoftwareType			= "service"

[FileConstantsDCASDLCDD]
;
; 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 SDLC Link Service Setup"

[FileConstantsDCASDLCLS_ENG]
ProductTitle	= "DCA SDLC Link Service"
ProductDesc	= "DCA SDLC Link Service for "$(!SNA_ProductName)

[FileConstantsDCASDLCDD_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]
;		...
;	
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

[DoSDLCLSConfigENG]
DlgTemplate		= IDD_IBMSDLCLSCONFIG
DlgType			= "RadioCombination"
Caption			= $(!P:SetupTitle)
DlgText1		= "Service Name: "$(ServiceName)
EditLabel1		= "&Title:"
EditTextIn		= { $(ServiceTitle) }
EditTextLim		= { 40 }
NotifyFields		= { "NO" }

RadioGroupA		= "Line T&ype"
RadioTextA1		= "&Leased"
RadioTextA2		= "Switched: &Server-Stored Number"
RadioTextA3		= "Switched: &Modem-Stored Number"
RadioTextA4		= "Switched: Ma&nual Dial"

ComboLabel1		= "&Interrupt"
ComboLabel2		= "I/&O Address"
ComboLabel3		= "&DMA Channel"

RadioOptionsGreyed	= {}
CheckText1		= "Constant &RTS"
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
;
;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;
; DoSDLCLSConfig:
;
; DESCRIPTION:  This shell script pops up a dialog to get the configuration
;				of this product.
;
; INPUT:        $($0) : Service Name
;		$($1) : Current Title
;		$($2) : Current Card Type Index
;		$($3) : Current Line Type
;		$($4) : Current Carrier
;		$($5) : Current Manual Dial setting
;
; OUTPUT:       $($R0): Status
;		$($R1): Changes flag
;		$($R2): New Title
;		$($R3): New Card Type (01 - 06)
; 		$($R4): New Line Type
;		$($R5): New Carrier
;		$($R6): New Manual Dial setting
;
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()

[DoSDLCLSConfig]
	
	set ServiceName		= $($0)
	set ServiceTitle	= $($1)
	set DriverIndex		= $($2)
	set LineType		= $($3)
	set Carrier		= $($4)
	set FRadio4		= $($5)

	set SvDriverIndex	= $($2)
	set SvLineType		= $($3)
	set SvCarrier		= $($4)
	set SvFRadio4		= $($5)

	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
	  DCASYNCcfg3 = 0                                             ; Added MAX3 06/18/96
	  DCASYNCls1  = ""
	  DCASYNCls2  = ""
	  DCASYNCls3  = ""                                            ; Added MAX3 06/18/96
	else
	  GetRegValue $(KeyDriver) "DCAISCAConfigData1" DCASYNCcfg1
	  GetRegValue $(KeyDriver) "DCAISCAConfigData2" DCASYNCcfg2
	  GetRegValue $(KeyDriver) "DCAISCAConfigData3" DCASYNCcfg3   ; Added MAX3 06/18/96
	  GetRegValue $(KeyDriver) "Data1LS" 		DCASYNCls1
	  GetRegValue $(KeyDriver) "Data2LS"		DCASYNCls2
	  GetRegValue $(KeyDriver) "Data3LS"		DCASYNCls3    ; Added MAX3 06/18/96

	  set DCASYNCcfg1 = *( $(DCASYNCcfg1), 4 )
	  set DCASYNCcfg2 = *( $(DCASYNCcfg2), 4 )
	  set DCASYNCcfg3 = *( $(DCASYNCcfg3), 4 )                    ; Added MAX3 06/18/96
	  set DCASYNCls1  = *( $(DCASYNCls1),  4 )
	  set DCASYNCls2  = *( $(DCASYNCls2),  4 )
	  set DCASYNCls3  = *( $(DCASYNCls3),  4 )                    ; Added MAX3 06/18/96

	  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) $(ServiceName) == $(DCASYNCls3)                      ; Added MAX3 06/18/96
	  goto ConfigLS010                                            ; Added MAX3 06/18/96
	endif                                                         ; Added MAX3 06/18/96
	ifstr(i) $(DCASYNCls1) == ""
	  goto ConfigLS010
	endif
	ifstr(i) $(DCASYNCls2) == ""
	  goto ConfigLS010
	endif
	ifstr(i) $(DCASYNCls3) == ""                                  ; Added MAX3 06/18/96
	  goto ConfigLS010                                            ; Added MAX3 06/18/96
	endif                                                         ; Added MAX3 06/18/96

        set Status				= STATUS_FAILED       ; Added MAX3 06/18/96

	; Removed MAX3 06/18/96 shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL "The maximum of 2 DCA SDLC/X.25 boards are already configured."
	shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL "The maximum of 3 DCA SDLC/X.25 boards are already configured."  ; Added MAX3 06/18/96
	Return $(Status), $(Changes), $(ServiceTitle), $(DriverIndex), $(LineType), $(Carrier), $(FRadio4)

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

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

	;
	; Set up choices based on bus type
	;
	ifstr(i) $(!STF_BUSTYPE) == "MCA"
	  set ComboListIn1 = { "3", "4", "7" }
	  set ComboListIn2 = { "380-387", "388-38F", "3A0-3A7", "3A8-3AF" }
	  set ComboListIn3 = { "1", "5", "7", "None" }
	else
	  set ComboListIn1 = { "3", "4", "7" }
	  set ComboListIn2 = { "380-387", "388-38F", "3A0-3A7", "370-377" }
	  set ComboListIn3 = { "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
	ifstr(i) $(ServiceName) == $(DCASYNCls3)                       ; Added MAX3 06/18/96
	  set DriverParams = $(DCASYNCcfg3)                            ; Added MAX3 06/18/96
	endif                                                          ; Added MAX3 06/18/96
	ifint $(DriverParams) == 0
	  set DriverParams = "310"
	endif

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

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

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

	set ComboListItemsIn  = { ComboListIn1,  ComboListIn2,  ComboListIn3 }
	set ComboListItemsOut = { ComboListOut1, ComboListOut2, ComboListOut3 }

	ifint $(Carrier) == 0
	  set CheckItemsIn = { "OFF" }
	else
	  set CheckItemsIn = { "ON" }
	endif

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

	ifstr(i) $(DLGEVENT) == "Exit"
	  set Status = STATUS_USERCANCEL
	else
	  ;
	  ; Compute new driver index
	  ;
     

          ifstr(i) $(!NTN_InstallMode) == configure      ; Added MAX3 06/18/96

; Removed MAX3 06/18/96	  ifstr(i) $(DCASYNCls1) == ""
; Removed MAX3 06/18/96    	    ifstr(i) $(DCASYNCls2) == ""
; Removed MAX3 06/18/96; Nothing in the first slot and nothing in the second, assume first
; Removed MAX3 06/18/96; index entry as appropriate
; Removed MAX3 06/18/96              ifstr(i) $(!NTN_InstallMode) == install
; Removed MAX3 06/18/96          	ifstr(i) $(!STF_BUSTYPE) == "MCA"
; Removed MAX3 06/18/96          	   set DriverIndex = "05"
; Removed MAX3 06/18/96        	else
; Removed MAX3 06/18/96          	   set DriverIndex = "03"
; Removed MAX3 06/18/96                endif
; Removed MAX3 06/18/96	      else
	  ; Must be config        
                 Debug-Output  "BBDeviceName="$(!BBDeviceName)                              
                 set DriverIndex = "03"				;;rmh004  
                 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                                                    
; Removed MAX3 06/18/96	      endif                                       
	   else                                                 ;Added MAX3 06/18/96
           ; must be install                                    ;Added MAX3 06/18/96
              ifstr(i) $(DCASYNCls1) == ""                      ;Added MAX3 06/18/96
                  set DriverIndex = "03"                        ;Added MAX3 06/18/96
              else                                              ;Added MAX3 06/18/96
   	          ifstr(i) $(DCASYNCls2) == ""                  ;Added MAX3 06/18/96
                      set DriverIndex = "04"                    ;Added MAX3 06/18/96
                  else                                          ;Added MAX3 06/18/96
   	              ifstr(i) $(DCASYNCls3) == ""              ;Added MAX3 06/18/96
                         set DriverIndex = "05"                 ;Added MAX3 06/18/96
                      endif                                     ;Added MAX3 06/18/96
                  endif                                         ;Added MAX3 06/18/96
              endif                                             ;Added MAX3 06/18/96
                                                                ;Added MAX3 06/18/96
           endif                                                ;Added MAX3 06/18/96


; Removed MAX3 06/18/96; We had a second slot entry assume the proper idx
; Removed MAX3 06/18/96              ifstr(i) $(!NTN_InstallMode) == install
; Removed MAX3 06/18/96      	       ifstr(i) $(!STF_BUSTYPE) == "MCA"
; Removed MAX3 06/18/96      		set DriverIndex = "06"
; Removed MAX3 06/18/96    	       else
; Removed MAX3 06/18/96      		set DriverIndex = "04"
; Removed MAX3 06/18/96	       endif
; Removed MAX3 06/18/96	      else
; Removed MAX3 06/18/96                set DriverIndex = "03"
; Removed MAX3 06/18/96                ifstr(i)      $(!BBDeviceName) == "DCADL$03"
; Removed MAX3 06/18/96                      set DriverIndex = "03"
; Removed MAX3 06/18/96                else-ifstr(i) $(!BBDeviceName) == "DCADL$04"
; Removed MAX3 06/18/96                      set DriverIndex = "04"
; Removed MAX3 06/18/96                else-ifstr(i) $(!BBDeviceName) == "DCADL$05"
; Removed MAX3 06/18/96                      set DriverIndex = "05"
; Removed MAX3 06/18/96                else-ifstr(i) $(!BBDeviceName) == "DCADL$06"
; Removed MAX3 06/18/96                      set DriverIndex = "06"
; Removed MAX3 06/18/96                endif
; Removed MAX3 06/18/96	     endif
; Removed MAX3 06/18/96	    endif
; Removed MAX3 06/18/96	  else
; Removed MAX3 06/18/96; This is if we had one in the first slot. So set the idx for
; Removed MAX3 06/18/96; the first one
; Removed MAX3 06/18/96            ifstr(i) $(!NTN_InstallMode) == install
; Removed MAX3 06/18/96	     ; We are installing
; Removed MAX3 06/18/96	      ifstr(i) $(!STF_BUSTYPE) == "MCA"
; Removed MAX3 06/18/96      	        set DriverIndex = "06"
; Removed MAX3 06/18/96    	      else
; Removed MAX3 06/18/96      	        set DriverIndex = "04"
; Removed MAX3 06/18/96	      endif
; Removed MAX3 06/18/96            else
; Removed MAX3 06/18/96	    ; We must be configuring
; Removed MAX3 06/18/96             set DriverIndex = "03"
; Removed MAX3 06/18/96             ifstr(i)      $(!BBDeviceName) == "DCADL$03"
; Removed MAX3 06/18/96                  set DriverIndex = "03"
; Removed MAX3 06/18/96             else-ifstr(i) $(!BBDeviceName) == "DCADL$04"
; Removed MAX3 06/18/96                   set DriverIndex = "04"
; Removed MAX3 06/18/96             else-ifstr(i) $(!BBDeviceName) == "DCADL$05"
; Removed MAX3 06/18/96                   set DriverIndex = "05"
; Removed MAX3 06/18/96             else-ifstr(i) $(!BBDeviceName) == "DCADL$06"
; Removed MAX3 06/18/96                   set DriverIndex = "06"
; Removed MAX3 06/18/96             endif
; Removed MAX3 06/18/96            endif
; Removed MAX3 06/18/96
; Removed MAX3 06/18/96	  endif
; Removed MAX3 06/18/96
	  ;
	  ; Compute new driver params
	  ;
	  set DriverParams = 0

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

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

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

	  ;
	  ; See if new driver params conflicts with another SDLC driver
	  ;
          ; Since we allow three cards, there are two other cards that we  Added MAX3 06/18/96
          ; need to check for conflicts                                    Added MAX3 06/18/96
	  ;Removed MAX3 06/18/96 set DPOther = 0
	  set DPOther1 = 0                      ;Added MAX3 06/18/96
	  set DPOther2 = 0                      ;Added MAX3 06/18/96
	  ;Removed MAX3 06/18/96 ifstr(i) $(ServiceName) == "SnaSdlc1"
	  ;Removed MAX3 06/18/96   ifstr(i) $(DCASYNCls1) == "SnaSdlc2"
	  ;Removed MAX3 06/18/96     set DPOther = $(DCASYNCcfg1)
	  ;Removed MAX3 06/18/96   endif
	  ;Removed MAX3 06/18/96   ifstr(i) $(DCASYNCls2) == "SnaSdlc2"
	  ;Removed MAX3 06/18/96     set DPOther = $(DCASYNCcfg2)
	  ;Removed MAX3 06/18/96   endif
	  ;Removed MAX3 06/18/96 else
	  ;Removed MAX3 06/18/96   ifstr(i) $(DCASYNCls1) == "SnaSdlc1"
	  ;Removed MAX3 06/18/96     set DPOther = $(DCASYNCcfg1)
	  ;Removed MAX3 06/18/96   endif
	  ;Removed MAX3 06/18/96   ifstr(i) $(DCASYNCls2) == "SnaSdlc1"
	  ;Removed MAX3 06/18/96     set DPOther = $(DCASYNCcfg2)
	  ;Removed MAX3 06/18/96   endif
	  ;Removed MAX3 06/18/96 endif
	  ;Removed MAX3 06/18/96 ifint $(DPOther) == 0
	  ;Removed MAX3 06/18/96   set DPOther = "999"
	  ;Removed MAX3 06/18/96 endif

          Debug-Output "DriverIndex="$(DriverIndex)
	  ifstr(i) $(DriverIndex) == "03"        ;Added MAX3 06/18/96
	      set DPOther1 = $(DCASYNCcfg2)      ;Added MAX3 06/18/96
	      set DPOther2 = $(DCASYNCcfg3)      ;Added MAX3 06/18/96
	  endif                                  ;Added MAX3 06/18/96
                                                 ;Added MAX3 06/18/96
	  ifstr(i) $(DriverIndex) == "04"        ;Added MAX3 06/18/96
	      set DPOther1 = $(DCASYNCcfg1)      ;Added MAX3 06/18/96
	      set DPOther2 = $(DCASYNCcfg3)      ;Added MAX3 06/18/96
	  endif                                  ;Added MAX3 06/18/96
                                                 ;Added MAX3 06/18/96
	  ifstr(i) $(DriverIndex) == "05"        ;Added MAX3 06/18/96
	      set DPOther1 = $(DCASYNCcfg1)      ;Added MAX3 06/18/96
	      set DPOther2 = $(DCASYNCcfg2)      ;Added MAX3 06/18/96
	  endif                                  ;Added MAX3 06/18/96
                                                 ;Added MAX3 06/18/96
	  ifint $(DPOther1) == 0                 ;Added MAX3 06/18/96
	    set DPOther1 = "999"                 ;Added MAX3 06/18/96
	  endif                                  ;Added MAX3 06/18/96
                                                 ;Added MAX3 06/18/96
	  ifint $(DPOther2) == 0                 ;Added MAX3 06/18/96
	    set DPOther2 = "999"                 ;Added MAX3 06/18/96
	  endif                                  ;Added MAX3 06/18/96



	  set DPThis = $(DriverParams)

	  ;
	  ; Check the IRQ
	  ;
	  set-div i1 = $(DPThis),  100
;Removed MAX3 06/18/96	  set-div i2 = $(DPOther), 100
;Removed MAX3 06/18/96	  ifint $(i1) == $(i2)
;Removed MAX3 06/18/96	      shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL "This interrupt setting is in conflict with the other DCA SDLC board."
;Removed MAX3 06/18/96	      ui pop 1
;Removed MAX3 06/18/96	      goto RefreshDlg
;Removed MAX3 06/18/96	  else
;Removed MAX3 06/18/96	    set-mul tem     = $(i1), 100
;Removed MAX3 06/18/96	    set-sub DPThis  = $(DPThis),  $(tem)
;Removed MAX3 06/18/96	    set-mul tem     = $(i2), 100
;Removed MAX3 06/18/96	    set-sub DPOther = $(DPOther), $(tem)
;Removed MAX3 06/18/96	  endif
	  set-div i2 = $(DPOther1), 100         ;Added MAX3 06/18/96
	  ifint $(i1) == $(i2)                  ;Added MAX3 06/18/96
	      shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL "This interrupt setting is in conflict with the other DCA SDLC board."    ;Added MAX3 06/18/96
	      ui pop 1                          ;Added MAX3 06/18/96
	      goto RefreshDlg                   ;Added MAX3 06/18/96
	  endif                                 ;Added MAX3 06/18/96
          set-mul tem      = $(i2), 100         ;Added MAX3 06/18/96
          set-sub DPOther1 = $(DPOther1), $(tem);Added MAX3 06/18/96
                                                ;Added MAX3 06/18/96
	  set-div i2 = $(DPOther2), 100         ;Added MAX3 06/18/96
	  ifint $(i1) == $(i2)                  ;Added MAX3 06/18/96
	      shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL "This interrupt setting is in conflict with the other DCA SDLC board."    ;Added MAX3 06/18/96
	      ui pop 1                          ;Added MAX3 06/18/96
	      goto RefreshDlg                   ;Added MAX3 06/18/96
	  endif                                 ;Added MAX3 06/18/96
          set-mul tem      = $(i2), 100         ;Added MAX3 06/18/96
          set-sub DPOther2 = $(DPOther2), $(tem);Added MAX3 06/18/96
                                                ;Added MAX3 06/18/96
	  set-mul tem      = $(i1), 100         ;Added MAX3 06/18/96
	  set-sub DPThis   = $(DPThis),  $(tem) ;Added MAX3 06/18/96




	  ;
	  ; Check the I/O address
	  ;
	  set-div i1 = $(DPThis),  10
;Removed MAX3 06/18/96	  set-div i2 = $(DPOther), 10
;Removed MAX3 06/18/96	  ifint $(i1) == $(i2)
;Removed MAX3 06/18/96	    shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL "This I/O address setting is in conflict with the other DCA SDLC board.";Added MAX3 06/18/96
;Removed MAX3 06/18/96	    ui pop 1
;Removed MAX3 06/18/96	    goto RefreshDlg
;Removed MAX3 06/18/96	  else
;Removed MAX3 06/18/96	    set-mul tem     = $(i1), 10
;Removed MAX3 06/18/96	    set-sub DPThis  = $(DPThis),  $(tem)
;Removed MAX3 06/18/96	    set-mul tem     = $(i2), 10
;Removed MAX3 06/18/96	    set-sub DPOther = $(DPOther), $(tem)
;Removed MAX3 06/18/96	  endif
	  set-div i2 = $(DPOther1), 10          ;Added MAX3 06/18/96
	  ifint $(i1) == $(i2)                  ;Added MAX3 06/18/96
	      shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL "This I/O address setting is in conflict with the other DCA SDLC board.";Added MAX3 06/18/96
	      ui pop 1                          ;Added MAX3 06/18/96
	      goto RefreshDlg                   ;Added MAX3 06/18/96
	  endif                                 ;Added MAX3 06/18/96
          set-mul tem      = $(i2), 10          ;Added MAX3 06/18/96
          set-sub DPOther1 = $(DPOther1), $(tem);Added MAX3 06/18/96
                                                ;Added MAX3 06/18/96
	  set-div i2 = $(DPOther2), 10          ;Added MAX3 06/18/96
	  ifint $(i1) == $(i2)                  ;Added MAX3 06/18/96
	      shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL "This I/O address setting is in conflict with the other DCA SDLC board.";Added MAX3 06/18/96
	      ui pop 1                          ;Added MAX3 06/18/96
	      goto RefreshDlg                   ;Added MAX3 06/18/96
	  endif                                 ;Added MAX3 06/18/96
          set-mul tem      = $(i2), 10          ;Added MAX3 06/18/96
          set-sub DPOther2 = $(DPOther2), $(tem);Added MAX3 06/18/96
                                                ;Added MAX3 06/18/96
	  set-mul tem      = $(i1), 10          ;Added MAX3 06/18/96
	  set-sub DPThis   = $(DPThis),  $(tem) ;Added MAX3 06/18/96

	  
	  ;
	  ; Check the DMA
	  ;
	  set-div i1 = $(DPThis),  1
;Removed MAX3 06/18/96	  set-div i2 = $(DPOther), 1
;Removed MAX3 06/18/96 	  ifint $(i1) == $(i2)
;Removed MAX3 06/18/96	    ifint $(i1) > 0
;Removed MAX3 06/18/96              shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL "This DMA channel setting is in conflict with the other DCA SDLC board.";Added MAX3 06/18/96
;Removed MAX3 06/18/96	      ui pop 1
;Removed MAX3 06/18/96	      goto RefreshDlg
;Removed MAX3 06/18/96	    endif
;Removed MAX3 06/18/96	  endif

	  set-div i2 = $(DPOther1), 1           ;Added MAX3 06/18/96
	  ifint $(i1) == $(i2)                  ;Added MAX3 06/18/96
            ifint $(i1) > 0                     ;Added MAX3 06/18/96
	      shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL "This DMA channel setting is in conflict with the other DCA SDLC board.";Added MAX3 06/18/96
	      ui pop 1                          ;Added MAX3 06/18/96
	      goto RefreshDlg                   ;Added MAX3 06/18/96
            endif
	  endif                                 ;Added MAX3 06/18/96
                                                ;Added MAX3 06/18/96
	  set-div i2 = $(DPOther2), 1           ;Added MAX3 06/18/96
	  ifint $(i1) == $(i2)                  ;Added MAX3 06/18/96
            ifint $(i1) > 0                     ;Added MAX3 06/18/96
	      shell $(!SubroutineInf) SetupMessage $(!STF_LANGUAGE) NONFATAL "This DMA channel setting is in conflict with the other DCA SDLC board.";Added MAX3 06/18/96
	      ui pop 1                          ;Added MAX3 06/18/96
	      goto RefreshDlg                   ;Added MAX3 06/18/96
            endif
	  endif                                 ;Added MAX3 06/18/96


	  set LineType     = *( {0,2,1,1}, *( $(RadioOut), 1 ) )
	  ifstr(i) *( $(RadioOut), 1 ) == "4"
	    set FRadio4 = $(!True)
	  else
	    set FRadio4 = $(!False)
	  endif

	  ifstr(i) *( $(CheckItemsOut), 1 ) == "OFF"
	    set Carrier = 0
	  else
	    set Carrier = 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

	  ifstr(i) $(DriverIndex) != $(SvDriverIndex)
	    set Changes = 1
	  endif

	  ifstr(i) $(LineType) != $(SvLineType)
	    set Changes = 1
	  endif

	  ifstr(i) $(Carrier) != $(SvCarrier)
	    set Changes = 1
	  endif

	  ifstr(i) $(FRadio4) != $(SvFRadio4)
	    set Changes = 1
	  endif

	  set Status = STATUS_SUCCESSFUL

	  ;
	  ; 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) $(ServiceName) == $(DCASYNCls3) ;Added MAX3 06/18/96
            SetRegValue $(KeyDriver) { "DCAISCAConfigData3", $(NoTitle), $(!REG_VT_DWORD), $(DriverParams) };Added MAX3 06/18/96
	    goto ConfigLS090                       ;Added MAX3 06/18/96
	  endif                                    ;Added MAX3 06/18/96

	  ifstr(i) $(DCASYNCls1) == ""
            SetRegValue $(KeyDriver) { "DCAISCAConfigData1", $(NoTitle), $(!REG_VT_DWORD), $(DriverParams) }
            SetRegValue $(KeyDriver) { "Data1LS", 	     $(NoTitle), $(!REG_VT_SZ),    $(ServiceName)  }
	    goto ConfigLS090
          endif                         ;Added MAX3 06/18/96
	  ifstr(i) $(DCASYNCls2) == ""  ;Added MAX3 06/18/96
	  ;Removed MAX3 06/18/96 else
            SetRegValue $(KeyDriver) { "DCAISCAConfigData2", $(NoTitle), $(!REG_VT_DWORD), $(DriverParams) }
            SetRegValue $(KeyDriver) { "Data2LS", 	     $(NoTitle), $(!REG_VT_SZ),    $(ServiceName)  }
	    goto ConfigLS090
	  endif
	  ifstr(i) $(DCASYNCls3) == ""             ;Added MAX3 06/18/96
            SetRegValue $(KeyDriver) { "DCAISCAConfigData3", $(NoTitle), $(!REG_VT_DWORD), $(DriverParams) };Added MAX3 06/18/96
            SetRegValue $(KeyDriver) { "Data3LS", 	     $(NoTitle), $(!REG_VT_SZ),    $(ServiceName)  };Added MAX3 06/18/96
	    goto ConfigLS090                       ;Added MAX3 06/18/96
          endif                                    ;Added MAX3 06/18/96


ConfigLS090 =+

	  CloseRegKey $(KeyDriver)
	endif

	ui pop 1

	Return $(Status), $(Changes), $(ServiceTitle), +
	       $(DriverIndex), $(LineType), $(Carrier), $(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 support 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) {} $(Changes)

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

;************************************************************************
;************************************************************************
;                   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_DCASDLCLS
    ;
    ;++++++++++++++++++++++++++++++++++++
    set_defaults_DCASDLCLS = +
	set ServiceName   = $(Option)
	set ServiceTitle  = $(ProductTitle)
	set ServiceDesc   = $(ProductDesc)
	set DriverIndex   = "03" ; DCA SDLC 1
	set LineType      = "0" ; Leased
	set Carrier       = "0" ; Not constant
	set Radio4Flag    = "0" ; Manual dial type
	goto finish_defaults

    ;++++++++++++++++++++++++++++++++++++
    ;
    ; set_defaults_DCASDLCDD
    ;
    ;++++++++++++++++++++++++++++++++++++
    set_defaults_DCASDLCDD = +
	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_DCASDLCLS:
		;
		;++++++++++++++++++++++++++++++++++++
		assign_value_DCASDLCLS = +
			
			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) == "LineType"
				set LineType = $(ValueData)
			else-ifstr(i) $(ValueName) == "Carrier"
				set Carrier = $(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_DCASDLCDD:
		;
		;++++++++++++++++++++++++++++++++++++
		assign_value_DCASDLCDD = +
			goto finish_assign_value

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

	goto assign_extra_$(Option)

	;++++++++++++++++++++++++++++++++++++
	;
	; assign_extra_DCASDLCLS:
	;
	;++++++++++++++++++++++++++++++++++++
	assign_extra_DCASDLCLS = +
		goto finish_assign_extra
	
	;++++++++++++++++++++++++++++++++++++
	;
	; assign_extra_DCASDLCDD:
	;
	;++++++++++++++++++++++++++++++++++++
	assign_extra_DCASDLCDD = +
		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_DCASDLCLS:
	;
	;++++++++++++++++++++++++++++++++++++
	modify_params_DCASDLCLS = +

		shell "" DoSDLCLSConfig $(ServiceName), +
					$(ServiceTitle), +
					$(DriverIndex), +
					$(LineType), +
					$(Carrier), +
					$(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 LineType	  = $($R4)
			set Carrier	  = $($R5)
			set Radio4Flag	  = $($R6)
			set DriverNumber  = $(DriverIndex)
			set DeviceName    = "DCADL$"$(DriverIndex)
		endif
		
		goto finish_modify_params

	;++++++++++++++++++++++++++++++++++++
	;
	; modify_params_DCASDLCDD:
	;
	;++++++++++++++++++++++++++++++++++++
	modify_params_DCASDLCDD = +
		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_DCASDLCLS:
	;
	;++++++++++++++++++++++++++++++++++++
	write_params_DCASDLCLS = +
		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) }, +
			{ LineType    , $(NoTitle), $(!REG_VT_DWORD), $(LineType) }, +
			{ Carrier     , $(NoTitle), $(!REG_VT_DWORD), $(Carrier)  }, +
			{ Radio4Flag  , $(NoTitle), $(!REG_VT_DWORD), $(RadioVal) }  +
			}

		goto finish_write_params

	;++++++++++++++++++++++++++++++++++++
	;
	; write_params_DCASDLCDD:
	;
	;++++++++++++++++++++++++++++++++++++
	write_params_DCASDLCDD = +
		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_DCASDLCLS:
	;
	;++++++++++++++++++++++++++++++++++++
	getbind_DCASDLCLS = +
		set RetData = { {"01", "DCASDLCDD", "", "", "getbindings"} }
		goto finish_getbind_component

	;++++++++++++++++++++++++++++++++++++
	;
	; getbind_DCASDLCDD:
	;
	;++++++++++++++++++++++++++++++++++++
	getbind_DCASDLCDD = +
		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) == "DCASDLCDD"
			set PN = #( FileConstantsDCASDLCLS, ProductName, 1)
			set PV = #( FileConstantsDCASDLCLS, ProductVersion, 1)
			shell $(!UtilityInf) FindSNAProductServices $(ProductRegBase) +
								   $(PN)"_"$(PV)
			set _Status = $($R0)
			set _List   = $($R1)

			ifstr(i) $(_List) != {}
				goto successful
			endif
			shell $(!UtilityInf) FindSNAProductServices $(ProductRegBase) +
								   "DCAX25LS_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) == "DCASDLCDD"
	  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  ; DCASDLCDD

	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
	  GetRegValue $(KeyDriver) "Data3LS" DCASYNCls3;Added MAX3 06/18/96
	  set DCASYNCls1  = *( $(DCASYNCls1),  4 )
	  set DCASYNCls2  = *( $(DCASYNCls2),  4 )
	  set DCASYNCls3  = *( $(DCASYNCls3),  4 )     ;Added MAX3 06/18/96

	  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
	  ifstr(i) $(RemoveName) == $(DCASYNCls3)                                               ;Added MAX3 06/18/96
            SetRegValue $(KeyDriver) { "DCAISCAConfigData3", $(NoTitle), $(!REG_VT_DWORD), 0  } ;Added MAX3 06/18/96
            SetRegValue $(KeyDriver) { "Data3LS", 	     $(NoTitle), $(!REG_VT_SZ),    "" } ;Added MAX3 06/18/96
	  endif                                                                                 ;Added MAX3 06/18/96


	  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), "DCASYNC"
;	  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)"dcasdlc\"$(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:
;     hwsetup - 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_DCASDLCLS]
1,	dcasdlc.inf
1,	dcasdlc.hlp
1,	dcasdlc.srl
1,      dcautl.dll

[FilesFor_system_DCASDLCLS]
;;rmh002 1,	dcasdlc.dll

[FilesFor_hwsetup_DCASDLCDD]

[FilesFor_system_DCASDLCDD]
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: web1, load: 0.62