From c385450c934659085dc190445b863ba4725f2b9f Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Mon, 23 Feb 2015 19:03:08 +0000 Subject: [PATCH] [NTDLL:LDR] - Apply OffsetModuleName to the first import entry, not the current one in LdrpUpdateLoadCount3. Fixes missing reference updates on dependency-loaded DLLs. CORE-5125 CORE-7127 #resolve svn path=/trunk/; revision=66433 --- reactos/dll/ntdll/ldr/ldrutils.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/reactos/dll/ntdll/ldr/ldrutils.c b/reactos/dll/ntdll/ldr/ldrutils.c index dd92b111c58..6841012f334 100644 --- a/reactos/dll/ntdll/ldr/ldrutils.c +++ b/reactos/dll/ntdll/ldr/ldrutils.c @@ -223,6 +223,7 @@ LdrpUpdateLoadCount3(IN PLDR_DATA_TABLE_ENTRY LdrEntry, OUT PUNICODE_STRING UpdateString) { PIMAGE_BOUND_FORWARDER_REF NewImportForwarder; + PIMAGE_BOUND_IMPORT_DESCRIPTOR FirstEntry; PIMAGE_BOUND_IMPORT_DESCRIPTOR BoundEntry; PIMAGE_IMPORT_DESCRIPTOR ImportEntry; PIMAGE_THUNK_DATA FirstThunk; @@ -256,12 +257,12 @@ LdrpUpdateLoadCount3(IN PLDR_DATA_TABLE_ENTRY LdrEntry, ImportNameUnic = &NtCurrentTeb()->StaticUnicodeString; /* Try to get the new import entry */ - BoundEntry = (PIMAGE_BOUND_IMPORT_DESCRIPTOR)RtlImageDirectoryEntryToData(LdrEntry->DllBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, - &ImportSize); + FirstEntry = RtlImageDirectoryEntryToData(LdrEntry->DllBase, + TRUE, + IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, + &ImportSize); - if (BoundEntry) + if (FirstEntry) { /* Set entry flags if refing/derefing */ if (Flags == LDRP_UPDATE_REFCOUNT) @@ -269,10 +270,11 @@ LdrpUpdateLoadCount3(IN PLDR_DATA_TABLE_ENTRY LdrEntry, else if (Flags == LDRP_UPDATE_DEREFCOUNT) LdrEntry->Flags |= LDRP_UNLOAD_IN_PROGRESS; + BoundEntry = FirstEntry; while (BoundEntry->OffsetModuleName) { /* Get pointer to the current import name */ - ImportName = (PCHAR)BoundEntry + BoundEntry->OffsetModuleName; + ImportName = (LPSTR)FirstEntry + BoundEntry->OffsetModuleName; RtlInitAnsiString(&ImportNameAnsi, ImportName); Status = RtlAnsiStringToUnicodeString(ImportNameUnic, &ImportNameAnsi, FALSE); @@ -315,9 +317,9 @@ LdrpUpdateLoadCount3(IN PLDR_DATA_TABLE_ENTRY LdrEntry, /* Go through forwarders */ NewImportForwarder = (PIMAGE_BOUND_FORWARDER_REF)(BoundEntry + 1); - for (i=0; iNumberOfModuleForwarderRefs; i++) + for (i = 0; i < BoundEntry->NumberOfModuleForwarderRefs; i++) { - ImportName = (PCHAR)BoundEntry + NewImportForwarder->OffsetModuleName; + ImportName = (LPSTR)FirstEntry + NewImportForwarder->OffsetModuleName; RtlInitAnsiString(&ImportNameAnsi, ImportName); Status = RtlAnsiStringToUnicodeString(ImportNameUnic, &ImportNameAnsi, FALSE); -- 2.17.1