//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ // //=============================================================================// // test_binaries.cpp : test for debug section // // Adapted from PEDUMP, AUTHOR: Matt Pietrek - 1993 //-------------------- #include #include #include "common.h" #include "strtools.h" bool HasSection( PIMAGE_SECTION_HEADER section, int numSections, const char *pSectionName ) { for ( int i = 0; i < numSections; i++ ) { if ( !strnicmp( (char *)section[i].Name, pSectionName, 8 ) ) return true; } return false; } void TestExeFile( const char *pFilename, PIMAGE_DOS_HEADER dosHeader ) { PIMAGE_NT_HEADERS pNTHeader; pNTHeader = MakePtr( PIMAGE_NT_HEADERS, dosHeader, dosHeader->e_lfanew ); // First, verify that the e_lfanew field gave us a reasonable // pointer, then verify the PE signature. if ( IsBadReadPtr(pNTHeader, sizeof(IMAGE_NT_HEADERS)) || pNTHeader->Signature != IMAGE_NT_SIGNATURE ) { printf("Unhandled EXE type, or invalid .EXE (%s)\n", pFilename); return; } if ( HasSection( (PIMAGE_SECTION_HEADER)(pNTHeader+1), pNTHeader->FileHeader.NumberOfSections, "ValveDBG" ) ) { printf("%s is a debug build\n", pFilename); } } // // Open up a file, memory map it, and call the appropriate dumping routine // void TestFile(const char *pFilename) { HANDLE hFile; HANDLE hFileMapping; LPVOID lpFileBase; PIMAGE_DOS_HEADER dosHeader; hFile = CreateFile(pFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if ( hFile == INVALID_HANDLE_VALUE ) { printf("Couldn't open file %s with CreateFile()\n", pFilename ); return; } hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); if ( hFileMapping == 0 ) { CloseHandle(hFile); printf("Couldn't open file mapping with CreateFileMapping()\n"); return; } lpFileBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0); if ( lpFileBase == 0 ) { CloseHandle(hFileMapping); CloseHandle(hFile); printf("Couldn't map view of file with MapViewOfFile()\n"); return; } dosHeader = (PIMAGE_DOS_HEADER)lpFileBase; if ( dosHeader->e_magic == IMAGE_DOS_SIGNATURE ) { TestExeFile( pFilename, dosHeader ); } #if 0 else if ( (dosHeader->e_magic == 0x014C) // Does it look like a i386 && (dosHeader->e_sp == 0) ) // COFF OBJ file??? { // The two tests above aren't what they look like. They're // really checking for IMAGE_FILE_HEADER.Machine == i386 (0x14C) // and IMAGE_FILE_HEADER.SizeOfOptionalHeader == 0; DumpObjFile( (PIMAGE_FILE_HEADER)lpFileBase ); } #endif else printf("unrecognized file format\n"); UnmapViewOfFile(lpFileBase); CloseHandle(hFileMapping); CloseHandle(hFile); } int main(int argc, char* argv[]) { if ( argc < 2 ) { printf("Usage: test_binaries \n" ); } else { char fileName[2048], dir[2048]; if ( !Q_ExtractFilePath( argv[1], dir, sizeof( dir ) ) ) { strcpy( dir, "" ); } else { Q_FixSlashes( dir, '/' ); int len = strlen(dir); if ( len && dir[len-1] !='/' ) { strcat( dir, "/" ); } } WIN32_FIND_DATA findData; HANDLE hFind = FindFirstFile( argv[1], &findData ); if ( hFind == INVALID_HANDLE_VALUE ) { printf("Can't find %s\n", argv[1] ); } else { do { sprintf( fileName, "%s%s", dir, findData.cFileName ); TestFile( fileName ); } while ( FindNextFile( hFind, &findData ) ); FindClose( hFind ); } } return 0; }