Andrey Turkin : dbghelp: Implement ImageDirectoryEntryToDataEx.

Alexandre Julliard julliard at winehq.org
Fri Jan 11 07:20:32 CST 2008


Module: wine
Branch: master
Commit: 9e2c76c6d454078932079f0d41b71486c590d3bc
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9e2c76c6d454078932079f0d41b71486c590d3bc

Author: Andrey Turkin <andrey.turkin at gmail.com>
Date:   Fri Jan 11 15:42:17 2008 +0300

dbghelp: Implement ImageDirectoryEntryToDataEx.

---

 dlls/dbghelp/dbghelp.spec |    4 +-
 dlls/dbghelp/pe_module.c  |   50 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+), 2 deletions(-)

diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec
index b023f3d..d29b880 100644
--- a/dlls/dbghelp/dbghelp.spec
+++ b/dlls/dbghelp/dbghelp.spec
@@ -15,8 +15,8 @@
 @ stub FindFileInPath
 @ stub FindFileInSearchPath
 @ stdcall GetTimestampForLoadedLibrary(long)
-@ stdcall ImageDirectoryEntryToData(ptr long long ptr) ntdll.RtlImageDirectoryEntryToData
-@ stub ImageDirectoryEntryToDataEx
+@ stdcall ImageDirectoryEntryToData(ptr long long ptr)
+@ stdcall ImageDirectoryEntryToDataEx(ptr long long ptr ptr)
 @ stdcall ImageNtHeader(ptr) ntdll.RtlImageNtHeader
 @ stdcall ImageRvaToSection(ptr ptr long) ntdll.RtlImageRvaToSection
 @ stdcall ImageRvaToVa(ptr ptr long ptr) ntdll.RtlImageRvaToVa
diff --git a/dlls/dbghelp/pe_module.c b/dlls/dbghelp/pe_module.c
index 3027f5b..6676f29 100644
--- a/dlls/dbghelp/pe_module.c
+++ b/dlls/dbghelp/pe_module.c
@@ -417,3 +417,53 @@ struct module* pe_load_builtin_module(struct process* pcs, const WCHAR* name,
     }
     return module;
 }
+
+/***********************************************************************
+ *           ImageDirectoryEntryToDataEx (DBGHELP.@)
+ *
+ * Search for specified directory in PE image
+ *
+ * PARAMS
+ *
+ *   base    [in]  Image base address
+ *   image   [in]  TRUE - image has been loaded by loader, FALSE - raw file image
+ *   dir     [in]  Target directory index
+ *   size    [out] Receives directory size
+ *   section [out] Receives pointer to section header of section containing directory data
+ *
+ * RETURNS
+ *   Success: pointer to directory data
+ *   Failure: NULL
+ *
+ */
+PVOID WINAPI ImageDirectoryEntryToDataEx( PVOID base, BOOLEAN image, USHORT dir, PULONG size, PIMAGE_SECTION_HEADER *section )
+{
+    const IMAGE_NT_HEADERS *nt;
+    DWORD addr;
+
+    *size = 0;
+
+    if (!(nt = RtlImageNtHeader( base ))) 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)
+    {
+        if (*section) *section = NULL;
+        return (char *)base + addr;
+    }
+
+    return RtlImageRvaToVa( nt, (HMODULE)base, addr, section );
+}
+
+/***********************************************************************
+ *         ImageDirectoryEntryToData   (DBGHELP.@)
+ *
+ * NOTES
+ *   See ImageDirectoryEntryToDataEx
+ */
+PVOID WINAPI ImageDirectoryEntryToData( PVOID base, BOOLEAN image, USHORT dir, PULONG size )
+{
+    return ImageDirectoryEntryToDataEx( base, image, dir, size, NULL );
+}




More information about the wine-cvs mailing list