From: André Hentschel Subject: ntdll: Add stub for LdrResolveDelayLoadedAPI and reference it in kernel32 Message-Id: <51AF900F.5060002@dawncrow.de> Date: Wed, 05 Jun 2013 21:22:55 +0200 --- 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