master
1/**
2 * This file has no copyright assigned and is placed in the Public Domain.
3 * This file is part of the mingw-w64 runtime package.
4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5 */
6#ifndef WIN32_LEAN_AND_MEAN
7#define WIN32_LEAN_AND_MEAN
8#endif
9#include <windows.h>
10#include <delayloadhandler.h>
11
12/* XXX NTSTATUS is supposed to be a LONG, but there are a bunch of STATUS_
13 * constants in winnt.h defined as ((DWORD)0x...), including
14 * STATUS_DLL_NOT_FOUND which we need, so using DWORD here to silence a warning
15 */
16typedef DWORD NTSTATUS;
17
18extern IMAGE_DOS_HEADER __ImageBase;
19
20/* this typedef is missing from the Windows SDK header, but is present in
21 * Wine's version. */
22typedef FARPROC (WINAPI *PDELAYLOAD_FAILURE_SYSTEM_ROUTINE)(LPCSTR pszDllName, LPCSTR pszProcName);
23
24/* these functions aren't in any Windows SDK header, but are documented at
25 * https://docs.microsoft.com/en-us/windows/win32/devnotes/delay-loaded-dlls */
26WINBASEAPI FARPROC WINAPI DelayLoadFailureHook(LPCSTR pszDllName, LPCSTR pszProcName);
27
28WINBASEAPI PVOID WINAPI ResolveDelayLoadedAPI(
29 PVOID ParentModuleBase,
30 PCIMAGE_DELAYLOAD_DESCRIPTOR DelayloadDescriptor,
31 PDELAYLOAD_FAILURE_DLL_CALLBACK FailureDllHook,
32 PDELAYLOAD_FAILURE_SYSTEM_ROUTINE FailureSystemHook,
33 PIMAGE_THUNK_DATA ThunkAddress,
34 ULONG Flags);
35
36WINBASEAPI NTSTATUS WINAPI ResolveDelayLoadsFromDll(
37 PVOID ParentBase,
38 LPCSTR TargetDllName,
39 ULONG Flags);
40
41/* These functions are defined here, part of the delayimp API */
42PVOID WINAPI __delayLoadHelper2(
43 PCIMAGE_DELAYLOAD_DESCRIPTOR DelayloadDescriptor,
44 PIMAGE_THUNK_DATA ThunkAddress);
45
46HRESULT WINAPI __HrLoadAllImportsForDll(LPCSTR szDll);
47
48PVOID WINAPI __delayLoadHelper2(
49 PCIMAGE_DELAYLOAD_DESCRIPTOR DelayloadDescriptor,
50 PIMAGE_THUNK_DATA ThunkAddress)
51{
52 return ResolveDelayLoadedAPI(&__ImageBase, DelayloadDescriptor, __pfnDliFailureHook2, DelayLoadFailureHook, ThunkAddress, 0);
53}
54
55HRESULT WINAPI __HrLoadAllImportsForDll(LPCSTR szDll)
56{
57 NTSTATUS status = ResolveDelayLoadsFromDll(&__ImageBase, szDll, 0);
58 if (status == STATUS_DLL_NOT_FOUND)
59 return HRESULT_FROM_WIN32(ERROR_MOD_NOT_FOUND);
60 else
61 return S_OK;
62}