Minor cleanups, plus fixed a couple bugs in .DBG parsing code.

Added dump for MISC section.
This commit is contained in:
John R. Sheets 2000-04-19 16:46:42 +00:00 committed by Alexandre Julliard
parent 3676c17646
commit b741cc0f52
4 changed files with 45 additions and 22 deletions

View file

@ -25,7 +25,7 @@
* other structs.
*
* The contents of this section look like this (the first two fields are
* already extracted and passed in as parameters):
* extracted and passed back out):
*
* unsigned short cFile
* unsigned short cSeg

View file

@ -49,7 +49,7 @@ DWORD GetOffsetFromRVA (DWORD rva)
/* Assumes all RVA's in the section headers are sorted in increasing
* order (which should be the case).
*/
for (i = g_dbg_dircount - 1; i >= 0; i--)
for (i = g_numsects - 1; i >= 0; i--)
{
sectbegin = g_secthdrs[i].VirtualAddress;
#ifdef VERBOSE
@ -330,8 +330,8 @@ int DumpDebugDir (FILE *debugfile)
PrintFilePos (debugfile);
printf ("Found %d CodeView subsection%c...\n", g_dbg_dircount,
(g_dbg_dircount == 1) ? '.' : 's');
printf ("Found %d Debug director%s...\n", g_dbg_dircount,
(g_dbg_dircount == 1) ? "y" : "ies");
if (g_dbg_dircount == 0)
return FALSE;
@ -347,20 +347,11 @@ int DumpDebugDir (FILE *debugfile)
fseek (debugfile, filepos, SEEK_SET);
PrintFilePos (debugfile);
}
#if 0
else
{
int i;
/* Find the .rdata section.
*/
for (i = 0; i < g_numsects; i++)
if (strcmp (g_secthdrs[i].Name, ".rdata") == 0)
break;
filepos = g_secthdrs[i].PointerToRawData;
fseek( debugfile, g_dbghdr.ExportedNamesSize, SEEK_CUR);
PrintFilePos (debugfile);
}
#endif
if (!ReadDebugDir (debugfile, g_dbg_dircount, &g_debugdirs))
return FALSE;
@ -387,6 +378,22 @@ int DumpDebugDir (FILE *debugfile)
printf (" SizeOfData = [0x%8lx]\n", g_debugdirs[i].SizeOfData);
printf (" AddressOfRawData = [0x%8lx]\n", g_debugdirs[i].AddressOfRawData);
printf (" PointerToRawData = [0x%8lx]\n", g_debugdirs[i].PointerToRawData);
if (g_debugdirs[i].Type == IMAGE_DEBUG_TYPE_MISC)
{
IMAGE_DEBUG_DIRECTORY_MISC misc;
int lastpos = ftell (debugfile);
size_t bytes_read;
/* FIXME: Not sure exactly what the contents are supposed to be. */
fseek (debugfile, g_debugdirs[i].PointerToRawData, SEEK_SET);
bytes_read = fread (&misc, 1, sizeof (IMAGE_DEBUG_DIRECTORY_MISC), debugfile);
printf ("\n [0x%8lx]\n [0x%8lx]\n [0x%4x]\n [0x%4x]\n '%s'\n",
misc.unknown1, misc.SizeOfData, misc.unknown2,
misc.unknown3, misc.Name);
fseek (debugfile, lastpos, SEEK_SET);
}
}
free (g_debugdirs);
@ -782,8 +789,8 @@ int DumpSrcModuleInfo (int index, FILE *debugfile)
}
/* Read in the entire sstSrcModule from the .DBG file. We'll process it
* bit by bit, but passing memory pointers into the various functions in
* cvprint.c.
* bit by bit, by passing memory pointers into the various functions in
* cvcrunch.c.
*/
if (!ReadChunk (debugfile, (void*)rawdata, g_cvEntries[index].cb, fileoffset))
return FALSE;
@ -831,7 +838,7 @@ int DumpAlignSymInfo (int index, FILE *debugfile)
/*
* Print out the info of all related modules (e.g. sstAlignSym, sstSrcModule)
* for the desired sub-section (i.e. sstModule).
* for the given sub-section index (i.e. sstModule).
*/
int DumpRelatedSections (int index, FILE *debugfile)
{
@ -925,9 +932,15 @@ int DumpAllModules (FILE *debugfile)
{
int i;
if (g_cvHeader.cDir == 0 || g_cvEntries == NULL)
if (g_cvHeader.cDir == 0)
{
printf ("ERROR: Bailing out of Module Data Dump\n");
printf ("\nStrange...found CodeView header, but no module entries\n\n");
return TRUE;
}
if (g_cvEntries == NULL)
{
printf ("ERROR: Invalid entry table, bailing out of Module Data Dump\n");
printf ("%ld %p\n", g_cvHeader.cDir, g_cvEntries);
return FALSE;
}

View file

@ -24,6 +24,16 @@
#include "pshpack1.h"
/* FIXME: no idea if this is correct */
typedef struct
{
DWORD unknown1;
DWORD SizeOfData;
WORD unknown2;
WORD unknown3;
char Name[MAX_PATH];
} IMAGE_DEBUG_DIRECTORY_MISC;
/*
* CodeView headers
*/

View file

@ -318,7 +318,7 @@ int ReadCodeViewDirectory (FILE *debugfile, int entrynum, OMFDirEntry **entries)
/*
* Load in the data contents of all CodeView sstModule sub-sections in the file (likely a
* large array, as there is one sub-section for every module... > 100 modules is normal).
* large array, as there is one sub-section for every code module... > 100 modules is normal).
* 'entrynum' should hold the total number of CV sub-sections, not the number of sstModule
* subsections. The function will ignore anything that isn't a sstModule.
*
@ -408,7 +408,7 @@ int ReadModuleData (FILE *debugfile, int entrynum, OMFDirEntry *entries,
if (pad)
namelen += (4 - pad);
module->Name = calloc (namelen, sizeof (char) + 1);
module->Name = calloc (namelen + 1, sizeof (char));
bytes_read = fread (module->Name, sizeof (char), namelen, debugfile);
if (bytes_read < namelen)
{