https://git.reactos.org/?p=reactos.git;a=commitdiff;h=883ae6d93bff097e76cbef4ac27babbd9c6ae483

commit 883ae6d93bff097e76cbef4ac27babbd9c6ae483
Author:     Timo Kreuzer <[email protected]>
AuthorDate: Sun Oct 4 20:07:34 2020 +0200
Commit:     Timo Kreuzer <[email protected]>
CommitDate: Sun Dec 6 16:37:57 2020 +0100

    [RTL] Fix RtlImageDirectoryEntryToData to support both 32 and 64 bit images
---
 sdk/lib/rtl/image.c | 37 +++++++++++++++++++++++++++++--------
 1 file changed, 29 insertions(+), 8 deletions(-)

diff --git a/sdk/lib/rtl/image.c b/sdk/lib/rtl/image.c
index 5ae6f679f72..9efb3d19744 100644
--- a/sdk/lib/rtl/image.c
+++ b/sdk/lib/rtl/image.c
@@ -289,17 +289,38 @@ RtlImageDirectoryEntryToData(
     if (NtHeader == NULL)
         return NULL;
 
-    if (Directory >= SWAPD(NtHeader->OptionalHeader.NumberOfRvaAndSizes))
-        return NULL;
+    if (NtHeader->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
+    {
+        PIMAGE_OPTIONAL_HEADER64 OptionalHeader = 
(PIMAGE_OPTIONAL_HEADER64)&NtHeader->OptionalHeader;
 
-    Va = 
SWAPD(NtHeader->OptionalHeader.DataDirectory[Directory].VirtualAddress);
-    if (Va == 0)
-        return NULL;
+        if (Directory >= SWAPD(OptionalHeader->NumberOfRvaAndSizes))
+            return NULL;
+
+        Va = SWAPD(OptionalHeader->DataDirectory[Directory].VirtualAddress);
+        if (Va == 0)
+            return NULL;
+
+        *Size = SWAPD(OptionalHeader->DataDirectory[Directory].Size);
+
+        if (MappedAsImage || Va < SWAPD(OptionalHeader->SizeOfHeaders))
+            return (PVOID)((ULONG_PTR)BaseAddress + Va);
+    }
+    else
+    {
+        PIMAGE_OPTIONAL_HEADER32 OptionalHeader = 
(PIMAGE_OPTIONAL_HEADER32)&NtHeader->OptionalHeader;
+
+        if (Directory >= SWAPD(OptionalHeader->NumberOfRvaAndSizes))
+            return NULL;
+
+        Va = SWAPD(OptionalHeader->DataDirectory[Directory].VirtualAddress);
+        if (Va == 0)
+            return NULL;
 
-    *Size = SWAPD(NtHeader->OptionalHeader.DataDirectory[Directory].Size);
+        *Size = SWAPD(OptionalHeader->DataDirectory[Directory].Size);
 
-    if (MappedAsImage || Va < SWAPD(NtHeader->OptionalHeader.SizeOfHeaders))
-        return (PVOID)((ULONG_PTR)BaseAddress + Va);
+        if (MappedAsImage || Va < SWAPD(OptionalHeader->SizeOfHeaders))
+            return (PVOID)((ULONG_PTR)BaseAddress + Va);
+    }
 
     /* Image mapped as ordinary file, we must find raw pointer */
     return RtlImageRvaToVa(NtHeader, BaseAddress, Va, NULL);

Reply via email to