home *** CD-ROM | disk | FTP | other *** search
/ PC Shareware 1997 June / PC_Shareware-1997-06.iso / programy / genesis / 32sinst.mst < prev    next >
Encoding:
Text File  |  1996-08-20  |  28.1 KB  |  827 lines

  1. '**************************************************************************
  2. '*                  MS Test script for Win32s setup program
  3. '**************************************************************************
  4.  
  5. '' $DEFINE DEBUG  ''Define for script development/debugging
  6.  
  7. '$INCLUDE 'setupapi.inc'
  8. '$INCLUDE 'msdetect.inc'
  9.  
  10. ''Dialog ID's
  11. CONST WELCOME                  = 100
  12. CONST ASKQUIT                  = 200
  13. CONST DESTPATH                 = 300
  14. CONST EXITFAILURE              = 400
  15. CONST EXITQUIT                 = 600
  16. CONST EXITSUCCESS              = 700
  17. CONST OPTIONS                  = 800
  18. CONST BADPATH                  = 6400
  19.  
  20. CONST HELPWELCOME              = 1000
  21. CONST VERPATH                  = 1100
  22. CONST EXITFAILNOTWIN31         = 1200
  23. CONST EXITFAILNOTENH           = 1300
  24. CONST EXITFAILNOTPAGING        = 1325
  25. CONST EXITFAILNOTINTEL         = 1350
  26. CONST EXITFAILRUNAPP           = 1360
  27. CONST FREECELLINST             = 1400
  28. CONST FREECELLINSTNOWIN32S     = 1450
  29. CONST FREECELLPATH             = 1500
  30. CONST HELPFREECELL             = 1600
  31.  
  32.  
  33. ''Bitmap ID
  34. CONST LOGO = 1
  35.  
  36. ''GetTempFileName flags
  37. CONST TF_FORCEDRIVE            = 128
  38.  
  39. GLOBAL DESTWIN$      ''Windows directory.
  40. GLOBAL DESTSYS$      ''Windows\System directory.
  41. GLOBAL DEST32S$      ''Windows\System\Win32s directory
  42. GLOBAL DESTFREE$     ''Freecell directory
  43. GLOBAL OLE_PROTECT%  ''Indicates whether ole2 dlls were protected from being
  44.                      '' copied.
  45. GLOBAL OLE_OLEBOOT%
  46. GLOBAL VERNUM$       '' Win32s Version Number (i.e., for v1.25 VERNUM$="125"
  47.  
  48. DECLARE SUB Install(OLEINCLUDED%, OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%)
  49. DECLARE SUB RecoverFromCopy(szFileName$)
  50. DECLARE FUNCTION UpdateSystemIni AS INTEGER
  51. DECLARE FUNCTION RebootSystem(OLEONLY%) AS INTEGER
  52. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  53. DECLARE FUNCTION MakeSystemIni LIB "INIUPD.DLL" (arg1$, arg2$) AS INTEGER
  54. DECLARE FUNCTION RestartWindows LIB "INIUPD.DLL" AS INTEGER
  55. DECLARE FUNCTION OnWindowsNT LIB "INIUPD.DLL" AS INTEGER
  56. DECLARE FUNCTION PagingEnabled LIB "INIUPD.DLL" AS INTEGER
  57. DECLARE FUNCTION ShareEnabled LIB "INIUPD.DLL" AS INTEGER
  58. DECLARE FUNCTION IsWin32sLoaded LIB "INIUPD.DLL" (arg1$) AS INTEGER
  59. DECLARE FUNCTION IsRunningApp LIB "INIUPD.DLL" AS INTEGER
  60. DECLARE FUNCTION SetCuiFlags LIB "MSCUISTF.DLL" (arg1%, arg2%) AS INTEGER
  61. DECLARE FUNCTION ExitWindowsExec LIB "USER.EXE" (arg1$, arg2$) AS INTEGER
  62. DECLARE FUNCTION GetModuleHandle LIB "KRNL386.EXE" (arg1$) AS INTEGER
  63. DECLARE FUNCTION LoadLibrary LIB "KRNL386.EXE" (arg1$) AS INTEGER
  64. DECLARE SUB FreeLibrary LIB "KRNL386.EXE" (arg1%)
  65. DECLARE FUNCTION SetErrorMode LIB "KRNL386.EXE" (arg1%) AS INTEGER
  66.  
  67. DECLARE FUNCTION GetTempFileName LIB "KRNL386.EXE" (drive%, prefix$, u%, filename$) AS INTEGER
  68. DECLARE SUB WriteLine LIB "INIUPD.DLL" (filename$, text$)
  69. DECLARE FUNCTION GetTempFileAt(szDir$, szPrefix$) as string
  70. INIT:
  71.     CUIDLL$ = "mscuistf.dll"            '' Custom user interface dll
  72.     HELPPROC$ = "FHelpDlgProc"          '' Help dialog procedure
  73.     szOldVer$ ="1.00.000     "          '' Reserve space in string for version
  74.     WIN32ENABLED% = 0
  75.     OLEONLY% = 0
  76.     OLE2_16% = 0
  77.     OLE2AUTO_16% = 0
  78.     OLE16RUNAPP% = 0
  79.     OLE_PROTECT% = 0
  80.     OLE_OLEBOOT% = 0
  81.  
  82.     ON ERROR GOTO ERRNORMAL
  83.  
  84.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  85.  
  86.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  87.     IF szInf$ = "" THEN
  88.         szInf$ = GetSymbolValue("STF_CWDDIR") + "32sinst.inf"
  89.     END IF
  90.     ReadInfFile szInf$
  91.  
  92.     SetBitmap CUIDLL$, LOGO
  93.  
  94.     WIN32SVER$ = MID$(GetSectionKeyVersion("WindowsSystem", "win32s16"), 1, 4)
  95. ''    SetTitle "Microsoft Win32s Version " + WIN32SVER$ + " Setup Program"
  96.     SetTitle "Genesis Version 1.5 Setup Program"
  97.     VERNUM$ = MID$(WIN32SVER$, 1, 1) + MID$(WIN32SVER$, 3 , 2)
  98.  
  99.     DESTWIN$ = GetWindowsDir()
  100.     DESTSYS$ = GetWindowsSysDir()
  101.     DEST32S$ = DESTSYS + "WIN32S\"
  102.  
  103. '$IFDEF DEBUG
  104.     i% = SetSizeCheckMode(scmOnIgnore)    '' could use scmOff; def = scmOnFatal
  105.     WinDrive$ = MID$(GetWindowsDir, 1, 1)
  106.     IF IsDriveValid(WinDrive$) = 0 THEN
  107.         i% = DoMsgBox("Windows drive ('"+WinDrive$+"') is not a valid drive.", "DEBUG", MB_TASKMODAL+MB_ICONHAND+MB_OK)
  108.         GOTO QUIT
  109.     END IF
  110. '$ENDIF ''DEBUG
  111.  
  112. CHECK:
  113.     '' Can not run on versions less than 3.10.
  114.     IF GetWindowsMajorVersion < 3 THEN
  115.         ExitCode% = EXITFAILNOTWIN31
  116.         GOTO QUIT
  117.     END IF
  118.     IF GetWindowsMajorVersion = 3 AND GetWindowsMinorVersion < 10 THEN
  119.         ExitCode% = EXITFAILNOTWIN31
  120.         GOTO QUIT
  121.     END IF
  122.     '' Check that we are not runnig on Chicago, including pre-released
  123.     '' Chicago versions.
  124.     IF GetWindowsMajorVersion * 100 + GetWindowsMinorVersion > 350 THEN
  125.         ExitCode% = EXITSUCCESS
  126.         WIN32ENABLED% = 1
  127.         GOTO FREECELL
  128.     END IF
  129.     IF GetWindowsMode < 2  THEN
  130.         IF OnWindowsNT() THEN
  131.             ExitCode% = EXITFAILNOTINTEL '' Running on Windows NT (on RISC)
  132.         ELSE
  133.             ExitCode% = EXITFAILNOTENH   '' Standard Mode Windows
  134.         END IF
  135.         GOTO QUIT
  136.     END IF
  137.     IF OnWindowsNT() THEN
  138.         ExitCode% = EXITSUCCESS
  139.         WIN32ENABLED% = 1
  140.         GOTO FREECELL
  141.     END IF
  142.     ExitCode% = EXITSUCCESS
  143.  
  144.     if IsRunningApp() <> 0 THEN
  145.         ExitCode% = EXITFAILRUNAPP
  146.         GOTO QUIT
  147.     END IF
  148.  
  149.     '' Get version of Win32s to be installed from version info in INF file
  150.     szNewVer$ = GetSectionKeyVersion("WindowsSystem", "win32s16")
  151.  
  152.     '' See if OLE is included.
  153.  
  154.     OLEINCLUDED% = DoesFileExist( GetSymbolValue("STF_SRCDIR") + "OLE2THK.DL_", femExists )
  155.     '' Do the same for ole2thk.dll, if it is not compressed
  156.     OLEINCLUDED% = OLEINCLUDED% OR DoesFileExist( GetSymbolValue("STF_SRCDIR") + "OLE2THK.DLL", femExists )
  157.  
  158.     IF OLEINCLUDED% = 1 THEN
  159.         '' See whether one of the OLE 16 bit components is loaded.
  160.         IF GetModulehandle("compobj") <> 0 THEN
  161.             OLE16RUNAPP% = 1
  162.             GOTO GetOleVersion
  163.         END IF
  164.         IF GetModuleHandle("ole2") <> 0 THEN
  165.             OLE16RUNAPP% = 1
  166.             GOTO GetOleVersion
  167.         END IF
  168.         IF GetModuleHandle("ole2prox") <> 0 THEN
  169.             OLE16RUNAPP% = 1
  170.             GOTO GetOleVersion
  171.         END IF
  172.         IF GetModuleHandle("ole2conv") <> 0 THEN
  173.             OLE16RUNAPP% = 1
  174.             GOTO GetOleVersion
  175.         END IF
  176.         IF GetModuleHandle("storage") <> 0 THEN
  177.             OLE16RUNAPP% = 1
  178.             GOTO GetOleVersion
  179.         END IF
  180.         IF GetModuleHandle("ole2nls") <> 0 THEN
  181.             OLE16RUNAPP% = 1
  182.             GOTO GetOleVersion
  183.         END IF
  184.         IF GetModuleHandle("ole2disp") <> 0 THEN
  185.             OLE16RUNAPP% = 1
  186.             GOTO GetOleVersion
  187.         END IF
  188.         IF GetModuleHandle("typelib") <> 0 THEN
  189.             OLE16RUNAPP% = 1
  190.             GOTO GetOleVersion
  191.         END IF
  192.  
  193. GetOleVersion:
  194.         szOleNewVer$ = GetSectionKeyVersion("OleWindowsSystemWin32s", "ole2thk")
  195.  
  196.         '' Get version of currently installed OLE32 from version info of
  197.         '' ole2thk file
  198.         szOleOldVer$ = GetVersionOfFile( DESTSYS$ + "WIN32S\OLE2THK.DLL" )
  199.  
  200.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "COMPOBJ.DLL" )
  201.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "compobj")
  202.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  203.             OLE2_16% = 1
  204.         END IF
  205.  
  206.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2.DLL" )
  207.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2")
  208.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  209.             OLE2_16% = 1
  210.         END IF
  211.  
  212.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2PROX.DLL" )
  213.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2prox")
  214.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  215.             OLE2_16% = 1
  216.         END IF
  217.  
  218.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "STORAGE.DLL" )
  219.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "storage")
  220.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  221.             OLE2_16% = 1
  222.         END IF
  223.  
  224.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2CONV.DLL" )
  225.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2conv")
  226.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  227.             OLE2_16% = 1
  228.         END IF
  229.  
  230.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2NLS.DLL" )
  231.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2nls")
  232.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  233.             OLE2AUTO_16% = 1
  234.         END IF
  235.  
  236.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2DISP.DLL" )
  237.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2disp")
  238.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  239.             OLE2AUTO_16% = 1
  240.         END IF
  241.  
  242.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "TYPELIB.DLL" )
  243.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "typelib")
  244.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  245.             OLE2AUTO_16% = 1
  246.         END IF
  247.  
  248.     END IF
  249.  
  250.     OLE2_32% = OLEINCLUDED%
  251.  
  252.     '' Check if Win32s is partially installed
  253.     sz$ = GetIniKeyString (DESTSYS$ + "WIN32S.INI", "Win32s", "Setup")
  254.     '' If WIN32S.INI specifies Win32s Setup=0, then force complete Win32s file overwrite
  255.     IF sz$ = "0" THEN
  256.         GOTO WELCOME
  257.     END IF
  258.     '' If WIN32S.INI is missing, try and reinstall Win32s files/recreate WIN32S.INI
  259.     IF sz$ <> "1" THEN
  260.         GOTO WELCOME
  261.     END IF
  262.  
  263.     '' If Win32s is already installed, get running version number
  264.     i% = DoesFileExist( DESTSYS$ + "W32SYS.DLL", femExists )
  265.     IF i% = 1 THEN
  266.         i% = IsWin32sLoaded( szOldVer$ )
  267.     ENDIF
  268.  
  269.     IF i% = 0 THEN
  270.         GOTO WELCOME
  271.     END IF
  272.  
  273.     IF szNewVer$ > szOldVer$ THEN
  274.         GOTO WELCOME
  275.     END IF
  276.  
  277.     IF OLEINCLUDED% = 1 THEN
  278.  
  279.         OLE2_32% = 0
  280.  
  281.         IF (szNewVer$ = szOldVer$) OR (szNewVer$ < szOldVer$) THEN
  282.             '' Compare OLE32 version and versions of each of OLE16 libraries.
  283.             sz$ = GetIniKeyString (DESTSYS$ + "WIN32S.INI", "OLE", "Setup")
  284.             '' If WIN32S.INI specifies OLE2 Setup=0, then force OLE2 file overwrite
  285.             IF ((sz$ <> "1") OR (szOleNewVer$ > szOleOldVer$)) THEN
  286.                 OLEONLY% = 1
  287.                 OLE2_32% = 1
  288.                 GOTO WELCOME
  289.             END IF
  290.  
  291.             IF OLE2_16% OR OLE2AUTO_16 THEN
  292.                 OLEONLY% = 1
  293.                 GOTO WELCOME
  294.             END IF
  295.  
  296.         END IF
  297.  
  298.     END IF
  299.  
  300.     WIN32ENABLED% = 1
  301.     GOTO FREECELL
  302.  
  303. WELCOME:
  304.     i% = SetCuiFlags(OLEONLY%, OLE16RUNAPP%)
  305.     sz$ = UIStartDlg(CUIDLL$, WELCOME, "FInfoDlgProc", HELPWELCOME, HELPPROC$)
  306.     IF sz$ = "CONTINUE" THEN
  307.         UIPop 1
  308.     ELSE
  309.         UIPop 1
  310.         GOSUB ASKQUIT
  311.         GOTO WELCOME
  312.     END IF
  313.  
  314.  
  315. GETWIN32SPATH:
  316.     IF PagingEnabled() = 0 THEN
  317.         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)
  318.         ExitCode% = EXITFAILURE '' Enhanced mode but not paging
  319.         GOTO QUIT
  320.     END IF
  321.  
  322.     IF ShareEnabled() = 0 THEN
  323.         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)
  324.     END IF
  325.  
  326.     SetSymbolValue "EditTextIn", DESTSYS$
  327.     SetSymbolValue "EditFocus", "END"
  328.  
  329. GETPATHL1:
  330.     sz$ = UIStartDlg(CUIDLL$, VERPATH, "FDispDlgProc", HELPWELCOME, HELPPROC$)
  331.  
  332.     IF sz$ = "CONTINUE" THEN
  333.         IF IsDirWritable(DESTSYS$) = 0 THEN
  334.             GOSUB BADPATH
  335.             GOTO GETPATHL1
  336.         END IF
  337.         UIPop 1
  338.     ELSEIF sz$ = "REACTIVATE" THEN
  339.         UIPop 1
  340.         GOTO GETPATHL1
  341.     ELSEIF sz$ = "BACK" THEN
  342.         UIPop 1
  343.         GOTO WELCOME
  344.     ELSE
  345.         UIPop 1
  346.         GOSUB ASKQUIT
  347.         GOTO GETPATHL1
  348.     END IF
  349.  
  350. COPYFILES:
  351.     IF OLEONLY% = 0 THEN
  352.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Setup", "0", cmoOverwrite
  353.     END IF
  354.     IF OLE2_32% = 1 THEN
  355.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Setup", "0", cmoOverwrite
  356.     END IF
  357.  
  358.     '' Indicate Win32s install failure until all files known to be copied.
  359.     ExitCode% = EXITFAILURE
  360.     ERR = 0
  361.     CreateDir DEST32S$, cmoNone
  362.     Install OLEINCLUDED%, OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%
  363.     i% = UpdateSystemIni
  364.     '' Terminate if unhandled fatal error
  365.     IF (ERR <> 0) OR (i% = 0) THEN
  366.     GOTO QUIT
  367.     END IF
  368.  
  369.     IF OLEONLY% = 0 THEN
  370.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Setup", "1", cmoOverwrite
  371.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Version", szNewVer$, cmoOverwrite
  372.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Nls", "AnsiCP", "1252", cmoOverwrite
  373.     END IF
  374.     IF OLE2_32% = 1 THEN
  375.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Setup", "1", cmoOverwrite
  376.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Version", szOleNewVer, cmoOverwrite
  377.     END IF
  378.  
  379.     i% = DoMsgBox("Win32s files successfully installed.", "Microsoft Win32s Setup", MB_OK+MB_TASKMODAL)
  380.     '' Indicate Win32s correctly copied and installed.
  381.     ExitCode% = EXITSUCCESS
  382.  
  383. FREECELL:
  384.     IF OLEONLY% = 1 THEN
  385.         GOTO QUIT
  386.     ENDIF
  387.     IF WIN32ENABLED% = 1 THEN
  388.         sz$ = UIStartDlg(CUIDLL$, FREECELLINSTNOWIN32S, "FInfoDlgProc",0, "")
  389.     ELSE
  390.         sz$ = UIStartDlg(CUIDLL$, FREECELLINST, "FInfoDlgProc",0, "")
  391.     END IF
  392.     UIPop 1
  393.     IF sz$ <> "CONTINUE" THEN
  394.         GOTO QUIT
  395.     END IF
  396.  
  397. GETFREEPATH:
  398.     DESTFREE$ = MID$(DESTSYS$,1,3) + "GENESIS\"
  399.     SetSymbolValue "EditTextIn", DESTFREE$
  400.     SetSymbolValue "EditFocus", "END"
  401.  
  402. GETFREEPATHL1:
  403.     sz$ = UIStartDlg(CUIDLL$, FREECELLPATH, "FEditDlgProc", HELPFREECELL, HELPPROC$)
  404.  
  405.     IF sz$ = "CONTINUE" THEN
  406.         DESTFREE$ = GetSymbolValue("EditTextOut")
  407.  
  408.         IF MID$(DESTFREE$, LEN(DESTFREE$), 1) <> "\" THEN
  409.             DESTFREE$ = DESTFREE$ + "\"
  410.         END IF
  411.         ''Validate new path.
  412.         IF IsDirWritable(DESTFREE$) = 0 THEN
  413.             GOSUB BADPATH
  414.             GOTO GETFREEPATHL1
  415.         END IF
  416.         UIPop 1
  417.  
  418.         GOTO COPYFREECELL
  419.     ELSEIF sz$ = "REACTIVATE" THEN
  420.         GOTO GETFREEPATHL1
  421.     ELSEIF sz$ = "EXIT" THEN
  422.         UIPop 1
  423.         GOTO QUIT
  424.     END IF
  425.  
  426. COPYFREECELL:
  427.     '' Main Genesis installation
  428.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  429.  
  430.     ClearCopyList
  431.     COPYFREE$ = DESTFREE$
  432.     CreateDir COPYFREE$, cmoNone
  433.     ERR = 0
  434.     AddSectionFilesToCopyList "Genesis", SrcDir$, COPYFREE$
  435.     CopyFilesInCopyList
  436.     '' If error copying Genesis, not a fatal error. Win32s is already installed.
  437.     IF ERR <> 0 THEN
  438.     ERR = 0
  439.     GOTO QUIT
  440.     END IF
  441.     ClearCopyList
  442.     COPYFREE$ = DESTFREE$ + "Bin\"
  443.     CreateDir COPYFREE$, cmoNone
  444.     ERR = 0
  445.     AddSectionFilesToCopyList "GenesisBin", SrcDir$, COPYFREE$
  446.     CopyFilesInCopyList
  447.     '' If error copying Genesis, not a fatal error. Win32s is already installed.
  448.     IF ERR <> 0 THEN
  449.     ERR = 0
  450.     GOTO QUIT
  451.     END IF
  452.     ClearCopyList
  453.     COPYFREE$ = DESTFREE$ + "Lib\"
  454.     CreateDir COPYFREE$, cmoNone
  455.     ERR = 0
  456.     AddSectionFilesToCopyList "GenesisLib", SrcDir$, COPYFREE$
  457.     CopyFilesInCopyList
  458.     '' If error copying Genesis, not a fatal error. Win32s is already installed.
  459.     IF ERR <> 0 THEN
  460.     ERR = 0
  461.     GOTO QUIT
  462.     END IF
  463.     ClearCopyList
  464.     COPYFREE$ = DESTFREE$ + "Include\"
  465.     CreateDir COPYFREE$, cmoNone
  466.     ERR = 0
  467.     AddSectionFilesToCopyList "GenesisInc", SrcDir$, COPYFREE$
  468.     CopyFilesInCopyList
  469.     '' If error copying Genesis, not a fatal error. Win32s is already installed.
  470.     IF ERR <> 0 THEN
  471.     ERR = 0
  472.     GOTO QUIT
  473.     END IF
  474.     ClearCopyList
  475.     COPYFREE$ = DESTFREE$ + "Doc\"
  476.     CreateDir COPYFREE$, cmoNone
  477.     ERR = 0
  478.     AddSectionFilesToCopyList "GenesisDoc", SrcDir$, COPYFREE$
  479.     CopyFilesInCopyList
  480.     '' If error copying Genesis, not a fatal error. Win32s is already installed.
  481.     IF ERR <> 0 THEN
  482.     ERR = 0
  483.     GOTO QUIT
  484.     END IF
  485.     ClearCopyList
  486.     COPYFREE$ = DESTFREE$ + "ToolExmp\"
  487.     CreateDir COPYFREE$, cmoNone
  488.     ERR = 0
  489.     AddSectionFilesToCopyList "GenesisExm", SrcDir$, COPYFREE$
  490.     CopyFilesInCopyList
  491.     '' If error copying Genesis, not a fatal error. Win32s is already installed.
  492.     IF ERR <> 0 THEN
  493.     ERR = 0
  494.     GOTO QUIT
  495.     END IF
  496.     ClearCopyList
  497.     COPYFREE$ = DESTFREE$ + "Objects\"
  498.     CreateDir COPYFREE$, cmoNone
  499.     ERR = 0
  500.     AddSectionFilesToCopyList "GenesisObj", SrcDir$, COPYFREE$
  501.     CopyFilesInCopyList
  502.     '' If error copying Genesis, not a fatal error. Win32s is already installed.
  503.     IF ERR <> 0 THEN
  504.     ERR = 0
  505.     GOTO QUIT
  506.     END IF
  507.     ClearCopyList
  508.     COPYFREE$ = DESTFREE$ + "Textures\"
  509.     CreateDir COPYFREE$, cmoNone
  510.     ERR = 0
  511.     AddSectionFilesToCopyList "GenesisTex", SrcDir$, COPYFREE$
  512.     CopyFilesInCopyList
  513.     '' If error copying Genesis, not a fatal error. Win32s is already installed.
  514.     IF ERR <> 0 THEN
  515.     ERR = 0
  516.     GOTO QUIT
  517.     END IF
  518.     ClearCopyList
  519.     ERR = 0
  520.     AddSectionFilesToCopyList "GenesisWin", SrcDir$, DESTWIN$
  521.     CopyFilesInCopyList
  522.     '' If error copying Genesis, not a fatal error. Win32s is already installed.
  523.     IF ERR <> 0 THEN
  524.     ERR = 0
  525.     GOTO QUIT
  526.     END IF
  527.  
  528.     ERR = 0
  529.  
  530.     IF DoesFileExist( DESTSYS$ + "WIN32S.INI", femExists ) THEN
  531.     CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Genesis", "Setup", "1", cmoOverwrite
  532.     CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Genesis", "Version", szNewVer$, cmoOverwrite
  533.     END IF
  534.  
  535.     ERR = 0
  536.     CreateProgmanGroup "Genesis", "", cmoNone
  537.     ShowProgmanGroup   "Genesis", 1, cmoNone
  538.     CreateProgmanItem  "Genesis", "Genesis Editor", DESTFREE$ + "BIN\GENED.EXE", "", cmoOverwrite
  539.     CreateProgmanItem  "Genesis", "Genesis Help", "WINHELP " + DESTFREE$ + "BIN\GENESIS.HLP", "", cmoOverwrite
  540.     '' Only put up success dialog if icon added to group
  541.     IF ERR = 0 THEN
  542.     i% = DoMsgBox("Genesis was successfully installed. You can now delete the files you unzipped.", "Genesis Setup", MB_OK+MB_TASKMODAL)
  543.     END IF
  544.     ERR = 0
  545.  
  546. QUIT:
  547.     '' Install error handler for final message box routines
  548.     ON ERROR GOTO ERRQUIT
  549.     IF ERR = 0 THEN
  550.         dlg% = ExitCode%
  551.     ELSEIF ERR = STFQUIT THEN
  552.         IF (OLE_PROTECT% = 1) THEN
  553.             '' Free all previously loaded libraries
  554.             FreeLibrary GetModuleHandle("compobj")
  555.             FreeLibrary GetModuleHandle("ole2")
  556.             FreeLibrary GetModuleHandle("ole2prox")
  557.             FreeLibrary GetModuleHandle("ole2conv")
  558.             FreeLibrary GetModuleHandle("storage")
  559.             FreeLibrary GetModuleHandle("ole2nls")
  560.             FreeLibrary GetModuleHandle("ole2disp")
  561.             FreeLibrary GetModuleHandle("typelib")
  562.         END IF
  563.         dlg% = EXITQUIT
  564.         ExitCode% = EXITQUIT
  565.     ELSE
  566.         dlg% = EXITFAILURE
  567.         ExitCode% = EXITQUIT
  568.     END IF
  569.  
  570. QUITL1:
  571.     IF WIN32ENABLED% = 1 THEN
  572.         UIPop 1
  573.         END
  574.     END IF
  575.  
  576.     sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfo0DlgProc", 0, "")
  577.     IF sz$ = "REACTIVATE" THEN
  578.         GOTO QUITL1
  579.     END IF
  580.     UIPop 1
  581.  
  582.     IF ExitCode% = EXITSUCCESS THEN
  583.         IF RebootSystem(OLEONLY% and not OLE_OLEBOOT%) = 0 THEN
  584.             CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Setup", "0", cmoOverwrite
  585.             IF OLE2_32% = 1 THEN
  586.                 CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Setup", "0", cmoOverwrite
  587.             END IF
  588.             i% = DoMsgBox("Win32s is not properly configured and Win32s Setup must be run again.", "Unable to Restart Windows", MB_ICONEXCLAMATION+MB_OK+MB_TASKMODAL)
  589.         END IF
  590.     ENDIF
  591.  
  592.     END
  593.  
  594. '' Fatal error handler for error message routine
  595. ERRQUIT:
  596.     i% = DoMsgBox("Setup sources were corrupted!", "Setup Message", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  597.     END
  598.  
  599. '' Bypass run-time errors. Let final dialog box display fatal error message.
  600. ERRNORMAL:
  601.     '' Check if user cancelled setup
  602.     IF ERR = STFQUIT THEN
  603.     GOTO QUIT
  604.     END IF
  605.     RESUME NEXT
  606.  
  607.  
  608. BADPATH:
  609.     sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfo0DlgProc", 0, "")
  610.     IF sz$ = "REACTIVATE" THEN
  611.         GOTO BADPATH
  612.     END IF
  613.         UIPop 1
  614.     RETURN
  615.  
  616.   ASKQUIT:
  617.     sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
  618.  
  619.     IF sz$ = "EXIT" THEN
  620.         UIPop 1
  621.         UIPopAll
  622.         ERROR STFQUIT
  623.     ELSEIF sz$ = "REACTIVATE" THEN
  624.         GOTO ASKQUIT
  625.     ELSE
  626.         UIPop 1
  627.     END IF
  628.     RETURN
  629.  
  630.  
  631.  
  632. '**
  633. '** Purpose:
  634. '**     Builds the copy list and performs all installation operations.
  635. '** Arguments:
  636. '**     none.
  637. '** Returns:
  638. '**     none.
  639. '*************************************************************************
  640. SUB Install(OLEINCLUDED%, OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%) STATIC
  641.  
  642.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  643.  
  644.     '' Use file layout sections that specify OLDER file version/time check
  645.     IF OLEONLY% = 0 THEN
  646.         AddSectionFilesToCopyList "WindowsSystem", SrcDir$, DESTSYS$
  647.         AddSectionFilesToCopyList "WindowsSystemWin32s", SrcDir$, DESTSYS$ + "WIN32S\"
  648.         '' Add obsolete files to be removed
  649.         AddSectionFilesToCopyList "Win32sSystemObsoleteFiles", SrcDir$, DESTSYS$ + "WIN32S\"
  650.     END IF
  651.  
  652.     OLE_PROTECT% = 0
  653.     if OLEINCLUDED% = 1 THEN
  654.         IF (OLE2_16% = 1) OR (OLE2AUTO_16% = 1) THEN
  655.             IF OLE16RUNAPP% = 1 THEN
  656.                 '' Force all OLE2 DLLS to be copied during reboot.
  657.                 i% = SetErrorMode(-32768)
  658.                 i% = LoadLibrary(DESTSYS$ + "compobj.dll")
  659.                 i% = LoadLibrary(DESTSYS$ + "ole2.dll")
  660.                 i% = LoadLibrary(DESTSYS$ + "ole2prox.dll")
  661.                 i% = LoadLibrary(DESTSYS$ + "ole2conv.dll")
  662.                 i% = LoadLibrary(DESTSYS$ + "storage.dll")
  663.                 i% = LoadLibrary(DESTSYS$ + "ole2nls.dll")
  664.                 i% = LoadLibrary(DESTSYS$ + "ole2disp.dll")
  665.                 i% = LoadLibrary(DESTSYS$ + "typelib.dll")
  666.                 OLE_PROTECT% = 1
  667.             END IF
  668.             AddSectionFilesToCopyList "OleWindowsSystem", SrcDir$, DESTSYS$
  669.         END IF
  670.         IF OLE2_32% = 1 THEN
  671.             AddSectionFilesToCopyList "OleWindowsSystemWin32s", SrcDir$, DESTSYS$ + "WIN32S\"
  672.         END IF
  673.         IF (OLE2_16% = 1) OR (OLE2_32% = 1) OR (OLE2AUTO_16% = 1) THEN
  674.             AddSectionFilesToCopyList "Ole2RegWindowsSystem", SrcDir$, DESTSYS$
  675.         END IF
  676.         IF (OLE2AUTO_16% = 1) THEN
  677.             AddSectionFilesToCopyList "StdoleWindowsSystem", SrcDir$, DESTSYS$
  678.             IF (OLE16RUNAPP and DoesFileExist(DESTSYS$ + "stdole.tlb", femExists) ) THEN
  679.                 ' copy stdole.tlb -> tempfile1
  680.                 stdole1$ = DESTSYS$ + GetTempFileAt(DESTSYS$, "STD")
  681.                 CopyFile DESTSYS$+"STDOLE.TLB", stdole1$, cmoOverwrit, 0
  682.                 OLE_OLEBOOT% = 1
  683.             ENDIF
  684.         END IF
  685.     END IF
  686.  
  687.     SetRestartDir GetWindowsDir()
  688.  
  689.     CopyFilesInCopyList
  690.  
  691.     IF (OLEINCLUDED% = 1) THEN
  692.         RecoverFromCopy DESTSYS$ + "compobj.dll"
  693.         RecoverFromCopy DESTSYS$ + "ole2.dll"
  694.         RecoverFromCopy DESTSYS$ + "ole2prox.dll"
  695.         RecoverFromCopy DESTSYS$ + "ole2conv.dll"
  696.         RecoverFromCopy DESTSYS$ + "storage.dll"
  697.         RecoverFromCopy DESTSYS$ + "ole2nls.dll"
  698.         RecoverFromCopy DESTSYS$ + "ole2disp.dll"
  699.         RecoverFromCopy DESTSYS$ + "typelib.dll"
  700.     END IF
  701.  
  702.     IF (OLE_PROTECT% = 1) THEN
  703.         '' Free all previously loaded libraries
  704.         FreeLibrary GetModuleHandle("compobj")
  705.         FreeLibrary GetModuleHandle("ole2")
  706.         FreeLibrary GetModuleHandle("ole2prox")
  707.         FreeLibrary GetModuleHandle("ole2conv")
  708.         FreeLibrary GetModuleHandle("storage")
  709.         FreeLibrary GetModuleHandle("ole2nls")
  710.         FreeLibrary GetModuleHandle("ole2disp")
  711.         FreeLibrary GetModuleHandle("typelib")
  712.         OLE_PROTECT% = 0
  713.     END IF
  714.     IF (OLE_OLEBOOT% = 1) THEN
  715.             'rename new stdole.tlb -> tempfile2
  716.             stdole2$ = GetTempFileAt(DESTSYS$, "STD")
  717.             RemoveFile DESTSYS$+stdole2$, cmoForce
  718.             RenameFile DESTSYS$+"STDOLE.TLB" , stdole2$
  719.             'rename tempfile1 -> stdole.tlb
  720.             RenameFile stdole1$, "STDOLE.TLB"
  721.             'write to _mssetup.bat: rename tempfile2 to stdole.tlb
  722.             WriteLine DESTWIN$+"_MSSETUP.BAT", ""
  723.             WriteLine DESTWIN$+"_MSSETUP.BAT", "DEL "+DESTSYS$+"STDOLE.TLB"
  724.             WriteLine DESTWIN$+"_MSSETUP.BAT", "REN "+DESTSYS$+stdole2$+" STDOLE.TLB"
  725.     ENDIF
  726.     IF OLEINCLUDED% AND (OLE2_16% OR OLE2_32% OR OLE2AUTO_16%) THEN
  727.         IF OLE16RUNAPP% THEN
  728.             reg1$ = DESTWIN$ + GetTempFileAt(DESTWIN$, "REG")
  729.             CopyFile DESTWIN$+"REG.DAT", reg1$, cmoOverwrit, 0
  730.         ENDIF
  731.  
  732.         RUN "regedit /s " + DESTSYS$ + "ole2.reg"
  733.  
  734.         IF OLE16RUNAPP% THEN
  735.             reg2$ = GetTempFileAt(DESTWIN$, "REG")
  736.             RemoveFile DESTWIN$ + reg2$, cmoForce
  737.             RenameFile DESTWIN$ + "REG.DAT" , reg2$
  738.             'rename tempfile1 -> reg.dat
  739.             RenameFile reg1$, "REG.DAT"
  740.             'write to _mssetup.bat: rename tempfile2 to reg.dat
  741.             WriteLine DESTWIN$+"_MSSETUP.BAT", ""
  742.             WriteLine DESTWIN$+"_MSSETUP.BAT", "DEL "+DESTWIN$+"REG.DAT"
  743.             WriteLine DESTWIN$+"_MSSETUP.BAT", "REN "+DESTWIN$ + reg2$+" REG.DAT"
  744.             OLE_OLEBOOT% = 1
  745.         ENDIF
  746.     END IF
  747. END SUB
  748.  
  749. FUNCTION UpdateSystemIni STATIC AS INTEGER
  750.  
  751.     VxDPath$ = DEST32S$ + "W32S.386"
  752.     SystemIniPath$ = GetWindowsDir()
  753.  
  754.     UpdateSystemIni% = MakeSystemIni(SystemIniPath$, VxdPath$)
  755.  
  756. END FUNCTION
  757.  
  758. FUNCTION RebootSystem(OLEONLY%) STATIC AS INTEGER
  759.  
  760. '   Check if any files were locked during install.  If the RestartList
  761. '   is not empty, ExitExecRestart() will restart Windows, cleanup setup
  762. '   files, and copy over locked files before Windows restarts.
  763.     i% = RestartListEmpty()
  764.     IF i% = 0 THEN
  765. '      ExitExecRestart() only returns if applications refuse to be shutdown.
  766. '      Win32s is installed but will not operate until Windows is restarted
  767. '      and the Win32s VxD is loaded.
  768.        i% = ExitExecRestart()
  769.        RebootSystem = 0
  770.     ELSE
  771. '      If the RestartList list is empty, it is necessary to restart windows
  772. '      directly.  The MSSETUP program creates _MSRSTRT.EXE and _MSSETUP.BAT
  773. '      in the restart directory.  This program should be exec'd to handle
  774. '      proper MSSETUP cleanup (temp files) and restart Windows.
  775.        IF (OLEONLY% = 1) THEN
  776.            RebootSystem = 1
  777.        ELSE
  778.            i% = ExitWindowsExec( GetWindowsDir() + "_MSRSTRT.EXE", "_MSSETUP.BAT" )
  779.            RebootSystem = 0
  780.        END IF
  781.     ENDIF
  782.  
  783. END FUNCTION
  784.  
  785.  
  786. '**
  787. '** Purpose:
  788. '**     Appends a file name to the end of a directory path,
  789. '**     inserting a backslash character as needed.
  790. '** Arguments:
  791. '**     szDir$  - full directory path (with optional ending "\")
  792. '**     szFile$ - filename to append to directory
  793. '** Returns:
  794. '**     Resulting fully qualified path name.
  795. '*************************************************************************
  796. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  797.     IF szDir$ = "" THEN
  798.     MakePath = szFile$
  799.     ELSEIF szFile$ = "" THEN
  800.     MakePath = szDir$
  801.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  802.     MakePath = szDir$ + szFile$
  803.     ELSE
  804.     MakePath = szDir$ + "\" + szFile$
  805.     END IF
  806. END FUNCTION
  807.  
  808. FUNCTION GetTempFileAt(szDir$, szPrefix$) STATIC AS STRING
  809.     szCurDir$ = CURDIR$
  810.     CHDIR szDir$ + "."
  811.     szTempFile$ = STRING$(144, "E")
  812.     i% = GetTempFileName(TF_FORCEDRIVE, szPrefix$,0, szTempFile$)
  813.     CHDIR szCurDir$
  814.     GetTempFileAt = MID$(szTempFile$,3)
  815. END FUNCTION
  816.  
  817. SUB RecoverFromCopy(szFileName$) STATIC
  818.     IF DoesFileExist(szFileName$, femExist) = 0 THEN
  819.         szBackFile$ = MID$(szFileName$, 1, LEN(szFileName$)-3) + VERNUM$
  820.         IF DoesfileExist(szBackFile$, femExist) = 0 THEN
  821.             i% = DoMsgBox("ERROR: Could not find backup file "+szBackfile$, "Setup Error", MB_ICONEXLAMATION + MB_OK)
  822.         ELSE
  823.             CopyFile szBackFile$, szFileName$, cmoTimeStamp, 0
  824.         END IF
  825.     END IF
  826. END SUB
  827.