home *** CD-ROM | disk | FTP | other *** search
/ Castle Explorer / DKMMCAST.iso / pc / dksetup / win32s.inc < prev   
Text File  |  1996-08-07  |  25KB  |  669 lines

  1. '**************************************************************************
  2. '*                  MS Test script for Win32s setup program
  3. '**************************************************************************
  4.  
  5. ''GetTempFileName flags
  6. CONST TF_FORCEDRIVE            = 128
  7.  
  8. GLOBAL DEST32S$      ''Windows\System\Win32s directory
  9. GLOBAL DESTFREE$     ''Freecell directory
  10. GLOBAL OLE_PROTECT%  ''Indicates whether ole2 dlls were protected from being
  11.                      '' copied.
  12. GLOBAL OLE_OLEBOOT%
  13. GLOBAL VERNUM$       '' Win32s Version Number (i.e., for v1.25 VERNUM$="125"
  14.  
  15. DECLARE SUB InstallW32s(OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%)
  16. DECLARE SUB RecoverFromCopy(szFileName$)
  17. DECLARE SUB UpdateSystemIni
  18. DECLARE FUNCTION RebootSystem(OLEONLY%) AS INTEGER
  19. DECLARE FUNCTION MakeSystemIni LIB "INIUPD.DLL" (arg1$, arg2$) AS INTEGER
  20. 'DECLARE FUNCTION OnWindowsNT LIB "INIUPD.DLL" AS INTEGER
  21. DECLARE FUNCTION PagingEnabled LIB "INIUPD.DLL" AS INTEGER
  22. DECLARE FUNCTION ShareEnabled LIB "INIUPD.DLL" AS INTEGER
  23. DECLARE FUNCTION IsWin32sLoaded LIB "INIUPD.DLL" (arg1$) AS INTEGER
  24. DECLARE FUNCTION IsRunningApp LIB "INIUPD.DLL" AS INTEGER
  25. 'DECLARE FUNCTION SetCuiFlags LIB "MSCUISTF.DLL" (arg1%, arg2%) AS INTEGER
  26. DECLARE FUNCTION GetModuleHandle LIB "KRNL386.EXE" (arg1$) AS INTEGER
  27. DECLARE FUNCTION LoadLibrary LIB "KRNL386.EXE" (arg1$) AS INTEGER
  28. DECLARE SUB FreeLibrary LIB "KRNL386.EXE" (arg1%)
  29. DECLARE FUNCTION SetErrorMode LIB "KRNL386.EXE" (arg1%) AS INTEGER
  30.  
  31. DECLARE FUNCTION GetTempFileName LIB "KRNL386.EXE" (drive%, prefix$, u%, filename$) AS INTEGER
  32. DECLARE SUB WriteLine LIB "INIUPD.DLL" (filename$, text$)
  33. DECLARE FUNCTION GetTempFileAt(szDir$, szPrefix$) as string
  34. '
  35. '------------------------------------------------------------------------------
  36. '
  37.     szOldVer$ ="1.00.000     "          '' Reserve space in string for version
  38.     WIN32ENABLED% = 0
  39.     OLEONLY% = 0
  40.     OLE2_16% = 0
  41.     OLE2AUTO_16% = 0
  42.     OLE16RUNAPP% = 0
  43.     OLE_PROTECT% = 0
  44.     OLE_OLEBOOT% = 0
  45.  
  46. 'Start in DKSETUP.MST NOT HERE!!!
  47.     goto init
  48.  
  49. InstallWin32s:
  50. '    ON ERROR GOTO ERRNORMAL
  51.  
  52.     WIN32SVER$ = MID$(GetSectionKeyVersion("WindowsSystem", "win32s16"), 1, 4)
  53. '    SetTitle "Microsoft Win32s version " + WIN32SVER$ + " Setup Program"
  54.     VERNUM$ = MID$(WIN32SVER$, 1, 1) + MID$(WIN32SVER$, 3 , 2)
  55.  
  56.     DEST32S$ = szWinSysPath + "WIN32S\"
  57.  
  58. '$IFDEF DEBUG
  59.     i% = SetSizeCheckMode(scmOnIgnore)    '' could use scmOff; def = scmOnFatal
  60.     WinDrive$ = MID$(GetWindowsDir, 1, 1)
  61.     IF IsDriveValid(WinDrive$) = 0 THEN
  62.         i% = DoMsgBox("Windows drive ('"+WinDrive$+"') is not a valid drive.", "DEBUG", MB_TASKMODAL+MB_ICONHAND+MB_OK)
  63.         GOTO QUITW32S
  64.     END IF
  65. '$ENDIF ''DEBUG
  66.  
  67. CHECKW32S:
  68.     '' Check that we are not running on Chicago, including pre-released
  69.     '' Chicago versions.
  70.     IF GetWindowsMajorVersion * 100 + GetWindowsMinorVersion > 350 THEN
  71.         ExitCode% = EXITSUCCESS
  72.         WIN32ENABLED% = 1
  73. '        GOTO FREECELL
  74.     END IF
  75.     IF GetWindowsMode < 2  THEN
  76.         IF OnWindowsNT() THEN
  77.             ExitCode% = DLG__EXITFAILNOTINTEL '' Running on Windows NT (on RISC)
  78.         ELSE
  79.             ExitCode% = DLG_EXITFAILNOTENH   '' Standard Mode Windows
  80.         END IF
  81.         GOTO QUITW32S
  82.     END IF
  83.     IF OnWindowsNT() THEN
  84. '****************************************************************************************************************************************
  85. '****************************************************************************************************************************************
  86. 'For debugging...
  87. '        dButton = DoMsgBox("This is windows NT", szMsgCaption$, MB_OK+MB_TASKMODAL+MB_ICONINFORMATION)
  88. '****************************************************************************************************************************************
  89. '****************************************************************************************************************************************
  90.  
  91.         ExitCode% = EXITSUCCESS
  92.         WIN32ENABLED% = 1
  93. '        GOTO FREECELL
  94. '****************************************************************************************************************************************
  95. '****************************************************************************************************************************************
  96. 'For debugging...
  97.     else
  98. '        dButton = DoMsgBox("This is NOT windows NT", szMsgCaption$, MB_OK+MB_TASKMODAL+MB_ICONINFORMATION)
  99. '****************************************************************************************************************************************
  100. '****************************************************************************************************************************************
  101.  
  102.     END IF
  103.     ExitCode% = EXITSUCCESS
  104.  
  105. ' Stupid place to put this! So I've moved to after we have decided if
  106. ' they already have win32s or not..
  107. '    If IsRunningApp() <> 0 THEN
  108. '        ExitCode% = DLG_EXITFAILRUNAPP
  109. '        GOTO QUITW32S
  110. '    END IF
  111.  
  112.     '' Get version of Win32s to be installed from version info in INF file
  113.     szNewVer$ = GetSectionKeyVersion("WindowsSystem", "win32s16")
  114.  
  115.     '' See if OLE is included.
  116.  
  117.     OLEINCLUDED% = DoesFileExist( szSrcBinPath + "\OLE2THK.DL_", femExists )
  118.  
  119.     IF OLEINCLUDED% = 1 THEN
  120.         '' See whether one of the OLE 16 bit components is loaded.
  121.         IF GetModulehandle("compobj") <> 0 THEN
  122.             OLE16RUNAPP% = 1
  123.             GOTO GetOleVersion
  124.         END IF
  125.         IF GetModuleHandle("ole2") <> 0 THEN
  126.             OLE16RUNAPP% = 1
  127.             GOTO GetOleVersion
  128.         END IF
  129.         IF GetModuleHandle("ole2prox") <> 0 THEN
  130.             OLE16RUNAPP% = 1
  131.             GOTO GetOleVersion
  132.         END IF
  133.         IF GetModuleHandle("ole2conv") <> 0 THEN
  134.             OLE16RUNAPP% = 1
  135.             GOTO GetOleVersion
  136.         END IF
  137.         IF GetModuleHandle("storage") <> 0 THEN
  138.             OLE16RUNAPP% = 1
  139.             GOTO GetOleVersion
  140.         END IF
  141.         IF GetModuleHandle("ole2nls") <> 0 THEN
  142.             OLE16RUNAPP% = 1
  143.             GOTO GetOleVersion
  144.         END IF
  145.         IF GetModuleHandle("ole2disp") <> 0 THEN
  146.             OLE16RUNAPP% = 1
  147.             GOTO GetOleVersion
  148.         END IF
  149.         IF GetModuleHandle("typelib") <> 0 THEN
  150.             OLE16RUNAPP% = 1
  151.             GOTO GetOleVersion
  152.         END IF
  153.  
  154. GetOleVersion:
  155.         szOleNewVer$ = GetSectionKeyVersion("OleWindowsSystemWin32s", "ole2thk")
  156.  
  157.         '' Get version of currently installed OLE32 from version info of
  158.         '' ole2thk file
  159.         szOleOldVer$ = GetVersionOfFile( szWinSysPath + "WIN32S\OLE2THK.DLL" )
  160.  
  161.         szOle16OldVer$ = GetVersionOfFile( szWinSysPath + "COMPOBJ.DLL" )
  162.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "compobj")
  163.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  164.             OLE2_16% = 1
  165.         END IF
  166.  
  167.         szOle16OldVer$ = GetVersionOfFile( szWinSysPath + "OLE2.DLL" )
  168.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2")
  169.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  170.             OLE2_16% = 1
  171.         END IF
  172.  
  173.         szOle16OldVer$ = GetVersionOfFile( szWinSysPath + "OLE2PROX.DLL" )
  174.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2prox")
  175.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  176.             OLE2_16% = 1
  177.         END IF
  178.  
  179.         szOle16OldVer$ = GetVersionOfFile( szWinSysPath + "STORAGE.DLL" )
  180.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "storage")
  181.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  182.             OLE2_16% = 1
  183.         END IF
  184.  
  185.         szOle16OldVer$ = GetVersionOfFile( szWinSysPath + "OLE2CONV.DLL" )
  186.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2conv")
  187.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  188.             OLE2_16% = 1
  189.         END IF
  190.  
  191.         szOle16OldVer$ = GetVersionOfFile( szWinSysPath + "OLE2NLS.DLL" )
  192.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2nls")
  193.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  194.             OLE2AUTO_16% = 1
  195.         END IF
  196.  
  197.         szOle16OldVer$ = GetVersionOfFile( szWinSysPath + "OLE2DISP.DLL" )
  198.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2disp")
  199.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  200.             OLE2AUTO_16% = 1
  201.         END IF
  202.  
  203.         szOle16OldVer$ = GetVersionOfFile( szWinSysPath + "TYPELIB.DLL" )
  204.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "typelib")
  205.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  206.             OLE2AUTO_16% = 1
  207.         END IF
  208.  
  209.     END IF
  210.  
  211.     OLE2_32% = OLEINCLUDED%
  212.  
  213.     '' Check if Win32s is partially installed
  214.     sz$ = GetIniKeyString (szWinSysPath + "WIN32S.INI", "Win32s", "Setup")
  215.     '' If WIN32S.INI specifies Win32s Setup=0, then force complete Win32s file overwrite
  216.     IF sz$ = "0" THEN
  217.         GOTO INSTW32S
  218.     END IF
  219.     '' If WIN32S.INI is missing, try and reinstall Win32s files/recreate WIN32S.INI
  220.     IF sz$ <> "1" THEN
  221.         GOTO INSTW32S
  222.     END IF
  223.  
  224.     '' If Win32s is already installed, get running version number
  225.     i% = DoesFileExist( szWinSysPath + "W32SYS.DLL", femExists )
  226.     IF i% = 1 THEN
  227.         i% = IsWin32sLoaded( szOldVer$ )
  228.     ENDIF
  229.  
  230.     IF i% = 0 THEN
  231.         GOTO INSTW32S
  232.     END IF
  233.  
  234.     IF szNewVer$ > szOldVer$ THEN
  235.         GOTO INSTW32S
  236.     END IF
  237.  
  238.     IF OLEINCLUDED% = 1 THEN
  239.  
  240.         OLE2_32% = 0
  241.  
  242.         IF (szNewVer$ = szOldVer$) OR (szNewVer$ < szOldVer$) THEN
  243.             '' Compare OLE32 version and versions of each of OLE16 libraries.
  244.             sz$ = GetIniKeyString (szWinSysPath + "WIN32S.INI", "OLE", "Setup")
  245.             '' If WIN32S.INI specifies OLE2 Setup=0, then force OLE2 file overwrite
  246.             IF ((sz$ <> "1") OR (szOleNewVer$ > szOleOldVer$)) THEN
  247.                 OLEONLY% = 1
  248.                 OLE2_32% = 1
  249.                 GOTO INSTW32S
  250.             END IF
  251.  
  252.             IF OLE2_16% OR OLE2AUTO_16 THEN
  253.                 OLEONLY% = 1
  254.                 GOTO INSTW32S
  255.             END IF
  256.  
  257.         END IF
  258.  
  259.     END IF
  260.  
  261.     WIN32ENABLED% = 1
  262. '    GOTO FREECELL
  263.     GOTO QUITW32S
  264.  
  265. INSTW32S:
  266.     ' Check for already running 32 bit apps
  267.     If IsRunningApp() <> 0 THEN
  268.         ExitCode% = DLG_EXITFAILRUNAPP
  269.         GOTO QUITW32S
  270.     END IF
  271.  
  272. '    i% = SetCuiFlags(OLEONLY%, OLE16RUNAPP%)
  273.     sz$ = UIStartDlg(CUIDLL_FILENAME, DLG_NEEDSWIN32S, "FInfoDlgProc", 0, "")
  274.     IF sz$ = "CONTINUE" THEN
  275.         UIPop 1
  276.     ELSE
  277.         UIPop 1
  278.         AskQuit
  279.         goto INSTW32S
  280.     END IF
  281.  
  282.  
  283. GETWIN32SPATH:
  284.     IF PagingEnabled() = 0 THEN
  285.         i% = DoMsgBox("Use the Control Panel 386 Enhanced icon and configure Windows using the Virtual Memory option.", "Win32s requires Virtual Memory", MB_TASKMODAL+MB_ICONHAND+MB_OK)
  286.         ExitCode% = DLG_EXITFAILURE '' Enhanced mode but not paging
  287.         GOTO QUITW32S
  288.     END IF
  289.  
  290.     IF ShareEnabled() = 0 THEN
  291.         i% = DoMsgBox( "File-sharing must be enabled. Run SHARE.EXE before starting Windows or add SHARE.EXE to your AUTOEXEC.BAT file.", "Win32s Setup: SHARE.EXE is not loaded", MB_TASKMODAL+MB_ICONEXCLAMATION+MB_OK)
  292.     END IF
  293.  
  294. '    SetSymbolValue "EditTextIn", szWinSysPath
  295. '    SetSymbolValue "EditFocus", "END"
  296.  
  297. 'GETPATHL1:
  298. '    sz$ = UIStartDlg(CUIDLL_FILENAME, DLG_VERPATH, "FDispDlgProc", 0, "")
  299. '
  300. '    IF sz$ = "CONTINUE" THEN
  301. '        IF IsDirWritable(szWinSysPath) = 0 THEN
  302. '            BadPath
  303. '            GOTO GETPATHL1
  304. '        END IF
  305. '        UIPop 1
  306. '    ELSEIF sz$ = "REACTIVATE" THEN
  307. '        UIPop 1
  308. '        GOTO GETPATHL1
  309. '    ELSEIF sz$ = "BACK" THEN
  310. '        UIPop 1
  311. '        GOTO INSTW32S
  312. '    ELSE
  313. '        UIPop 1
  314. '        AskQuit
  315. '        GOTO GETPATHL1
  316. '    END IF
  317.  
  318. COPYFILES:
  319.     IF OLEONLY% = 0 THEN
  320.         CreateIniKeyValue szWinSysPath + "WIN32S.INI", "Win32s", "Setup", "0", cmoOverwrite
  321.     END IF
  322.     IF OLE2_32% = 1 THEN
  323.         CreateIniKeyValue szWinSysPath + "WIN32S.INI", "OLE", "Setup", "0", cmoOverwrite
  324.     END IF
  325.  
  326.     '' Indicate Win32s install failure until all files known to be copied.
  327.     ExitCode% = DLG_EXITFAILURE
  328.     ERR = 0
  329.     CreateDir DEST32S$, cmoNone
  330.     InstallW32s OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%
  331.     UpdateSystemIni
  332.     '' Terminate if unhandled fatal error
  333.     IF ERR <> 0 THEN
  334.     GOTO QUITW32S
  335.     END IF
  336.  
  337.     IF OLEONLY% = 0 THEN
  338.         CreateIniKeyValue szWinSysPath + "WIN32S.INI", "Win32s", "Setup", "1", cmoOverwrite
  339.         CreateIniKeyValue szWinSysPath + "WIN32S.INI", "Win32s", "Version", szNewVer$, cmoOverwrite
  340.         CreateIniKeyValue szWinSysPath + "WIN32S.INI", "Nls", "AnsiCP", "1252", cmoOverwrite
  341.     END IF
  342.     IF OLE2_32% = 1 THEN
  343.         CreateIniKeyValue szWinSysPath + "WIN32S.INI", "OLE", "Setup", "1", cmoOverwrite
  344.         CreateIniKeyValue szWinSysPath + "WIN32S.INI", "OLE", "Version", szOleNewVer, cmoOverwrite
  345.     END IF
  346.  
  347. '    i% = DoMsgBox("Win32s files successfully installed.", "Microsoft Win32s Setup", MB_OK+MB_TASKMODAL)
  348.     '' Indicate Win32s correctly copied and installed.
  349.     ExitCode% = EXITSUCCESS
  350.  
  351. FREECELL:
  352.     IF OLEONLY% = 1 THEN
  353.         GOTO QUITW32S
  354.     ENDIF
  355. '    IF WIN32ENABLED% = 1 THEN
  356. '        sz$ = UIStartDlg(CUIDLL_FILENAME, DLG_FREECELLINSTNOWIN32S, "FInfoDlgProc",0, "")
  357. '    ELSE
  358.         sz$ = UIStartDlg(CUIDLL_FILENAME, DLG_FREECELLINST, "FInfoDlgProc",0, "")
  359. '    END IF
  360.     UIPop 1
  361.     IF sz$ <> "CONTINUE" THEN
  362.         GOTO QUITW32S
  363.     END IF
  364.  
  365. GETFREEPATH:
  366.     DESTFREE$ = MID$(szWinSysPath,1,3) + "WIN32APP\FREECELL\"
  367.     SetSymbolValue "EditTextIn", DESTFREE$
  368.     SetSymbolValue "EditFocus", "END"
  369.  
  370. 'GETFREEPATHL1:
  371. '    sz$ = UIStartDlg(CUIDLL_FILENAME, DLG_FREECELLPATH, "FEditDlgProc", HELPFREECELL, PROCHELP)
  372.  
  373. '    IF sz$ = "CONTINUE" THEN
  374. '        DESTFREE$ = GetSymbolValue("EditTextOut")
  375.  
  376. '        IF MID$(DESTFREE$, LEN(DESTFREE$), 1) <> "\" THEN
  377. '            DESTFREE$ = DESTFREE$ + "\"
  378. '        END IF
  379. '        ''Validate new path.
  380. '        IF IsDirWritable(DESTFREE$) = 0 THEN
  381. '            BadPath
  382. '            GOTO GETFREEPATHL1
  383. '        END IF
  384. '        UIPop 1
  385. '
  386. '        GOTO COPYFREECELL
  387. '    ELSEIF sz$ = "REACTIVATE" THEN
  388. '        GOTO GETFREEPATHL1
  389. '    ELSEIF sz$ = "EXIT" THEN
  390. '        UIPop 1
  391. '        GOTO QUITW32S
  392. '    END IF
  393.  
  394. COPYFREECELL:
  395.     ClearCopyList
  396.     CreateDir DESTFREE$, cmoNone
  397.  
  398.     ERR = 0
  399.     AddSectionFilesToCopyList "Win32appFreecell", szSrcBinPath, DESTFREE$
  400.     CopyFilesInCopyList
  401.     '' If error copying FreeCell, not a fatal error. Win32s is already installed.
  402.     IF ERR <> 0 THEN
  403.     ERR = 0
  404.     GOTO QUITW32S
  405.     END IF
  406.     ERR = 0
  407.  
  408.     IF DoesFileExist( szWinSysPath + "WIN32S.INI", femExists ) THEN
  409.     CreateIniKeyValue szWinSysPath + "WIN32S.INI", "Freecell", "Setup", "1", cmoOverwrite
  410.     CreateIniKeyValue szWinSysPath + "WIN32S.INI", "Freecell", "Version", szNewVer$, cmoOverwrite
  411.     END IF
  412.  
  413.     ERR = 0
  414.     CreateProgmanGroup "Win32 Applications", "", cmoNone
  415.     ShowProgmanGroup   "Win32 Applications", 1, cmoNone
  416.     CreateProgmanItem  "Win32 Applications", "Freecell", DESTFREE$ + "FREECELL.EXE", "", cmoOverwrite
  417.     '' Only put up success dialog if icon added to group
  418.     IF ERR = 0 THEN
  419. '    i% = DoMsgBox("Freecell was successfully installed.", "Freecell Setup", MB_OK+MB_TASKMODAL)
  420.     END IF
  421.     ERR = 0
  422.  
  423.     ' Exit back to normal setup
  424.     goto FinishedWin32s
  425.  
  426. QUITW32S:
  427.     ' Exit back to normal setup
  428.     goto FinishedWin32s
  429.  
  430.     '' Install error handler for final message box routines
  431. '    ON ERROR GOTO ERRQUIT
  432.     IF ERR = 0 THEN
  433.         dlg% = ExitCode%
  434.     ELSEIF ERR = STFQUIT THEN
  435.         IF (OLE_PROTECT% = 1) THEN
  436.             '' Free all previously loaded libraries
  437.             FreeLibrary GetModuleHandle("compobj")
  438.             FreeLibrary GetModuleHandle("ole2")
  439.             FreeLibrary GetModuleHandle("ole2prox")
  440.             FreeLibrary GetModuleHandle("ole2conv")
  441.             FreeLibrary GetModuleHandle("storage")
  442.             FreeLibrary GetModuleHandle("ole2nls")
  443.             FreeLibrary GetModuleHandle("ole2disp")
  444.             FreeLibrary GetModuleHandle("typelib")
  445.         END IF
  446.         dlg% = EXITQUIT
  447.         ExitCode% = EXITQUIT
  448.     ELSE
  449.         dlg% = DLG_EXITFAILURE
  450.         ExitCode% = EXITQUIT
  451.     END IF
  452.  
  453. QUITL1:
  454.     IF WIN32ENABLED% = 1 THEN
  455.         UIPop 1
  456.         ' Exit back to normal setup
  457.         goto FinishedWin32s
  458. '        END
  459.     END IF
  460.  
  461.     sz$ = UIStartDlg(CUIDLL_FILENAME, dlg%, "FInfo0DlgProc", 0, "")
  462.     IF sz$ = "REACTIVATE" THEN
  463.         GOTO QUITL1
  464.     END IF
  465.     UIPop 1
  466.  
  467.     IF ExitCode% = EXITSUCCESS THEN
  468.         IF RebootSystem(OLEONLY% and not OLE_OLEBOOT%) = 0 THEN
  469.             CreateIniKeyValue szWinSysPath + "WIN32S.INI", "Win32s", "Setup", "0", cmoOverwrite
  470.             IF OLE2_32% = 1 THEN
  471.                 CreateIniKeyValue szWinSysPath + "WIN32S.INI", "OLE", "Setup", "0", cmoOverwrite
  472.             END IF
  473.             i% = DoMsgBox("Win32s is not properly configured and Win32s Setup must be run again.", "Unable to Restart Windows", MB_ICONEXCLAMATION+MB_OK+MB_TASKMODAL)
  474.         END IF
  475.     ENDIF
  476.  
  477.     ' Exit back to normal setup
  478.     goto FinishedWin32s
  479. '    END
  480.  
  481. '' Fatal error handler for error message routine
  482. ERRQUIT:
  483.     i% = DoMsgBox("Win32s Setup sources were corrupted!", "Setup Message", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  484.     ' Exit back to normal setup
  485.     goto FinishedWin32s
  486. '    END
  487.  
  488. '' Bypass run-time errors. Let final dialog box display fatal error message.
  489. ERRNORMAL:
  490.     '' Check if user cancelled setup
  491.     IF ERR = STFQUIT THEN
  492.     GOTO QUITW32S
  493.     END IF
  494.     RESUME NEXT
  495.  
  496. '**
  497. '** Purpose:
  498. '**     Builds the copy list and performs all installation operations.
  499. '** Arguments:
  500. '**     none.
  501. '** Returns:
  502. '**     none.
  503. '*************************************************************************
  504. SUB InstallW32s(OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%) STATIC
  505.  
  506.     '' Use file layout sections that specify OLDER file version/time check
  507.     IF OLEONLY% = 0 THEN
  508.         AddSectionFilesToCopyList "WindowsSystem", szSrcBinPath, szWinSysPath
  509.         AddSectionFilesToCopyList "WindowsSystemWin32s", szSrcBinPath, szWinSysPath + "WIN32S\"
  510.         '' Add obsolete files to be removed
  511.         AddSectionFilesToCopyList "Win32sSystemObsoleteFiles", szSrcBinPath, szWinSysPath + "WIN32S\"
  512.     END IF
  513.  
  514.     OLE_PROTECT% = 0
  515.     OLEINCLUDED% = DoesFileExist( szSrcBinPath + "\OLE2THK.DL_", femExists )
  516.     if OLEINCLUDED% = 1 THEN
  517.         IF (OLE2_16% = 1) OR (OLE2AUTO_16% = 1) THEN
  518.             IF OLE16RUNAPP% = 1 THEN
  519.                 '' Force all OLE2 DLLS to be copied during reboot.
  520.                 i% = SetErrorMode(-32768)
  521.                 i% = LoadLibrary(szWinSysPath + "compobj.dll")
  522.                 i% = LoadLibrary(szWinSysPath + "ole2.dll")
  523.                 i% = LoadLibrary(szWinSysPath + "ole2prox.dll")
  524.                 i% = LoadLibrary(szWinSysPath + "ole2conv.dll")
  525.                 i% = LoadLibrary(szWinSysPath + "storage.dll")
  526.                 i% = LoadLibrary(szWinSysPath + "ole2nls.dll")
  527.                 i% = LoadLibrary(szWinSysPath + "ole2disp.dll")
  528.                 i% = LoadLibrary(szWinSysPath + "typelib.dll")
  529.                 OLE_PROTECT% = 1
  530.             END IF
  531.             AddSectionFilesToCopyList "OleWindowsSystem", szSrcBinPath, szWinSysPath
  532.         END IF
  533.         IF OLE2_32% = 1 THEN
  534.             AddSectionFilesToCopyList "OleWindowsSystemWin32s", szSrcBinPath, szWinSysPath + "WIN32S\"
  535.         END IF
  536.         IF (OLE2_16% = 1) OR (OLE2_32% = 1) OR (OLE2AUTO_16% = 1) THEN
  537.             AddSectionFilesToCopyList "Ole2RegWindowsSystem", szSrcBinPath, szWinSysPath
  538.         END IF
  539.         IF (OLE2AUTO_16% = 1) THEN
  540.             AddSectionFilesToCopyList "StdoleWindowsSystem", szSrcBinPath, szWinSysPath
  541.             IF (OLE16RUNAPP and DoesFileExist(szWinSysPath + "stdole.tlb", femExists) ) THEN
  542.                 ' copy stdole.tlb -> tempfile1
  543.                 stdole1$ = szWinSysPath + GetTempFileAt(szWinSysPath, "STD")
  544.                 CopyFile szWinSysPath+"STDOLE.TLB", stdole1$, cmoOverwrit, 0
  545.                 OLE_OLEBOOT% = 1
  546.             ENDIF
  547.         END IF
  548.     END IF
  549.  
  550.     SetRestartDir GetWindowsDir()
  551.  
  552.     CopyFilesInCopyList
  553.  
  554.     bInstalledWin32s = 1
  555.  
  556.     IF (OLEINCLUDED% = 1) THEN
  557.         RecoverFromCopy szWinSysPath + "compobj.dll"
  558.         RecoverFromCopy szWinSysPath + "ole2.dll"
  559.         RecoverFromCopy szWinSysPath + "ole2prox.dll"
  560.         RecoverFromCopy szWinSysPath + "ole2conv.dll"
  561.         RecoverFromCopy szWinSysPath + "storage.dll"
  562.         RecoverFromCopy szWinSysPath + "ole2nls.dll"
  563.         RecoverFromCopy szWinSysPath + "ole2disp.dll"
  564.         RecoverFromCopy szWinSysPath + "typelib.dll"
  565.     END IF
  566.  
  567.     IF (OLE_PROTECT% = 1) THEN
  568.         '' Free all previously loaded libraries
  569.         FreeLibrary GetModuleHandle("compobj")
  570.         FreeLibrary GetModuleHandle("ole2")
  571.         FreeLibrary GetModuleHandle("ole2prox")
  572.         FreeLibrary GetModuleHandle("ole2conv")
  573.         FreeLibrary GetModuleHandle("storage")
  574.         FreeLibrary GetModuleHandle("ole2nls")
  575.         FreeLibrary GetModuleHandle("ole2disp")
  576.         FreeLibrary GetModuleHandle("typelib")
  577.         OLE_PROTECT% = 0
  578.     END IF
  579.     IF (OLE_OLEBOOT% = 1) THEN
  580.             'rename new stdole.tlb -> tempfile2
  581.             stdole2$ = GetTempFileAt(szWinSysPath, "STD")
  582.             RemoveFile szWinSysPath+stdole2$, cmoForce
  583.             RenameFile szWinSysPath+"STDOLE.TLB" , stdole2$
  584.             'rename tempfile1 -> stdole.tlb
  585.             RenameFile stdole1$, "STDOLE.TLB"
  586.             'write to _mssetup.bat: rename tempfile2 to stdole.tlb
  587.             WriteLine szWinPath+"_MSSETUP.BAT", ""
  588.             WriteLine szWinPath+"_MSSETUP.BAT", "DEL "+szWinSysPath+"STDOLE.TLB"
  589.             WriteLine szWinPath+"_MSSETUP.BAT", "REN "+szWinSysPath+stdole2$+" STDOLE.TLB"
  590.     ENDIF
  591.     IF OLEINCLUDED% AND (OLE2_16% OR OLE2_32% OR OLE2AUTO_16%) THEN
  592.         IF OLE16RUNAPP% THEN
  593.             reg1$ = szWinPath + GetTempFileAt(szWinPath, "REG")
  594.             CopyFile szWinPath+"REG.DAT", reg1$, cmoOverwrit, 0
  595.         ENDIF
  596.  
  597.         RUN "regedit /s " + szWinSysPath + "ole2.reg"
  598.  
  599.         IF OLE16RUNAPP% THEN
  600.             reg2$ = GetTempFileAt(szWinPath, "REG")
  601.             RemoveFile szWinPath + reg2$, cmoForce
  602.             RenameFile szWinPath + "REG.DAT" , reg2$
  603.             'rename tempfile1 -> reg.dat
  604.             RenameFile reg1$, "REG.DAT"
  605.             'write to _mssetup.bat: rename tempfile2 to reg.dat
  606.             WriteLine szWinPath+"_MSSETUP.BAT", ""
  607.             WriteLine szWinPath+"_MSSETUP.BAT", "DEL "+szWinPath+"REG.DAT"
  608.             WriteLine szWinPath+"_MSSETUP.BAT", "REN "+szWinPath + reg2$+" REG.DAT"
  609.             OLE_OLEBOOT% = 1
  610.         ENDIF
  611.     END IF
  612. END SUB
  613.  
  614. SUB UpdateSystemIni STATIC
  615.  
  616.     VxDPath$ = DEST32S$ + "W32S.386"
  617.     SystemIniPath$ = GetWindowsDir()
  618.  
  619.     t% = MakeSystemIni(SystemIniPath$, VxdPath$)
  620.  
  621. END SUB
  622.  
  623. FUNCTION RebootSystem(OLEONLY%) STATIC AS INTEGER
  624.  
  625. '   Check if any files were locked during install.  If the RestartList
  626. '   is not empty, ExitExecRestart() will restart Windows, cleanup setup
  627. '   files, and copy over locked files before Windows restarts.
  628.     i% = RestartListEmpty()
  629.     IF i% = 0 THEN
  630. '      ExitExecRestart() only returns if applications refuse to be shutdown.
  631. '      Win32s is installed but will not operate until Windows is restarted
  632. '      and the Win32s VxD is loaded.
  633.        i% = ExitExecRestart()
  634.        RebootSystem = 0
  635.     ELSE
  636. '      If the RestartList list is empty, it is necessary to restart windows
  637. '      directly.  The MSSETUP program creates _MSRSTRT.EXE and _MSSETUP.BAT
  638. '      in the restart directory.  This program should be exec'd to handle
  639. '      proper MSSETUP cleanup (temp files) and restart Windows.
  640.        IF (OLEONLY% = 1) THEN
  641.            RebootSystem = 1
  642.        ELSE
  643.            i% = ExitWindowsExec( GetWindowsDir() + "_MSRSTRT.EXE", "_MSSETUP.BAT" )
  644.            RebootSystem = 0
  645.        END IF
  646.     ENDIF
  647.  
  648. END FUNCTION
  649.  
  650. FUNCTION GetTempFileAt(szDir$, szPrefix$) STATIC AS STRING
  651.     szCurDir$ = CURDIR$
  652.     CHDIR szDir$ + "."
  653.     szTempFile$ = STRING$(144, "E")
  654.     i% = GetTempFileName(TF_FORCEDRIVE, szPrefix$,0, szTempFile$)
  655.     CHDIR szCurDir$
  656.     GetTempFileAt = MID$(szTempFile$,3)
  657. END FUNCTION
  658.  
  659. SUB RecoverFromCopy(szFileName$) STATIC
  660.     IF DoesFileExist(szFileName$, femExist) = 0 THEN
  661.         szBackFile$ = MID$(szFileName$, 1, LEN(szFileName$)-3) + VERNUM$
  662.         IF DoesfileExist(szBackFile$, femExist) = 0 THEN
  663.             i% = DoMsgBox("ERROR: Could not find backup file "+szBackfile$, "Setup Error", MB_ICONEXLAMATION + MB_OK)
  664.         ELSE
  665.             CopyFile szBackFile$, szFileName$, cmoTimeStamp, 0
  666.         END IF
  667.     END IF
  668. END SUB
  669.