David Collett : kernel32: Adjust data directories in UpdateResource API.

Alexandre Julliard julliard at winehq.org
Thu Nov 23 15:04:45 CST 2017


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

Author: David Collett <david.collett at gmail.com>
Date:   Thu Nov 23 16:02:55 2017 +1100

kernel32: Adjust data directories in UpdateResource API.

When adding resources to a PE file using the UpdateResource API and
the resource section is not the last section (i.e. we had to move
existing sections), ensure any data directory entries pointing into
moved sections is adjusted.

Signed-off-by: David Collett <david.collett at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/resource.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/dlls/kernel32/resource.c b/dlls/kernel32/resource.c
index c88c921..73f3cca 100644
--- a/dlls/kernel32/resource.c
+++ b/dlls/kernel32/resource.c
@@ -1435,7 +1435,7 @@ static BOOL write_raw_resources( QUEUEDUPDATES *updates )
 {
     static const WCHAR prefix[] = { 'r','e','s','u',0 };
     WCHAR tempdir[MAX_PATH], tempfile[MAX_PATH];
-    DWORD section_size;
+    DWORD i, section_size;
     BOOL ret = FALSE;
     IMAGE_SECTION_HEADER *sec;
     IMAGE_NT_HEADERS32 *nt;
@@ -1619,11 +1619,19 @@ static BOOL write_raw_resources( QUEUEDUPDATES *updates )
             nt64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = sec->VirtualAddress;
             nt64->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = res_size.total_size;
             nt64->OptionalHeader.SizeOfInitializedData = get_init_data_size( write_map->base, mapping_size );
+
+            for (i=0; i<nt64->OptionalHeader.NumberOfRvaAndSizes; i++)
+                if (nt64->OptionalHeader.DataDirectory[i].VirtualAddress > sec->VirtualAddress)
+                    nt64->OptionalHeader.DataDirectory[i].VirtualAddress += rva_delta;
         } else {
             nt->OptionalHeader.SizeOfImage += rva_delta;
             nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = sec->VirtualAddress;
             nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = res_size.total_size;
             nt->OptionalHeader.SizeOfInitializedData = get_init_data_size( write_map->base, mapping_size );
+
+            for (i=0; i<nt->OptionalHeader.NumberOfRvaAndSizes; i++)
+                if (nt->OptionalHeader.DataDirectory[i].VirtualAddress > sec->VirtualAddress)
+                    nt->OptionalHeader.DataDirectory[i].VirtualAddress += rva_delta;
         }
     }
 




More information about the wine-cvs mailing list