Module: wine Branch: master Commit: ea640e1aa7033a694eb8474c8cb69ecbbc160671 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ea640e1aa7033a694eb8474c8c...
Author: David Collett david.collett@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@gmail.com Signed-off-by: Alexandre Julliard julliard@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; } }