Alexandre Julliard : ntdll: Support both 32-bit and 64-bit modules in RtlImageDirectoryEntryToData.
Alexandre Julliard
julliard at winehq.org
Fri Sep 25 10:24:40 CDT 2009
Module: wine
Branch: master
Commit: c39e28edfb1c89bb40e2ece0de3d8abf54ebd804
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c39e28edfb1c89bb40e2ece0de3d8abf54ebd804
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Sep 25 12:46:39 2009 +0200
ntdll: Support both 32-bit and 64-bit modules in RtlImageDirectoryEntryToData.
---
dlls/ntdll/loader.c | 23 +++++++++++++++++++----
1 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 76f0e5d..cc9904b 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -2522,10 +2522,25 @@ PVOID WINAPI RtlImageDirectoryEntryToData( HMODULE module, BOOL image, WORD dir,
image = FALSE;
}
if (!(nt = RtlImageNtHeader( module ))) return NULL;
- if (dir >= nt->OptionalHeader.NumberOfRvaAndSizes) return NULL;
- if (!(addr = nt->OptionalHeader.DataDirectory[dir].VirtualAddress)) return NULL;
- *size = nt->OptionalHeader.DataDirectory[dir].Size;
- if (image || addr < nt->OptionalHeader.SizeOfHeaders) return (char *)module + addr;
+ if (nt->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
+ {
+ const IMAGE_NT_HEADERS64 *nt64 = (IMAGE_NT_HEADERS64 *)nt;
+
+ if (dir >= nt64->OptionalHeader.NumberOfRvaAndSizes) return NULL;
+ if (!(addr = nt64->OptionalHeader.DataDirectory[dir].VirtualAddress)) return NULL;
+ *size = nt64->OptionalHeader.DataDirectory[dir].Size;
+ if (image || addr < nt64->OptionalHeader.SizeOfHeaders) return (char *)module + addr;
+ }
+ else if (nt->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
+ {
+ const IMAGE_NT_HEADERS32 *nt32 = (IMAGE_NT_HEADERS32 *)nt;
+
+ if (dir >= nt32->OptionalHeader.NumberOfRvaAndSizes) return NULL;
+ if (!(addr = nt32->OptionalHeader.DataDirectory[dir].VirtualAddress)) return NULL;
+ *size = nt32->OptionalHeader.DataDirectory[dir].Size;
+ if (image || addr < nt32->OptionalHeader.SizeOfHeaders) return (char *)module + addr;
+ }
+ else return NULL;
/* not mapped as image, need to find the section containing the virtual address */
return RtlImageRvaToVa( nt, module, addr, NULL );
More information about the wine-cvs
mailing list