=?UTF-8?Q?Andr=C3=A9=20Hentschel=20?=: ntdll: Implement LdrResolveDelayLoadedAPI.

Alexandre Julliard julliard at winehq.org
Tue Nov 12 14:26:35 CST 2013


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

Author: André Hentschel <nerv at dawncrow.de>
Date:   Mon Nov 11 23:20:41 2013 +0100

ntdll: Implement LdrResolveDelayLoadedAPI.

---

 dlls/kernel32/kernel32.spec |    1 +
 dlls/ntdll/loader.c         |   65 +++++++++++++++++++++++++++++++++++++++++++
 dlls/ntdll/ntdll.spec       |    1 +
 3 files changed, 67 insertions(+), 0 deletions(-)

diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 08b225f..7779a75 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -1030,6 +1030,7 @@
 @ stdcall RequestWakeupLatency(long)
 @ stdcall ResetEvent(long)
 @ stdcall ResetWriteWatch(ptr long)
+@ stdcall ResolveDelayLoadedAPI(ptr ptr ptr ptr ptr long) ntdll.LdrResolveDelayLoadedAPI
 @ stdcall RestoreLastError(long) ntdll.RtlRestoreLastWin32Error
 @ stdcall ResumeThread(long)
 @ cdecl -arch=arm,x86_64 RtlAddFunctionTable(ptr long long) ntdll.RtlAddFunctionTable
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 0455df4..a4552bb 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -36,6 +36,7 @@
 #include "windef.h"
 #include "winnt.h"
 #include "winternl.h"
+#include "delayloadhandler.h"
 
 #include "wine/exception.h"
 #include "wine/library.h"
@@ -2383,6 +2384,70 @@ BOOLEAN WINAPI RtlDllShutdownInProgress(void)
     return process_detaching;
 }
 
+/****************************************************************************
+ *              LdrResolveDelayLoadedAPI   (NTDLL.@)
+ */
+void* WINAPI LdrResolveDelayLoadedAPI( void* base, const IMAGE_DELAYLOAD_DESCRIPTOR* desc,
+                                       PDELAYLOAD_FAILURE_DLL_CALLBACK dllhook, void* syshook,
+                                       IMAGE_THUNK_DATA* addr, ULONG flags )
+{
+    IMAGE_THUNK_DATA *pIAT, *pINT;
+    DELAYLOAD_INFO delayinfo;
+    UNICODE_STRING mod;
+    const CHAR* name;
+    HMODULE *phmod;
+    NTSTATUS nts;
+    FARPROC fp;
+    DWORD id;
+
+    FIXME("(%p, %p, %p, %p, %p, 0x%08x), partial stub\n", base, desc, dllhook, syshook, addr, flags);
+
+    phmod = get_rva(base, desc->ModuleHandleRVA);
+    pIAT = get_rva(base, desc->ImportAddressTableRVA);
+    pINT = get_rva(base, desc->ImportNameTableRVA);
+    name = get_rva(base, desc->DllNameRVA);
+    id = addr - pIAT;
+
+    if (!*phmod)
+    {
+        if (!RtlCreateUnicodeStringFromAsciiz(&mod, name))
+        {
+            nts = STATUS_NO_MEMORY;
+            goto fail;
+        }
+        nts = LdrLoadDll(NULL, 0, &mod, phmod);
+        RtlFreeUnicodeString(&mod);
+        if (nts) goto fail;
+    }
+
+    if (IMAGE_SNAP_BY_ORDINAL(pINT[id].u1.Ordinal))
+        nts = LdrGetProcedureAddress(*phmod, NULL, LOWORD(pINT[id].u1.Ordinal), (void**)&fp);
+    else
+    {
+        const IMAGE_IMPORT_BY_NAME* iibn = get_rva(base, pINT[id].u1.AddressOfData);
+        ANSI_STRING fnc;
+
+        RtlInitAnsiString(&fnc, (char*)iibn->Name);
+        nts = LdrGetProcedureAddress(*phmod, &fnc, 0, (void**)&fp);
+    }
+    if (!nts)
+    {
+        pIAT[id].u1.Function = (ULONG_PTR)fp;
+        return fp;
+    }
+
+fail:
+    delayinfo.Size = sizeof(delayinfo);
+    delayinfo.DelayloadDescriptor = desc;
+    delayinfo.ThunkAddress = addr;
+    delayinfo.TargetDllName = name;
+    delayinfo.TargetApiDescriptor.ImportDescribedByName = !IMAGE_SNAP_BY_ORDINAL(pINT[id].u1.Ordinal);
+    delayinfo.TargetApiDescriptor.Description.Ordinal = LOWORD(pINT[id].u1.Ordinal);
+    delayinfo.TargetModuleBase = *phmod;
+    delayinfo.Unused = NULL;
+    delayinfo.LastError = nts;
+    return dllhook(4, &delayinfo);
+}
 
 /******************************************************************
  *		LdrShutdownProcess (NTDLL.@)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 860b4c6..70bf94f 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -75,6 +75,7 @@
 @ stdcall LdrProcessRelocationBlock(ptr long ptr long)
 @ stdcall LdrQueryImageFileExecutionOptions(ptr wstr long ptr long ptr)
 @ stdcall LdrQueryProcessModuleInformation(ptr long ptr)
+@ stdcall LdrResolveDelayLoadedAPI(ptr ptr ptr ptr ptr long)
 @ stub LdrSetAppCompatDllRedirectionCallback
 @ stub LdrSetDllManifestProber
 @ stdcall LdrShutdownProcess()




More information about the wine-cvs mailing list