windows-nt/Source/XPSP1/NT/base/wow64/tools/gen.h

695 lines
18 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1995-1999 Microsoft Corporation
Module Name:
gen.h
Abstract:
Types shared between the Wx86 tools
Author:
??-???-?? Unknown
Revision History:
--*/
// Increment this number whenever the format of winincs.ppm changes
#define VM_TOOL_VERSION_BASE 0x80000006
// Make the 64-bit PPM file format incompatible to prevent badness
#if _WIN64
#define VM_TOOL_VERSION (VM_TOOL_VERSION_BASE | 0x01000000)
#else
#define VM_TOOL_VERSION (VM_TOOL_VERSION_BASE)
#endif
// Make the compiler more struct.
#pragma warning(3:4033) // function must return a value
//#pragma warning(3:4701) // local may be used w/o init
#pragma warning(3:4702) // Unreachable code
#pragma warning(3:4705) // Statement has no effect
extern const char *ErrMsgPrefix; // string to put in front of all error
// messages so that BUILD can find them.
// This is something like:
// "NMAKE : U8600: 'GENTHNK' "
struct _KnownTypesInfo;
typedef enum _TokenType {
TK_NONE, // 0
TK_IDENTIFIER, // 1
TK_NUMBER, // 2
TK_PLUS, // 3
TK_MINUS, // 4
TK_STAR, // 5
TK_DIVIDE, // 6
TK_LSQUARE, // 7
TK_RSQUARE, // 8
TK_LBRACE, // 9
TK_RBRACE, // a
TK_LPAREN, // b
TK_RPAREN, // c
TK_VARGS, // d
TK_CONST, // e
TK_VOLATILE, // f
TK_REGISTER, // 10
TK_EXTERN, // 11
TK_CDECL, // 12
TK_STDCALL, // 13
TK_TYPEDEF, // 14
TK_STATIC, // 15
TK_COMMA, // 16
TK_SEMI, // 17
TK_STRUCT, // 18
TK_UNION, // 19
TK_ENUM, // 1a
TK_INLINE, // 1b
TK_COLON, // 1c
TK_ASSIGN, // 1d
TK_DOT, // 1e
TK_LSHIFT, // 1f
TK_RSHIFT, // 20
TK_LESS, // 21
TK_GREATER, // 22
TK_UNALIGNED, // 23
TK_DECLSPEC, // 24
TK_RESTRICT, // 25
TK_FASTCALL, // 26
TK_IN, // 27
TK_OUT, // 28
TK_INOUT, // 29
TK_BITWISE_AND, // 30
TK_BITWISE_OR, // 31
TK_LOGICAL_AND, // 32
TK_LOGICAL_OR, // 33
TK_MOD, // 34
TK_XOR, // 35
TK_NOT, // 36
TK_TILDE, // 37
TK_STRING, // 38
TK_SIZEOF, // 39
TK_TEMPLATE, // 40
TK___W64, // 41
TK_EOS // end-of-statement
} TOKENTYPE, *PTOKENTYPE;
typedef struct _cvmheapinfo {
ULONG_PTR uBaseAddress;
ULONG_PTR uReserveSize;
ULONG_PTR uRegionSize;
ULONG_PTR uUncomitted;
ULONG_PTR uUnReserved;
ULONG_PTR uAvailable;
} CVMHEAPINFO;
typedef struct _memberinfo {
struct _memberinfo *pmeminfoNext; // ptr to next member
DWORD dwOffset; // offset in structure of member
char *sName; // member name
char *sType; // type name
struct _KnownTypesInfo *pkt; // Info for this type
int IndLevel; // levels of indirection
struct _KnownTypesInfo *pktCache; // used by MemberTypes() in genthnk
BOOL bIsBitfield; // Determines if this is a bitfield
int BitsRequired; // Number of bits required for bitfield
BOOL bIsPtr64; // Pointer is a 64 bit pointer
BOOL bIsArray; // This member is an array
int ArrayElements; // Number of elements in the array
} MEMBERINFO, *PMEMBERINFO;
typedef struct _funcinfo {
struct _funcinfo *pfuncinfoNext;
BOOL fIsPtr64; // TRUE if this is a __ptr64
TOKENTYPE tkDirection; // TK_IN, TK_OUT, TK_INOUT or TK_NONE
TOKENTYPE tkPreMod; // TK_CONST, TK_VOLATILE, or TK_NONE
TOKENTYPE tkSUE; // TK_STRUCT/UNION/ENUM, or TK_NONE
char *sType; // name of the type
struct _KnownTypesInfo *pkt; // Info for this type
TOKENTYPE tkPrePostMod; // TK_CONST, TK_VOLATILE, or TK_NONE
int IndLevel; // indirection level
TOKENTYPE tkPostMod; // TK_CONST, TK_VOLATILE, or TK_NONE
char *sName; // name of the argment
} FUNCINFO, *PFUNCINFO;
#if _WIN64
// The sizes must be bigger since the MEMBERINFO structs themselves are bigger
#define FUNCMEMBERSIZE (40*1024) // storage for members or MEMINFO list
#define MEMBERMETHODSSIZE 8192 // storage for names of methods
#else
#define FUNCMEMBERSIZE (20*1024) // storage for members or MEMINFO list
#define MEMBERMETHODSSIZE 4096 // storage for names of methods
#endif
typedef enum _TypeKind {
TypeKindEmpty = 0, // Members[] is unused
TypeKindStruct, // TYPESINFO.Members is array of MEMBERINFO
TypeKindFunc // TYPESINFO.Members is array of FUNCINFO
} TYPEKIND;
#define DIR_INOUT 0
#define DIR_IN 1
#define DIR_OUT 2
#define SIZEOFPOINTER 4 // standard size for 32 bit pointer
#define SIZEOFPOINTER64 8 // standard size for 64 bit pointer
// The colors
typedef enum {RED, BLACK} COL;
typedef struct _KnownTypesInfo {
// elements used by the Red-Black tree code, along with TypeName
struct _KnownTypesInfo *RBParent;
struct _KnownTypesInfo *RBLeft;
struct _KnownTypesInfo *RBRight;
COL RBColor;
struct _KnownTypesInfo *Next;
ULONG Flags;
int IndLevel;
int RetIndLevel;
int Size;
int iPackSize;
char *BasicType;
char *BaseName;
char *FuncRet;
char *FuncMod;
char *TypeName;
char *Methods;
char *IMethods;
char *BaseType;
GUID gGuid;
DWORD dwVTBLSize;
DWORD dwVTBLOffset;
int TypeId;
int LineNumber;
DWORD dwScopeLevel;
struct _KnownTypesInfo *pktBase; // a cache, used by genthnk
struct _KnownTypesInfo *pktRet; // a cache, used by genthnk
int SizeMembers; // size of Members[], in bytes
char *Members;
char *FileName;
PMEMBERINFO pmeminfo;
PFUNCINFO pfuncinfo;
DWORD dwArrayElements;
DWORD dwBaseSize;
struct _KnownTypesInfo *pTypedefBase;
DWORD dwCurrentPacking;
char Names[1];
} KNOWNTYPES, *PKNOWNTYPES;
typedef struct _RBTree {
PKNOWNTYPES pRoot;
PKNOWNTYPES pLastNodeInserted;
} RBTREE, *PRBTREE;
typedef struct _DefaultBasicTypes {
char *BasicType;
}DEFBASICTYPES, *PDEFBASICTYPES;
typedef struct _TypesInfo {
ULONG Flags;
int IndLevel; // indirection level
int Size; // size of the type in bytes
int iPackSize; // packing size
char BasicType[MAX_PATH];
char BaseName[MAX_PATH];
char FuncRet[MAX_PATH];
char FuncMod[MAX_PATH];
char TypeName[MAX_PATH]; // typedef or struc name
TYPEKIND TypeKind; // how to interpret Members[] data
PFUNCINFO pfuncinfo; // if TypeKind==TypeKindFunc, ptr to first FUNCINFO
int RetIndLevel; // if TypeKind==TypeKindFunc, indlevel of return type for function
DWORD dwMemberSize; // #bytes used in Members array
char Members[FUNCMEMBERSIZE]; // stores either MEMBERINFOs or FUNCINFOs
// Added to support automatic retrival of COM objects
// If a class or struct is found with virtual methods, an extra VTLB member
// is created at the top.
// Note: a class has a VTLB if virtual methods are found or base class
// has virtual methods
// A type is a COM object if it is IUnknown or it derives from a COM object
GUID gGuid; // Guid for this object if
DWORD dwVTBLSize; // Total size of the VTBL
DWORD dwVTBLOffset; // Offset of VTLB from parent
char Methods[MEMBERMETHODSSIZE]; // Names of methods
char IMethods[MEMBERMETHODSSIZE]; // Names of methods not inherited
char BaseType[MAX_PATH]; // Name of the base class
//////////////////////////////////////////////////////////////////////
// Added to support reordering of definations later
//////////////////////////////////////////////////////////////////////
int TypeId; //is actually a defination ID
char FileName[MAX_PATH];
int LineNumber;
DWORD dwCurrentPacking; // Packing level when structure defined
DWORD dwScopeLevel;
DWORD dwArrayElements; // If this is an array, the number of elements
DWORD dwBaseSize; // Base size before it is multiplied for the array
PKNOWNTYPES pTypedefBase;
} TYPESINFO, *PTYPESINFO;
#define BTI_DLLEXPORT 1 // the function decl had __declspec(dllimport)
#define BTI_CONTAINSFUNCPTR 2 // the type contains a function pointer
#define BTI_PTR64 4 // the type is a __ptr64
#define BTI_HASGUID 8 // A guid has been found for this type
#define BTI_ISCOM 16 // This is a COM object
#define BTI_DISCARDABLE 32 // Type is overwriteable
#define BTI_VIRTUALONLY 64 // Contains only virtual methods
#define BTI_ANONYMOUS 128 // Type is anonymous
#define BTI_POINTERDEP 256 // Type is dependent on the standard pointer size
#define BTI_NOTDERIVED 512 // Type is not derived, but a placeholder
#define BTI_ISARRAY 1024 // Element is an array
#define BTI_UNSIGNED 2048 // Used only on default derived types
// Signals that the type is unsigned
#define BTI_INT64DEP 4096 // this is a 8byte integer value that
// might be union as well
// contiguous allocation in a buffer
typedef struct _bufallocinfo {
BYTE *pb; // ptr to buffer pool
DWORD dwSize; // size of buffer pool
DWORD dwLen; // current length of buffer pool
} BUFALLOCINFO;
typedef struct _TokenMatch {
TOKENTYPE Tk;
char *MatchString;
} TOKENMATCH, *PTOKENMATCH;
extern char *TokenString[];
extern TOKENMATCH KeywordList[];
typedef struct _Token {
TOKENTYPE TokenType;
union _TokenName {
char *Name; // filled in only for TokenType==TK_IDENTIFIER or TK_STRING
long Value; // filled in only for TokenType==TK_NUMBER
};
DWORD dwValue; //unsigned version of Value
} TOKEN, *PTOKEN;
#define MAX_CHARS_IN_LINE 4096
#define MAX_TOKENS_IN_STATEMENT 4096
extern TOKEN Tokens[MAX_TOKENS_IN_STATEMENT];
extern int CurrentTokenIndex;
void
ResetLexer(
void
);
char *
LexOneLine(
char *p,
BOOL fStopAtStatement,
BOOL *pfLexDone
);
BOOL
UnlexToText(
char *dest,
int destlen,
int StartToken,
int EndToken
);
void
DumpLexerOutput(
int FirstToken
);
void
HandlePreprocessorDirective(
char *Line
);
TOKENTYPE
ConsumeDirectionOpt(
void
);
TOKENTYPE
ConsumeConstVolatileOpt(
void
);
PMEMBERINFO
AllocMemInfoAndLink(
BUFALLOCINFO *pbufallocinfo,
PMEMBERINFO pmeminfo
);
PFUNCINFO
AllocFuncInfoAndLink(
BUFALLOCINFO *pbufallocinfo,
PFUNCINFO pfuncinfo
);
DWORD
SizeOfMultiSz(
char *c
);
BOOL
CatMultiSz(
char *dest,
char *source,
DWORD dwMaxSize
);
BOOL
AppendToMultiSz(
char *dest,
char *source,
DWORD dwMaxSize
);
BOOL IsInMultiSz(
const char *multisz,
const char *element
);
BOOL
ConvertStringToGuid(
const char *pString,
GUID *pGuid
);
//
// Inline code
#define iswhitespace(c) ((c == ' ') || (c == '\t'))
//
// initialize BUFALLOCINFO structure
_inline void BufAllocInit(BUFALLOCINFO *pbufallocinfo,
BYTE *pb, DWORD dwSize, DWORD dwLen)
{
pbufallocinfo->pb = pb;
pbufallocinfo->dwSize = dwSize;
pbufallocinfo->dwLen = dwLen;
}
//
// allocate memory from buffer
_inline void *BufAllocate(BUFALLOCINFO *pbufallocinfo, DWORD dwLen)
{
void *pv = NULL;
DWORD dwNewLen;
// Pad to quadword alignment, like malloc does, so RISC builds don't
// take alignment faults.
dwLen = (dwLen+7) & ~7;
dwNewLen = pbufallocinfo->dwLen + dwLen;
if (dwNewLen < pbufallocinfo->dwSize)
{
pv = &pbufallocinfo->pb[pbufallocinfo->dwLen];
pbufallocinfo->dwLen = dwNewLen;
}
return(pv);
}
//
// determine if we could allocate from buffer pool
_inline BOOL BufCanAllocate(BUFALLOCINFO *pbufallocinfo, DWORD dwLen)
{
return( (pbufallocinfo->dwLen + dwLen) < pbufallocinfo->dwSize);
}
//
// get pointer to current free area
_inline void *BufPointer(BUFALLOCINFO *pbufallocinfo)
{
return(&pbufallocinfo->pb[pbufallocinfo->dwLen]);
}
//
// get remaining space in buffer
_inline DWORD BufGetFreeSpace(BUFALLOCINFO *pbufallocinfo)
{
return pbufallocinfo->dwSize - pbufallocinfo->dwLen;
}
_inline char *SkipWhiteSpace(char *s)
{
while (iswhitespace(*s) && (*s != 0)) {
s++;
}
return(s);
}
__inline void
ConsumeToken(
void
)
{
if (Tokens[CurrentTokenIndex].TokenType != TK_EOS) {
CurrentTokenIndex++;
}
}
__inline PTOKEN
CurrentToken(
void
)
{
return &Tokens[CurrentTokenIndex];
}
//
// function prototypes
char *SkipKeyWord(char *pSrc, char *pKeyWord);
BOOL IsSeparator(char ch);
BOOL IsTokenSeparator(void);
size_t CopyToken(char *pDst, char *pSrc, size_t Size);
char *GetNextToken(char *pSrc);
void DumpKnownTypes(PKNOWNTYPES pKnownTypes, FILE *fp);
void DumpTypesInfo(PTYPESINFO pTypesInfo, FILE *fp);
void FreeTypesList(PRBTREE HeadList);
void __cdecl ErrMsg(char *pch, ...);
void __cdecl ExitErrMsg(BOOL bSysError, char *pch, ...);
void __cdecl DbgPrintf(char *pch, ...);
char *ReadEntireFile(HANDLE hFile, DWORD *pBytesRead);
HANDLE CreateTempFile(VOID);
BOOL
ParseTypes(
PRBTREE pTypesList,
PTYPESINFO pTypesInfo,
PKNOWNTYPES *ppKnownTypes
);
PFUNCINFO
RelocateTypesInfo(
char *dest,
PTYPESINFO src
);
void ParseIndirection(
DWORD *pIndLevel,
DWORD *pdwSize,
DWORD *pFlags,
PTOKENTYPE tkPrePostMod,
PTOKENTYPE tkPostMod
);
PKNOWNTYPES
GetNameFromTypesList(
PRBTREE pHeadList,
char *pTypeName
);
PDEFBASICTYPES
GetDefBasicType(
char *pBasicType
);
PKNOWNTYPES
AddToTypesList(
PRBTREE pHeadList,
PTYPESINFO pTypesInfo
);
BOOL
AddOpenFile(
char *FileName,
FILE *fp,
HANDLE hFile
);
void
DelOpenFile(
FILE *fp,
HANDLE hFile
);
void
CloseOpenFileList(
BOOL DeleteFiles
);
BOOL
ConsoleControlHandler(
DWORD dwCtrlType
);
//
// global vars
extern char szVARGS[];
extern char szNULL[];
extern char szCONST[];
extern char szVOLATILE[];
extern char szREGISTER[];
extern char szEXTERN[];
extern char szCDECL[];
extern char sz_CDECL[];
extern char szSTDCALL[];
extern char sz__FASTCALL[];
extern char szUNALIGNED[];
extern char szTYPEDEF[];
extern char szCHAR[];
extern char szINT[];
extern char szLONG[];
extern char szSHORT[];
extern char szDOUBLE[];
extern char szENUM[];
extern char szFLOAT[];
extern char szSTRUCT[];
extern char szUNION[];
extern char szVOID[];
extern char szINT64[];
extern char sz_INT64[];
extern char szFUNC[];
extern char szSIGNED[];
extern char szUNSIGNED[];
extern char szFUNCTIONS[];
extern char szSTRUCTURES[];
extern char szTYPEDEFS[];
extern char szPragma[];
extern char szPack[];
extern char szPush[];
extern char szPop[];
extern char szSTATIC[];
extern char szUNSIGNEDCHAR[];
extern char szUNSIGNEDSHORT[];
extern char szUNSIGNEDLONG[];
extern CHAR szINOUT[];
extern CHAR szIN[];
extern CHAR szOUT[];
extern CHAR szVTBL[];
extern char szGUID[];
extern BOOLEAN bDebug;
extern BOOLEAN bExitClean;
extern PVOID (*fpTypesListMalloc)(ULONG Len);
PKNOWNTYPES GetBasicType(
char *sTypeName,
PRBTREE TypeDefsList,
PRBTREE StructsList);
void ReplaceInTypesList(PKNOWNTYPES pKnownTypes, PTYPESINFO pTypesInfo);
HANDLE CreateAllocCvmHeap(ULONG_PTR uBaseAddress,
ULONG_PTR uReserveSize,
ULONG_PTR uRegionSize,
ULONG_PTR uUncomitted,
ULONG_PTR uUnReserved,
ULONG_PTR uAvailable);
PVOID GetCvmHeapBaseAddress(HANDLE hCvmHeap);
PVOID
AllocCvm(HANDLE hCvmHeap,
ULONG_PTR Size
);
void DeleteAllocCvmHeap(HANDLE hCvmHeap);
// This structure is the first thing allocated within the CvmHeap. It contains
// the roots of all data stored within the heap.
typedef struct _CvmHeapHeader {
ULONG Version;
ULONG_PTR BaseAddress;
RBTREE FuncsList;
RBTREE StructsList;
RBTREE TypeDefsList;
KNOWNTYPES NIL;
} CVMHEAPHEADER, *PCVMHEAPHEADER;
PVOID GetCvmHeapAvailable(HANDLE hCvmHeap);
// from redblack.c:
VOID
RBInsert(
PRBTREE proot,
PKNOWNTYPES x
);
PKNOWNTYPES
RBFind(
PRBTREE proot,
PVOID addr
);
PKNOWNTYPES
RBDelete(
PRBTREE proot,
PKNOWNTYPES z
);
VOID
RBInitTree(
PRBTREE proot
);
extern PKNOWNTYPES NIL;
//
// Use these allocators instead of malloc/free
//
PVOID GenHeapAlloc(INT_PTR Len);
void GenHeapFree(PVOID pv);
BOOL
IsDefinedPointerDependent(
char *pName
);
PCHAR
IsDefinedPtrToPtrDependent(
IN char *pName
);
BOOL
ClosePpmFile(
BOOL bExitFailure
);
PCVMHEAPHEADER
MapPpmFile(
char *sPpmfile,
BOOL bExitFailure
);
char *GetHostPointerName(BOOL bIsPtr64);
char *GetHostBasicTypeName(PKNOWNTYPES pkt);
char *GetHostTypeName(PKNOWNTYPES pkt, char *pBuffer);