|
|
#if defined (use_CopyPdbX)
#include "private.h"
#include "splitsymx.h"
typedef BOOL ( __cdecl *PPDBCOPYTO ) ( PDB* ppdb, const char* szTargetPdb, DWORD dwCopyFilter, DWORD dwReserved );
typedef BOOL ( __cdecl *PPDBOPEN )( LNGNM_CONST char *, LNGNM_CONST char *, SIG, EC *, char [cbErrMax], PDB ** );
typedef BOOL ( __cdecl *PPDBCLOSE ) ( PDB* ppdb );
static PPDBCOPYTO pPDBCopyTo = NULL; static PPDBOPEN pPDBOpen = NULL; static PPDBCLOSE pPDBClose = NULL;
// If you call CopyPdbX with a NB10, or NB* pdb, then
// set szRSDSDllToLoad and it will use the statically
// linked in PDBCopyTo in msdbi60l.lib
BOOL CopyPdbX( CHAR const * szSrcPdb, CHAR const * szDestPdb, BOOL StripPrivate, CHAR const * szRSDSDllToLoad ) #else
BOOL CopyPdb( CHAR const * szSrcPdb, CHAR const * szDestPdb, BOOL StripPrivate )
#endif
{ LONG ErrorCode; ULONG Sig = 0; char ErrorString[1024]; BOOL rc; PDB * pSrcPdb; HINSTANCE hMsPdb;
static BOOL RSDSLibLoaded = FALSE;
// Add a short circut. PdbCopy fails miserably if the source and destination are the same.
// If StripPrivate isn't set, check for this case and just return. If StripPrivate is set,
// bummer.
if (!StripPrivate) { if (!_stricmp(szSrcPdb, szDestPdb)) { rc = TRUE; } else { rc = CopyFile(szSrcPdb, szDestPdb, FALSE); }
} else {
#if defined ( use_CopyPdbX )
if ( szRSDSDllToLoad != NULL ) { // Load the dll with PDBCopyTo
HMODULE hDll;
if ( !RSDSLibLoaded ) { hDll = LoadLibrary( szRSDSDllToLoad ); if (hDll != NULL) { RSDSLibLoaded = TRUE; pPDBCopyTo = ( PPDBCOPYTO ) GetProcAddress( hDll, "PDBCopyTo" ); if (pPDBCopyTo == NULL ) { return (FALSE); } pPDBOpen = ( PPDBOPEN ) GetProcAddress( hDll, "PDBOpen" ); if (pPDBOpen == NULL ) { return (FALSE); } pPDBClose = ( PPDBCLOSE ) GetProcAddress( hDll, "PDBClose" ); if (pPDBClose == NULL ) { return (FALSE); } } else { return (FALSE); } } __try { rc = pPDBOpen((char *)szSrcPdb, "r", Sig, &ErrorCode, ErrorString, &pSrcPdb); } __except (EXCEPTION_EXECUTE_HANDLER) { rc=FALSE; } } else { __try { rc = PDBOpen((char *)szSrcPdb, "r", Sig, &ErrorCode, ErrorString, &pSrcPdb); } __except (EXCEPTION_EXECUTE_HANDLER) { rc=FALSE; } } #else
__try { rc = PDBOpen((char *)szSrcPdb, "r", Sig, &ErrorCode, ErrorString, &pSrcPdb); } __except (EXCEPTION_EXECUTE_HANDLER) { rc=FALSE; } #endif
if (rc) { rc = DeleteFile(szDestPdb); if (rc || (GetLastError() == ERROR_FILE_NOT_FOUND)) {
#if defined ( use_CopyPdbX )
if ( szRSDSDllToLoad != NULL ) { rc = pPDBCopyTo(pSrcPdb, szDestPdb, StripPrivate ? 0x00000001 : 0x0000000, 0); } else { rc = PDBCopyTo(pSrcPdb, szDestPdb, StripPrivate ? 0x00000001 : 0x0000000, 0); } #else
rc = PDBCopyTo(pSrcPdb, szDestPdb, StripPrivate ? 0x00000001 : 0x0000000, 0); #endif
} if (!rc) { // PdbCopyTo doesn't cleanup on failure. Do it here.
DeleteFile(szDestPdb); } #if defined ( use_CopyPdbX )
if ( szRSDSDllToLoad != NULL ) { pPDBClose(pSrcPdb); } else { PDBClose(pSrcPdb); } #else
PDBClose(pSrcPdb); #endif
} } return(rc); }
|