// // Load symbols for the MSF // // Return Value: symbol descriptor (SYMD) for the supplied PDB // PSYMD SYMLoadSymbols (MSF* msf) { PSYMD Symd = (PSYMD) calloc (sizeof(SYMD), 1); if (Symd != NULL) { Symd->msf = msf; Symd->dbi = (PNewDBIHdr) MsfReferenceStream (msf, PDB_STREAM_DBI, &Symd->DbiSize); if (Symd->dbi != NULL && Symd->DbiSize >= sizeof(NewDBIHdr)) { Symd->SymRecs = (PSYM) MsfReferenceStream (msf, Symd->dbi->snSymRecs, &Symd->SymSize); if (Symd->SymRecs != NULL) { Symd->SymMac = (PSYM)((PUCHAR)Symd->SymRecs + Symd->SymSize); Symd->TpiHdr = TPILoadTypeInfo (msf); if (Symd->TpiHdr != NULL) { return Symd; } } } free (Symd); } return NULL; }
PHDR TPILoadTypeInfo(MSF *msf) { ULONG TpiSize; PHDR pHdr = (PHDR)MsfReferenceStream(msf, PDB_STREAM_TPI, &TpiSize); if (TpiSize >= HDR_ && TpiSize >= pHdr->cbHdr + pHdr->cbGprec && pHdr->tiMac >= pHdr->tiMin) { return pHdr; } printf("TPI stream invalid\n"); return NULL; }