ntdll: Add stub for LdrResolveDelayLoadedAPI and reference it in kernel32

André Hentschel nerv at dawncrow.de
Wed Jun 5 14:22:55 CDT 2013


---
 dlls/kernel32/kernel32.spec |  1 +
 dlls/ntdll/loader.c         | 14 ++++++++++++
 dlls/ntdll/ntdll.spec       |  1 +
 include/delayloadhandler.h  | 56 +++++++++++++++++++++++++++++++++++++++++++++
 include/winnt.h             | 22 ++++++++++++++++++
 5 files changed, 94 insertions(+)
 create mode 100644 include/delayloadhandler.h

diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 9d06e12..bc42120 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -1026,6 +1026,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 9642f62..e8a2401 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"
@@ -2387,6 +2388,19 @@ BOOLEAN WINAPI RtlDllShutdownInProgress(void)
 }
 
 
+/****************************************************************************
+ *              LdrResolveDelayLoadedAPI   (NTDLL.@)
+ */
+PVOID WINAPI LdrResolveDelayLoadedAPI( PVOID base, PCIMAGE_DELAYLOAD_DESCRIPTOR desc,
+                                       PDELAYLOAD_FAILURE_DLL_CALLBACK dllhook,
+                                       PDELAYLOAD_FAILURE_SYSTEM_ROUTINE syshook,
+                                       PIMAGE_THUNK_DATA addr, ULONG flags )
+{
+    FIXME("(%p, %p, %p, %p, %p, 0x%08x) stub\n", base, desc, dllhook, syshook, addr, flags);
+    if (addr) addr->u1.AddressOfData = 0;
+    return NULL;
+}
+
 /******************************************************************
  *		LdrShutdownProcess (NTDLL.@)
  *
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 60f70b1..093cf90 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()
diff --git a/include/delayloadhandler.h b/include/delayloadhandler.h
new file mode 100644
index 0000000..e48e415
--- /dev/null
+++ b/include/delayloadhandler.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2013 André Hentschel
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __WINE_DELAYLOADHANDLER_H
+#define __WINE_DELAYLOADHANDLER_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define DELAYLOAD_GPA_FAILURE 4
+
+typedef struct _DELAYLOAD_PROC_DESCRIPTOR
+{
+    ULONG ImportDescribedByName;
+    union {
+        LPCSTR Name;
+        ULONG Ordinal;
+    } Description;
+} DELAYLOAD_PROC_DESCRIPTOR, *PDELAYLOAD_PROC_DESCRIPTOR;
+
+typedef struct _DELAYLOAD_INFO
+{
+    ULONG Size;
+    PCIMAGE_DELAYLOAD_DESCRIPTOR DelayloadDescriptor;
+    PIMAGE_THUNK_DATA ThunkAddress;
+    LPCSTR TargetDllName;
+    DELAYLOAD_PROC_DESCRIPTOR TargetApiDescriptor;
+    PVOID TargetModuleBase;
+    PVOID Unused;
+    ULONG LastError;
+} DELAYLOAD_INFO, *PDELAYLOAD_INFO;
+
+typedef PVOID (WINAPI *PDELAYLOAD_FAILURE_DLL_CALLBACK)(ULONG, PDELAYLOAD_INFO);
+typedef PVOID PDELAYLOAD_FAILURE_SYSTEM_ROUTINE; /* FIXME */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* __WINE_DELAYLOADHANDLER_H */
diff --git a/include/winnt.h b/include/winnt.h
index 171141e..393f5a7 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -3052,6 +3052,28 @@ typedef struct _IMAGE_RELOCATION
 
 #define IMAGE_SIZEOF_RELOCATION 10
 
+typedef struct _IMAGE_DELAYLOAD_DESCRIPTOR
+{
+    union
+    {
+        DWORD AllAttributes;
+        struct
+        {
+            DWORD RvaBased:1;
+            DWORD ReservedAttributes:31;
+        };
+    } Attributes;
+
+    DWORD DllNameRVA;
+    DWORD ModuleHandleRVA;
+    DWORD ImportAddressTableRVA;
+    DWORD ImportNameTableRVA;
+    DWORD BoundImportAddressTableRVA;
+    DWORD UnloadInformationTableRVA;
+    DWORD TimeDateStamp;
+} IMAGE_DELAYLOAD_DESCRIPTOR, *PIMAGE_DELAYLOAD_DESCRIPTOR;
+typedef const IMAGE_DELAYLOAD_DESCRIPTOR *PCIMAGE_DELAYLOAD_DESCRIPTOR;
+
 /* generic relocation types */
 #define IMAGE_REL_BASED_ABSOLUTE 		0
 #define IMAGE_REL_BASED_HIGH			1
-- 
1.8.1.2



More information about the wine-patches mailing list