DWORD64 base, DWORD64 size);
extern BOOL pe_load_debug_info(const struct process* pcs,
struct module* module);
+extern const char* pe_map_directory(struct module* module, int dirno, DWORD* size);
+extern void pe_unmap_directoy(struct module* module, int dirno);
+
/* source.c */
extern unsigned source_new(struct module* module, const char* basedir, const char* source);
extern const char* source_get(const struct module* module, unsigned idx);
}
}
+/******************************************************************
+ * pe_map_directory
+ *
+ * Maps a directory content out of a PE file
+ */
+const char* pe_map_directory(struct module* module, int dirno, DWORD* size)
+{
+ IMAGE_NT_HEADERS* nth;
+ void* mapping;
+
+ if (module->type != DMT_PE || !module->format_info[DFI_PE]) return NULL;
+ if (dirno >= IMAGE_NUMBEROF_DIRECTORY_ENTRIES ||
+ !(mapping = pe_map_full(&module->format_info[DFI_PE]->u.pe_info->fmap, &nth)))
+ return NULL;
+ if (size) *size = nth->OptionalHeader.DataDirectory[dirno].Size;
+ return RtlImageRvaToVa(nth, mapping,
+ nth->OptionalHeader.DataDirectory[dirno].VirtualAddress, NULL);
+}
+
+/******************************************************************
+ * pe_unmap_directory
+ *
+ * Unmaps a directory content
+ */
+void pe_unmap_directory(struct image_file_map* fmap, int dirno)
+{
+ pe_unmap_full(fmap);
+}
+
static void pe_module_remove(struct process* pcs, struct module_format* modfmt)
{
pe_unmap_file(&modfmt->u.pe_info->fmap);