Load resources from data files from CW

Duane Clark dclark at akamail.com
Sun Jan 27 20:19:48 CST 2002


Modified files:
	loader		: pe_resource.c

Log message:
	Codeweavers
	Apparently add functions to load pe_resources from data files.

-------------- next part --------------
Index: loader/pe_resource.c
===================================================================
RCS file: /home/wine/wine/loader/pe_resource.c,v
retrieving revision 1.35
diff -u -r1.35 pe_resource.c
--- loader/pe_resource.c	2002/01/01 00:24:33	1.35
+++ loader/pe_resource.c	2002/01/28 00:24:48
@@ -47,6 +47,39 @@
 
 
 /**********************************************************************
+ *  is_data_file_module
+ *
+ * Check if a module handle is for a LOAD_LIBRARY_AS_DATAFILE module.
+ */
+inline static int is_data_file_module( HMODULE hmod )
+{
+    return (ULONG_PTR)hmod & 1;
+}
+
+
+/**********************************************************************
+ *  get_data_file_ptr
+ *
+ * Get a pointer to a given offset in a file mapped as data file.
+ */
+static const void *get_data_file_ptr( const void *base, DWORD offset )
+{
+    const IMAGE_NT_HEADERS *nt = PE_HEADER(base);
+    const IMAGE_SECTION_HEADER *sec = (IMAGE_SECTION_HEADER *)((char *)&nt->OptionalHeader +
+                                                               nt->FileHeader.SizeOfOptionalHeader);
+    int i;
+
+    /* find the section containing the virtual address */
+    for (i = 0; i < nt->FileHeader.NumberOfSections; i++, sec++)
+    {
+        if ((sec->VirtualAddress <= offset) && (sec->VirtualAddress + sec->SizeOfRawData > offset))
+            return (char *)base + sec->PointerToRawData + (offset - sec->VirtualAddress);
+    }
+    return NULL;
+}
+
+
+/**********************************************************************
  *  get_resdir
  *
  * Get the resource directory of a PE module
@@ -61,7 +94,10 @@
     {
         dir = &PE_HEADER(base)->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
         if (dir->Size && dir->VirtualAddress)
-            ret = (IMAGE_RESOURCE_DIRECTORY *)((char *)base + dir->VirtualAddress);
+        {
+            if (is_data_file_module(hmod)) ret = get_data_file_ptr( base, dir->VirtualAddress );
+            else ret = (IMAGE_RESOURCE_DIRECTORY *)((char *)base + dir->VirtualAddress);
+        }
     }
     return ret;
 }
@@ -274,9 +310,17 @@
  */
 HGLOBAL PE_LoadResource( HMODULE hmod, HRSRC hRsrc )
 {
+    DWORD offset;
     const void *base = get_module_base( hmod );
-    if (!hRsrc) return 0;
-    return (HANDLE)((char *)base + ((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
+
+    if (!hRsrc || !base) return 0;
+
+    offset = ((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData;
+
+    if (is_data_file_module(hmod))
+        return (HANDLE)get_data_file_ptr( base, offset );
+    else
+        return (HANDLE)((char *)base + offset);
 }
 
 


More information about the wine-patches mailing list