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}