GLOBAL hSetup AS INTEGER
GLOBAL fFrameInit AS INTEGER
GLOBAL fInstallInit AS INTEGER
CONST MB_OK=0
CONST MB_ICONHAND=16
CONST MB_TASKMODAL=8192
DECLARE FUNCTION DoMsgBox LIB "mscomstf.dll" (lpText$,lpCaption$,wType%) As INTEGER
DECLARE FUNCTION GetWindowsDirectory LIB "kernel" (szBuf$, cbBuf%) AS INTEGER
DECLARE FUNCTION GetSystemDirectory LIB "kernel" (szBuf$, cbBuf%) AS INTEGER
DECLARE FUNCTION GetVersion LIB "kernel" AS INTEGER
DECLARE FUNCTION YnrcRemoveFile LIB "msinsstf.dll" (szFullPathSrc$, cmo%) AS INTEGER
DECLARE SUB RemoveFile (szFullPathSrc$, cmo%)
CONST cmoVital=1
CONST cmoCopy=2
CONST cmoUndo=4
CONST cmoRoot=8
CONST cmoDecompress=16
CONST cmoTimeStamp=32
CONST cmoReadOnly=64
CONST cmoBackup=128
CONST cmoForce=256
CONST cmoRemove=512
CONST cmoOverwrite=1024
CONST cmoAppend=2048
CONST cmoPrepend=4096
CONST cmoNone=0
CONST cmoAll=65535
CONST femExists=0
CONST femRead=1
CONST femWrite=2
CONST femReadWrite=3
CONST ynrcNo=0
CONST ynrcYes=1
CONST ynrcErr1=2
CONST ynrcErr2=3
CONST ynrcErr3=4
CONST ynrcErr4=5
CONST ynrcErr5=6
CONST ynrcErr6=7
CONST ynrcErr7=8
CONST ynrcErr8=9
CONST ynrcErr9=10
CONST grcOkay=0
CONST grcNotOkay=1
CONST grcUserQuit=48
CONST cbSymValMax=512
CONST STFERR=1024 ''setup system error
CONST STFQUIT=1025 ''user quit
CONST scmOff=0
CONST scmOnIgnore=1
CONST scmOnFatal=2
DECLARE FUNCTION FOpenInf LIB "mscomstf.dll" (szFile$, fCheck%, fCheckSyms%) AS INTEGER
DECLARE FUNCTION HShowWaitCursor LIB "msshlstf.dll" AS INTEGER
DECLARE FUNCTION FRestoreCursor  LIB "msshlstf.dll" (hPrev%) AS INTEGER
DECLARE FUNCTION CbGetInfSectionKeyField LIB "mscomstf.dll" (szSect$, szKey$, iField%, szBuf$, cbBuf%) AS INTEGER
DECLARE FUNCTION FMakeListInfSectionField LIB "mscomstf.dll" (szSym$, szSect$, iField%) AS INTEGER
DECLARE FUNCTION FSetBitmap LIB "msshlstf.dll" (szDll$, Bitmap%) AS INTEGER
DECLARE FUNCTION FSetAbout LIB "msshlstf.dll" (szAbout1$, szAbout2$) AS INTEGER
DECLARE FUNCTION FDoDialog LIB "msuilstf.dll" (hwnd%, szDll$, Dlg%, szDlgProc$, HelpDlg%, szHelpProc$) AS INTEGER
DECLARE FUNCTION FKillNDialogs LIB "msuilstf.dll" (n%) AS INTEGER
DECLARE SUB      SetWindowText LIB "User" (hwnd%, lpString$)
DECLARE FUNCTION FSetSymbolValue LIB "msshlstf.dll" (szSymbol$, szValue$) AS INTEGER
DECLARE FUNCTION FRemoveSymbol LIB "mscomstf.dll" (szSym$) AS INTEGER
DECLARE FUNCTION CbGetSymbolValue LIB "mscomstf.dll" (szSymbol$, szValue$, Length%) AS INTEGER
DECLARE FUNCTION UsGetListLength LIB "mscomstf.dll" (szSymbol$) AS INTEGER
DECLARE FUNCTION CbGetListItem LIB "mscomstf.dll" (szListSymbol$, n%, szListItem$, cbMax%) AS INTEGER
DECLARE FUNCTION FAddListItem LIB "mscomstf.dll" (szListSymbol$, szListItem$) AS INTEGER
DECLARE FUNCTION FReplaceListItem LIB "mscomstf.dll" (szListSymbol$, n%, szListItem$) AS INTEGER
DECLARE FUNCTION FSetSymbolToListOfInfKeys LIB "mscomstf.dll" (szSym$, szSect$, fNulls%) AS INTEGER
DECLARE FUNCTION InitializeFrame LIB "msshlstf.dll" (szCmdLine$) AS INTEGER
DECLARE FUNCTION HwndFrame LIB "msshlstf.dll" AS INTEGER
DECLARE FUNCTION HinstFrame LIB "msshlstf.dll" AS INTEGER
DECLARE FUNCTION FCreateDir LIB "msinsstf.dll" (szDir$, cmo%) AS INTEGER
DECLARE FUNCTION FAddSectionFilesToCopyList LIB "mscomstf.dll" (szSect$, szSrc$, szDest$) AS INTEGER
DECLARE FUNCTION FAddSectionKeyFileToCopyList LIB "mscomstf.dll" (szSect$, szKey$, szSrc$, szDest$) AS INTEGER
DECLARE FUNCTION FAddSpecialFileToCopyList LIB "mscomstf.dll" (szSect$, szKey$, szSrc$, szDest$) AS INTEGER
DECLARE FUNCTION GrcCopyFilesInCopyList LIB "msinsstf.dll" (hInstance%) AS INTEGER
DECLARE FUNCTION FRemoveIniSection LIB "msinsstf.dll" (szFile$, szSect$, cmo%) AS INTEGER
DECLARE FUNCTION FCreateIniKeyValue LIB "msinsstf.dll" (szFile$, szSect$, szKey$, szValue$, cmo%) AS INTEGER
DECLARE FUNCTION FCreateProgManGroup LIB "msinsstf.dll" (szGroup$, szPath$, cmo%) AS INTEGER
DECLARE FUNCTION FCreateProgManItem LIB "msinsstf.dll" (szGroup$, szItem$, szCmd$, cmo%) AS INTEGER
DECLARE FUNCTION FShowProgManGroup LIB "msinsstf.dll" (szGroup$, szCmd$, cmo%) AS INTEGER
DECLARE SUB      ResetCopyList LIB "msinsstf.dll"
DECLARE FUNCTION LcbGetCopyListCost LIB "msinsstf.dll" (szExtraList$, szCostList$, szNeedList$) AS LONG
DECLARE FUNCTION FCopyOneFile LIB "msinsstf.dll" (szSrc$, szDest$, cmo%, fAppend%) AS INTEGER
DECLARE FUNCTION YnrcBackupFile LIB "msinsstf.dll" (szFullPath$, szBackup$, cmo%) AS INTEGER
DECLARE FUNCTION FInitializeInstall LIB "msinsstf.dll" (hinst%, hwndFrame%) AS INTEGER
DECLARE FUNCTION WFindFileUsingFileOpen LIB "msinsstf.dll" (szFile$, szBuf$, cbBuf%) AS INTEGER
DECLARE FUNCTION FIsDirWritable LIB "msinsstf.dll" (szDir$) AS INTEGER
DECLARE FUNCTION SetSizeCheckMode LIB "msinsstf.dll" (scmMode%) AS INTEGER
DECLARE SUB      SetBitmap(szDll$, Bitmap%)
DECLARE SUB      SetAbout(szAbout1$, szAbout2$)
DECLARE FUNCTION UIStartDlg(szDll$, Dlg%, szDlgProc$, HelpDlg%, szHelpProc$) AS STRING
DECLARE SUB UIPop (n%)
DECLARE SUB UIPopAll
DECLARE SUB SetTitle (sz$)
DECLARE SUB ReadInfFile (szFile$)
DECLARE SUB SetSymbolValue (szSymbol$, szValue$)
DECLARE SUB RemoveSymbol (szSym$)
DECLARE FUNCTION GetSymbolValue (szSymbol$) AS STRING
DECLARE FUNCTION GetListLength(szSymbol$) AS INTEGER
DECLARE FUNCTION GetListItem(szSymbol$, n%) AS STRING
DECLARE SUB AddListItem(szSymbol$, szItem$)
DECLARE SUB ReplaceListItem(szSymbol$, n%, szItem$)
DECLARE FUNCTION InitFrame (szCmdLine$) AS INTEGER
DECLARE FUNCTION InitSetup (szCmdLine$) AS INTEGER
DECLARE FUNCTION ShowWaitCursor AS INTEGER
DECLARE SUB RestoreCursor (hPrev%)
DECLARE SUB MakeListFromSectionSize (szSym$, szSect$)
DECLARE SUB CreateDir (szDir$, cmo%)
DECLARE SUB AddSectionFilesToCopyList (szSect$, szSrc$, szDest$)
DECLARE SUB AddSpecialFileToCopyList (szSect$, szKey$, szSrc$, szDest$)
DECLARE SUB CopyFilesInCopyList
DECLARE SUB RemoveIniSection (szFile$, szSect$, cmo%)
DECLARE SUB CreateIniKeyValue (szFile$, szSect$, szKey$, szValue$, cmo%)
DECLARE SUB CreateProgmanGroup (szGroup$, szPath$, cmo%)
DECLARE SUB CreateProgmanItem (szGroup$, szItem$, szCmd$, szOther$, cmo%)
DECLARE SUB ShowProgmanGroup (szGroup$, Cmd%, cmo%)
DECLARE SUB ClearCopyList
DECLARE FUNCTION GetCopyListCost (szExtraList$, szCostList$, szNeedList$) AS LONG
DECLARE SUB CopyFile (szFullPathSrc$, szFullPathDst$, cmo%, fAppend%)
DECLARE SUB RenameFile (szFullPath$, szBackup$)
DECLARE SUB InitInstall
DECLARE FUNCTION IsDirWritable (szDir$) AS INTEGER
DECLARE FUNCTION GetWindowsMajorVersion AS INTEGER
DECLARE FUNCTION GetWindowsMinorVersion AS INTEGER
DECLARE FUNCTION GetWindowsDir  AS STRING
DECLARE FUNCTION GetWindowsSysDir AS STRING

FUNCTION InitSetup(szCmdLine$) STATIC AS INTEGER
fFrameInit=0
fInstallInit=0
IF hSetup > 0 THEN
END IF
i% = InitFrame(szCmdLine$)
fFrameInit = 1
InitInstall
fInstallInit = 1
InitSetup = i%
END FUNCTION

FUNCTION InitFrame(szCmdLine$) STATIC AS INTEGER
IF hSetup > 0 THEN
ELSE
  i% = InitializeFrame (szCmdLine$)
  IF i% = -1 THEN
  END '' NOT an error - Usage (/?) or Command line copy operation
  ELSEIF i% = 0 THEN
  END
  ELSE
  InitFrame = i%
  END IF
END IF
END FUNCTION

SUB SetBitmap (szDll$, Bitmap%) STATIC
IF FSetBitmap (szDll$, Bitmap%) = 0 THEN
  ERROR STFERR
END IF
END SUB

SUB SetAbout (szAbout1$, szAbout2$) STATIC
IF FSetAbout(szAbout1$, szAbout2$) = 0 THEN
  ERROR STFERR
END IF
END SUB

SUB SetTitle (sz$) STATIC
SetWindowText HwndFrame (), sz$
END SUB

SUB ReadInfFile (szFile$) STATIC
IF FOpenInf (szFile$, 1, 0) = 0 THEN
  ERROR STFERR
END IF
END SUB

FUNCTION UIStartDlg (szDll$, Dlg%, szDlgProc$, HelpDlg%, szHelpProc$) STATIC AS STRING
IF FDoDialog (HwndFrame (), szDll$, Dlg%, szDlgProc$, HelpDlg%, szHelpProc$) = 0 THEN
  ERROR STFERR
ELSE
  UIStartDlg = GetSymbolValue ("DLGEVENT")
END IF
END FUNCTION

SUB UIPop (n%) STATIC
IF FKillNDialogs (n%) = 0 THEN
  ERROR STFERR
END IF
END SUB

'*************************************************************************
SUB UIPopAll STATIC
IF FKillNDialogs (65535) = 0 THEN
  ERROR STFERR
END IF
END SUB

'*************************************************************************
FUNCTION GetSymbolValue(szSymbol$) STATIC AS STRING
szValue$ = string$ (cbSymValMax,32)
Length% = CbGetSymbolValue (szSymbol$, szValue$, cbSymValMax)
GetSymbolValue = szValue$
IF Length% >= cbSymValMax THEN
  res% = DoMsgBox ("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  ERROR STFERR
END IF
IF szSymbol$ = "" THEN
  ERROR STFERR
END IF
szValue$ = ""
END FUNCTION

FUNCTION GetListLength (szSymbol$) STATIC AS INTEGER
GetListLength = UsGetListLength (szSymbol$)
IF szSymbol$ = "" THEN
  ERROR STFERR
END IF
END FUNCTION

FUNCTION GetListItem (szListSymbol$, nItem%) STATIC AS STRING
szListItem$ = string$ (cbSymValMax,32)
Length% = CbGetListItem (szListSymbol$, nItem%, szListItem$, cbSymValMax)
GetListItem = szListItem$
IF Length% >= cbSymValMax THEN
  res% = DoMsgBox ("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  ERROR STFERR
END IF
IF szListSymbol$ = "" THEN
  ERROR STFERR
END IF
if nItem% <= 0 or nItem% > GetListLength (szListSymbol$) then
  ERROR STFERR
end if
szListItem$ = ""
END FUNCTION

SUB AddListItem (szSymbol$, szItem$) STATIC
IF FAddListItem (szSymbol$, szItem$) = 0 THEN
  ERROR STFERR
END IF
END SUB

SUB ReplaceListItem (szSymbol$, n%, szItem$) STATIC
IF FReplaceListItem(szSymbol$, n%, szItem$) = 0 THEN
  ERROR STFERR
END IF
END SUB

SUB SetSymbolValue (szSymbol$, szValue$) STATIC
IF FSetSymbolValue (szSymbol$, szValue$) = 0 THEN
  ERROR STFERR
END IF
END SUB

SUB RemoveSymbol (szSym$) STATIC
IF FRemoveSymbol (szSym$) = 0 THEN
  ERROR STFERR
END IF
END SUB

FUNCTION ShowWaitCursor STATIC AS INTEGER
ShowWaitCursor = HShowWaitCursor
END FUNCTION

SUB RestoreCursor (hPrev%) STATIC
i% = FRestoreCursor (hPrev%)
IF i% = 0 THEN
  ERROR STFERR
END IF
END SUB

SUB MakeListFromSectionSize (szSym$, szSect$) STATIC
IF FMakeListInfSectionField (szSym$, szSect$, 15) = 0 THEN
  ERROR STFERR
END IF
END SUB

SUB InitInstall STATIC
IF hSetup > 0 THEN
ELSEIF FInitializeInstall (HinstFrame (), HwndFrame ()) = 0 THEN
END
END IF
END SUB

SUB CreateDir (szDir$, cmo%) STATIC
IF FCreateDir (szDir$, cmo%) = 0 THEN
  ERROR STFERR
END IF
END SUB

SUB RemoveIniSection (szFile$, szSect$, cmo%) STATIC
IF FRemoveIniSection (szFile$, szSect$, cmo%) = 0 THEN
  ERROR STFERR
  END IF
END SUB

SUB CreateIniKeyValue (szFile$, szSect$, szKey$, szValue$, cmo%) STATIC
IF FCreateIniKeyValue  (szFile$, szSect$, szKey$, szValue$, cmo%) = 0 THEN
  ERROR STFERR
END IF
END SUB

SUB CreateProgmanGroup (szGroup$, szPath$, cmo%) STATIC
IF FCreateProgManGroup (szGroup$, szPath$, cmo%) = 0 THEN
  ERROR STFERR
END IF
END SUB

SUB ShowProgmanGroup (szGroup$, Cmd%, cmo%) STATIC
IF FShowProgManGroup (szGroup$, STR$(Cmd%), cmo%) = 0 THEN
  ERROR STFERR
  END IF
END SUB

SUB ClearCopyList STATIC
ResetCopyList
END SUB

FUNCTION GetCopyListCost (szExtraList$, szCostList$, szNeedList$) STATIC AS LONG
lNeed& = LcbGetCopyListCost (szExtraList$, szCostList$, szNeedList$)
IF lNeed& < 0 THEN
  ERROR STFERR
END IF
GetCopyListCost = lNeed&
END FUNCTION

SUB CreateProgmanItem (szGroup$, szItem$, szCmd$, szOther$, cmo%) STATIC
szItemNew$ = szItem$
IF szOther$ <> "" THEN
  szItemNew$ = szItem$ + "," + szOther$
END IF
IF FCreateProgManItem (szGroup$, szItemNew$, szCmd$, cmo%) = 0 THEN
  ERROR STFERR
END IF
szItemNew$ = ""
END SUB

SUB CopyFilesInCopyList STATIC
grc% = GrcCopyFilesInCopyList (HinstFrame())
IF grc% = grcUserQuit THEN
  ERROR STFQUIT
ELSEIF grc% > 0 THEN
  ERROR STFERR
END IF
END SUB

SUB CopyFile (szFullPathSrc$, szFullPathDst$, cmo%, fAppend%) STATIC
IF FCopyOneFile (szFullPathSrc$, szFullPathDst$, (cmo OR cmoCopy), fAppend%) = 0 THEN
  ERROR STFERR
END IF
END SUB

SUB AddSectionFilesToCopyList (szSect$, szSrc$, szDest$) STATIC
IF FAddSectionFilesToCopyList (szSect$, szSrc$, szDest$) = 0 THEN
  ERROR STFERR
END IF
END SUB

'' 101 SUB AddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$) STATIC
'' 101 IF FAddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$) = 0 THEN
'' 101   ERROR STFERR
'' 101 END IF
'' 101 END SUB

SUB AddSpecialFileToCopyList (szSect$, szKey$, szSrc$, szDest$) STATIC
IF FAddSpecialFileToCopyList (szSect$, szKey$, szSrc$, szDest$) = 0 THEN
  ERROR STFERR
END IF
END SUB

FUNCTION IsDirWritable (szDir$) STATIC AS INTEGER
IsDirWritable = FIsDirWritable (szDir$)
END FUNCTION

FUNCTION GetWindowsMajorVersion STATIC AS INTEGER
GetWindowsMajorVersion = GetVersion () MOD 256
END FUNCTION

FUNCTION GetWindowsMinorVersion STATIC AS INTEGER
GetWindowsMinorVersion = GetVersion () / 256
END FUNCTION

FUNCTION GetWindowsDir STATIC AS STRING
szBuf$ = string$ (256, 32)
cbBuf% = GetWindowsDirectory (szBuf$, 256)
IF cbBuf% = 0 THEN
  GetWindowsDir = ""
  ERROR STFERR
ELSE
IF cbBuf% > 255 THEN
  res% = DoMsgBox ("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  ERROR STFERR
END IF
szBuf$ = RTRIM$ (szBuf$)
IF MID$(szBuf$, 1, 1) = "\" THEN
  'szBuf$ = MID$(CURDIR$, 1, 2) + szBuf$
  szBuf$ = MID$(GetWindowsSysDir, 1, 2) + szBuf$
ELSEIF MID$(szBuf$, 2, 1) <> ":" THEN
  szBuf$ = MID$(GetWindowsSysDir, 1, 3) + szBuf$
END IF
IF MID$(szBuf$, LEN(szBuf$), 1) <> "\" THEN
  szBuf$ = szBuf$ + "\"
END IF
GetWindowsDir = szBuf$
END IF
szBuf$ = ""
END FUNCTION

FUNCTION GetWindowsSysDir STATIC AS STRING
szBuf$ = string$ (256, 32)
cbBuf% = GetSystemDirectory (szBuf$, 256)
IF cbBuf% = 0 THEN
  ERROR STFERR
ELSE
IF cbBuf% > 255 THEN
  res% = DoMsgBox ("Buffer Overflow", "MS-Setup Error", MB_ICONHAND+MB_OK)
  ERROR STFERR
END IF
szBuf$ = RTRIM$(szBuf$)
IF MID$(szBuf$, 1, 1) = "\" THEN
  szBuf$ = MID$(CURDIR$, 1, 2) + szBuf$
ELSEIF MID$(szBuf$, 2, 1) <> ":" THEN
  szBuf$ = MID$(CURDIR$, 1, 3) + szBuf$
END IF
IF MID$(szBuf$, LEN(szBuf$), 1) <> "\" THEN
  szBuf$ = szBuf$ + "\"
END IF
GetWindowsSysDir = szBuf$
END IF
szBuf$ = ""
END FUNCTION

SUB RemoveFile (szFullPathSrc$, cmo%) STATIC
IF YnrcRemoveFile (szFullPathSrc$, cmo%) = ynrcNo THEN
  ERROR STFERR
END IF
END SUB

TRAP CleanupTrap From "MSSHLSTF.DLL"
End Trap

hSetup = InitSetup (COMMAND$)
ON ERROR GOTO QUIT

SUB RenameFile (szFullPath$, szBackup$) STATIC
IF YnrcBackupFile (szFullPath$, szBackup$, cmoNone) = ynrcNo THEN
  ERROR STFERR
END IF
END SUB
