1157 lines
30 KiB
C
1157 lines
30 KiB
C
/************************************************/
|
|
/* Common Library Component public include file */
|
|
/************************************************/
|
|
|
|
|
|
#if !defined (COMSTF_INCLUDED )
|
|
|
|
#define COMSTF_INCLUDED
|
|
|
|
// avoid warnings on every file from including stdlib.h
|
|
#if defined(min)
|
|
#undef min
|
|
#undef max
|
|
#endif /* min */
|
|
|
|
extern HANDLE MyDllModuleHandle;
|
|
|
|
|
|
|
|
/*
|
|
** Global variable macro for DLL portability
|
|
*/
|
|
|
|
#define GLOBAL(x) (x)
|
|
|
|
|
|
/* standard datatypes
|
|
*/
|
|
typedef BYTE * PB;
|
|
|
|
typedef unsigned CB;
|
|
|
|
typedef LONG * PLONG_STF;
|
|
|
|
|
|
/* BOOLean datatype
|
|
*/
|
|
#define fFalse ((BOOL)0)
|
|
|
|
#define fTrue ((BOOL)1)
|
|
|
|
|
|
/* To avoid compiler warnings for unused parameters
|
|
*/
|
|
#define Unused(x) (x)=(x)
|
|
|
|
|
|
/* If new GRCs are added, they should as well be handled
|
|
in EercErrorHandler() in ERROR1.C */
|
|
/*
|
|
** General Return Code datatype
|
|
*/
|
|
typedef USHORT GRC;
|
|
|
|
#define grcFirst ((GRC)0)
|
|
|
|
#define grcLast ((GRC)52)
|
|
|
|
#define grcOkay ((GRC)0)
|
|
#define grcNotOkay ((GRC)1)
|
|
#define grcOutOfMemory ((GRC)2)
|
|
#define grcInvalidStruct ((GRC)3)
|
|
#define grcOpenFileErr ((GRC)4)
|
|
#define grcCreateFileErr ((GRC)5)
|
|
#define grcReadFileErr ((GRC)6)
|
|
#define grcWriteFileErr ((GRC)7)
|
|
#define grcRemoveFileErr ((GRC)8)
|
|
#define grcRenameFileErr ((GRC)9)
|
|
#define grcReadDiskErr ((GRC)10)
|
|
#define grcCreateDirErr ((GRC)11)
|
|
#define grcRemoveDirErr ((GRC)12)
|
|
#define grcBadINF ((GRC)13)
|
|
#define grcINFBadSectionLabel ((GRC)14)
|
|
#define grcINFBadLine ((GRC)15)
|
|
#define grcINFBadKey ((GRC)16)
|
|
#define grcCloseFileErr ((GRC)17)
|
|
#define grcChangeDirErr ((GRC)18)
|
|
#define grcINFSrcDescrSect ((GRC)19)
|
|
#define grcTooManyINFKeys ((GRC)20)
|
|
#define grcWriteInf ((GRC)21)
|
|
#define grcInvalidPoer ((GRC)22)
|
|
#define grcINFMissingLine ((GRC)23)
|
|
#define grcINFBadFDLine ((GRC)24)
|
|
#define grcINFBadRSLine ((GRC)25)
|
|
#define grcInvalidPathErr ((GRC)26)
|
|
#define grcWriteIniValueErr ((GRC)27)
|
|
#define grcReplaceIniValueErr ((GRC)28)
|
|
#define grcIniValueTooLongErr ((GRC)29)
|
|
#define grcDDEInitErr ((GRC)30)
|
|
#define grcDDEExecErr ((GRC)31)
|
|
#define grcBadWinExeFileFormatErr ((GRC)32)
|
|
#define grcResourceTooLongErr ((GRC)33)
|
|
#define grcMissingSysIniSectionErr ((GRC)34)
|
|
#define grcDecompGenericErr ((GRC)35)
|
|
#define grcDecompUnknownAlgErr ((GRC)36)
|
|
#define grcMissingResourceErr ((GRC)37)
|
|
#define grcLibraryLoadErr ((GRC)38)
|
|
#define grcBadLibEntry ((GRC)39)
|
|
#define grcApplet ((GRC)40)
|
|
#define grcExternal ((GRC)41)
|
|
#define grcSpawn ((GRC)42)
|
|
#define grcDiskFull ((GRC)43)
|
|
#define grcDDEAddItem ((GRC)44)
|
|
#define grcDDERemoveItem ((GRC)45)
|
|
#define grcINFMissingSection ((GRC)46)
|
|
#define grcRunTimeParseErr ((GRC)47)
|
|
#define grcOpenSameFileErr ((GRC)48)
|
|
#define grcGetVolInfo ((GRC)49)
|
|
#define grcGetFileSecurity ((GRC)50)
|
|
#define grcSetFileSecurity ((GRC)51)
|
|
#define grcVerifyFileErr ((GRC)52)
|
|
|
|
/**************************************/
|
|
/* common library function prototypes */
|
|
/**************************************/
|
|
|
|
|
|
/* CHaracter Physical representation datatype
|
|
*/
|
|
typedef BYTE CHP;
|
|
typedef CHP * PCHP;
|
|
typedef CB CCHP;
|
|
|
|
|
|
#define CbFromCchp(cchp) ((CB)(cchp))
|
|
|
|
|
|
/* CHaracter Logical representation datatype
|
|
*/
|
|
typedef CHP CHL;
|
|
typedef CHL * PCHL;
|
|
typedef PCHL * PPCHL;
|
|
typedef CB CCHL;
|
|
typedef CB ICHL;
|
|
|
|
|
|
#define cbFullPathMax ((CB)(MAX_PATH-1))
|
|
#define cchlFullPathMax ((CCHL)(MAX_PATH-1))
|
|
#define cchlFullDirMax cchlFullPathMax
|
|
#define cchpFullPathMax ((CCHP)(MAX_PATH-1))
|
|
|
|
|
|
|
|
#define cbFullPathBuf ((CB)(cbFullPathMax + 1))
|
|
|
|
#define cchlFullPathBuf ((CCHL)(cchlFullPathMax + 1))
|
|
|
|
#define cchpFullPathBuf ((CCHP)(cchpFullPathMax + 1))
|
|
|
|
|
|
/* String Zero terminated datatype
|
|
*/
|
|
typedef PCHL SZ;
|
|
#define PSZ PPSZ
|
|
typedef PPCHL PSZ;
|
|
typedef PPCHL RGSZ;
|
|
|
|
|
|
/* Comparison Return Code datatype
|
|
*/
|
|
typedef INT CRC;
|
|
|
|
|
|
#define crcError ((CRC)(-2))
|
|
|
|
|
|
#define crcEqual ((CRC)0)
|
|
|
|
|
|
#define crcFirstHigher ((CRC)1)
|
|
|
|
|
|
#define crcSecondHigher ((CRC)(-1))
|
|
|
|
|
|
/* String manipulation routines */
|
|
extern SZ APIENTRY SzDupl(SZ);
|
|
extern CRC APIENTRY CrcStringCompare(SZ, SZ);
|
|
extern CRC APIENTRY CrcStringCompareI(SZ, SZ);
|
|
extern SZ APIENTRY SzLastChar(SZ);
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Advances a string pointer to the beginning of the next valid
|
|
** character. This may include skipping a double-byte character.
|
|
** Arguments:
|
|
** sz: the string pointer to advance. It can be NULL or empty, or else
|
|
** it must point at the beginning of a valid character.
|
|
** Returns:
|
|
** NULL if sz was NULL.
|
|
** sz unchanged if it was an empty string (*sz == '\0').
|
|
** sz advanced past the current character and to the beginning of the
|
|
** next valid character.
|
|
*/
|
|
|
|
#define SzNextChar(sz) ((SZ)AnsiNext(sz))
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Retreats a string pointer to the beginning of the previous valid
|
|
** character. This may include skipping a double-byte character.
|
|
** Arguments:
|
|
** szStart: string pointer to the beginning of a valid character that
|
|
** equals or preceeds the character szCur.
|
|
** szCur: string pointer to retreat. It can be NULL or empty, or
|
|
** can point to any byte in a valid character.
|
|
** Returns:
|
|
** NULL if szCur was NULL.
|
|
** sz unchanged if szStart was NULL or if szCur equaled szStart.
|
|
** sz retreated past the current character and to the beginning of the
|
|
** previous valid character.
|
|
*/
|
|
|
|
#define SzPrevChar(szStart, szCur) ((SZ)AnsiPrev(szStart,szCur))
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Appends a string from one buffer to another.
|
|
** Arguments:
|
|
** szDst: string pointer to destination buffer. This can be NULL or
|
|
** else it must contain a zero terminated string (can be empty)
|
|
** and enough storage to append szSrc with its terminating zero
|
|
** character.
|
|
** szSrc: string pointer to source buffer. This can be NULL or else
|
|
** must point to a zero terminated string (can be empty).
|
|
** Returns:
|
|
** NULL if either szDst or szSrc is NULL.
|
|
** szDst signifying the operation succeeded.
|
|
*/
|
|
|
|
#define SzStrCat(szDst, szSrc) ((SZ)lstrcat((LPSTR)szDst,(LPSTR)szSrc))
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Determines whether the current character is a single Physical
|
|
** Character.
|
|
** Arguments:
|
|
** sz: string pointer which can be NULL, empty, or pointing to the
|
|
** beginning of a valid character.
|
|
** Returns:
|
|
** fFalse if sz is NULL or points to the beginning of a multiple
|
|
** Physical Character character.
|
|
** fTrue if sz is empty or points to the beginning of a single
|
|
** Physical Character character.
|
|
*/
|
|
|
|
#define FSingleByteCharSz(sz) (!IsDBCSLeadByte(*sz))
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Determines whether a character is an End-Of-Line character.
|
|
** Arguments:
|
|
** chp: Physical Character (eg a single byte Logical Character).
|
|
** Returns:
|
|
** fFalse if chp is not either a '\n' or a '\r' character.
|
|
** fTrue if chp is either a '\n' or a '\r' character.
|
|
*/
|
|
|
|
#define FEolChp(chp) ((BOOL)((chp) == '\n' || (chp) == '\r'))
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Determines whether a character is whitespace.
|
|
** Arguments:
|
|
** chp: Physical Character (eg a single byte Logical Character).
|
|
** Returns:
|
|
** fFalse if chp is not either a space or a tab character.
|
|
** fTrue if chp is either a space or a tab character.
|
|
*/
|
|
|
|
#define FWhiteSpaceChp(chp) ((BOOL)((chp) == ' ' || (chp) == '\t'))
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Converts a zero-terminated string to upper case.
|
|
** Arguments:
|
|
** sz: the string to convert to upper case. sz must be non-NULL though
|
|
** it can be empty.
|
|
** Returns:
|
|
** A pointer to the converted string.
|
|
*/
|
|
|
|
#define SzStrUpper(sz) (SZ)(AnsiUpper((LPSTR)(sz)))
|
|
|
|
/*
|
|
** Purpose:
|
|
** Converts a zero-terminated string to lower case.
|
|
** Arguments:
|
|
** sz: the string to convert to lower case. sz must be non-NULL though
|
|
** it can be empty.
|
|
** Returns:
|
|
** A pointer to the converted string.
|
|
*/
|
|
|
|
#define SzStrLower(sz) (SZ)(AnsiLower((LPSTR)(sz)))
|
|
|
|
|
|
#define cbSymbolMax (64*1024)
|
|
#define cbAllocMax (65520*5)
|
|
#define cbIntStrMax 16
|
|
|
|
PVOID
|
|
SAlloc(
|
|
IN DWORD Size
|
|
);
|
|
|
|
PVOID
|
|
SRealloc(
|
|
IN PVOID Block,
|
|
IN DWORD NewSize
|
|
);
|
|
|
|
VOID
|
|
SFree(
|
|
IN PVOID Block
|
|
);
|
|
|
|
BOOL
|
|
SInit(
|
|
IN BOOL Init
|
|
);
|
|
|
|
|
|
/* Long File Address datatype
|
|
*/
|
|
typedef unsigned long LFA;
|
|
|
|
|
|
#define lfaSeekError ((LFA)-1)
|
|
|
|
|
|
/*
|
|
** File Handle structure
|
|
** Fields:
|
|
** iDosfh: DOS file handle.
|
|
** ofstruct: OFSTRUCT used when the file was opened.
|
|
*/
|
|
typedef struct _fh
|
|
{
|
|
INT iDosfh;
|
|
OFSTRUCT ofstruct;
|
|
} FH;
|
|
|
|
|
|
/* File Handle datatype
|
|
*/
|
|
typedef FH * PFH;
|
|
|
|
|
|
/* Open File Mode datatype
|
|
*/
|
|
typedef USHORT OFM;
|
|
|
|
|
|
#define ofmExistRead ((OFM)OF_EXIST | OF_READ)
|
|
|
|
#define ofmExistReadWrite ((OFM)OF_EXIST | OF_READWRITE)
|
|
|
|
//#define ofmRead ((OFM)OF_READ | OF_SHARE_DENY_WRITE)
|
|
|
|
|
|
#define ofmRead ((OFM)OF_READ)
|
|
|
|
#define ofmWrite ((OFM)OF_WRITE | OF_SHARE_EXCLUSIVE)
|
|
|
|
#define ofmReadWrite ((OFM)OF_READWRITE | OF_SHARE_EXCLUSIVE)
|
|
|
|
#define ofmCreate ((OFM)OF_CREATE | OF_SHARE_EXCLUSIVE)
|
|
|
|
|
|
/* Seek File Mode datatype
|
|
*/
|
|
typedef WORD SFM;
|
|
|
|
|
|
#define sfmSet ((SFM)0)
|
|
|
|
|
|
#define sfmCur ((SFM)1)
|
|
|
|
|
|
#define sfmEnd ((SFM)2)
|
|
|
|
|
|
/* File handling routines */
|
|
extern PFH APIENTRY PfhOpenFile(SZ, OFM);
|
|
extern BOOL APIENTRY FCloseFile(PFH);
|
|
extern CB APIENTRY CbReadFile(PFH, PB, CB);
|
|
extern CB APIENTRY CbWriteFile(PFH, PB, CB);
|
|
extern LFA APIENTRY LfaSeekFile(PFH, LONG, SFM);
|
|
extern BOOL APIENTRY FEndOfFile(PFH);
|
|
extern BOOL APIENTRY FRemoveFile(SZ);
|
|
extern BOOL APIENTRY FWriteSzToFile(PFH, SZ);
|
|
extern BOOL APIENTRY FFileExists(SZ);
|
|
extern SZ APIENTRY szGetFileName(SZ szPath);
|
|
extern VOID APIENTRY FreePfh(PFH pfh);
|
|
|
|
|
|
|
|
/* Path manipulation routines */
|
|
|
|
BOOL FMakeFATPathFromDirAndSubPath(SZ, SZ, SZ, CCHP);
|
|
#define FValidFATDir(sz) fTrue
|
|
#define FValidFATPath(sz) fTrue
|
|
#define CchlValidFATSubPath(sz) strlen(sz) // no checking for WIN32
|
|
#define ISUNC(sz) ((BOOL)(sz != NULL && lstrlen(sz) > 3 && *sz == '\\' && *(sz+1) == '\\'))
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Determines if a path is a valid FAT directory.
|
|
** Arguments:
|
|
** szDir: the directory string to check.
|
|
** Returns:
|
|
** fTrue if the szDir is a valid FAT directory.
|
|
** fFalse if the szDir is an invalid FAT directory.
|
|
*/
|
|
|
|
#define FValidDir(szDir) FValidFATDir(szDir)
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Determines if a string is a valid FAT SubPath (eg subdirs and filename).
|
|
** Arguments:
|
|
** szSubPath: the SubPath string to check.
|
|
** Returns:
|
|
** zero if the string is an invalid FAT subPath.
|
|
** non-zero count of characters in sz if it is a valid FAT subPath.
|
|
*/
|
|
|
|
#define CchlValidSubPath(szSubPath) CchlValidFATSubPath(szSubPath)
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Determines if a path is a valid FAT path.
|
|
** Arguments:
|
|
** szPath: the path to check.
|
|
** Returns:
|
|
** fTrue if the szPath is a valid FAT path.
|
|
** fFalse if the szPath is an invalid FAT path.
|
|
*/
|
|
|
|
#define FValidPath(szPath) FValidFATPath(szPath)
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Creates a valid path from subpath, and filename arguments if possible
|
|
** and stores it in a supplied buffer.
|
|
** Arguments:
|
|
** szDir: string containing the volume and subdirs.
|
|
** szSubPath: string containing subdirs and the filename.
|
|
** szBuf: the buffer in which to store the newly created path.
|
|
** cchpBufMax: the maximum number of physical characters (including the
|
|
** terminating zero) that can be stored in the buffer.
|
|
** Returns:
|
|
** fTrue if a valid FAT path can be created and stored in szBuf.
|
|
** fFalse if szDir is NULL or invalid (first character must be in the
|
|
** 'a' to 'z' or 'A' to 'Z', the second character must be either
|
|
** a ':' or a terminating zero, and the third character must be
|
|
** a '\\' and the rest must conform to 8.3 format), if szSubPath is
|
|
** NULL, empty or invalid (first character cannot be a '\\' and it must
|
|
** conform to 8.3 format), if szBuf is NULL, or if cchpBufMax is not
|
|
** large enough to hold the resultant path.
|
|
*/
|
|
|
|
#define FMakePathFromDirAndSubPath(szDir, szSubPath, szBuffer, cchpBufMax) \
|
|
FMakeFATPathFromDirAndSubPath(szDir,szSubPath,szBuffer,cchpBufMax)
|
|
|
|
|
|
|
|
|
|
#define AssertDataSeg()
|
|
|
|
#if DBG
|
|
|
|
#define Assert(f) \
|
|
((f) ? (void)0 : (void)AssertSzUs(__FILE__,__LINE__))
|
|
|
|
#define AssertRet(f, retVal) \
|
|
{if (!(f)) {AssertSzUs(__FILE__,__LINE__); return(retVal);}}
|
|
|
|
#define EvalAssert(f) \
|
|
((f) ? (void)0 : (void)AssertSzUs(__FILE__,__LINE__))
|
|
|
|
#define EvalAssertRet(f, retVal) \
|
|
{if (!(f)) {AssertSzUs(__FILE__,__LINE__); return(retVal);}}
|
|
|
|
#define PreCondition(f, retVal) \
|
|
{if (!(f)) {PreCondSzUs(__FILE__,__LINE__); return(retVal);}}
|
|
|
|
#define ChkArg(f, iArg, retVal) \
|
|
{if (!(f)) {BadParamUs(iArg, __FILE__, __LINE__); return(retVal);}}
|
|
|
|
#else
|
|
|
|
#define Assert(f) ((void)0)
|
|
#define AssertRet(f, retVal) ((void)0)
|
|
#define EvalAssert(f) ((void)(f))
|
|
#define EvalAssertRet(f, retVal) ((void)(f))
|
|
#define PreCondition(f, retVal) ((void)0)
|
|
#define ChkArg(f, iArg, retVal) ((void)0)
|
|
|
|
#endif
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Generates a task modal message box.
|
|
** Arguments:
|
|
** szTitle: title for message box.
|
|
** szText: text for message box.
|
|
** Returns:
|
|
** none
|
|
*/
|
|
|
|
#define MessBoxSzSz(szTitle, szText) \
|
|
MessageBox((HWND)NULL, (LPSTR)szText, (LPSTR)szTitle, \
|
|
MB_TASKMODAL | MB_ICONHAND | MB_OK)
|
|
|
|
|
|
extern BOOL APIENTRY AssertSzUs(SZ, USHORT);
|
|
extern BOOL APIENTRY PreCondSzUs(SZ, USHORT);
|
|
extern BOOL APIENTRY BadParamUs(USHORT, SZ, USHORT);
|
|
|
|
|
|
/*
|
|
** Inf Data Block structure
|
|
**
|
|
** Fields:
|
|
** pidbNext: next IDB in linked list.
|
|
** pchpBuffer: character buffer.
|
|
** cchpBuffer: number of useful characters in pchpBuffer.
|
|
** cchpAllocated: number of characters actually allocated with
|
|
** pchpBuffer. May be zero.
|
|
*/
|
|
typedef struct _idb
|
|
{
|
|
struct _idb * pidbNext;
|
|
PCHP pchpBuffer;
|
|
CCHP cchpBuffer;
|
|
CCHP cchpAllocated;
|
|
} IDB;
|
|
|
|
|
|
/* Inf Data Block datatypes
|
|
*/
|
|
typedef IDB * PIDB;
|
|
typedef PIDB * PPIDB;
|
|
|
|
/*
|
|
The following equate is used because of a situation like
|
|
"abcd"+
|
|
"efgh"
|
|
When parsed, this will be "abcdefgh" -- is this two strings or
|
|
one string with a double quote in the middle? If it's the latter,
|
|
we'll actually store "abcd.efgh" where . is DOUBLE_QUOTE.
|
|
*/
|
|
|
|
#define DOUBLE_QUOTE '\001'
|
|
|
|
#define INFLINE_SECTION 0x01
|
|
#define INFLINE_KEY 0x02
|
|
|
|
/* INF File Handling routines */
|
|
GRC APIENTRY GrcOpenInf(SZ IniFileName, PVOID pInfTempInfo);
|
|
|
|
BOOL APIENTRY FFreeInf(void);
|
|
|
|
UINT APIENTRY CKeysFromInfSection(SZ Section, BOOL IncludeAllLines);
|
|
BOOL APIENTRY FKeyInInfLine(INT Line);
|
|
|
|
RGSZ APIENTRY RgszFromInfLineFields(INT Line,UINT StartField,UINT NumFields);
|
|
BOOL APIENTRY FFreeRgsz(RGSZ);
|
|
|
|
UINT APIENTRY CFieldsInInfLine(INT Line);
|
|
|
|
INT APIENTRY FindInfSectionLine(SZ Section);
|
|
INT APIENTRY FindNthLineFromInfSection(SZ Section,UINT n);
|
|
INT APIENTRY FindLineFromInfSectionKey(SZ Section,SZ Key);
|
|
INT APIENTRY FindNextLineFromInf(INT Line);
|
|
|
|
SZ APIENTRY SzGetNthFieldFromInfLine(INT Line,UINT n);
|
|
SZ APIENTRY SzGetNthFieldFromInfSectionKey(SZ Section,SZ Key,UINT n);
|
|
|
|
BOOL APIENTRY FUpdateInfSectionUsingSymTab(SZ);
|
|
|
|
SZ APIENTRY InterpretField(SZ);
|
|
|
|
#define RgszFromInfScriptLine(Line,NumFields) \
|
|
RgszFromInfLineFields(Line,1,NumFields)
|
|
|
|
#define FindFirstLineFromInfSection(Section) FindNthLineFromInfSection(Section,1)
|
|
|
|
/*
|
|
** Option-Element Flags datatype for SFD
|
|
*/
|
|
typedef WORD OEF;
|
|
|
|
|
|
#define oefVital ((OEF)0x0001)
|
|
|
|
#define oefCopy ((OEF)0x0002)
|
|
|
|
#define oefUndo ((OEF)0x0004)
|
|
|
|
#define oefRoot ((OEF)0x0008)
|
|
|
|
#define oefDecompress ((OEF)0x0010)
|
|
|
|
#define oefTimeStamp ((OEF)0x0020)
|
|
|
|
#define oefReadOnly ((OEF)0x0040)
|
|
|
|
#define oefBackup ((OEF)0x0080)
|
|
|
|
#define oefUpgradeOnly ((OEF)0x0100)
|
|
|
|
//
|
|
// The following oef means that the source file should not be deleted
|
|
// after it is copied, even if the source is the DOS setup local source.
|
|
// (Files coming from anywhere below that directory are usually deleted
|
|
// after they are copied).
|
|
//
|
|
|
|
#define oefNoDeleteSource ((OEF)0x0200)
|
|
|
|
//
|
|
// The following means that the file should not be put into the setup log
|
|
// file that tracks all files copied by setup.
|
|
//
|
|
#define oefNoLog ((OEF)0x0400)
|
|
|
|
|
|
//
|
|
// The following means that the file is a third party file
|
|
//
|
|
#define oefThirdPartyFile ((OEF)0x0800)
|
|
|
|
//
|
|
// The following means that the file is from a CSD install
|
|
//
|
|
#define oefCsdInstall ((OEF)0x1000)
|
|
|
|
|
|
|
|
#define oefNone ((OEF)0x0000)
|
|
|
|
#define oefAll ((OEF)0xFFFF)
|
|
|
|
|
|
/*
|
|
** Copy-Time Unit datatype for SFD
|
|
*/
|
|
typedef WORD CTU;
|
|
|
|
|
|
/*
|
|
** OverWrite Mode datatype for SFD
|
|
*/
|
|
typedef WORD OWM;
|
|
|
|
|
|
#define owmNever ((OWM)0x0001)
|
|
|
|
#define owmAlways ((OWM)0x0002)
|
|
|
|
#define owmUnprotected ((OWM)0x0004)
|
|
|
|
#define owmOlder ((OWM)0x0008)
|
|
|
|
#define owmVerifySourceOlder ((OWM)0x0010)
|
|
|
|
/*
|
|
** Option-Element Record for SFD
|
|
*/
|
|
typedef struct _oer
|
|
{
|
|
OEF oef;
|
|
CTU ctuCopyTime;
|
|
OWM owm;
|
|
LONG lSize;
|
|
SZ szRename;
|
|
SZ szAppend;
|
|
SZ szBackup;
|
|
SZ szDescription;
|
|
ULONG ulVerMS;
|
|
ULONG ulVerLS;
|
|
SZ szDate;
|
|
SZ szDest;
|
|
} OER;
|
|
|
|
|
|
/*
|
|
** Option-Element Record datatype for SFD
|
|
*/
|
|
typedef OER * POER;
|
|
typedef POER * PPOER;
|
|
|
|
|
|
#define poerNull ((POER)NULL)
|
|
|
|
|
|
/*
|
|
** Disk ID datatype for SFD
|
|
*/
|
|
typedef WORD DID;
|
|
|
|
|
|
#define didMin 1
|
|
|
|
|
|
#define didMost 999
|
|
|
|
|
|
/*
|
|
** Section-File Description structure
|
|
** Fields:
|
|
*/
|
|
typedef struct _sfd
|
|
{
|
|
DID did;
|
|
UINT InfId;
|
|
SZ szFile;
|
|
OER oer;
|
|
} SFD;
|
|
|
|
|
|
/*
|
|
** Section-File Description datatype
|
|
*/
|
|
typedef SFD * PSFD;
|
|
typedef PSFD * PPSFD;
|
|
|
|
#define psfdNull ((PSFD)NULL)
|
|
|
|
|
|
extern POER APIENTRY PoerAlloc(VOID);
|
|
extern BOOL APIENTRY FFreePoer(POER);
|
|
extern BOOL APIENTRY FPrintPoer(PFH, POER);
|
|
extern BOOL APIENTRY FValidPoer(POER);
|
|
|
|
extern PSFD APIENTRY PsfdAlloc(VOID);
|
|
extern BOOL APIENTRY FFreePsfd(PSFD);
|
|
extern GRC APIENTRY GrcGetSectionFileLine(INT, PPSFD, POER);
|
|
extern BOOL APIENTRY FPrintPsfd(PFH, PSFD);
|
|
#if DBG
|
|
extern BOOL APIENTRY FValidPsfd(PSFD);
|
|
#endif
|
|
|
|
extern BOOL APIENTRY FValidOerDate(SZ);
|
|
extern BOOL APIENTRY FParseVersion(SZ, PULONG, PULONG);
|
|
|
|
extern BOOL APIENTRY FListIncludeStatementLine(INT Line);
|
|
extern GRC APIENTRY GrcGetListIncludeSectionLine(INT, PSZ, PSZ);
|
|
|
|
|
|
|
|
/*
|
|
** Source Description List Element data structure
|
|
*/
|
|
typedef struct _sdle
|
|
{
|
|
struct _sdle * psdleNext;
|
|
DID did; // disk id as specified in the inf
|
|
DID didGlobal; // a universal id across infs
|
|
SZ szLabel;
|
|
SZ szTagFile;
|
|
SZ szNetPath;
|
|
} SDLE;
|
|
|
|
typedef SDLE * PSDLE;
|
|
typedef PSDLE * PPSDLE;
|
|
|
|
|
|
extern PSDLE APIENTRY PsdleAlloc(VOID);
|
|
extern BOOL APIENTRY FFreePsdle(PSDLE);
|
|
|
|
extern GRC APIENTRY GrcFillSrcDescrListFromInf(VOID);
|
|
|
|
|
|
|
|
/*
|
|
** Copy List Node data structure
|
|
*/
|
|
typedef struct _cln
|
|
{
|
|
SZ szSrcDir;
|
|
SZ szDstDir;
|
|
PSFD psfd;
|
|
struct _cln * pclnNext;
|
|
} CLN;
|
|
typedef CLN * PCLN;
|
|
typedef PCLN * PPCLN;
|
|
typedef PPCLN * PPPCLN;
|
|
|
|
|
|
/*
|
|
** Section Files Operation data structure
|
|
** REVIEW -- not really used
|
|
*/
|
|
typedef WORD SFO;
|
|
|
|
#define sfoCopy 1
|
|
|
|
#define sfoBackup 2
|
|
|
|
#define sfoRemove 3
|
|
|
|
/* in LIST.C */
|
|
extern PCLN pclnHead;
|
|
extern PPCLN ppclnTail;
|
|
|
|
|
|
|
|
extern GRC APIENTRY GrcFillPoerFromSymTab(POER);
|
|
extern BOOL APIENTRY FSetPoerToEmpty(POER);
|
|
|
|
extern GRC APIENTRY GrcAddSectionFilesToCopyList(SZ, SZ, SZ);
|
|
extern GRC APIENTRY GrcAddSectionKeyFileToCopyList(SZ, SZ, SZ, SZ);
|
|
extern GRC APIENTRY GrcAddNthSectionFileToCopyList(SZ, UINT, SZ, SZ);
|
|
extern GRC APIENTRY GrcAddSectionFilesToCList(SFO, SZ, SZ, SZ, SZ, POER);
|
|
extern GRC APIENTRY GrcAddLineToCList(INT, SFO, SZ, SZ, POER);
|
|
extern GRC APIENTRY GrcAddPsfdToCList(SZ, SZ, PSFD);
|
|
|
|
extern PCLN APIENTRY PclnAlloc(VOID);
|
|
extern BOOL APIENTRY FFreePcln(PCLN);
|
|
|
|
extern BOOL APIENTRY FPrintPcln(PFH, PCLN);
|
|
#if DBG
|
|
extern BOOL APIENTRY FValidPcln(PCLN);
|
|
#endif
|
|
|
|
|
|
|
|
/* Symbol Table constants */
|
|
#define cchpSymMax ((CCHP)255)
|
|
#define cchpSymBuf (cchpSymMax + 1)
|
|
|
|
/* Symbol Table routines */
|
|
extern BOOL APIENTRY FAddSymbolValueToSymTab(SZ, SZ);
|
|
extern GRC APIENTRY GrcAddSymsFromInfSection(SZ);
|
|
|
|
|
|
/* Message Box Routine */
|
|
extern int APIENTRY ExtMessageBox(HANDLE, HWND, WORD, WORD, WORD);
|
|
|
|
|
|
|
|
/*
|
|
** Purpose:
|
|
** Determines whether a symbol is defined in the symbol table.
|
|
** Arguments:
|
|
** szSymbol: symbol to search for. szSymbol must be non-NULL, non-empty,
|
|
** and start with a non-whitespace character.
|
|
** Returns:
|
|
** fTrue if szSymbol is defined in the symbol table (even if the associated
|
|
** is an empty string).
|
|
** fFalse if szSymbol is not defined in the symbol table.
|
|
*/
|
|
|
|
#define FSymbolDefinedInSymTab(szSymbol) \
|
|
((BOOL)(SzFindSymbolValueInSymTab(szSymbol)!=(SZ)NULL))
|
|
|
|
|
|
extern SZ APIENTRY SzFindSymbolValueInSymTab(SZ);
|
|
extern BOOL APIENTRY FRemoveSymbolFromSymTab(SZ);
|
|
extern RGSZ APIENTRY RgszFromSzListValue(SZ);
|
|
extern SZ APIENTRY SzListValueFromRgsz(RGSZ);
|
|
extern BOOL APIENTRY FFreeInfTempInfo(PVOID);
|
|
extern BOOL APIENTRY FCheckSymTabIntegrity(VOID);
|
|
extern SZ APIENTRY SzGetSubstitutedValue(SZ);
|
|
extern SZ APIENTRY SzProcessSzForSyms(HWND, SZ);
|
|
|
|
BOOL
|
|
DumpSymbolTableToFile(
|
|
IN PCSTR Filename
|
|
);
|
|
|
|
/* String Parse Code
|
|
*/
|
|
typedef unsigned SPC;
|
|
|
|
typedef SPC * PSPC;
|
|
|
|
|
|
/*
|
|
** String-Code Pair structure
|
|
** Fields:
|
|
** sz: string.
|
|
** spc: String Parse Code to associate with string.
|
|
*/
|
|
typedef struct _scp
|
|
{
|
|
SZ sz;
|
|
SPC spc;
|
|
} SCP;
|
|
|
|
|
|
/* String-Code Pair datatype
|
|
*/
|
|
typedef SCP * PSCP;
|
|
|
|
|
|
/* String Parse Table datatypes
|
|
*/
|
|
///////////////////////////////////
|
|
// typedef SCP SPT;
|
|
///////////////////////////////////
|
|
|
|
typedef struct _pspt
|
|
{
|
|
PSCP pscpSorted ; // Generated for binary search
|
|
long cItems ; // Number of items in table
|
|
PSCP pscpBase ; // Original as given to PsptInitParsingTable()
|
|
SPC spcDelim ; // Table delimiter entry
|
|
} SPT ;
|
|
|
|
typedef SPT * PSPT;
|
|
|
|
|
|
/* Symbol Table routines */
|
|
extern PSPT APIENTRY PsptInitParsingTable(PSCP);
|
|
extern SPC APIENTRY SpcParseString(PSPT, SZ);
|
|
extern BOOL APIENTRY FDestroyParsingTable(PSPT);
|
|
|
|
/* Flow handling routines */
|
|
|
|
/* external program, library */
|
|
|
|
BOOL APIENTRY FParseLoadLibrary(INT Line, UINT *pcFields);
|
|
BOOL APIENTRY FParseFreeLibrary(INT Line, UINT *pcFields);
|
|
BOOL APIENTRY FParseLibraryProcedure(INT Line,UINT *pcFields);
|
|
BOOL APIENTRY FParseRunExternalProgram(INT Line,UINT *pcFields);
|
|
BOOL APIENTRY FParseInvokeApplet(INT Line, UINT *pcFields);
|
|
BOOL APIENTRY FParseStartDetachedProcess(INT Line, UINT *pcFields);
|
|
|
|
/* registry */
|
|
|
|
BOOL APIENTRY FParseRegistrySection(INT Line, UINT *pcFields, SPC spc);
|
|
BOOL APIENTRY FParseCreateRegKey(INT Line, UINT *pcFields, SZ szHandle);
|
|
BOOL APIENTRY FParseOpenRegKey(INT Line, UINT *pcFields, SZ szHandle);
|
|
BOOL APIENTRY FParseFlushRegKey(INT Line, UINT *pcFields, SZ szHandle);
|
|
BOOL APIENTRY FParseCloseRegKey(INT Line, UINT *pcFields, SZ szHandle);
|
|
BOOL APIENTRY FParseDeleteRegKey(INT Line, UINT *pcFields, SZ szHandle);
|
|
BOOL APIENTRY FParseDeleteRegTree(INT Line, UINT *pcFields, SZ szHandle);
|
|
BOOL APIENTRY FParseEnumRegKey(INT Line, UINT *pcFields, SZ szHandle);
|
|
BOOL APIENTRY FParseSetRegValue(INT Line, UINT *pcFields, SZ szHandle);
|
|
BOOL APIENTRY FParseGetRegValue(INT Line, UINT *pcFields, SZ szHandle);
|
|
BOOL APIENTRY FParseDeleteRegValue(INT Line, UINT *pcFields, SZ szHandle);
|
|
BOOL APIENTRY FParseEnumRegValue(INT Line, UINT *pcFields, SZ szHandle);
|
|
|
|
BOOL APIENTRY FParseAddFileToDeleteList(INT Line, UINT *pcFields);
|
|
BOOL APIENTRY FParseWaitOnEvent(INT Line,UINT *pcFields);
|
|
BOOL APIENTRY FParseSignalEvent(INT Line,UINT *pcFields);
|
|
BOOL APIENTRY FParseSleep(INT Line, UINT *pcFields);
|
|
BOOL APIENTRY FParseFlushInf(INT Line, UINT *pcFields);
|
|
|
|
/*
|
|
** String Parse Codes for Flow Handling
|
|
*/
|
|
#define spcError 0
|
|
#define spcUnknown 1
|
|
#define spcSet 2
|
|
#define spcIfStr 3
|
|
#define spcIfStrI 4
|
|
#define spcIfInt 5
|
|
#define spcIfContains 6
|
|
#define spcIfContainsI 7
|
|
#define spcIfFirst spcIfStr
|
|
#define spcIfLast spcIfContainsI
|
|
#define spcEndIf 8
|
|
#define spcElse 9
|
|
#define spcElseIfStr 10
|
|
#define spcElseIfStrI 11
|
|
#define spcElseIfInt 12
|
|
#define spcElseIfContains 13
|
|
#define spcElseIfContainsI 14
|
|
#define spcEQ 15
|
|
#define spcNE 16
|
|
#define spcLT 17
|
|
#define spcLE 18
|
|
#define spcGT 19
|
|
#define spcGE 20
|
|
#define spcIn 21
|
|
#define spcNotIn 22
|
|
#define spcGoTo 23
|
|
#define spcForListDo 24
|
|
#define spcEndForListDo 25
|
|
#define spcSetSubst 26
|
|
#define spcSetSubsym 27
|
|
#define spcDebugMsg 28
|
|
#define spcHourglass 29
|
|
#define spcArrow 30
|
|
#define spcSetInstructionText 31
|
|
#define spcSetHelpFile 32
|
|
#define spcCreateRegKey 33
|
|
#define spcOpenRegKey 34
|
|
#define spcFlushRegKey 35
|
|
#define spcCloseRegKey 36
|
|
#define spcDeleteRegKey 37
|
|
#define spcDeleteRegTree 38
|
|
#define spcEnumRegKey 39
|
|
#define spcSetRegValue 40
|
|
#define spcGetRegValue 41
|
|
#define spcDeleteRegValue 42
|
|
#define spcEnumRegValue 43
|
|
#define spcSetAdd 50
|
|
#define spcSetSub 51
|
|
#define spcSetMul 52
|
|
#define spcSetDiv 53
|
|
#define spcGetDriveInPath 54
|
|
#define spcGetDirInPath 55
|
|
#define spcLoadLibrary 56
|
|
#define spcFreeLibrary 57
|
|
#define spcLibraryProcedure 58
|
|
#define spcRunExternalProgram 59
|
|
#define spcInvokeApplet 60
|
|
#define spcDebugOutput 61
|
|
#define spcSplitString 62
|
|
#define spcQueryListSize 63
|
|
#define spcSetOr 64
|
|
#define spcAddFileToDeleteList 65
|
|
#define spcInitRestoreDiskLog 66
|
|
#define spcStartDetachedProcess 67
|
|
#define spcWaitOnEvent 68
|
|
#define spcSignalEvent 69
|
|
#define spcSleep 70
|
|
#define spcSetHexToDec 71
|
|
#define spcSetDecToHex 72
|
|
#define spcFlushInf 73
|
|
#define spcBmpShow 74
|
|
#define spcBmpHide 75
|
|
#define spcTermRestoreDiskLog 76
|
|
|
|
extern PSPT psptFlow;
|
|
extern SCP rgscpFlow[];
|
|
|
|
extern BOOL APIENTRY FHandleFlowStatements(INT *, HWND, SZ, UINT *,RGSZ *);
|
|
extern BOOL APIENTRY FInitFlowPspt(VOID);
|
|
extern BOOL APIENTRY FDestroyFlowPspt(VOID);
|
|
|
|
|
|
/*
|
|
** Expanded Error Return Code
|
|
*/
|
|
typedef unsigned EERC;
|
|
|
|
#define eercAbort ((EERC)0)
|
|
|
|
#define eercRetry ((EERC)1)
|
|
|
|
#define eercIgnore ((EERC)2)
|
|
|
|
EERC __cdecl EercErrorHandler(HWND, GRC, BOOL, ...);
|
|
extern BOOL APIENTRY FHandleOOM(HWND);
|
|
|
|
extern BOOL APIENTRY FGetSilent(VOID);
|
|
extern BOOL APIENTRY FSetSilent(BOOL);
|
|
|
|
|
|
VOID SetSupportLibHandle(HANDLE Handle);
|
|
|
|
extern HCURSOR CurrentCursor;
|
|
|
|
|
|
//
|
|
// Utility functions for dealing with multisz's.
|
|
//
|
|
|
|
RGSZ
|
|
MultiSzToRgsz(
|
|
IN PVOID MultiSz
|
|
);
|
|
|
|
PCHAR
|
|
RgszToMultiSz(
|
|
IN RGSZ rgsz
|
|
);
|
|
|
|
|
|
BOOL AddFileToDeleteList(PCHAR Filename);
|
|
|
|
// floppy operations/repair diskette stuff
|
|
|
|
BOOL
|
|
InitializeFloppySup(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
TerminateFloppySup(
|
|
VOID
|
|
);
|
|
|
|
BOOL
|
|
FormatFloppyDisk(
|
|
IN CHAR DriveLetter,
|
|
IN HWND hwndOwner,
|
|
OUT PBOOL Fatal
|
|
);
|
|
|
|
BOOL
|
|
CopyFloppyDisk(
|
|
IN CHAR DriveLetter,
|
|
IN HWND hwndOwner,
|
|
IN DWORD SourceDiskPromptId,
|
|
IN DWORD TargetDiskPromptId
|
|
);
|
|
|
|
UINT
|
|
xMsgBox(
|
|
HWND hwnd,
|
|
UINT CaptionResId,
|
|
UINT MessageResId,
|
|
UINT MsgBoxFlags,
|
|
...
|
|
);
|
|
|
|
|
|
// Bit map control variables.
|
|
|
|
#define BMP_MAX 10
|
|
|
|
extern HBITMAP hbmAdvertList [ BMP_MAX + 1 ] ;
|
|
extern INT cAdvertIndex ;
|
|
extern INT cAdvertCycleSeconds ;
|
|
extern INT cyAdvert ;
|
|
extern INT cxAdvert ;
|
|
|
|
extern PSTR SETUP_LOG_FILE;
|
|
extern PSTR SETUP_REPAIR_DIRECTORY;
|
|
|
|
//
|
|
// This flag tells us whether we were invoked as a standalone process
|
|
// or whether we were called to interpret a legacy inf from within a process.
|
|
//
|
|
extern BOOL OwnProcess;
|
|
|
|
//
|
|
// The following two globals are only valid if 'OwnProcess' is FALSE.
|
|
//
|
|
extern LPSTR ServicesModified;
|
|
extern DWORD ServicesModifiedSize;
|
|
|
|
#endif // COMSTF_INCLUDED
|