You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
2.9 KiB
117 lines
2.9 KiB
#include "SymCommon.h"
|
|
#include <strsafe.h>
|
|
|
|
BOOL SymCommonPDBLinesStripped(PDB *ppdb, DBI *pdbi) {
|
|
// Return values:
|
|
// FALSE - Private Information has NOT been stripped
|
|
// TRUE - Private Information has been stripped
|
|
|
|
Mod *pmod;
|
|
Mod *prevmod;
|
|
long cb;
|
|
|
|
pmod = NULL;
|
|
prevmod=NULL;
|
|
while (DBIQueryNextMod(pdbi, pmod, &pmod) && pmod) {
|
|
if (prevmod != NULL) ModClose(prevmod);
|
|
|
|
// Check that Source line info is removed
|
|
ModQueryLines(pmod, NULL, &cb);
|
|
|
|
if (cb != 0) {
|
|
ModClose(pmod);
|
|
return FALSE;
|
|
}
|
|
|
|
// Check that local symbols are removed
|
|
ModQuerySymbols(pmod, NULL, &cb);
|
|
|
|
if (cb != 0) {
|
|
ModClose(pmod);
|
|
return FALSE;
|
|
}
|
|
prevmod=pmod;
|
|
}
|
|
if (pmod != NULL) ModClose(pmod);
|
|
if (prevmod != NULL) ModClose(prevmod);
|
|
|
|
return (TRUE);
|
|
}
|
|
|
|
BOOL SymCommonPDBPrivateStripped(PDB *ppdb, DBI *pdbi) {
|
|
AGE age;
|
|
BOOL PrivateStripped;
|
|
GSI *pgsi;
|
|
BOOL valid;
|
|
|
|
age = pdbi->QueryAge();
|
|
|
|
if (age == 0) {
|
|
// If the age is 0, then check for types to determine if this is
|
|
// a private pdb or not. PDB 5.0 and earlier may have types and no
|
|
// globals if the age is 0.
|
|
|
|
PrivateStripped= SymCommonPDBTypesStripped(ppdb, pdbi) &&
|
|
SymCommonPDBLinesStripped(ppdb, pdbi);
|
|
|
|
} else {
|
|
// Otherwise, use globals to determine if the private info is
|
|
// stripped or not. No globals means that private is stripped.
|
|
__try {
|
|
valid = pdbi->OpenGlobals(&pgsi);
|
|
} __except( EXCEPTION_EXECUTE_HANDLER ) {
|
|
valid= FALSE;
|
|
}
|
|
|
|
if ( !valid ) {
|
|
return FALSE;
|
|
}
|
|
|
|
// Now, see if there are any globals in the pdb.
|
|
|
|
valid=TRUE;
|
|
__try {
|
|
PrivateStripped= ((pgsi->NextSym(NULL)) == NULL);
|
|
} __except( EXCEPTION_EXECUTE_HANDLER ) {
|
|
valid= FALSE;
|
|
}
|
|
|
|
GSIClose(pgsi);
|
|
if ( !valid ) {
|
|
return FALSE;
|
|
}
|
|
}
|
|
return (PrivateStripped);
|
|
}
|
|
|
|
BOOL SymCommonPDBTypesStripped(PDB *ppdb, DBI *pdbi) {
|
|
// Return values:
|
|
// FALSE - Private Information has NOT been stripped
|
|
// TRUE - Private Information has been stripped
|
|
|
|
unsigned itsm;
|
|
TPI *ptpi;
|
|
TI tiMin;
|
|
TI tiMac;
|
|
|
|
// Check that types are removed
|
|
for ( itsm = 0; itsm < 256; itsm++) {
|
|
ptpi = 0;
|
|
if (DBIQueryTypeServer(pdbi, (ITSM) itsm, &ptpi)) {
|
|
continue;
|
|
}
|
|
if (!ptpi) {
|
|
|
|
PDBOpenTpi(ppdb, pdbRead, &ptpi);
|
|
tiMin = TypesQueryTiMinEx(ptpi);
|
|
tiMac = TypesQueryTiMacEx(ptpi);
|
|
if (tiMin < tiMac) {
|
|
TypesClose(ptpi);
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
TypesClose(ptpi);
|
|
return (TRUE);
|
|
}
|
|
|