/*++ Copyright (c) 1995 Microsoft Corporation Module Name: upddbg.c Abstract: This tool updates debug files to match corresponding binary checksum, base address and timestamp Author: Matthew Hoehnen (matthoe) 08-Jun-1995 Revision History: --*/ #include BOOL fUpdate; LPSTR CurrentImageName; LOADED_IMAGE CurrentImage; CHAR DebugFilePath[_MAX_PATH]; CHAR SymbolPathBuffer[MAX_PATH*10]; LPSTR SymbolPath; DWORD dw; LPSTR FilePart; CHAR Buffer[MAX_PATH]; PIMAGE_LOAD_CONFIG_DIRECTORY ConfigInfo; CHAR c; LPSTR p; BOOL DbgHeaderModified; ULONG CheckSum; HANDLE hDbgFile; ULONG cb; IMAGE_SEPARATE_DEBUG_HEADER DbgHeader; VOID DisplayUsage( VOID ) { fputs("usage: UPDDBG [switches] image-names... \n" " [-?] display this message\n" " [-u] update image\n" " [-s] path to symbol files\n", stderr ); } int _CRTAPI1 main( int argc, char *argv[], char *envp[] ) { if (argc <= 1) { DisplayUsage(); return 1; } _tzset(); while (--argc) { p = *++argv; if (*p == '/' || *p == '-') { while (c = *++p) switch (tolower( c )) { case '?': DisplayUsage(); return 0; case 'u': fUpdate = TRUE; break; case 's': argc--, argv++; SymbolPath = *argv; break; default: fprintf( stderr, "UPDDBG: Invalid switch - /%c\n", c ); DisplayUsage(); return 1; } } } if (!SymbolPath) { if (GetEnvironmentVariable( "_nt_symbol_path", SymbolPathBuffer, sizeof(SymbolPathBuffer)-1 )) { SymbolPath = SymbolPathBuffer; } } if (!SymbolPath) { fprintf( stderr, "UPDDBG: uknown symbol file path\n" ); return 1; } CurrentImageName = p; // // Map and load the current image // if (!MapAndLoad( CurrentImageName, NULL, &CurrentImage, FALSE, TRUE )) { fprintf( stderr, "UPDDBG: failure mapping and loading %s\n", CurrentImageName ); return 1; } CurrentImageName = CurrentImage.ModuleName; FlushViewOfFile( CurrentImage.MappedAddress, 0 ); if (!fUpdate) { hDbgFile = FindDebugInfoFile( CurrentImageName, SymbolPath, DebugFilePath ); if (hDbgFile == INVALID_HANDLE_VALUE || hDbgFile == NULL) { fprintf( stderr, "UPDDBG: could not locate DBG file %s\n", CurrentImageName ); return 1; } if (!ReadFile( hDbgFile, &DbgHeader, sizeof(IMAGE_SEPARATE_DEBUG_HEADER), &cb, NULL )) { fprintf( stderr, "UPDDBG: could not read DBG file %s\n", CurrentImageName ); return 1; } printf( "*\n" ); if (CurrentImage.FileHeader->OptionalHeader.CheckSum != DbgHeader.CheckSum) { printf( "*************************************\n" ); printf( "* WARNING: checksums do not match *\n" ); printf( "*************************************\n" ); printf( "*\n" ); } _strlwr( CurrentImageName ); _strlwr( DebugFilePath ); printf( "Image 0x%08x %s\n", CurrentImage.FileHeader->OptionalHeader.CheckSum, CurrentImageName ); printf( "DBG File 0x%08x %s\n", DbgHeader.CheckSum, DebugFilePath ); return 0; } if (!CurrentImage.FileHeader->FileHeader.Characteristics & IMAGE_FILE_DEBUG_STRIPPED) { fprintf( stderr, "UPDDBG: symbols have not been split %s\n", CurrentImageName ); return 1; } if ( UpdateDebugInfoFileEx( CurrentImageName, SymbolPath, DebugFilePath, CurrentImage.FileHeader, CurrentImage.FileHeader->OptionalHeader.CheckSum ) ) { if (GetLastError() == ERROR_INVALID_DATA) { printf( "UPDDBG: Warning - Old checksum did not match for %s\n", DebugFilePath ); } printf( "Updated symbols for %s\n", DebugFilePath ); } else { printf( "Unable to update symbols: %s\n", DebugFilePath ); } return 0; }