#define _pexports_h
#include <stdio.h>
+#include <stdint.h>
#include "str_tree.h"
-#define VER_MAJOR 0
-#define VER_MINOR 43
-
-/* These are needed */
-typedef unsigned short WORD;
-typedef unsigned int DWORD;
-typedef unsigned char BYTE;
-typedef long LONG;
-typedef WORD *PWORD;
-typedef DWORD *PDWORD;
+/* These are needed:
+ * FIXME: However, I'd really much prefer to see ISO-C99 standard
+ * types used throughout, in preference to these Micrsoft-inspired
+ * obfuscated typedefs.
+ */
+typedef uint8_t BYTE;
+typedef uint16_t WORD;
+typedef uint32_t DWORD;
+typedef void* PVOID;
+typedef int32_t LONG;
+typedef uint64_t ULONGLONG;
+typedef int BOOL;
+typedef void* HMODULE;
+
+#define FALSE 0
+#define TRUE 1
/* PE structures */
typedef struct _IMAGE_DATA_DIRECTORY {
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
-typedef struct _IMAGE_OPTIONAL_HEADER {
+#define IMAGE_FILE_MACHINE_I386 0x014c
+#define IMAGE_FILE_MACHINE_IA64 0x0200
+#define IMAGE_FILE_MACHINE_AMD64 0x8664
+
+typedef struct _IMAGE_OPTIONAL_HEADER32 {
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
-
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[16];
-} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
+} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
+
+typedef struct _IMAGE_OPTIONAL_HEADER64 {
+ WORD Magic;
+ BYTE MajorLinkerVersion;
+ BYTE MinorLinkerVersion;
+ DWORD SizeOfCode;
+ DWORD SizeOfInitializedData;
+ DWORD SizeOfUninitializedData;
+ DWORD AddressOfEntryPoint;
+ DWORD BaseOfCode;
+ ULONGLONG ImageBase;
+ DWORD SectionAlignment;
+ DWORD FileAlignment;
+ WORD MajorOperatingSystemVersion;
+ WORD MinorOperatingSystemVersion;
+ WORD MajorImageVersion;
+ WORD MinorImageVersion;
+ WORD MajorSubsystemVersion;
+ WORD MinorSubsystemVersion;
+ DWORD Win32VersionValue;
+ DWORD SizeOfImage;
+ DWORD SizeOfHeaders;
+ DWORD CheckSum;
+ WORD Subsystem;
+ WORD DllCharacteristics;
+ ULONGLONG SizeOfStackReserve;
+ ULONGLONG SizeOfStackCommit;
+ ULONGLONG SizeOfHeapReserve;
+ ULONGLONG SizeOfHeapCommit;
+ DWORD LoaderFlags;
+ DWORD NumberOfRvaAndSizes;
+ IMAGE_DATA_DIRECTORY DataDirectory[16];
+} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
+typedef struct IMAGE_NT_HEADERS32 {
+ char Signature[4];
+ IMAGE_FILE_HEADER FileHeader;
+ IMAGE_OPTIONAL_HEADER32 OptionalHeader;
+} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
-typedef struct _IMAGE_NT_HEADERS {
+typedef struct _IMAGE_NT_HEADERS64 {
char Signature[4];
IMAGE_FILE_HEADER FileHeader;
- IMAGE_OPTIONAL_HEADER OptionalHeader;
-} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
+ IMAGE_OPTIONAL_HEADER64 OptionalHeader;
+} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[8];
DWORD Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
+#define IMAGE_SCN_CNT_CODE 0x00000020
+
typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
DWORD Base;
DWORD NumberOfFunctions;
DWORD NumberOfNames;
- PDWORD *AddressOfFunctions;
- PDWORD *AddressOfNames;
- PWORD *AddressOfNameOrdinals;
+ DWORD AddressOfFunctions;
+ DWORD AddressOfNames;
+ DWORD AddressOfNameOrdinals;
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;
typedef struct _IMAGE_DOS_HEADER {
PIMAGE_DOS_HEADER
load_pe_image(const char *filename);
-DWORD
+void *
rva_to_ptr(DWORD rva);
void
-dump_exports(DWORD exports_rva);
+dump_exports(DWORD exports_rva, DWORD exports_size);
-#define ADD_FUNCTION(nm,n) str_tree_add(&symbols, nm, (void*)n)
+#define ADD_FUNCTION(nm,n) str_tree_add(&symbols, nm, (void*)(intptr_t)(n))
extern str_tree *symbols;
-/* pe.h from bfd */
-
-/* dirty! */
-#define AOUTHDR int
-
-#include "pe.h"
-
#endif /* _pexports_h */