18 #define MakePtr( cast, ptr, addValue ) (cast)( (DWORD)(ptr) + (DWORD)(addValue)) 
   45   if(lpszLibPathName == NULL || pFile.bad() ) {
 
   46     assert(lpszLibPathName != NULL);
 
   48     m_strErrorMsg.assign(
"NULL <lpszLibPathName> or Invalid file handle.");
 
   52   if(!Dump(lpszLibPathName, pFile))  
return FALSE;
 
   74         m_strErrorMsg = 
"Unable to access file ";
 
   75     m_strErrorMsg+= lpszLibPathName;
 
   81   PSTR pArchiveStartString = (PSTR)libFile.
GetBase();
 
   83   if ( 0 != strncmp( pArchiveStartString, IMAGE_ARCHIVE_START,
 
   84                        IMAGE_ARCHIVE_START_SIZE )  )  {
 
   85       m_strErrorMsg.assign(
"Not a valid COFF LIB file.");
 
   91   PIMAGE_ARCHIVE_MEMBER_HEADER pMbrHdr;
 
   92   pMbrHdr = 
MakePtr( PIMAGE_ARCHIVE_MEMBER_HEADER, pArchiveStartString,
 
   93                      IMAGE_ARCHIVE_START_SIZE );
 
   96   PDWORD pcbSymbols = (PDWORD)(pMbrHdr + 1);  
 
  100   DWORD cSymbols = ConvertBigEndian( *pcbSymbols );
 
  104   PDWORD pMemberOffsets = pcbSymbols + 1;     
 
  108   PSTR pszSymbolName = 
MakePtr( PSTR, pMemberOffsets, 4 * cSymbols );
 
  113   for ( 
unsigned i = 0; i < cSymbols; i++ )
 
  119     offset = ConvertBigEndian( *pMemberOffsets );
 
  124     if ( IsRegularLibSymbol( pszSymbolName ) ) {
 
  125       string symbol(pszSymbolName);
 
  126       if (IsFiltedSymbol(symbol) ) {
 
  127         pFile << symbol << endl;
 
  134     pszSymbolName += strlen(pszSymbolName) + 1;
 
  145   if ( 0 == strncmp( pszSymbolName, 
"__IMPORT_DESCRIPTOR_", 20 ) )
 
  148   if ( 0 == strncmp( pszSymbolName, 
"__NULL_IMPORT_DESCRIPTOR", 24 ) )
 
  151   if ( strstr( pszSymbolName, 
"_NULL_THUNK_DATA" ) )
 
  162   if ( symbolName.substr(0,3) == 
"_CT" ) 
return FALSE;
 
  163   if ( symbolName.substr(0,3) == 
"_TI" ) 
return FALSE;
 
  165   if ( symbolName.substr(0,2) == 
"__" ) 
 
  167   if ( symbolName.substr(0,3) == 
"??_" && symbolName[3] != 
'0') 
 
  169   if( symbolName[0] == 
'_') {
 
  170     symbolName.erase(0, 1);  
 
  173   if (symbolName.find (
"detail@boost") != string::npos )
 
  175   if (symbolName.find (
"details@boost") != string::npos ) 
 
  187   temp |= bigEndian >> 24;
 
  188   temp |= ((bigEndian & 0x00FF0000) >> 8);
 
  189   temp |= ((bigEndian & 0x0000FF00) << 8);
 
  190   temp |= ((bigEndian & 0x000000FF) << 24);
 
  197   return m_strErrorMsg;
 
  207    m_hFile = INVALID_HANDLE_VALUE;
 
  209    m_pMemoryMappedFileBase = 0;
 
  213    m_hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
 
  214                        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)0);
 
  216    if ( m_hFile == INVALID_HANDLE_VALUE )
 
  221     m_cbFile = ::GetFileSize( m_hFile, 0 );
 
  223    m_hFileMapping = CreateFileMapping(m_hFile,NULL, PAGE_READONLY, 0, 0,NULL);
 
  224    if ( m_hFileMapping == 0 )
 
  227        CloseHandle(m_hFile);
 
  228        m_hFile = INVALID_HANDLE_VALUE;
 
  232     m_pMemoryMappedFileBase = (PCHAR)MapViewOfFile( m_hFileMapping,
 
  233                                                    FILE_MAP_READ, 0, 0, 0);
 
  234     if ( m_pMemoryMappedFileBase == 0 )
 
  237        CloseHandle(m_hFileMapping);
 
  239        CloseHandle(m_hFile);
 
  240        m_hFile = INVALID_HANDLE_VALUE;
 
  250     if ( m_pMemoryMappedFileBase )
 
  251         UnmapViewOfFile( m_pMemoryMappedFileBase );
 
  253     if ( m_hFileMapping )
 
  254         CloseHandle( m_hFileMapping );
 
  256     if ( m_hFile != INVALID_HANDLE_VALUE )
 
  257         CloseHandle( m_hFile ); 
 
std::string GetLastError() const 
 
~MEMORY_MAPPED_FILE(void)
 
#define MakePtr(cast, ptr, addValue)
 
BOOL Dump(LPTSTR lpszLibPathName, std::ostream &pFile)
 
BOOL IsFiltedSymbol(std::string &pszSymbolName)
 
DWORD ConvertBigEndian(DWORD bigEndian)
 
MEMORY_MAPPED_FILE(PSTR pszFileName)
 
BOOL DumpSymbols(LPTSTR lpszLibPathName, std::ostream &pFile)
 
virtual ~CLibSymbolInfo()
 
BOOL IsRegularLibSymbol(PSTR pszSymbolName)