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" ) )
161 if ( symbolName.
compare(0,2,
"__") == 0 )
163 if ( symbolName.
compare(0,3,
"??_") == 0 && symbolName[3] !=
'0')
165 if( symbolName[0] ==
'_') {
166 symbolName.
erase(0, 1);
169 if (symbolName.
find (
"detail@boost") != string::npos )
171 if (symbolName.
find (
"details@boost") != string::npos )
183 temp |= bigEndian >> 24;
184 temp |= ((bigEndian & 0x00FF0000) >> 8);
185 temp |= ((bigEndian & 0x0000FF00) << 8);
186 temp |= ((bigEndian & 0x000000FF) << 24);
193 return m_strErrorMsg;
203 m_hFile = INVALID_HANDLE_VALUE;
205 m_pMemoryMappedFileBase = 0;
209 m_hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
210 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)0);
212 if ( m_hFile == INVALID_HANDLE_VALUE )
217 m_cbFile = ::GetFileSize( m_hFile, 0 );
219 m_hFileMapping = CreateFileMapping(m_hFile,NULL, PAGE_READONLY, 0, 0,NULL);
220 if ( m_hFileMapping == 0 )
223 CloseHandle(m_hFile);
224 m_hFile = INVALID_HANDLE_VALUE;
228 m_pMemoryMappedFileBase = (PCHAR)MapViewOfFile( m_hFileMapping,
229 FILE_MAP_READ, 0, 0, 0);
230 if ( m_pMemoryMappedFileBase == 0 )
233 CloseHandle(m_hFileMapping);
235 CloseHandle(m_hFile);
236 m_hFile = INVALID_HANDLE_VALUE;
246 if ( m_pMemoryMappedFileBase )
247 UnmapViewOfFile( m_pMemoryMappedFileBase );
249 if ( m_hFileMapping )
250 CloseHandle( m_hFileMapping );
252 if ( m_hFile != INVALID_HANDLE_VALUE )
253 CloseHandle( m_hFile );
std::string GetLastError() const
bool TRUE
for job options legacy (TODO: get rid of these!) ----------------------—
~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)