windows-nt/Source/XPSP1/NT/base/wow64/tools/gennt32t/gennt32t.cpp

210 lines
6.3 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1998-1999 Microsoft Corporation
Module Name:
gennt32t.cpp
Abstract:
Generates NT32 headers for use in the NT64 build.
Author:
mzoran 5-8-98
Revision History:
--*/
#pragma warning( disable : 4786) //disable identifier is too long for debugging error
#pragma warning( disable : 4503) //disable decorated name is too long
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <imagehlp.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <sstream>
#include <set>
#include <map>
extern "C" {
#include "gen.h"
// string to put in front of all error messages so that BUILD can find them.
const char *ErrMsgPrefix = "NMAKE : U8603: 'GENNT32T' ";
void
HandlePreprocessorDirective(
char *p
)
{
ExitErrMsg(FALSE, "Preprocessor directives not allowed by gennt32t.\n");
}
}
using namespace std;
typedef string String;
PRBTREE pFunctions = NULL;
PRBTREE pStructures = NULL;
PRBTREE pTypedefs = NULL;
PKNOWNTYPES NIL = NULL;
void ExtractCVMHeader(PCVMHEAPHEADER pHeader) {
pFunctions = &pHeader->FuncsList;
pTypedefs = &pHeader->TypeDefsList;
pStructures =&pHeader->StructsList;
NIL =&pHeader->NIL;
}
void GetType(PKNOWNTYPES pTypes, char *pPrepend, ostream & oType, ostream & oName, BOOL bAddTypeName) {
while(1) {
PKNOWNTYPES pBasicType = NULL;
assert(pTypes->TypeName != NULL);
oType << "/* " << pTypes->TypeName << " */";
if(pTypes->Flags & BTI_ISARRAY)
oName << '[' << pTypes->dwArrayElements << ']';
if (pTypes->IndLevel > 0) {
oType << GetHostPointerName(pTypes->Flags & BTI_PTR64);
return;
}
if(!(BTI_NOTDERIVED & pTypes->Flags)) {
if (strcmp(pTypes->BaseName, "enum") == 0) {
if (bAddTypeName)
oType << "enum " << pPrepend << pTypes->TypeName << " {} \n";
else
oType << "_int32 \n";
return;
}
else if (strcmp(pTypes->BaseName, "union") == 0 ||
strcmp(pTypes->BaseName, "struct") == 0) {
oType << "\n#pragma pack(" << pTypes->dwCurrentPacking
<< ")\n";
if (bAddTypeName)
oType << pTypes->BaseName << " " << pPrepend << pTypes->TypeName;
else
oType << pTypes->BaseName << " ";
if (NULL != pTypes->pmeminfo) {
oType << "{\n";
PMEMBERINFO pmeminfo = pTypes->pmeminfo;
do {
ostringstream oMemberType("");
ostringstream oMemberName("");
PKNOWNTYPES pMemberType = pmeminfo->pkt;
if(pmeminfo->sName != NULL)
(ostream)oMemberName << pmeminfo->sName;
if (pmeminfo->bIsArray)
(ostream)oMemberName << '[' << pmeminfo->ArrayElements << ']';
if (pmeminfo->IndLevel > 0) {
(ostream)oMemberType << GetHostPointerName(pmeminfo->bIsPtr64);
}
else {
GetType(pMemberType, pPrepend, oMemberType, oMemberName, FALSE);
if (pmeminfo->bIsBitfield)
(ostream)oMemberName << " : " << pmeminfo->BitsRequired;
}
oType << oMemberType.str() << " " << oMemberName.str() << ";\n";
pmeminfo = pmeminfo->pmeminfoNext;
} while(NULL != pmeminfo);
oType << "}\n";
}
return;
}
else {
pBasicType = pTypes->pTypedefBase;
if (NULL == pBasicType) {
oType << GetHostPointerName(pTypes->Flags & BTI_PTR64);
return;
}
pTypes = pBasicType;
}
}
else {
char Buffer[MAX_PATH];
oType << GetHostTypeName(pTypes, Buffer);
return;
}
}
}
void DumpTypesHeader(void) {
PKNOWNTYPES pTypes;
cout << "///////////////////////////////////////////\n";
cout << "// This file is autogenerated by gennt32t. \n";
cout << "// Do not edit \n";
cout << "///////////////////////////////////////////\n";
cout << '\n' << '\n';
cout << "#include <guiddef.h>\n\n";
cout << "#pragma pack(push, gennt32t)\n\n";
cout << "///////////////////////////////////////////\n";
cout << "// Structures \n";
cout << "///////////////////////////////////////////\n";
for(pTypes = pStructures->pLastNodeInserted; pTypes != NULL; pTypes = pTypes->Next) {
if (pTypes->TypeName != NULL && !(pTypes->Flags & BTI_NOTDERIVED)) {
ostringstream oType;
ostringstream oName;
GetType(pTypes, "NT32", oType, oName, TRUE);
cout << "/* " << pTypes->TypeName << " */";
cout << oType.str() << "\n";
cout << oName.str() << ";" << "\n";
cout << "/* End of definition for " << pTypes->TypeName << " */\n";
cout << '\n';
} }
cout << '\n' << '\n';
cout << "///////////////////////////////////////////\n";
cout << "// TypeDefs \n";
cout << "///////////////////////////////////////////\n";
for(pTypes = pTypedefs->pLastNodeInserted; pTypes != NULL; pTypes = pTypes->Next) {
if (pTypes->TypeName != NULL && !(pTypes->Flags & BTI_NOTDERIVED)) {
ostringstream oType;
ostringstream oName;
oName << "NT32" << pTypes->TypeName << " ";
GetType(pTypes, "NT32", oType, oName, FALSE);
cout << "/* " << pTypes->TypeName << " */" << " typedef \n";
cout << oType.str() << "\n";
cout << oName.str() << "\n";
cout << ";" << "\n";
cout << "/* End of definition for " << pTypes->TypeName << " */\n";
cout << '\n';
}
}
cout << '\n' << '\n';
cout << "#pragma pack(pop, gennt32t)\n\n";
}
int _cdecl main(int argc, char*argv[]) {
ExtractCVMHeader(MapPpmFile(argv[1], TRUE));
DumpTypesHeader();
return 0;
}