31 #pragma warning ( disable : 4273 )
33 #define pclose _pclose
34 #define fileno _fileno
45 #if !defined(AFX_LIBSYMBOLINFO_H__1A7003B4_BA53_11D1_AE46_1CFB51000000__INCLUDED_)
46 #define AFX_LIBSYMBOLINFO_H__1A7003B4_BA53_11D1_AE46_1CFB51000000__INCLUDED_
50 #endif // _MSC_VER >= 1000
64 BOOL
DumpSymbols(LPTSTR lpszLibPathName, std::ostream& pFile);
71 BOOL
Dump(LPTSTR lpszLibPathName, std::ostream& pFile);
102 #endif // !defined(AFX_LIBSYMBOLINFO_H__1A7003B4_BA53_11D1_AE46_1CFB51000000__INCLUDED_)
106 #define MakePtr( cast, ptr, addValue ) (cast)( (DWORD)(ptr) + (DWORD)(addValue))
133 if(lpszLibPathName == NULL || pFile.bad() ) {
134 assert(lpszLibPathName != NULL);
135 assert(pFile.good());
136 m_strErrorMsg.assign(
"NULL <lpszLibPathName> or Invalid file handle.");
140 if(!Dump(lpszLibPathName, pFile))
return FALSE;
162 m_strErrorMsg =
"Unable to access file ";
163 m_strErrorMsg+= lpszLibPathName;
169 PSTR pArchiveStartString = (PSTR)libFile.
GetBase();
171 if ( 0 != strncmp( pArchiveStartString, IMAGE_ARCHIVE_START,
172 IMAGE_ARCHIVE_START_SIZE ) ) {
173 m_strErrorMsg.assign(
"Not a valid COFF LIB file.");
179 PIMAGE_ARCHIVE_MEMBER_HEADER pMbrHdr;
180 pMbrHdr =
MakePtr( PIMAGE_ARCHIVE_MEMBER_HEADER, pArchiveStartString,
181 IMAGE_ARCHIVE_START_SIZE );
184 PDWORD pcbSymbols = (PDWORD)(pMbrHdr + 1);
188 DWORD cSymbols = ConvertBigEndian( *pcbSymbols );
192 PDWORD pMemberOffsets = pcbSymbols + 1;
196 PSTR pszSymbolName =
MakePtr( PSTR, pMemberOffsets, 4 * cSymbols );
201 for (
unsigned i = 0; i < cSymbols; i++ )
207 offset = ConvertBigEndian( *pMemberOffsets );
212 if ( IsRegularLibSymbol( pszSymbolName ) ) {
213 string symbol(pszSymbolName);
214 if (IsFiltedSymbol(symbol) ) {
215 pFile << symbol << endl;
222 pszSymbolName += strlen(pszSymbolName) + 1;
233 if ( 0 == strncmp( pszSymbolName,
"__IMPORT_DESCRIPTOR_", 20 ) )
236 if ( 0 == strncmp( pszSymbolName,
"__NULL_IMPORT_DESCRIPTOR", 24 ) )
239 if ( strstr( pszSymbolName,
"_NULL_THUNK_DATA" ) )
250 if ( symbolName.substr(0,3) ==
"_CT" )
return FALSE;
251 if ( symbolName.substr(0,3) ==
"_TI" )
return FALSE;
253 if ( symbolName.substr(0,2) ==
"__" )
255 if ( symbolName.substr(0,3) ==
"??_" && symbolName[3] !=
'0')
257 if( symbolName[0] ==
'_') {
258 symbolName.erase(0, 1);
261 if (symbolName.find (
"detail@boost") != string::npos )
263 if (symbolName.find (
"details@boost") != string::npos )
275 temp |= bigEndian >> 24;
276 temp |= ((bigEndian & 0x00FF0000) >> 8);
277 temp |= ((bigEndian & 0x0000FF00) << 8);
278 temp |= ((bigEndian & 0x000000FF) << 24);
285 return m_strErrorMsg;
295 m_hFile = INVALID_HANDLE_VALUE;
297 m_pMemoryMappedFileBase = 0;
301 m_hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
302 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)0);
304 if ( m_hFile == INVALID_HANDLE_VALUE )
309 m_cbFile = ::GetFileSize( m_hFile, 0 );
311 m_hFileMapping = CreateFileMapping(m_hFile,NULL, PAGE_READONLY, 0, 0,NULL);
312 if ( m_hFileMapping == 0 )
315 CloseHandle(m_hFile);
316 m_hFile = INVALID_HANDLE_VALUE;
320 m_pMemoryMappedFileBase = (PCHAR)MapViewOfFile( m_hFileMapping,
321 FILE_MAP_READ, 0, 0, 0);
322 if ( m_pMemoryMappedFileBase == 0 )
325 CloseHandle(m_hFileMapping);
327 CloseHandle(m_hFile);
328 m_hFile = INVALID_HANDLE_VALUE;
338 if ( m_pMemoryMappedFileBase )
339 UnmapViewOfFile( m_pMemoryMappedFileBase );
341 if ( m_hFileMapping )
342 CloseHandle( m_hFileMapping );
344 if ( m_hFile != INVALID_HANDLE_VALUE )
345 CloseHandle( m_hFile );
352 cerr <<
"Usage: genwindef [-l <dllname>] [-o <output-file> | exports.def] <obj or lib filenames>" << endl;
359 int main (
int argc,
char** argv )
362 string outfile(
"exports.def");
363 string library(
"UnknownLib");
370 while (argv[arg][0] ==
'-') {
371 if (strcmp(argv[arg],
"--") == 0) {
374 else if (strcmp(argv[arg],
"-l") == 0) {
379 else if (strcmp(argv[arg],
"-o") == 0) {
387 for (arg; arg < argc; arg++) {
388 objfiles += argv[arg];
389 if( arg+1 < argc) objfiles +=
" ";
393 ofstream out(outfile.c_str());
395 cerr <<
"windef: Error opening file " << outfile << endl;
398 out <<
"LIBRARY " << library << endl;
399 out <<
"EXPORTS" << endl;
401 libsymbols.
DumpSymbols(const_cast<char*>(objfiles.c_str()), out);
std::string GetLastError() const
MEMORY_MAPPED_FILE * PMEMORY_MAPPED_FILE
BOOL IsFiltedSymbol(std::string &pszSymbolName)
std::string m_strResultsString
BOOL DumpSymbols(LPTSTR lpszLibPathName, std::ostream &pFile)
DWORD ConvertBigEndian(DWORD bigEndian)
#define MakePtr(cast, ptr, addValue)
PVOID m_pMemoryMappedFileBase
int main(int argc, char **argv)
BOOL IsRegularLibSymbol(PSTR pszSymbolName)
MEMORY_MAPPED_FILE(PSTR pszFileName)
~MEMORY_MAPPED_FILE(void)
BOOL Dump(LPTSTR lpszLibPathName, std::ostream &pFile)
std::string m_strErrorMsg
virtual ~CLibSymbolInfo()