;
; KEYED SECTIONS.  These sections are provided for files where a selection
; is made from a set of files and the chosen one is copied under a generic
; name.  This can be used to update the hal.dll, ntoskrnl.exe, ntbootdd.sys,
; ntdetect.com.
;


[FileKeyedClasses]
    Hal            = hal.dll
    Ntoskrnl       = ntoskrnl.exe
    Ntdetect       = ntdetect.com

[FilesKeyedSections]
    FilesHal       = $(STF_HALDEST)
    FilesNtoskrnl  = $(STF_WINDOWSSYSPATH)
    FilesNtdetect  = $(STF_OSLDEST)

[FilesHal]
    HAL      = 1, HAL.DLL      , RENAME=$(NEWFILE)
    HAL486C  = 1, HAL486C.DLL  , RENAME=$(NEWFILE)
    HALAST   = 1, HALAST.DLL   , RENAME=$(NEWFILE)
    HALCBUS  = 1, HALCBUS.DLL  , RENAME=$(NEWFILE)
    HALMCA   = 1, HALMCA.DLL   , RENAME=$(NEWFILE)
    HALNCR   = 1, HALNCR.DLL   , RENAME=$(NEWFILE)
    HALOLI   = 1, HALOLI.DLL   , RENAME=$(NEWFILE)
    HALSP    = 1, HALSP.DLL    , RENAME=$(NEWFILE)
    HALWYSE7 = 1, HALWYSE7.DLL , RENAME=$(NEWFILE)

[FilesNtoskrnl]
    NTKRNLMP = 1, NTKRNLMP.EXE , RENAME=$(NEWFILE)
    NTOSKRNL = 1, NTOSKRNL.EXE , RENAME=$(NEWFILE)

[FilesNtdetect]
    NTDETECT = 1, NTDETECT.COM , RENAME=$(NEWFILE)

[FileSections]
    FilesPrimary        = C:
    FilesOsLoader       = $(STF_OSLDEST)
    FilesPal            = $(STF_HALDEST)
    FilesWinnt          = $(STF_WINDOWSPATH)
    FilesSystem32       = $(STF_WINDOWSSYSPATH)
    FilesOs2Dll         = $(STF_WINDOWSSYSPATH)\os2\dll
    FilesSystem         = $(STF_WINDOWSPATH)\system
    FilesDrivers        = $(STF_WINDOWSSYSPATH)\drivers
    FilesConfig         = $(STF_WINDOWSSYSPATH)\config
    FilesWinspool       = $(STF_WINDOWSSYSPATH)\spool
    FilesPrnDriver      = $(STF_WINDOWSSYSPATH)\spool\drivers\$(!STF_PRNPLATFORM)
    FilesPrnProc        = $(STF_WINDOWSSYSPATH)\spool\prtprocs\$(!STF_PRNPLATFORM)
    FilesDbgCom         = $(STF_WINDOWSPATH)\symbols\com
    FilesDbgCpl         = $(STF_WINDOWSPATH)\symbols\cpl
    FilesDbgDll         = $(STF_WINDOWSPATH)\symbols\dll
    FilesDbgDrv         = $(STF_WINDOWSPATH)\symbols\drv
    FilesDbgExe         = $(STF_WINDOWSPATH)\symbols\exe
    FilesDbgScr         = $(STF_WINDOWSPATH)\symbols\scr
    FilesDbgSys         = $(STF_WINDOWSPATH)\symbols\sys


[FileSectionsCopyAlways]
    FilesSystem32CopyAlways = $(STF_WINDOWSSYSPATH)
    FilesOs2DllCopyAlways   = $(STF_WINDOWSSYSPATH)\os2\dll
    FilesDriversCopyAlways  = $(STF_WINDOWSSYSPATH)\drivers

;
; product specific sections
;

[FileSectionsWINNT]
    FilesInfWinnt       = $(STF_WINDOWSSYSPATH)

[FileSectionsLANMANNT]
    FilesInfLanmanNT    = $(STF_WINDOWSSYSPATH)

;
; FilesPrimary only covers ntldr.  For ntbootddd, a keyed section needs to
; be created.  Only relevant for x86.
;
[FilesPrimary]
1 = 1, NTLDR	     , RENAME=$(NEWFILE)

[FilesOsLoader]

[FilesPal]

[FilesWinnt]

[FilesSystem32]
1 = 1, ACLCONV.EXE , RENAME=$(NEWFILE)
2 = 1, ALRSVC.DLL  , RENAME=$(NEWFILE)
3 = 1, ATI.DLL     , RENAME=$(NEWFILE)
4 = 1, ATSVC.EXE   , RENAME=$(NEWFILE)
5 = 1, AUTOCHK.EXE , RENAME=$(NEWFILE)
6 = 1, AUTOCONV.EXE, RENAME=$(NEWFILE)
7 = 1, BASESRV.DLL , RENAME=$(NEWFILE)
8 = 1, BROWSER.DLL , RENAME=$(NEWFILE)
9 = 1, CLIPBRD.EXE , RENAME=$(NEWFILE)
10 = 1, COMDLG32.DLL, RENAME=$(NEWFILE)
11 = 1, CSRSRV.DLL  , RENAME=$(NEWFILE)
12 = 1, DEMIL32.DLL , RENAME=$(NEWFILE)
13 = 1, DGCONFIG.DLL, RENAME=$(NEWFILE)
14 = 1, DLCAPI.DLL  , RENAME=$(NEWFILE)
15 = 1, DOSX.EXE    , RENAME=$(NEWFILE)
16 = 1, DRIVERS.DLL , RENAME=$(NEWFILE)
17 = 1, DRWTSN32.EXE, RENAME=$(NEWFILE)
18 = 1, EVENTLOG.EXE, RENAME=$(NEWFILE)
19 = 1, EVENTVWR.EXE, RENAME=$(NEWFILE)
20 = 1, FRAMEBUF.DLL, RENAME=$(NEWFILE)
21 = 1, FTPSVC.EXE  , RENAME=$(NEWFILE)
22 = 1, GDI.EXE     , RENAME=$(NEWFILE)
23 = 1, GDI32.DLL   , RENAME=$(NEWFILE)
24 = 1, HPMON.DLL   , RENAME=$(NEWFILE)
25 = 1, IFSUTIL.DLL , RENAME=$(NEWFILE)
26 = 1, IPXROUTE.EXE, RENAME=$(NEWFILE)
27 = 1, KB16.COM    , RENAME=$(NEWFILE)
28 = 1, KBDPO.DLL   , RENAME=$(NEWFILE)
29 = 1, KERNEL32.DLL, RENAME=$(NEWFILE)
30 = 1, KRNL386.EXE , RENAME=$(NEWFILE)
31 = 1, LMUICMN0.DLL, RENAME=$(NEWFILE)
32 = 1, LMUICMN1.DLL, RENAME=$(NEWFILE)
33 = 1, LOCALSPL.DLL, RENAME=$(NEWFILE)
34 = 1, LSASRV.DLL  , RENAME=$(NEWFILE)
35 = 1, LSASS.EXE   , RENAME=$(NEWFILE)
36 = 1, MGMTAPI.DLL , RENAME=$(NEWFILE)
37 = 1, MSPRIVS.DLL , RENAME=$(NEWFILE)
38 = 1, MSSCHD32.DLL, RENAME=$(NEWFILE)
39 = 1, MSV1_0.DLL  , RENAME=$(NEWFILE)
40 = 1, MUSRMGR.EXE , RENAME=$(NEWFILE)
41 = 1, NCPA.CPL    , RENAME=$(NEWFILE)
42 = 1, NETAPI32.DLL, RENAME=$(NEWFILE)
43 = 1, NETLOGON.DLL, RENAME=$(NEWFILE)
44 = 1, NETRAP.DLL  , RENAME=$(NEWFILE)
45 = 1, NTBACKUP.EXE, RENAME=$(NEWFILE)
46 = 1, NTDLL.DLL   , RENAME=$(NEWFILE)
47 = 1, NTVDM.EXE   , RENAME=$(NEWFILE)
48 = 1, NWLNKCFG.DLL, RENAME=$(NEWFILE)
49 = 1, NWLNKMSG.DLL, RENAME=$(NEWFILE)
50 = 1, NWLNKSVC.EXE, RENAME=$(NEWFILE)
51 = 1, NWNBLINK.DLL, RENAME=$(NEWFILE)
52 = 1, NWNBLINK.EXE, RENAME=$(NEWFILE)
53 = 1, OS2.EXE     , RENAME=$(NEWFILE)
54 = 1, OS2SRV.EXE  , RENAME=$(NEWFILE)
55 = 1, OS2SS.EXE   , RENAME=$(NEWFILE)
56 = 1, PERFCTRS.DLL, RENAME=$(NEWFILE)
57 = 1, PERFMON.EXE , RENAME=$(NEWFILE)
58 = 1, PORTUAS.EXE , RENAME=$(NEWFILE)
59 = 1, PROGMAN.EXE , RENAME=$(NEWFILE)
60 = 1, RASADMIN.EXE, RENAME=$(NEWFILE)
61 = 1, RASCAUTH.DLL, RENAME=$(NEWFILE)
62 = 1, RASGTWY.DLL , RENAME=$(NEWFILE)
63 = 1, REDIR.EXE   , RENAME=$(NEWFILE)
64 = 1, RPCLTC3.DLL , RENAME=$(NEWFILE)
65 = 1, RPCLTC6.DLL , RENAME=$(NEWFILE)
66 = 1, RPCRT4.DLL  , RENAME=$(NEWFILE)
67 = 1, S3.DLL      , RENAME=$(NEWFILE)
68 = 1, SAMLIB.DLL  , RENAME=$(NEWFILE)
69 = 1, SAMSRV.DLL  , RENAME=$(NEWFILE)
70 = 1, SCREG.EXE   , RENAME=$(NEWFILE)
71 = 1, SENDFL32.DLL, RENAME=$(NEWFILE)
72 = 1, SFMMON.DLL  , RENAME=$(NEWFILE)
73 = 1, SFMPRINT.EXE, RENAME=$(NEWFILE)
74 = 1, SFMSVC.EXE  , RENAME=$(NEWFILE)
75 = 1, SFMWSHAT.DLL, RENAME=$(NEWFILE)
76 = 1, SHELL32.DLL , RENAME=$(NEWFILE)
77 = 1, SNMP.EXE    , RENAME=$(NEWFILE)
78 = 1, SRVMGR.CPL  , RENAME=$(NEWFILE)
79 = 1, SRVMGR.EXE  , RENAME=$(NEWFILE)
80 = 1, SRVSVC.DLL  , RENAME=$(NEWFILE)
81 = 1, TCPIPSVC.DLL, RENAME=$(NEWFILE)
82 = 1, TELNET.DLL  , RENAME=$(NEWFILE)
83 = 1, TERMINAL.EXE, RENAME=$(NEWFILE)
84 = 1, UFAT.DLL    , RENAME=$(NEWFILE)
85 = 1, UHPFS.DLL   , RENAME=$(NEWFILE)
86 = 1, UNTFS.DLL   , RENAME=$(NEWFILE)
87 = 1, UPS.EXE     , RENAME=$(NEWFILE)
88 = 1, USER.EXE    , RENAME=$(NEWFILE)
89 = 1, USER32.DLL  , RENAME=$(NEWFILE)
90 = 1, USERINIT.EXE, RENAME=$(NEWFILE)
91 = 1, USRMGR.EXE  , RENAME=$(NEWFILE)
92 = 1, WIN32SPL.DLL, RENAME=$(NEWFILE)
93 = 1, WINDISK.EXE , RENAME=$(NEWFILE)
94 = 1, WINFILE.EXE , RENAME=$(NEWFILE)
95 = 1, WINLOGON.EXE, RENAME=$(NEWFILE)
96 = 1, WINMSD.EXE  , RENAME=$(NEWFILE)
97 = 1, WINMSDP.EXE , RENAME=$(NEWFILE)
98 = 1, WINSPOOL.DRV, RENAME=$(NEWFILE)
99 = 1, WINSRV.DLL  , RENAME=$(NEWFILE)
100 = 1, WINSTRM.DLL , RENAME=$(NEWFILE)
101 = 1, WINVER.EXE  , RENAME=$(NEWFILE)
102 = 1, WOW32.DLL   , RENAME=$(NEWFILE)
103 = 1, WSHNWLNK.DLL, RENAME=$(NEWFILE)
104 = 1, WSOCK32.DLL , RENAME=$(NEWFILE)
105 = 1, XACTSRV.DLL , RENAME=$(NEWFILE)

[FilesOs2Dll]
1 = 1, DOSCALLS.DLL, RENAME=$(NEWFILE)

[FilesSystem]

[FilesDrivers]
1 = 1, 4MMDAT.SYS  , RENAME=$(NEWFILE)
2 = 1, ABIOSDSK.SYS, RENAME=$(NEWFILE)
3 = 1, AFD.SYS     , RENAME=$(NEWFILE)
4 = 1, ARCHQIC.SYS , RENAME=$(NEWFILE)
5 = 1, ARROW.SYS   , RENAME=$(NEWFILE)
6 = 1, ASYNCMAC.SYS, RENAME=$(NEWFILE)
7 = 1, ATDISK.SYS  , RENAME=$(NEWFILE)
8 = 1, BROWSER.SYS , RENAME=$(NEWFILE)
9 = 1, CDFS.SYS    , RENAME=$(NEWFILE)
10 = 1, CPQARRAY.SYS, RENAME=$(NEWFILE)
11 = 1, DIGIFEP5.SYS, RENAME=$(NEWFILE)
12 = 1, DLC.SYS     , RENAME=$(NEWFILE)
13 = 1, DPTSCSI.SYS , RENAME=$(NEWFILE)
14 = 1, ELNK16.SYS  , RENAME=$(NEWFILE)
15 = 1, ELNK3.SYS   , RENAME=$(NEWFILE)
16 = 1, ELNKII.SYS  , RENAME=$(NEWFILE)
17 = 1, ELNKMC.SYS  , RENAME=$(NEWFILE)
18 = 1, EXABYTE1.SYS, RENAME=$(NEWFILE)
19 = 1, FASTFAT.SYS , RENAME=$(NEWFILE)
20 = 1, FD16_700.SYS, RENAME=$(NEWFILE)
21 = 1, FLOPPY.SYS  , RENAME=$(NEWFILE)
22 = 1, FTDISK.SYS  , RENAME=$(NEWFILE)
23 = 1, I8042PRT.SYS, RENAME=$(NEWFILE)
24 = 1, IBMTOK.SYS  , RENAME=$(NEWFILE)
25 = 1, LANCE.SYS   , RENAME=$(NEWFILE)
26 = 1, MUP.SYS     , RENAME=$(NEWFILE)
27 = 1, MVAUDIO.SYS , RENAME=$(NEWFILE)
28 = 1, NBF.SYS     , RENAME=$(NEWFILE)
29 = 1, NBT.SYS     , RENAME=$(NEWFILE)
30 = 1, NCR77C22.SYS, RENAME=$(NEWFILE)
31 = 1, NCRC700.SYS , RENAME=$(NEWFILE)
32 = 1, NCRC710.SYS , RENAME=$(NEWFILE)
33 = 1, NDIS.SYS    , RENAME=$(NEWFILE)
34 = 1, NE2000.SYS  , RENAME=$(NEWFILE)
35 = 1, NE3200.SYS  , RENAME=$(NEWFILE)
36 = 1, NETFLX.SYS  , RENAME=$(NEWFILE)
37 = 1, NPEISA.SYS  , RENAME=$(NEWFILE)
38 = 1, NPFS.SYS    , RENAME=$(NEWFILE)
39 = 1, NTCX.SYS    , RENAME=$(NEWFILE)
40 = 1, NTDOS.SYS   , RENAME=$(NEWFILE)
41 = 1, NTFS.SYS    , RENAME=$(NEWFILE)
42 = 1, NTXALL.SYS  , RENAME=$(NEWFILE)
43 = 1, NTXEM.SYS   , RENAME=$(NEWFILE)
44 = 1, NWLINK.SYS  , RENAME=$(NEWFILE)
45 = 1, NWNBLINK.SYS, RENAME=$(NEWFILE)
46 = 1, PARALLEL.SYS, RENAME=$(NEWFILE)
47 = 1, PINBALL.SYS , RENAME=$(NEWFILE)
48 = 1, PROTEON.SYS , RENAME=$(NEWFILE)
49 = 1, RDR.SYS     , RENAME=$(NEWFILE)
50 = 1, S3.SYS      , RENAME=$(NEWFILE)
51 = 1, SCSIDISK.SYS, RENAME=$(NEWFILE)
52 = 1, SCSIPORT.SYS, RENAME=$(NEWFILE)
53 = 1, SERIAL.SYS  , RENAME=$(NEWFILE)
54 = 1, SERMOUSE.SYS, RENAME=$(NEWFILE)
55 = 1, SFMATALK.SYS, RENAME=$(NEWFILE)
56 = 1, SFMSRV.SYS  , RENAME=$(NEWFILE)
57 = 1, SRV.SYS     , RENAME=$(NEWFILE)
58 = 1, STREAMS.SYS , RENAME=$(NEWFILE)
59 = 1, TCPIP.SYS   , RENAME=$(NEWFILE)
60 = 1, UBNEI.SYS   , RENAME=$(NEWFILE)
61 = 1, ULTRA124.SYS, RENAME=$(NEWFILE)
62 = 1, WDVGA.SYS   , RENAME=$(NEWFILE)

[FilesConfig]
;    1 = 1, file1, RENAME=$(NEWFILE)
;    2 = 1, file2, RENAME=$(NEWFILE)

[FilesWinspool]
;    1 = 1, file1, RENAME=$(NEWFILE)
;    2 = 1, file2, RENAME=$(NEWFILE)

[FilesPrnDriver]
1 = 1, HPDSKJET.DLL, RENAME=$(NEWFILE)
2 = 1, JP350.DLL   , RENAME=$(NEWFILE)
3 = 1, PSCRIPT.DLL , RENAME=$(NEWFILE)
4 = 1, PSCRPTUI.DLL, RENAME=$(NEWFILE)

[FilesPrnProc]
1 = 1, WINPRINT.DLL, RENAME=$(NEWFILE)

[FilesDbgCom]
;    1 = 1, file1, RENAME=$(NEWFILE)
;    2 = 1, file2, RENAME=$(NEWFILE)

[FilesDbgCpl]
;    1 = 1, file1, RENAME=$(NEWFILE)
;    2 = 1, file2, RENAME=$(NEWFILE)

[FilesDbgDll]
;    1 = 1, file1, RENAME=$(NEWFILE)
;    2 = 1, file2, RENAME=$(NEWFILE)

[FilesDbgDrv]
;    1 = 1, file1, RENAME=$(NEWFILE)
;    2 = 1, file2, RENAME=$(NEWFILE)

[FilesDbgExe]
;    1 = 1, file1, RENAME=$(NEWFILE)
;    2 = 1, file2, RENAME=$(NEWFILE)

[FilesDbgScr]
;    1 = 1, file1, RENAME=$(NEWFILE)
;    2 = 1, file2, RENAME=$(NEWFILE)

[FilesDbgSys]
;    1 = 1, file1, RENAME=$(NEWFILE)
;    2 = 1, file2, RENAME=$(NEWFILE)

[FilesInfWinnt]
1 = 1, OEMNADDS.INF, RENAME=$(NEWFILE)
2 = 1, OEMNADLM.INF, RENAME=$(NEWFILE)
3 = 1, OEMNADLT.INF, RENAME=$(NEWFILE)
4 = 1, OEMNSVRA.INF, RENAME=$(NEWFILE)
5 = 1, OEMNXPSM.INF, RENAME=$(NEWFILE)
6 = 1, UTILITY.INF , RENAME=$(NEWFILE)

[FilesInfLanmanNT]
1 = 1, OEMNADDS.INF, RENAME=$(NEWFILE)
2 = 1, OEMNADLM.INF, RENAME=$(NEWFILE)
3 = 1, OEMNADLT.INF, RENAME=$(NEWFILE)
4 = 1, OEMNSVRA.INF, RENAME=$(NEWFILE)
5 = 1, OEMNXPSM.INF, RENAME=$(NEWFILE)
6 = 1, UTILITY.INF , RENAME=$(NEWFILE)

[FilesSystem32CopyAlways]
;    1 = 1, file1, RENAME=$(NEWFILE)
;    2 = 1, file2, RENAME=$(NEWFILE)

[FilesOs2DllCopyAlways]
1 = 1, NETAPI.OS2  , RENAME=NETAPI.DLL

[FilesDriversCopyAlways]
;    1 = 1, file1, RENAME=$(NEWFILE)
;    2 = 1, file2, RENAME=$(NEWFILE)


[ProcessorID]
    ProcessorID_I386  = I386
    ProcessorID_I486  = I486
    ProcessorID_I586  = I586
    ProcessorID_R4000 = R4000

[UiVars]
    STF_PLATFORMDET    = "" ? $(!LIBHANDLE) GetPlatform
    STF_CSDVER         = 768
    STF_BUILDVER       = 528

    STF_PRIMARY        = "C:"
    STF_NTDRIVE        = ""
    STF_WINDOWSPATH    = "" ? $(!LIBHANDLE) GetWindowsNtDir
    STF_WINDOWSSYSPATH = "" ? $(!LIBHANDLE) GetWindowsNtSysDir
    STF_CONTROLSET     = CurrentControlSet
    VolumeList         = {} ? $(!LIBHANDLE) GetHardDriveLetters
    VolumeFSList       = {} ? $(!LIBHANDLE) GetHardDriveFileSystems
    VolumeFreeList     = {} ? $(!LIBHANDLE) GetHardDriveFreeSpace
    DisketteList       = {} ? $(!LIBHANDLE) GetFloppyDriveLetters

    ;
    ; Amount of free space (in MB) required on the winnt drive
    ; before we'll do the upgrade patch.
    ;
[FreeSpaceI386]
    RequiredFreeWinnt  = 25
[FreeSpaceMips]
    RequiredFreeWinnt  = 32
[FreeSpaceAlpha]
    RequiredFreeWinnt  = 27


[NVRAMVars]
    SystemPartition = "" ? $(!LIBHANDLE) GetNVRAMVar SYSTEMPARTITION
    OsLoader        = "" ? $(!LIBHANDLE) GetNVRAMVar OSLOADER
    OsLoadPartition = "" ? $(!LIBHANDLE) GetNVRAMVar OSLOADPARTITION
    OsLoadFilename  = "" ? $(!LIBHANDLE) GetNVRAMVar OSLOADFILENAME

;
; INF LOGIC
;

[Shell Commands]

    set-title "Windows NT Setup"
    set-subst CR = "\r"
    set-subst LF = "\n"
    set STF_LANGUAGE = ENG
    read-syms Strings
    shell "subroutn.inf" PushBillboard STATUSDLG $(Billboard1)
    set BillboardPushed = TRUE

    set !LIBHANDLE      = ""
    set !PATCHLIBHANDLE = ""

    ;
    ; Initialize Library support for the inf
    ;

    install   LoadSetupLibrary

    ;
    ; find out the essential information about the installed hardware and
    ; software
    ;

    read-syms ProductType
    ifstr(i) $(!STF_PLATFORM) == I386
        set STF_PRNPLATFORM = "w32x86"
    else-ifstr(i) $(!STF_PLATFORM) == Mips
        set STF_PRNPLATFORM = "w32mips"
    else-ifstr(i) $(!STF_PLATFORM) == Alpha
        set STF_PRNPLATFORM = "w32alpha"
    endif

    read-syms UiVars
    detect    UiVars
    read-syms FreeSpace$(!STF_PLATFORM)

    ;
    ; if the Platform is not the same as the one supported by this patch
    ; diskette, inform the user and quit
    ;
    ifstr(i) $(STF_PLATFORM) != $(STF_PLATFORMDET)
         ifstr(i) $(BillboardPushed) == TRUE
             shell "subroutn.inf" PopBillboard
             set BillboardPushed = FALSE
         endif
         shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "FATAL" $(String1)
         goto patchnotdone
    endif

    ;
    ; Check to make sure we have admin privileges, if not print fatal error
    ;

    shell "registry.inf" CheckSetupModify
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
        ; DEBUG
        ;
        ;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Failed to shell CheckSetupModify"
        ;
        ; DEBUG END
        ifstr(i) $(BillboardPushed) == TRUE
            shell "subroutn.inf" PopBillboard
            set BillboardPushed = FALSE
        endif

        Debug-Output "shelling CheckSetupModify failed"
        goto patchnotdone
    else-ifstr(i) $($R0) != STATUS_SUCCESSFUL
        ifstr(i) $(BillboardPushed) == TRUE
            shell "subroutn.inf" PopBillboard
            set BillboardPushed = FALSE
        endif
        shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) "FATAL" $(String4)
        goto patchnotdone
    endif


    ;
    ; Initialize the patch library support for the inf
    ;

    install   LoadPatchLibrary

    ;
    ; find out if the system we are patching is checked / free using GetCheckedFree
    ; and fail if we find a checked system.  ignore any errors in getting
    ; checked/free status since this is not important.
    ;
    shell "" GetCheckedFree
    ifint $($ShellCode) == $(!SHELL_CODE_OK)
        ifstr(i) $($R0) == "STATUS_SUCCESSFUL"
            ifstr(i) $($R1) == "checked"
                shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) "FATAL" $(String15)
                goto patchnotdone
            endif
        endif
    endif

    ;
    ; Get the build and patch version for the system.  If this is more than our patch
    ; version warn the user, allowing him to exit
    ;

    LibraryProcedure STATUS,$(!PATCHLIBHANDLE), CheckBuildVersion $(!STF_BUILDVER)
    ifstr(i) $(STATUS) == ERROR
        goto patchnotdone
    else-ifstr(i) $(STATUS) == NO
        shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) WARNING $(String8)
        ifstr(i) $($R1) == "OK"
            goto skip_patchvercheck
        else
            goto patchnotdone
        endif
    endif

    shell "" GetCSDVersion
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
        ifstr(i) $(BillboardPushed) == TRUE
            shell "subroutn.inf" PopBillboard
            set BillboardPushed = FALSE
        endif
        Debug-Output "PATCH.INF: Shelling GetCSDVersion failed"
        goto patchnotdone
    endif

    ifstr(i) $($R0) != "STATUS_SUCCESSFUL"
        Debug-Output "PATCH.INF: GetCSDVersion failed to return a value"
    else
        ifint $($R1) > $(!STF_CSDVER)
            ifstr(i) $(BillboardPushed) == TRUE
                shell "subroutn.inf" PopBillboard
                set BillboardPushed = FALSE
            endif
            shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) WARNING $(String8)
            ifstr(i) $($R1) == "OK"
            else
                goto patchnotdone
            endif
        endif
    endif

skip_patchvercheck = +

    ;
    ; Get the NT DRIVE
    ;

    GetDriveInPath !STF_NTDRIVE $(!STF_WINDOWSSYSPATH)

    ;
    ; Check for enough disk space.
    ;

    ifint *($(VolumeFreeList), ~($(VolumeList), $(!STF_NTDRIVE))) < $(RequiredFreeWinnt)
        shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) FATAL $(String13a)$(RequiredFreeWinnt)$(String13b)$(!STF_NTDRIVE)$(String13c)
        goto patchnotdone
    endif

    ;
    ; get the product type we are running on
    ;

    set STF_PRODUCT = ""
    OpenRegKey $(!REG_H_LOCAL) "" "System\CurrentControlSet\Control\ProductOptions" 33554432 KeyProductOption
    ifstr(i) $(KeyProductOption) != ""
        GetRegValue $(KeyProductOption) "ProductType" ProductTypeList
        set TempProductType = *($(ProductTypeList),4)
        ifstr(i) $(TempProductType) == "winnt"
            set !STF_PRODUCT = WINNT
            set !PRODUCT_DIR = WINNT
        else-ifstr(i) $(TempProductType) == "lanmannt"
            set !STF_PRODUCT = LANMANNT
            set !PRODUCT_DIR = NTAS
        endif
        CloseRegKey $(KeyProductOptions)
    endif

    ;
    ; if we are unable to determine the product type print error and exit
    ;

    ifstr(i) $(STF_PRODUCT) == ""
        shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) FATAL $(String14)
        goto patchnotdone
    endif

    ;
    ; Find the hal and osloader destination on Mips and Alpha
    ;

    ifstr(i) $(!STF_PLATFORM) == I386
        set STF_HALDEST = $(!STF_WINDOWSSYSPATH)
        set STF_OSLDEST = C:\

    else

        read-syms NVRAMVars
        detect    NVRAMVars
        LibraryProcedure STATUS,$(!PATCHLIBHANDLE), GetOsLoaderDest         +
                                                         $(SystemPartition) +
                                                         $(OsLoader)        +
                                                         $(OsLoadPartition) +
                                                         $(OsLoadFilename)
        ifstr(i) $(STATUS) == ERROR
            goto patchnotdone
        else
            set STF_OSLDEST = $(STATUS)
            set STF_HALDEST = $(STATUS)
        endif
    endif

    ;
    ; Get the required information about keyed files
    ;

    set KeyedClassKeys  = ^(FileKeyedClasses, 0)
    set KeyedClassFiles = ^(FileKeyedClasses, 1)

    LibraryProcedure STATUS,$(!PATCHLIBHANDLE), GetFileTypes $(KeyedClassFiles)
    ifstr(i) $(STATUS) == ERROR
        goto patchnotdone
    else-ifstr(i) $(STATUS) == SETUPLOGNOTPRESENT
        shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) FATAL $(String11)
        goto patchnotdone
    else
        ForListDo $(KeyedClassKeys)
            set $($)Type = *($(STATUS), $(#))
        EndForListDo
    endif

    ;
    ; Warn the user about the patch process..
    ;

    ifstr(i) $(BillboardPushed) == TRUE
        shell "subroutn.inf" PopBillboard
        set BillboardPushed = FALSE
    endif

    shell "" QueryOkCancel $(String9)
    ifstr(i) $($R1) == "OK"
    else
        set String = $(String12)
        goto finish2
    endif

    shell "subroutn.inf" PushBillboard STATUSDLG $(Billboard2)
    set BillboardPushed = TRUE

    ;
    ; initialize copy
    ;

    set MoveFileExList  = {}


    ;
    ; Run through the directory list adding files to the copy list
    ;

    read-syms FileSections
    set FileSectionsList = ^(FileSections, 0)
    set FileSource  = $(!STF_SRCDIR)

    ForListDo $(FileSectionsList)
        set FileSection = $($)
        set FileDest    = $($($))
        set FileList    = ^($(FileSection), 0)
        ForListDo $(FileList)
            set FileKey = $($)
            set File    = #($(FileSection), $(FileKey), 2)
            set FileDestFullPath = $(FileDest)\$(File)

            ;
            ; Check to see if file exists, if it is does not exist, it doesn't
            ; need to be copied over

            LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(FileDestFullPath)
            ifstr(i) $(STATUS) == YES


                ; DEBUG
                ;
                ;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Examining to see if file opened excl: "$(FileDestFullPath)
                ;
                ; DEBUG END

                LibraryProcedure STATUS, $(!PATCHLIBHANDLE), IsFileOpenedExclusive $(FileDestFullPath)
                ifstr(i) $(STATUS) == ERROR
                    goto patchnotdone
                else
                    ifstr(i) $(STATUS) == "YES"
                        LibraryProcedure NEWFILE, $(!PATCHLIBHANDLE), GenerateTemporary $(FileDest)
                        ifstr(i) $(NEWFILE) == ERROR
                            goto patchnotdone
                        else
                            set FileComp = {$(FileDest)\$(NEWFILE), $(FileDestFullPath)}

                            ; DEBUG
                            ;
                            ;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Adding to movefile ex list: "$(FileComp)
                            ;
                            ; DEBUG END

                            set MoveFileExList = >($(MoveFileExList), $(FileComp))
                        endif
                    else
                        set NEWFILE = $(File)
                    endif

                    ; DEBUG
                    ;
                    ;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Copying File Section: "$(FileSection)" : Key: "$(FileKey)" Source: "$(FileSource)" Dest: "$(FileDest)" rename = "$(NEWFILE)
                    ;
                    ; DEBUG END

                    install Install-File

                endif
            endif
        EndForListDo
    EndForListDO

    ;
    ; Add the keyed sections to the copy list
    ;

    read-syms FilesKeyedSections
    set FileSource  = $(!STF_SRCDIR)
    ForListDo $(KeyedClassKeys)
        set FileSection = Files$($)
        set FileDest    = $($(FileSection))
        set FileKey     = $($($)Type)

        set KeyedClassChoices = ^(Files$($), 0)
        ifcontains(i) $(FileKey) in $(KeyedClassChoices)
            set File             = #(FileKeyedClasses, $($), 1)
            set FileDestFullPath = $(FileDest)\$(File)
            ;
            ; Check to see if file exists, if it is does not exist, it doesn't
            ; need to be copied over

            LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(FileDestFullPath)
            ifstr(i) $(STATUS) == YES


                ; DEBUG
                ;
                ;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Examining to see if file opened excl: "$(FileDestFullPath)
                ;
                ; DEBUG END

                LibraryProcedure STATUS, $(!PATCHLIBHANDLE), IsFileOpenedExclusive $(FileDestFullPath)
                ifstr(i) $(STATUS) == ERROR
                    goto patchnotdone
                else
                    ifstr(i) $(STATUS) == "YES"
                        LibraryProcedure NEWFILE, $(!PATCHLIBHANDLE), GenerateTemporary $(FileDest)
                        ifstr(i) $(NEWFILE) == ERROR
                            goto patchnotdone
                        else
                            set FileComp = {$(FileDest)\$(NEWFILE), $(FileDestFullPath)}

                            ; DEBUG
                            ;
                            ;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Adding to movefile ex list: "$(FileComp)
                            ;
                            ; DEBUG END

                            set MoveFileExList = >($(MoveFileExList), $(FileComp))
                        endif
                    else
                        set NEWFILE = $(File)
                    endif

                    ; DEBUG
                    ;
                    ;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Copying File Section: "$(FileSection)" : Key: "$(FileKey)" Source: "$(FileSource)" Dest: "$(FileDest)" rename = "$(NEWFILE)
                    ;
                    ; DEBUG END

                    install Install-File

                endif
            endif



        endif
    EndForListDo

    ;
    ; add product specific files to the copy list
    ;

    read-syms FileSections$(STF_PRODUCT)
    set FileSectionsList = ^(FileSections$(STF_PRODUCT), 0)
    set FileSource  = $(!STF_SRCDIR)$(PRODUCT_DIR)
    ForListDo $(FileSectionsList)
        set FileSection = $($)
        set FileDest    = $($($))
        set FileList    = ^($(FileSection), 0)
        ForListDo $(FileList)
            set FileKey = $($)
            set File    = #($(FileSection), $(FileKey), 2)
            set FileDestFullPath = $(FileDest)\$(File)

            ;
            ; Check to see if file exists, if it is does not exist, it doesn't
            ; need to be copied over

            LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(FileDestFullPath)
            ifstr(i) $(STATUS) == YES


                ; DEBUG
                ;
                ;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Examining to see if file opened excl: "$(FileDestFullPath)
                ;
                ; DEBUG END

                LibraryProcedure STATUS, $(!PATCHLIBHANDLE), IsFileOpenedExclusive $(FileDestFullPath)
                ifstr(i) $(STATUS) == ERROR
                    goto patchnotdone
                else
                    ifstr(i) $(STATUS) == "YES"
                        LibraryProcedure NEWFILE, $(!PATCHLIBHANDLE), GenerateTemporary $(FileDest)
                        ifstr(i) $(NEWFILE) == ERROR
                            goto patchnotdone
                        else
                            set FileComp = {$(FileDest)\$(NEWFILE), $(FileDestFullPath)}

                            ; DEBUG
                            ;
                            ;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Adding to movefile ex list: "$(FileComp)
                            ;
                            ; DEBUG END

                            set MoveFileExList = >($(MoveFileExList), $(FileComp))
                        endif
                    else
                        set NEWFILE = $(File)
                    endif

                    ; DEBUG
                    ;
                    ;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "Copying File Section: "$(FileSection)" : Key: "$(FileKey)" Source: "$(FileSource)" Dest: "$(FileDest)" rename = "$(NEWFILE)
                    ;
                    ; DEBUG END

                    install Install-File

                endif
            endif
        EndForListDo
    EndForListDO


    ifstr(i) $(BillboardPushed) == TRUE
        shell "subroutn.inf" PopBillboard
        set BillboardPushed = FALSE
    endif

    ;
    ; add the files which are always copied
    ;
    read-syms FileSectionsCopyAlways
    set FileSectionsList = ^(FileSectionsCopyAlways, 0)
    set FileSource  = $(!STF_SRCDIR)

    ForListDo $(FileSectionsList)
        set FileSection = $($)
        set FileDest    = $($($))
        set FileList    = ^($(FileSection), 0)
        ForListDo $(FileList)
            set FileKey = $($)
            set File    = #($(FileSection), $(FileKey), 2)
            set NEWFILE = $(File)
            set FileDestFullPath = $(FileDest)\$(File)
            install Install-File
        EndForListDo
    EndForListDO

    ;
    ; Do the copy
    ;

    read-syms ProgressCopy$(!STF_LANGUAGE)
    install   Install-DoCopy
    ifstr(i) $(STF_INSTALL_OUTCOME) == "STF_USERQUIT"
        goto patchnotdone
    else-ifstr(i) $(STF_INSTALL_OUTCOME) == "STF_FAILURE"
        goto patchnotdone
    endif

processmovefileex=+
    ;
    ; Process MoveFileExList
    ;

    ForListDo $(MoveFileExList)
        ;
        set ExistingPath = *($($), 1)
        set NewPath      = *($($), 2)

        ; DEBUG
        ;
        ;shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "STATUS" "CopyFileOnReboot "$(ExistingPath)" to "$(NewPath)
        ;
        ; DEBUG END

        LibraryProcedure STATUS, $(!PATCHLIBHANDLE), CopyFileOnReboot $(ExistingPath) $(NewPath)
        ifstr(i) $(STATUS) == ERROR
            goto patchnotdone
        endif
    EndForListDo


patchdone =+
    ifstr(i) $(BillboardPushed) == TRUE
        shell "subroutn.inf" PopBillboard
        set BillboardPushed = FALSE
    endif

    ;
    ; do the registry modifications needed
    ;

    shell "" DoRegistryModifications $(!STF_CSDVER)
    read-syms SetupDoneDlg$(!STF_LANGUAGE)
    ui start "SetupDone"
    ifstr(i) $(DLGEVENT) == "CONTINUE"
        ui pop 1
        goto rebootend
    else
        ui pop 1
        goto finish1
    endif

patchnotdone =+
    set String = $(String2)
finish2 =+
    ifstr(i) $(BillboardPushed) == TRUE
        shell "subroutn.inf" PopBillboard
        set BillboardPushed = FALSE
    endif

    shell "subroutn.inf" SetupMessage $(STF_LANGUAGE) "FATAL" $(String)
    goto finish1

finish1 =+
    ;
    ; Free the library support
    ;

    install   FreeSetupLibrary

finish =+

    install   FreePatchLibrary
    exit

rebootend =+
    set Reboot = YES
    install   Install-Shutdown
    goto finish1
    exit


;-----------------------------------------------------------------------
; INSTALL HELPERS
;-----------------------------------------------------------------------

[LoadPatchLibrary]
    LoadLibrary "x" patchdll.dll !PATCHLIBHANDLE
    exit

[FreePatchLibrary]
    ifstr(i) $(!PATCHLIBHANDLE) != ""
        FreeLibrary $(!PATCHLIBHANDLE)
    endif
    exit

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

[FreeSetupLibrary]
    ifstr(i) $(!LIBHANDLE) != ""
        FreeLibrary $(!LIBHANDLE)
    endif
    exit

[Install-File]
    set STF_VITAL = ""
    AddSectionKeyFileToCopyList $(FileSection) $(FileKey) $(FileSource) $(FileDest)
    exit

[Install-DoCopy]
    CopyFilesInCopyList
    exit


[Install-Shutdown]
    ;
    LibraryProcedure STATUS,$(!LIBHANDLE),ShutdownSystem $(Reboot)
    exit

;-----------------------------------------------------------------------
; REGISTRY SUBROUTINES
;-----------------------------------------------------------------------

[RegistryConstants]

    MaskAllAccess          = 33554432
    NoTitle                = 0
    RegLastError           = $(!REG_ERROR_SUCCESS)

;-----------------------------------------------------------------------
; ROUTINE:      DoRegistryModifications
;
; DESCRIPTION:  Does the registry modifications needed.
;               - Sets the compatibility flags for the postcript stuff
;               - Creates an entry for the WinNT software.
;
; INPUTS:       $0:  CSD Version #
;
; OUTPUTS:      $R0: Status: STATUS_SUCCESSFUL
;                            STATUS_FAILED
;
;------------------------------------------------------------------------

[DoRegistryModifications]

    set Status = STATUS_FAILED
    read-syms RegistryConstants

    ;
    ; Modify the compatibility flags..
    ;
    set KeyPath   = { +
                     {SOFTWARE,       $(NoTitle), $(MaskAllAccess)}, +
                     {Microsoft,      $(NoTitle), $(MaskAllAccess)}, +
                     {"Windows NT",   $(NoTitle), $(MaskAllAccess)}, +
                     {CurrentVersion, $(NoTitle), $(MaskAllAccess)}, +
                     {WOW,            $(NoTitle), $(MaskAllAccess)}, +
                     {Compatibility,  $(NoTitle), $(MaskAllAccess)}  +
                    }

    ;
    ; Form the value info structures for the WinNT entry
    ;

    set KeyValues = { +
                     {PM4,  $(NoTitle), $(!REG_VT_SZ), "0x02004000" }, +
                     {main123W, $(NoTitle), $(!REG_VT_SZ), "0x00004000" }, +
                     {FH3, $(NoTitle), $(!REG_VT_SZ), "0x00004000" }  +
                    }


    shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
        goto endCSDVersionCreate
    endif
    ifstr(i) $($R0) != STATUS_SUCCESSFUL
        goto endCSDVersionCreate
    else
        CloseRegKey $($R1)
    endif
    ;
    ; Form the path up to the version key
    ;

    set KeyPath   = { +
                     {SOFTWARE,       $(NoTitle), $(MaskAllAccess)}, +
                     {Microsoft,      $(NoTitle), $(MaskAllAccess)}, +
                     {"Windows NT",   $(NoTitle), $(MaskAllAccess)}, +
                     {CurrentVersion, $(NoTitle), $(MaskAllAccess)}  +
                    }

    ;
    ; Form the value info structures for the WinNT entry
    ;

    set KeyValues = { +
                     {CSDVersion, $(NoTitle), $(!REG_VT_DWORD), $($0) } +
                    }


    shell "registry.inf" CreateKey $(!REG_H_LOCAL) $(KeyPath) $(KeyValues)
    ifint $($ShellCode) != $(!SHELL_CODE_OK)
        goto endCSDVersionCreate
    endif
    ifstr(i) $($R0) != STATUS_SUCCESSFUL
        goto endCSDVersionCreate
    else
        CloseRegKey $($R1)
    endif

    set Status = STATUS_SUCCESSFUL
endCSDVersionCreate = +
    Return $(Status)




;-----------------------------------------------------------------------
; ROUTINE:      GetCSDVersion
;
; DESCRIPTION:  Reads the software entry to find out what the CSD Patch Version
;               is
;
; INPUTS:       $0:  None
;
; OUTPUTS:      $R0: Status: STATUS_SUCCESSFUL
;                            STATUS_FAILED
;
;               $R1: CSDVersion
;
;------------------------------------------------------------------------

[GetCSDVersion]

    set Status = STATUS_SUCCESSFUL
    read-syms RegistryConstants
    set CSDVersion = 0

    ;
    ; Open the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
    ; key

    set KeyName = "Software\Microsoft\Windows NT\CurrentVersion"
    OpenRegKey $(!REG_H_LOCAL) "" $(KeyName) $(!REG_KEY_READ) KeyHandle
    ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
        Debug-Output "REGISTRY.INF: Couldn't open windows nt software key for read access"
        goto end_GetCSDVersion
    endif

    ;
    ; read the csdversion entry
    ;

    GetRegValue $(KeyHandle) "CSDVersion" CSDVersionValue
    ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
        CloseRegKey $(KeyHandle)
        goto end_GetCSDVersion
    endif

    set CSDVersion =  *($(CSDVersionValue), 4)
    CloseRegKey $(KeyHandle)
end_GetCSDVersion = +
    Return $(Status) $(CSDVersion)


;-----------------------------------------------------------------------
; ROUTINE:      GetCheckedFree
;
; DESCRIPTION:  Reads the software entry to find out whether the system
;               is checked / free.
;
; INPUTS:       $0:  None
;
; OUTPUTS:      $R0: Status: STATUS_SUCCESSFUL
;                            STATUS_FAILED
;
;               $R1: Checked | Free
;
;------------------------------------------------------------------------

[GetCheckedFree]

    set Status = STATUS_SUCCESSFUL
    read-syms RegistryConstants
    set System = Free

    ;
    ; Open the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
    ; key

    set KeyName = "Software\Microsoft\Windows NT\CurrentVersion"
    OpenRegKey $(!REG_H_LOCAL) "" $(KeyName) $(!REG_KEY_READ) KeyHandle
    ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
        Debug-Output "REGISTRY.INF: Couldn't open windows nt software key for read access"
        goto end_GetCheckedFree
    endif

    ;
    ; read the currenttype value
    ;

    GetRegValue $(KeyHandle) "CurrentType" CurrentTypeValue
    ifint $(RegLastError) != $(!REG_ERROR_SUCCESS)
        CloseRegKey $(KeyHandle)
        goto end_GetCheckedFree
    endif

    ;
    ; split the currenttype value and see if the split string has "free" or
    ; "checked" in it
    ;

    Split-String *($(CurrentTypeValue), 4) " " CurrentTypeList
    ForListDo $(CurrentTypeList)
       ifstr(i) $($) == "free"
          set System = free
       else-ifstr(i) $($) == "checked"
          set System = checked
       endif
    EndForListDo

    CloseRegKey $(KeyHandle)
end_GetCheckedFree = +
    Return $(Status) $(System)


;-----------------------------------------------------------------------
; ROUTINE:      QueryOkCancel
;
; DESCRIPTION:  This routine lets the user query OK / Cancel giving OK as
;               default
;
; INPUTS:       $0:  MessageText.
;
; OUTPUTS:      $R0: STATUS:   STATUS_SUCCESSFUL |
;                              STATUS_NOLANGUAGE
;                              STATUS_FAILED
;
;               $R1: DLGEVENT: OK | CANCEL
;
;------------------------------------------------------------------------

[QueryOkCancel]

    set DlgText = $($0)
    read-syms QueryOKCancelDlg$(!STF_LANGUAGE)

    ui start "SetupMessage"
    ifstr(i) $(DLGEVENT) == "OK"
        set Status     = STATUS_SUCCESSFUL
        set UserAction = $(DLGEVENT)

    else-ifstr(i) $(DLGEVENT) == "CANCEL"
        set Status     = STATUS_SUCCESSFUL
        set UserAction = $(DLGEVENT)
    else
        set Status     = STATUS_FAILED
        set UserAction = "CANCEL"
    endif
    Return $(Status) $(UserAction)

[ProductType]
STF_PRODUCT  = Winnt
STF_PLATFORM = I386

;
; MEDIA AND FILE DESCRIPTIONS
;

[Source Media Descriptions]
    1  = "Update-Diskette 1 für Windows NT, Version 3.1"  , TAGFILE = disk1
    2  = "Update-Diskette 2 für Windows NT, Version 3.1"  , TAGFILE = disk2
    3  = "Update-Diskette 3 für Windows NT, Version 3.1"  , TAGFILE = disk3
    4  = "Update-Diskette 4 für Windows NT, Version 3.1"  , TAGFILE = disk4
    5  = "Update-Diskette 5 für Windows NT, Version 3.1"  , TAGFILE = disk5
    6  = "Update-Diskette 6 für Windows NT, Version 3.1"  , TAGFILE = disk6
    7  = "Update-Diskette 7 für Windows NT, Version 3.1"  , TAGFILE = disk7
    8  = "Update-Diskette 8 für Windows NT, Version 3.1"  , TAGFILE = disk8
    9  = "Update-Diskette 9 für Windows NT, Version 3.1"  , TAGFILE = disk9
    10 = "Update-Diskette 10 für Windows NT, Version 3.1" , TAGFILE = disk10

[Strings]
    String1 = "Diese Update-Diskette kann nicht auf dieser Plattform verwendet werden."
    String2 = "Setup konnte kein Update des Systems durchführen."
    String3 = "Setup hat das Update des Systems erfolgreich durchgeführt."
    String4 = "Sie besitzen keine Berechtigung, ein Update des Systems durchzuführen. Wenden Sie sich an Ihren Systemadministrator."
    String5 = "Setup konnte die aktualisierten Dateien nicht für sichere Operationen einrichten."
    String6 = "In Ihrem Computer konnte kein Diskettenlaufwerk gefunden werden. "+
              "Setup kann die Notfalldiskette nicht modifizieren."
    String7 = "Falls Sie bei der Installation von Windows NT eine Notfalldiskette "+
              "erstellt haben, legen Sie diese in Laufwerk "
    String10 =  " ein und wählen Sie 'OK', um die Notfalldiskette zu " +
                "aktualisieren. Falls die Notfalldiskette nicht auffindbar ist, " +
                "wählen sie 'Abbrechen'. Setup wird den Installationsvorgang dann fortsetzen."

    String8 = "Setup hat festgestellt, daß die installierte Version neuer ist als die, mit der "+
              "Sie aktualisieren wollen. Das Update kann dazu führen, daß "+
              "das System nicht mehr startbar ist. Wählen Sie 'OK', falls Sie dennoch fortsetzen "+
              "wollen, oder 'Abbrechen', um Setup zu beenden. "

; PLEASE NOTE:
    ; Change the language mentioned in variable String9 to the language
    ; you are localizing to.  That is if the localized language is German,
    ; the word English should be changed to deutsch.
    ;

    String9 = "Setup wird Ihr Windows NT-System mit der deutschen Version "+
              "des Update-Programms aktualisieren. Wählen Sie 'Abbrechen', "+
              "um den Vorgang zu beenden, oder 'OK', um fortzusetzen."

    String11 = "Setup kann die Datei SETUP.LOG nicht in Ihrem Windows-Verzeichnis finden. "+
               "Setup kann daher nicht mit dem Update des Systems fortfahren. Kopieren Sie "+
               "die Datei REPAIR.INF von der Notfalldiskette unter dem Namen SETUP.LOG in Ihr "+
               "Windows-Verzeichnis, und starten Sie das Update neu."
    String12 = "Setup hat Ihr System nicht aktualisiert. Falls Sie Ihr System aktualisieren "+
               "möchten, führen Sie das Update nochmals durch."

    String13a = "Es steht nicht genügend Festplattenspeicherplatz zur Verfügung. "+
                "Zur Ausführung des Setups muß mindestens "
    String13b = " MB freier Speicherplatz auf "
    String13c = " vorliegen. Löschen Sie einige Dateien und "+
                "führen Sie das Update erneut durch."

    String14  = "Setup konnte Ihre Windows NT-Dateien nicht aktualisieren, da der "+
                "Produkttyp nicht bestimmt werden konnte. Die Registrierung ist möglicherweise beschädigt."

    String15  = "Setup konnte Ihr System nicht aktualisieren. Die Aktualisierung kann nur für ein im "+
                "Handel verkauftes System durchgeführt werden."

    Billboard1 = "Bitte warten Sie..."
    Billboard2 = "Bitte warten Sie, bis die zu aktualisierenden Dateien bestimmt worden sind..."
    Billboard3 = "Bitte warten Sie, bis die Notfalldiskette aktualisiert worden ist..."

[ProgressCopyENG]
    ProCaption   = "Windows NT-Setup"
    ProCancel    = "Abbrechen"
    ProCancelMsg = "Die Dateien von Windows NT, Version 3.1, sind nicht vollständig aktualisiert. "+
                   "Sind Sie sicher, daß Sie den Kopiervorgang abbrechen wollen?"
    ProCancelCap = "Setup-Meldung"
    ProText1     = "Kopiert:"
    ProText2     = "Nach:"


[SetupDoneDlgENG]
    Caption     = "Windows NT-Setup"
    DlgText     = "Windows NT, Version 3.1, wurde aktualisiert. Falls "+
                  "Sie Systemkomponenten ändern oder hinzufügen, müssen Sie die "+
                  "Aktualisierung erneut ausführen."$(!LF)$(!LF)+
                  "Nehmen Sie die Disketten aus den Diskettenlaufwerken, und wählen "+
                  "Sie 'Neu starten', um das aktualisierte System auszuführen."
    Reboot      = "&Neu starten"
    Windows     = "&Zurück zu Windows NT"
    DlgType     = "Info"
    DlgTemplate = "REBOOT"

[QueryOKCancelDlgENG]
    STF_MB_TITLE = "Setup-Meldung"

    ;no translation needed after this

    DlgType      = "MessageBox"
    STF_MB_TEXT  = $(DlgText)
    STF_MB_TYPE  = 2
    STF_MB_ICON  = 4
    STF_MB_DEF   = 1
