|
@@ -333,6 +333,45 @@ static int fill_context(KDDEBUGGER_DATA64 *kdbg,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int pe_get_data_dir_entry(uint64_t base, void *start_addr, int idx,
|
|
|
+ void *entry, size_t size, struct va_space *vs)
|
|
|
+{
|
|
|
+ const char e_magic[2] = "MZ";
|
|
|
+ const char Signature[4] = "PE\0\0";
|
|
|
+ IMAGE_DOS_HEADER *dos_hdr = start_addr;
|
|
|
+ IMAGE_NT_HEADERS64 nt_hdrs;
|
|
|
+ IMAGE_FILE_HEADER *file_hdr = &nt_hdrs.FileHeader;
|
|
|
+ IMAGE_OPTIONAL_HEADER64 *opt_hdr = &nt_hdrs.OptionalHeader;
|
|
|
+ IMAGE_DATA_DIRECTORY *data_dir = nt_hdrs.OptionalHeader.DataDirectory;
|
|
|
+
|
|
|
+ QEMU_BUILD_BUG_ON(sizeof(*dos_hdr) >= ELF2DMP_PAGE_SIZE);
|
|
|
+
|
|
|
+ if (memcmp(&dos_hdr->e_magic, e_magic, sizeof(e_magic))) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (va_space_rw(vs, base + dos_hdr->e_lfanew,
|
|
|
+ &nt_hdrs, sizeof(nt_hdrs), 0)) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (memcmp(&nt_hdrs.Signature, Signature, sizeof(Signature)) ||
|
|
|
+ file_hdr->Machine != 0x8664 || opt_hdr->Magic != 0x020b) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (va_space_rw(vs,
|
|
|
+ base + data_dir[idx].VirtualAddress,
|
|
|
+ entry, size, 0)) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ printf("Data directory entry #%d: RVA = 0x%08"PRIx32"\n", idx,
|
|
|
+ (uint32_t)data_dir[idx].VirtualAddress);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int write_dump(struct pa_space *ps,
|
|
|
WinDumpHeader64 *hdr, const char *name)
|
|
|
{
|
|
@@ -369,42 +408,16 @@ static int write_dump(struct pa_space *ps,
|
|
|
static int pe_get_pdb_symstore_hash(uint64_t base, void *start_addr,
|
|
|
char *hash, struct va_space *vs)
|
|
|
{
|
|
|
- const char e_magic[2] = "MZ";
|
|
|
- const char Signature[4] = "PE\0\0";
|
|
|
const char sign_rsds[4] = "RSDS";
|
|
|
- IMAGE_DOS_HEADER *dos_hdr = start_addr;
|
|
|
- IMAGE_NT_HEADERS64 nt_hdrs;
|
|
|
- IMAGE_FILE_HEADER *file_hdr = &nt_hdrs.FileHeader;
|
|
|
- IMAGE_OPTIONAL_HEADER64 *opt_hdr = &nt_hdrs.OptionalHeader;
|
|
|
- IMAGE_DATA_DIRECTORY *data_dir = nt_hdrs.OptionalHeader.DataDirectory;
|
|
|
IMAGE_DEBUG_DIRECTORY debug_dir;
|
|
|
OMFSignatureRSDS rsds;
|
|
|
char *pdb_name;
|
|
|
size_t pdb_name_sz;
|
|
|
size_t i;
|
|
|
|
|
|
- QEMU_BUILD_BUG_ON(sizeof(*dos_hdr) >= ELF2DMP_PAGE_SIZE);
|
|
|
-
|
|
|
- if (memcmp(&dos_hdr->e_magic, e_magic, sizeof(e_magic))) {
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- if (va_space_rw(vs, base + dos_hdr->e_lfanew,
|
|
|
- &nt_hdrs, sizeof(nt_hdrs), 0)) {
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- if (memcmp(&nt_hdrs.Signature, Signature, sizeof(Signature)) ||
|
|
|
- file_hdr->Machine != 0x8664 || opt_hdr->Magic != 0x020b) {
|
|
|
- return 1;
|
|
|
- }
|
|
|
-
|
|
|
- printf("Debug Directory RVA = 0x%08"PRIx32"\n",
|
|
|
- (uint32_t)data_dir[IMAGE_FILE_DEBUG_DIRECTORY].VirtualAddress);
|
|
|
-
|
|
|
- if (va_space_rw(vs,
|
|
|
- base + data_dir[IMAGE_FILE_DEBUG_DIRECTORY].VirtualAddress,
|
|
|
- &debug_dir, sizeof(debug_dir), 0)) {
|
|
|
+ if (pe_get_data_dir_entry(base, start_addr, IMAGE_FILE_DEBUG_DIRECTORY,
|
|
|
+ &debug_dir, sizeof(debug_dir), vs)) {
|
|
|
+ eprintf("Failed to get Debug Directory\n");
|
|
|
return 1;
|
|
|
}
|
|
|
|