Define 64bit PE structures.

This commit is contained in:
Kevin Koltzau 2005-07-19 11:44:32 +00:00 committed by Alexandre Julliard
parent 6655fed5a6
commit 6873379991
2 changed files with 155 additions and 43 deletions

View File

@ -206,21 +206,21 @@ struct stub
* *
* Allocate a stub entry point. * Allocate a stub entry point.
*/ */
static void *allocate_stub( const char *dll, const char *name ) static ULONG_PTR allocate_stub( const char *dll, const char *name )
{ {
#define MAX_SIZE 65536 #define MAX_SIZE 65536
static struct stub *stubs; static struct stub *stubs;
static unsigned int nb_stubs; static unsigned int nb_stubs;
struct stub *stub; struct stub *stub;
if (nb_stubs >= MAX_SIZE / sizeof(*stub)) return (void *)0xdeadbeef; if (nb_stubs >= MAX_SIZE / sizeof(*stub)) return 0xdeadbeef;
if (!stubs) if (!stubs)
{ {
ULONG size = MAX_SIZE; ULONG size = MAX_SIZE;
if (NtAllocateVirtualMemory( NtCurrentProcess(), (void **)&stubs, 0, &size, if (NtAllocateVirtualMemory( NtCurrentProcess(), (void **)&stubs, 0, &size,
MEM_COMMIT, PAGE_EXECUTE_WRITECOPY ) != STATUS_SUCCESS) MEM_COMMIT, PAGE_EXECUTE_WRITECOPY ) != STATUS_SUCCESS)
return (void *)0xdeadbeef; return 0xdeadbeef;
} }
stub = &stubs[nb_stubs++]; stub = &stubs[nb_stubs++];
stub->popl_eax = 0x58; /* popl %eax */ stub->popl_eax = 0x58; /* popl %eax */
@ -231,11 +231,11 @@ static void *allocate_stub( const char *dll, const char *name )
stub->pushl_eax = 0x50; /* pushl %eax */ stub->pushl_eax = 0x50; /* pushl %eax */
stub->jmp = 0xe9; /* jmp stub_entry_point */ stub->jmp = 0xe9; /* jmp stub_entry_point */
stub->entry = (BYTE *)stub_entry_point - (BYTE *)(&stub->entry + 1); stub->entry = (BYTE *)stub_entry_point - (BYTE *)(&stub->entry + 1);
return stub; return (ULONG_PTR)stub;
} }
#else /* __i386__ */ #else /* __i386__ */
static inline void *allocate_stub( const char *dll, const char *name ) { return (void *)0xdeadbeef; } static inline ULONG_PTR allocate_stub( const char *dll, const char *name ) { return 0xdeadbeef; }
#endif /* __i386__ */ #endif /* __i386__ */
@ -518,8 +518,8 @@ static WINE_MODREF *import_dll( HMODULE module, const IMAGE_IMPORT_DESCRIPTOR *d
thunk_list->u1.Function = allocate_stub( name, pe_name->Name ); thunk_list->u1.Function = allocate_stub( name, pe_name->Name );
} }
WARN(" imported from %s, allocating stub %p\n", WARN(" imported from %s, allocating stub %p\n",
debugstr_w(current_modref->ldr.FullDllName.Buffer), debugstr_w(current_modref->ldr.FullDllName.Buffer),
thunk_list->u1.Function ); (void *)thunk_list->u1.Function );
import_list++; import_list++;
thunk_list++; thunk_list++;
} }
@ -532,31 +532,32 @@ static WINE_MODREF *import_dll( HMODULE module, const IMAGE_IMPORT_DESCRIPTOR *d
{ {
int ordinal = IMAGE_ORDINAL(import_list->u1.Ordinal); int ordinal = IMAGE_ORDINAL(import_list->u1.Ordinal);
thunk_list->u1.Function = (PDWORD)find_ordinal_export( imp_mod, exports, exp_size, thunk_list->u1.Function = (ULONG_PTR)find_ordinal_export( imp_mod, exports, exp_size,
ordinal - exports->Base ); ordinal - exports->Base );
if (!thunk_list->u1.Function) if (!thunk_list->u1.Function)
{ {
thunk_list->u1.Function = allocate_stub( name, (const char *)ordinal ); thunk_list->u1.Function = allocate_stub( name, (const char *)ordinal );
WARN("No implementation for %s.%d imported from %s, setting to %p\n", WARN("No implementation for %s.%d imported from %s, setting to %p\n",
name, ordinal, debugstr_w(current_modref->ldr.FullDllName.Buffer), name, ordinal, debugstr_w(current_modref->ldr.FullDllName.Buffer),
thunk_list->u1.Function ); (void *)thunk_list->u1.Function );
} }
TRACE_(imports)("--- Ordinal %s.%d = %p\n", name, ordinal, thunk_list->u1.Function ); TRACE_(imports)("--- Ordinal %s.%d = %p\n", name, ordinal, (void *)thunk_list->u1.Function );
} }
else /* import by name */ else /* import by name */
{ {
IMAGE_IMPORT_BY_NAME *pe_name; IMAGE_IMPORT_BY_NAME *pe_name;
pe_name = get_rva( module, (DWORD)import_list->u1.AddressOfData ); pe_name = get_rva( module, (DWORD)import_list->u1.AddressOfData );
thunk_list->u1.Function = (PDWORD)find_named_export( imp_mod, exports, exp_size, thunk_list->u1.Function = (ULONG_PTR)find_named_export( imp_mod, exports, exp_size,
pe_name->Name, pe_name->Hint ); pe_name->Name, pe_name->Hint );
if (!thunk_list->u1.Function) if (!thunk_list->u1.Function)
{ {
thunk_list->u1.Function = allocate_stub( name, pe_name->Name ); thunk_list->u1.Function = allocate_stub( name, pe_name->Name );
WARN("No implementation for %s.%s imported from %s, setting to %p\n", WARN("No implementation for %s.%s imported from %s, setting to %p\n",
name, pe_name->Name, debugstr_w(current_modref->ldr.FullDllName.Buffer), name, pe_name->Name, debugstr_w(current_modref->ldr.FullDllName.Buffer),
thunk_list->u1.Function ); (void *)thunk_list->u1.Function );
} }
TRACE_(imports)("--- %s %s.%d = %p\n", pe_name->Name, name, pe_name->Hint, thunk_list->u1.Function); TRACE_(imports)("--- %s %s.%d = %p\n",
pe_name->Name, name, pe_name->Hint, (void *)thunk_list->u1.Function);
} }
import_list++; import_list++;
thunk_list++; thunk_list++;
@ -718,7 +719,7 @@ static NTSTATUS alloc_process_tls(void)
IMAGE_DIRECTORY_ENTRY_TLS, &size ))) IMAGE_DIRECTORY_ENTRY_TLS, &size )))
continue; continue;
tls_dirs[i] = dir; tls_dirs[i] = dir;
*dir->AddressOfIndex = i; *(DWORD *)dir->AddressOfIndex = i;
mod->TlsIndex = i; mod->TlsIndex = i;
mod->LoadCount = -1; /* can't unload it */ mod->LoadCount = -1; /* can't unload it */
i++; i++;
@ -782,7 +783,7 @@ static void call_tls_callbacks( HMODULE module, UINT reason )
dir = RtlImageDirectoryEntryToData( module, TRUE, IMAGE_DIRECTORY_ENTRY_TLS, &dirsize ); dir = RtlImageDirectoryEntryToData( module, TRUE, IMAGE_DIRECTORY_ENTRY_TLS, &dirsize );
if (!dir || !dir->AddressOfCallBacks) return; if (!dir || !dir->AddressOfCallBacks) return;
for (callback = dir->AddressOfCallBacks; *callback; callback++) for (callback = (const PIMAGE_TLS_CALLBACK *)dir->AddressOfCallBacks; *callback; callback++)
{ {
if (TRACE_ON(relay)) if (TRACE_ON(relay))
DPRINTF("%04lx:Call TLS callback (proc=%p,module=%p,reason=%s,reserved=0)\n", DPRINTF("%04lx:Call TLS callback (proc=%p,module=%p,reason=%s,reserved=0)\n",

View File

@ -1875,7 +1875,8 @@ typedef struct _IMAGE_VXD_HEADER {
#define IMAGE_SIZEOF_FILE_HEADER 20 #define IMAGE_SIZEOF_FILE_HEADER 20
#define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56 #define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56
#define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28 #define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28
#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER 224 #define IMAGE_SIZEOF_NT_OPTIONAL32_HEADER 224
#define IMAGE_SIZEOF_NT_OPTIONAL64_HEADER 240
#define IMAGE_SIZEOF_SHORT_NAME 8 #define IMAGE_SIZEOF_SHORT_NAME 8
#define IMAGE_SIZEOF_SECTION_HEADER 40 #define IMAGE_SIZEOF_SECTION_HEADER 40
#define IMAGE_SIZEOF_SYMBOL 18 #define IMAGE_SIZEOF_SYMBOL 18
@ -1886,9 +1887,18 @@ typedef struct _IMAGE_VXD_HEADER {
#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60 #define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60
/* Possible Magic values */ /* Possible Magic values */
#define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b #define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107 #define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
#ifdef _WIN64
#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER IMAGE_SIZEOF_NT_OPTIONAL64_HEADER
#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR64_MAGIC
#else
#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER IMAGE_SIZEOF_NT_OPTIONAL32_HEADER
#define IMAGE_NT_OPTIONAL_HDR_MAGIC IMAGE_NT_OPTIONAL_HDR32_MAGIC
#endif
/* These are indexes into the DataDirectory array */ /* These are indexes into the DataDirectory array */
#define IMAGE_FILE_EXPORT_DIRECTORY 0 #define IMAGE_FILE_EXPORT_DIRECTORY 0
#define IMAGE_FILE_IMPORT_DIRECTORY 1 #define IMAGE_FILE_IMPORT_DIRECTORY 1
@ -1936,6 +1946,13 @@ typedef struct _IMAGE_VXD_HEADER {
#define IMAGE_SUBSYSTEM_EFI_ROM 13 #define IMAGE_SUBSYSTEM_EFI_ROM 13
#define IMAGE_SUBSYSTEM_XBOX 14 #define IMAGE_SUBSYSTEM_XBOX 14
/* DLL Characteristics */
#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200
#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400
#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800
#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000
#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
typedef struct _IMAGE_FILE_HEADER { typedef struct _IMAGE_FILE_HEADER {
WORD Machine; WORD Machine;
WORD NumberOfSections; WORD NumberOfSections;
@ -1953,6 +1970,45 @@ typedef struct _IMAGE_DATA_DIRECTORY {
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
typedef struct _IMAGE_OPTIONAL_HEADER64 {
WORD Magic; /* 0x20b */
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[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
typedef struct _IMAGE_NT_HEADERS64 {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER64 OptionalHeader;
} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
typedef struct _IMAGE_OPTIONAL_HEADER { typedef struct _IMAGE_OPTIONAL_HEADER {
/* Standard fields */ /* Standard fields */
@ -1992,13 +2048,25 @@ typedef struct _IMAGE_OPTIONAL_HEADER {
DWORD NumberOfRvaAndSizes; DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; /* 0x60 */ IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; /* 0x60 */
/* 0xE0 */ /* 0xE0 */
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; } IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
typedef struct _IMAGE_NT_HEADERS { typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; /* "PE"\0\0 */ /* 0x00 */ DWORD Signature; /* "PE"\0\0 */ /* 0x00 */
IMAGE_FILE_HEADER FileHeader; /* 0x04 */ IMAGE_FILE_HEADER FileHeader; /* 0x04 */
IMAGE_OPTIONAL_HEADER OptionalHeader; /* 0x18 */ IMAGE_OPTIONAL_HEADER32 OptionalHeader; /* 0x18 */
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS; } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
#ifdef _WIN64
typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS;
typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS;
typedef IMAGE_OPTIONAL_HEADER64 IMAGE_OPTIONAL_HEADER;
typedef PIMAGE_OPTIONAL_HEADER64 PIMAGE_OPTIONAL_HEADER;
#else
typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS;
typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
typedef IMAGE_OPTIONAL_HEADER32 IMAGE_OPTIONAL_HEADER;
typedef PIMAGE_OPTIONAL_HEADER32 PIMAGE_OPTIONAL_HEADER;
#endif
#define IMAGE_SIZEOF_SHORT_NAME 8 #define IMAGE_SIZEOF_SHORT_NAME 8
@ -2274,21 +2342,30 @@ typedef struct _IMAGE_IMPORT_BY_NAME {
} IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME; } IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;
/* Import thunk */ /* Import thunk */
typedef struct _IMAGE_THUNK_DATA { typedef struct _IMAGE_THUNK_DATA64 {
union { union {
LPBYTE ForwarderString; ULONGLONG ForwarderString;
PDWORD Function; ULONGLONG Function;
DWORD Ordinal; ULONGLONG Ordinal;
PIMAGE_IMPORT_BY_NAME AddressOfData; ULONGLONG AddressOfData;
} u1; } u1;
} IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA; } IMAGE_THUNK_DATA64,*PIMAGE_THUNK_DATA64;
typedef struct _IMAGE_THUNK_DATA32 {
union {
DWORD ForwarderString;
DWORD Function;
DWORD Ordinal;
DWORD AddressOfData;
} u1;
} IMAGE_THUNK_DATA32,*PIMAGE_THUNK_DATA32;
/* Import module directory */ /* Import module directory */
typedef struct _IMAGE_IMPORT_DESCRIPTOR { typedef struct _IMAGE_IMPORT_DESCRIPTOR {
union { union {
DWORD Characteristics; /* 0 for terminating null import descriptor */ DWORD Characteristics; /* 0 for terminating null import descriptor */
PIMAGE_THUNK_DATA OriginalFirstThunk; /* RVA to original unbound IAT */ DWORD OriginalFirstThunk; /* RVA to original unbound IAT */
} DUMMYUNIONNAME; } DUMMYUNIONNAME;
DWORD TimeDateStamp; /* 0 if not bound, DWORD TimeDateStamp; /* 0 if not bound,
* -1 if bound, and real date\time stamp * -1 if bound, and real date\time stamp
@ -2300,12 +2377,29 @@ typedef struct _IMAGE_IMPORT_DESCRIPTOR {
DWORD ForwarderChain; /* -1 if no forwarders */ DWORD ForwarderChain; /* -1 if no forwarders */
DWORD Name; DWORD Name;
/* RVA to IAT (if bound this IAT has actual addresses) */ /* RVA to IAT (if bound this IAT has actual addresses) */
PIMAGE_THUNK_DATA FirstThunk; DWORD FirstThunk;
} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR; } IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
#define IMAGE_ORDINAL_FLAG 0x80000000 #define IMAGE_ORDINAL_FLAG64 (((ULONGLONG)0x80000000 << 32) | 0x00000000)
#define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0) #define IMAGE_ORDINAL_FLAG32 0x80000000
#define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff) #define IMAGE_SNAP_BY_ORDINAL64(ordinal) (((ordinal) & IMAGE_ORDINAL_FLAG64) != 0)
#define IMAGE_SNAP_BY_ORDINAL32(ordinal) (((ordinal) & IMAGE_ORDINAL_FLAG32) != 0)
#define IMAGE_ORDINAL64(ordinal) ((ordinal) & 0xffff)
#define IMAGE_ORDINAL32(ordinal) ((ordinal) & 0xffff)
#ifdef _WIN64
#define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG64
#define IMAGE_SNAP_BY_ORDINAL(Ordinal) IMAGE_SNAP_BY_ORDINAL64(Ordinal)
#define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL64(Ordinal)
typedef IMAGE_THUNK_DATA64 IMAGE_THUNK_DATA;
typedef PIMAGE_THUNK_DATA64 PIMAGE_THUNK_DATA;
#else
#define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG32
#define IMAGE_SNAP_BY_ORDINAL(Ordinal) IMAGE_SNAP_BY_ORDINAL32(Ordinal)
#define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL32(Ordinal)
typedef IMAGE_THUNK_DATA32 IMAGE_THUNK_DATA;
typedef PIMAGE_THUNK_DATA32 PIMAGE_THUNK_DATA;
#endif
typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR
{ {
@ -2594,14 +2688,31 @@ typedef VOID (CALLBACK *PIMAGE_TLS_CALLBACK)(
LPVOID DllHandle,DWORD Reason,LPVOID Reserved LPVOID DllHandle,DWORD Reason,LPVOID Reserved
); );
typedef struct _IMAGE_TLS_DIRECTORY { typedef struct _IMAGE_TLS_DIRECTORY64 {
DWORD StartAddressOfRawData; ULONGLONG StartAddressOfRawData;
DWORD EndAddressOfRawData; ULONGLONG EndAddressOfRawData;
LPDWORD AddressOfIndex; ULONGLONG AddressOfIndex;
PIMAGE_TLS_CALLBACK *AddressOfCallBacks; ULONGLONG AddressOfCallBacks;
DWORD SizeOfZeroFill; DWORD SizeOfZeroFill;
DWORD Characteristics; DWORD Characteristics;
} IMAGE_TLS_DIRECTORY,*PIMAGE_TLS_DIRECTORY; } IMAGE_TLS_DIRECTORY64, *PIMAGE_TLS_DIRECTORY64;
typedef struct _IMAGE_TLS_DIRECTORY32 {
DWORD StartAddressOfRawData;
DWORD EndAddressOfRawData;
DWORD AddressOfIndex;
DWORD AddressOfCallBacks;
DWORD SizeOfZeroFill;
DWORD Characteristics;
} IMAGE_TLS_DIRECTORY32, *PIMAGE_TLS_DIRECTORY32;
#ifdef _WIN64
typedef IMAGE_TLS_DIRECTORY64 IMAGE_TLS_DIRECTORY;
typedef PIMAGE_TLS_DIRECTORY64 PIMAGE_TLS_DIRECTORY;
#else
typedef IMAGE_TLS_DIRECTORY32 IMAGE_TLS_DIRECTORY;
typedef PIMAGE_TLS_DIRECTORY32 PIMAGE_TLS_DIRECTORY;
#endif
typedef struct _IMAGE_DEBUG_DIRECTORY { typedef struct _IMAGE_DEBUG_DIRECTORY {
DWORD Characteristics; DWORD Characteristics;