dbghelp: Implement ImageDirectoryEntryToDataEx.
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 @@
}
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 );
+}