Example #1
0
//
// 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;
}
Example #2
0
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;
}