/*++ 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include 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 \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; }