;-----------------------------------------------------------------------
; OPTION TYPE
; -----------
; This identifies the Option type we are dealing with.  The different
; possible types are:
;
; COMPUTER, VIDEO, POINTER, KEYBOARD, LAYOUT, SCSI, TAPE, PRINTER, ...
;-----------------------------------------------------------------------

[Identification]
        OptionType = SCSI

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

[LanguagesSupported]
        ENG


;-----------------------------------------------------------------------
; OPTION LIST
; -----------
; This section lists the Option key names.  These keys are locale
; independent and used to represent the option in a locale independent
; manner.
;
;-----------------------------------------------------------------------

[Options]
        "SISIDEDV"   = sisidedv

;-----------------------------------------------------------------------
; OPTION TEXT SECTION
; -------------------
; These are text strings used to identify the option to the user.  There
; are separate sections for each language supported.  The format of the
; section name is "OptionsText" concatenated with the Language represented
; by the section.
;
;-----------------------------------------------------------------------

[OptionsTextENG]
        "SISIDEDV"    = "SiS PCI MASTER IDE Miniport DRIVER"


;-----------------------------------------------------------------------------------------
; SCSI MINIPORT DRIVERS:
;
; Order of the information:
;
; Class driver = Type, Group, ErrorControl, Tag, EventMessageFile, TypesSupported
;
;-----------------------------------------------------------------------------------------

[MiniportDrivers]
        sisidedv  = !SERVICE_KERNEL_DRIVER, "SCSI Miniport", !SERVICE_ERROR_NORMAL,  1, %SystemRoot%\System32\IoLogMsg.dll , 7

[Shell]
        shell  "subroutn.inf" SetupMessage $(!STF LANGUAGE) STATUS+
                "IDE Driver Version 1.30"

;---------------------------------------------------------------------------
; 1. 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)



;------------------------------------------------------------------------
; 2. 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

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

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

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


;
; 3. InstallOption:
;
; FUNCTION:  To copy files representing Options
;            To configure the installed option
;            To update the registry for the installed option
;
; INPUT:     $($0):  Language to use
;            $($1):  OptionID to install
;            $($2):  SourceDirectory
;            $($3):  AddCopy  (YES | NO)
;            $($4):  DoCopy   (YES | NO)
;            $($5):  DoConfig (YES | NO)
;
; OUTPUT:    $($R0): STATUS: STATUS_SUCCESSFUL |
;                            STATUS_NOLANGUAGE |
;                            STATUS_USERCANCEL |
;                            STATUS_FAILED
;

[InstallOption]

        ;
        ; Set default values for
        ;
        set Status = STATUS_FAILED
        set DrivesToFree = {}

        ;
        ; extract parameters
        ;
        set Option   = $($1)
        set SrcDir   = $($2)
        set AddCopy  = $($3)
        set DoCopy   = $($4)
        set DoConfig = $($5)

        ;
        ; Check if the language requested is supported
        ;
        set LanguageList = ^(LanguagesSupported, 1)
        Ifcontains(i) $($0) in $(LanguageList)
        else
                set Status = STATUS_NOLANGUAGE
                goto finish_InstallOption
        endif
        read-syms Strings$($0)

        ;
        ; check to see if Option is supported.
        ;

        set OptionList = ^(Options, 0)
        ifcontains $(Option) in $(OptionList)
        else
                Debug-Output "SCSI.INF: SCSI option is not supported."
                goto finish_InstallOption
        endif
        set OptionList = ""

        ;
        ; Option has been defined already
        ;

        set MiniportDriver   =   #(Options,         $(Option),         1)
        set Type             = $(#(MiniportDrivers, $(MiniportDriver), 1))
        set Group            =   #(MiniportDrivers, $(MiniportDriver), 2)
        set ErrorControl     = $(#(MiniportDrivers, $(MiniportDriver), 3))
        set Tag              =   #(MiniportDrivers, $(MiniportDriver), 4)
        set EventMessageFile =   #(MiniportDrivers, $(MiniportDriver), 5)
        set TypesSupported   =   #(MiniportDrivers, $(MiniportDriver), 6)

        set Start            =   $(!SERVICE_BOOT_START)

installtheoption = +

        ;
        ; Code to add files to copy list
        ;

        ifstr(i) $(AddCopy) == "YES"
                set DoActualCopy = NO

                ; 
                ; Get Windows NT version
                ;

                set KeyName = "Software\Microsoft\Windows NT\CurrentVersion"
                OpenRegKey $(!REG_H_LOCAL) "" $(KeyName) $(!REG_KEY_READ) KeyHandle
                GetRegValue $(KeyHandle) "CurrentVersion" NtCurVer

                ifstr(i) *($(NtCurVer),4) != "4.0"
                    set FileToCheck = #(Files35-ScsiMiniportDrivers, $(MiniportDriver), 2)
                else
                    set FileToCheck = #(Files40-ScsiMiniportDrivers, $(MiniportDriver), 2)
                endif

                LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(!STF_WINDOWSSYSPATH)"\drivers\"$(FileToCheck)
                ifstr(i) $(STATUS) == NO
                        set DoActualCopy = YES
                endif

                ifstr(i) $(DoActualCopy) == NO
                        shell "subroutn.inf" DriversExist $($0) $(String1)
                        ifint $($ShellCode) != $(!SHELL_CODE_OK)
                                Debug-Output "SCSI.INF: shelling DriversExist failed"
                                goto finish_InstallOption
                        endif

                        ifstr(i) $($R0) == STATUS_CURRENT
                        else-ifstr(i) $($R0) == STATUS_NEW
                                set DoActualCopy = YES
                        else-ifstr(i) $($R0) == STATUS_USERCANCEL
                                Debug-Output "SCSI.INF: User cancelled SCSI installation"
                                goto finish_InstallOption
                        else
                                Debug-Output "SCSI.INF: Error reported in DriversExist routine in SUBROUTN.INF"
                                goto finish_InstallOption
                        endif
                endif

                ifstr(i) $(DoActualCopy) == YES

                        shell "subroutn.inf" DoAskSourceEx $(SrcDir) $(String2)
                        ifint $($ShellCode) != $(!SHELL_CODE_OK)
                                Debug-Output "SCSI.INF: shelling DoAskSourceEx failed"
                                goto finish_InstallOption
                        endif

                        ifstr(i) $($R0) == STATUS_SUCCESSFUL
                                set SrcDir = $($R1)
                                ifstr(i) $($R2) != ""
                                        set DrivesToFree = >($(DrivesToFree), $($R2))
                                endif
                        else
                                Debug-Output "SCSI.INF: User cancelled asking source."
                                goto finish_InstallOption
                        endif

                        install Install-AddCopyOption
                        ifstr(i) $(STF_INSTALL_OUTCOME) != "STF_SUCCESS"
                                Debug-Output "Adding SCSI files to copy list failed"
                                goto finish_InstallOption
                        endif
                else
                        set DoCopy = NO
                endif

        endif

        ifstr(i) $(DoCopy) == "YES"
                read-syms ProgressCopy$($0)
                install Install-DoCopyOption
                ifstr(i) $(STF_INSTALL_OUTCOME) == "STF_FAILURE"
                        Debug-Output "Copying files failed"
                        goto finish_InstallOption
                else-ifstr(i) $(STF_INSTALL_OUTCOME) == "STF_USERQUIT"
                        set Status = STATUS_USERCANCEL
                        goto finish_InstallOption
                endif
        endif

        ifstr(i) $(DoConfig) == "YES"
                ;
                ; first run a privilege check on modifying the setup node
                ;

                shell "registry.inf" CheckSetupModify
                ifint $($ShellCode) != $(!SHELL_CODE_OK)
                        goto finish_InstallOption
                endif

                ifstr(i) $($R0) != STATUS_SUCCESSFUL
                        goto finish_InstallOption
                endif

                ;
                ; then make a new SCSI entry, the entry is created automatically
                ; enabled
                ;

                set ServiceNode   = $(MiniportDriver)

                ifstr(i) *($(NtCurVer),4) != "4.0"     
                   set ServiceBinary = System32\drivers\#(Files35-ScsiMiniportDrivers, $(MiniportDriver), 2)
                else
                   set ServiceBinary = System32\drivers\#(Files40-ScsiMiniportDrivers, $(MiniportDriver), 2)
                endif

                set ServicesValues   = { +
                                {Type,           0, $(!REG_VT_DWORD),     $(Type)                  }, +
                                {Start,          0, $(!REG_VT_DWORD),     $(Start)                 }, +
                                {Group,          0, $(!REG_VT_SZ),        $(Group)                 }, +
                                {ErrorControl,   0, $(!REG_VT_DWORD),     $(ErrorControl)          }, +
                                {Tag,            0, $(!REG_VT_DWORD),     $(Tag)                   }, +
                                {BinaryPathName, 0, $(!REG_VT_EXPAND_SZ), $(ServiceBinary)         }  +
                                }
                set ParametersValues = ""
                set DeviceValues     = {}
                set EventLogValues   = { +
                                {EventMessageFile, 0, $(!REG_VT_EXPAND_SZ), $(EventMessageFile) }, +
                                {TypesSupported,   0, $(!REG_VT_DWORD),     $(TypesSupported)   }  +
                                }

                shell "registry.inf"  MakeServicesEntry $(ServiceNode)      +
                                                                                                $(ServicesValues)   +
                                                                                                $(ParametersValues) +
                                                                                                $(DeviceValues)     +
                                                                                                $(EventLogValues)   +
                                                                                                Parameters



                ifint $($ShellCode) != $(!SHELL_CODE_OK)
                        Debug-Output "Couldn't execute MakeServicesEntry in registry.inf"
                        goto finish_InstallOption
                endif

                ifstr(i) $($R0) != STATUS_SUCCESSFUL
                        Debug-Output "MakeServicesEntry failed for SCSI"
                        goto finish_InstallOption
                endif

        endif

        set Status = STATUS_SUCCESSFUL

; Turn off Atdisk and Atapi Driver

        shell "registry.inf" RemoveServicesEntry "Atdisk"
        shell "registry.inf" RemoveServicesEntry "Atapi"
;       shell "registry.inf" RemoveServicesEntry "siside"

        ifstr(i) *($(NtCurVer),4) != "4.0"
              shell "registry.inf" ModifyServicesEntry "Scsidisk" + $(!SERVICE_BOOT_START)
        endif
        CloseRegKey $(KeyHandle)


    endif


    set Status = STATUS_SUCCESSFUL

finish_InstallOption = +
        ForListDo $(DrivesToFree)
                LibraryProcedure STATUS,$(!LIBHANDLE), DeleteNetConnection $($) "TRUE"
        EndForListDo

        Return $(Status)


[Install-AddCopyOption]

        ;
        ; Add the files to the copy list
        ;


        set KeyName = "Software\Microsoft\Windows NT\CurrentVersion"
        OpenRegKey $(!REG_H_LOCAL) "" $(KeyName) $(!REG_KEY_READ) KeyHandle
        GetRegValue $(KeyHandle) "CurrentVersion" NtCurVer

        ifstr(i) *($(NtCurVer),4) != "4.0"

           AddSectionKeyFileToCopyList   Files35-ScsiMiniportDrivers         +
                                                                  $(MiniportDriver)                 +
                                                                  $(SrcDir)                      +
                                                                  $(!STF_WINDOWSSYSPATH)\drivers
        else

           AddSectionKeyFileToCopyList   Files40-ScsiMiniportDrivers         +
                                                                  $(MiniportDriver)                 +
                                                                  $(SrcDir)                      +
                                                                  $(!STF_WINDOWSSYSPATH)\drivers

        endif
        exit


[Install-DoCopyOption]

        ;
        ; Copy files in the copy list
        ;
        CopyFilesInCopyList
        exit

;-------------------------------------------------------------------------
; 4. DeInstallOption:
;
; FUNCTION:  To remove files representing Option
;            To remove the registry entry corresponding to the Option
;
; INPUT:     $($0):  Language to use
;            $($1):  OptionID to install
;
; OUTPUT:    $($R0): STATUS: STATUS_SUCCESSFUL |
;                            STATUS_NOLANGUAGE |
;                            STATUS_USERCANCEL |
;                            STATUS_FAILED
;-------------------------------------------------------------------------
[DeInstallOption]
        ;
        ; Set default values for
        ;
        set Status   = STATUS_FAILED
        ;
        ; extract parameters
        ;
        set Option   = $($1)

        ;
        ; Check if the language requested is supported
        ;
        set LanguageList = ^(LanguagesSupported, 1)
        Ifcontains(i) $($0) in $(LanguageList)
        else
                set Status = STATUS_NOLANGUAGE
                goto finish_DeInstallOption
        endif
        read-syms Strings$($0)

        ;
        ; check to see if Option is supported.
        ;

        set OptionList = ^(Options, 0)
        ifcontains $(Option) in $(OptionList)
        else
                goto finish_DeInstallOption
        endif
        set OptionList = ""

        ;
        ; fetch details about option
        ;

        set MiniportDriver = #(Options, $(Option), 1)

        set KeyName = "Software\Microsoft\Windows NT\CurrentVersion"
        OpenRegKey $(!REG_H_LOCAL) "" $(KeyName) $(!REG_KEY_READ) KeyHandle
        GetRegValue $(KeyHandle) "CurrentVersion" NtCurVer

        ifstr(i) *($(NtCurVer),4) != "4.0"
            set MiniportFile   = #(Files35-ScsiMiniportDrivers, $(MiniportDriver), 2)
        else
            set MiniportFile   = #(Files40-ScsiMiniportDrivers, $(MiniportDriver), 2)
        endif

        set FilePath       = $(!STF_WINDOWSSYSPATH)"\drivers\"$(MiniportFile)

        ;
        ; check to see if file is installed
        ; if not give success
        ;

        LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(FilePath)
        ifstr(i) $(STATUS) == "NO"
                set Status = STATUS_SUCCESSFUL
                goto finish_DeInstallOption
        endif

        shell "registry.inf" GetServicesEntryStart $(MiniportDriver)
        ifstr(i) $($R0) != "STATUS_SUCCESSFUL"
                ; this could happen if there is no start value or there is no
                ; key, in which case the option is not installed
                set Status = STATUS_SUCCESSFUL
                goto finish_DeInstallOption
        endif

        ifstr(i) $($R1) == $(!SERVICE_BOOT_START)
                shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) "WARNING" $(String3)
                ifstr(i) $($R0) != STATUS_SUCCESSFUL
                        goto do_removal
                endif
                ifstr(i) $($R1) == "CANCEL"
                        goto finish_DeInstallOption
                endif
        endif

do_removal =+
        ;
        ; disable the registry entry
        ;

        shell "registry.inf" ModifyServicesEntry "Atdisk" +
              $(!SERVICE_BOOT_START)

        shell "registry.inf" RemoveServicesEntry $(MiniportDriver)
        ifint $($ShellCode) != $(!SHELL_CODE_OK)
                Debug-Output "SCSI.INF: Failed to shell RemoveServicesEntry"
                goto finish_DeInstallOption
        endif

        ifstr(i) $($R0) != STATUS_SUCCESSFUL
                Debug-Output "SCSI.INF: Failed to disable services entry"
                goto finish_DeInstallOption
        endif

        ;
        ; we won't remove the file because we can only do so during the next boot.
        ; if the user chooses to reinstall the same driver during this boot
        ; he will still end up deleting the driver on next boot. if the file
        ; should be deleted a warning should be put up saying that the user should
        ; not try to reinstall the driver during this boot
        ;
        ;    AddFileToDeleteList $(FilePath)

        set Status = STATUS_SUCCESSFUL

finish_DeInstallOption =+
        return $(Status)


;-------------------------------------------------------------------------
; . GetInstalledOptions:
;
; FUNCTION:  To find out the list of options which are installed
;
; INPUT:     $($0): Language to Use
;
; OUTPUT:    $($R0): STATUS: STATUS_SUCCESSFUL |
;                            STATUS_FAILED
;
;            $($R1): List of options installed
;            $($R2): Option installed Text List
;-------------------------------------------------------------------------
[GetInstalledOptions]
        set Status = STATUS_FAILED
        set InstalledOptions = {}
        set InstalledOptionsText = {}

        ;
        ; Check if the language requested is supported
        ;
        set LanguageList = ^(LanguagesSupported, 1)
        Ifcontains(i) $($0) in $(LanguageList)
        else
                set Status = STATUS_NOLANGUAGE
                goto finish_GetInstalledOptions
        endif

        set OptionList = ^(Options, 0)
        ForListDo $(OptionList)
                set MiniportDriver = #(Options, $($), 1)

                set KeyName = "Software\Microsoft\Windows NT\CurrentVersion"
                OpenRegKey $(!REG_H_LOCAL) "" $(KeyName) $(!REG_KEY_READ) KeyHandle
                GetRegValue $(KeyHandle) "CurrentVersion" NtCurVer

                ifstr(i) *($(NtCurVer),4) != "4.0"
                  set MiniportFile   = #(Files35-ScsiMiniportDrivers, $(MiniportDriver), 2)
                else
                  set MiniportFile   = #(Files40-ScsiMiniportDrivers, $(MiniportDriver), 2)
                endif
                set FilePath       = $(!STF_WINDOWSSYSPATH)"\drivers\"$(MiniportFile)
                LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(FilePath)
                ifstr(i) $(STATUS) == "YES"
                        shell "registry.inf" GetServicesEntryStart $(MiniportDriver)
                        ifint $($ShellCode) == $(!SHELL_CODE_OK)
                                ifstr(i) $($R0) == STATUS_SUCCESSFUL
                                        ifstr(i) $($R1) != $(!SERVICE_DISABLED)

                                                set OptionText = #(OptionsText$($0), $($), 1)
                                                set InstalledOptions     = >($(InstalledOptions), $($))
                                                set InstalledOptionsText = >($(InstalledOptionsText), $(OptionText))

                                        endif
                                endif
                        endif
                endif
        EndForListDo
        set Status = STATUS_SUCCESSFUL
finish_GetInstalledOptions =+
        Return $(Status) $(InstalledOptions) $(InstalledOptionsText)


;**************************************************************************
; PROGRESS GUAGE VARIABLES
;**************************************************************************

[ProgressCopyENG]
        ProCaption   = "Windows NT Setup"
        ProCancel    = "Cancel"
        ProCancelMsg = "Windows NT is not correcly installed.  Are you sure you want "+
                                   "to cancel copying files?"
        ProCancelCap = "Setup Message"
        ProText1     = "Copying:"
        ProText2     = "To:"

[StringsENG]
        String1 = "SCSI Adapter"
        String2 = "Please enter the full path to the OEM SCSI "+
                          "Adapter files.  Then choose Continue."
        String3 = "The SCSI Adapter has been marked as a boot device.  Removing "+
                          "it may cause the system not to boot."$(!LF)$(!LF)"Are you sure "+
                          "you want to remove the Adapter."

[Source Media Descriptions]
        1  = "SiS MASTER IDE Miniport DRIVERS"  , TAGFILE = sistag

[Files35-ScsiMiniportDrivers]
        sisidedv = 1,siside3x.sys , SIZE=999

[Files40-ScsiMiniportDrivers] 
        sisidedv = 1,siside40.sys , SIZE=999
