ReactOS 0.4.17-dev-934-g091855f
ignoreloadlib.c File Reference
#include <ntstatus.h>
#include <windows.h>
#include <ntndk.h>
#include "wine/test.h"
#include "appshim_apitest.h"
Include dependency graph for ignoreloadlib.c:

Go to the source code of this file.

Macros

#define WIN32_NO_STATUS
 

Typedefs

typedef HMODULE(WINAPI * LOADLIBRARYAPROC) (LPCSTR lpLibFileName)
 
typedef HMODULE(WINAPI * LOADLIBRARYWPROC) (LPCWSTR lpLibFileName)
 
typedef HMODULE(WINAPI * LOADLIBRARYEXAPROC) (LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
 
typedef HMODULE(WINAPI * LOADLIBRARYEXWPROC) (LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
 

Functions

UINT WINAPI GetErrorMode (VOID)
 
static HMODULE WINAPI my_LoadLibraryA (PCSTR Name)
 
static HMODULE WINAPI my_LoadLibraryExA (PCSTR Name, HANDLE hFile, DWORD dwFlags)
 
static HMODULE WINAPI my_LoadLibraryW (PCWSTR Name)
 
static HMODULE WINAPI my_LoadLibraryExW (PCWSTR Name, HANDLE hFile, DWORD dwFlags)
 
static void test_LoadLibraryA (PHOOKAPI hook)
 
static void test_LoadLibraryW (PHOOKAPI hook)
 
static void test_LoadLibraryExA (PHOOKAPI hook)
 
static void test_LoadLibraryExW (PHOOKAPI hook)
 
DWORD get_host_winver (void)
 
 START_TEST (ignoreloadlib)
 

Variables

static DWORD g_WinVersion
 
static tGETHOOKAPIS pGetHookAPIs
 
static HMODULE g_hSentinelModule = (HMODULE)&pGetHookAPIs
 
static HMODULE g_h123 = (HMODULE)123
 
static HMODULE g_h111 = (HMODULE)111
 
static HMODULE g_h0 = (HMODULE)0
 

Macro Definition Documentation

◆ WIN32_NO_STATUS

#define WIN32_NO_STATUS

Definition at line 9 of file ignoreloadlib.c.

Typedef Documentation

◆ LOADLIBRARYAPROC

typedef HMODULE(WINAPI * LOADLIBRARYAPROC) (LPCSTR lpLibFileName)

Definition at line 23 of file ignoreloadlib.c.

◆ LOADLIBRARYEXAPROC

typedef HMODULE(WINAPI * LOADLIBRARYEXAPROC) (LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)

Definition at line 25 of file ignoreloadlib.c.

◆ LOADLIBRARYEXWPROC

typedef HMODULE(WINAPI * LOADLIBRARYEXWPROC) (LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)

Definition at line 26 of file ignoreloadlib.c.

◆ LOADLIBRARYWPROC

typedef HMODULE(WINAPI * LOADLIBRARYWPROC) (LPCWSTR lpLibFileName)

Definition at line 24 of file ignoreloadlib.c.

Function Documentation

◆ get_host_winver()

DWORD get_host_winver ( void  )

Definition at line 796 of file data.c.

797{
798 if (!g_WinVersion)
799 {
800 RTL_OSVERSIONINFOEXW rtlinfo = {0};
801 void (__stdcall* pRtlGetVersion)(RTL_OSVERSIONINFOEXW*);
802 pRtlGetVersion = (void (__stdcall*)(RTL_OSVERSIONINFOEXW*))GetProcAddress(GetModuleHandleA("ntdll"), "RtlGetVersion");
803
804 rtlinfo.dwOSVersionInfoSize = sizeof(rtlinfo);
805 pRtlGetVersion(&rtlinfo);
806 g_WinVersion = (rtlinfo.dwMajorVersion << 8) | rtlinfo.dwMinorVersion;
807 }
808 return g_WinVersion;
809}
#define GetProcAddress(x, y)
Definition: compat.h:753
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
#define __stdcall
Definition: corecrt.h:120
DWORD g_WinVersion
Definition: data.c:795
ULONG dwMajorVersion
Definition: rtltypes.h:270
ULONG dwMinorVersion
Definition: rtltypes.h:271
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:269

Referenced by START_TEST().

◆ GetErrorMode()

UINT WINAPI GetErrorMode ( VOID  )

Definition at line 31 of file ignoreloadlib.c.

32{
34 UINT ErrMode;
35
36 /* Query the current setting */
39 &ErrMode,
40 sizeof(ErrMode),
41 NULL);
42 if (!NT_SUCCESS(Status))
43 {
44 /* Fail if we couldn't query */
45 return 0;
46 }
47
48 /* Check if NOT failing critical errors was requested */
49 if (ErrMode & SEM_FAILCRITICALERRORS)
50 {
51 /* Mask it out, since the native API works differently */
52 ErrMode &= ~SEM_FAILCRITICALERRORS;
53 }
54 else
55 {
56 /* OR it if the caller didn't, due to different native semantics */
57 ErrMode |= SEM_FAILCRITICALERRORS;
58 }
59
60 /* Return the mode */
61 return ErrMode;
62}
LONG NTSTATUS
Definition: precomp.h:26
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
Status
Definition: gdiplustypes.h:24
unsigned int UINT
Definition: sysinfo.c:13
#define SEM_FAILCRITICALERRORS
Definition: rtltypes.h:69
#define NtCurrentProcess()
Definition: nt_native.h:1660
NTSTATUS NTAPI NtQueryInformationProcess(_In_ HANDLE ProcessHandle, _In_ PROCESSINFOCLASS ProcessInformationClass, _Out_writes_bytes_to_opt_(ProcessInformationLength, *ReturnLength) PVOID ProcessInformation, _In_ ULONG ProcessInformationLength, _Out_opt_ PULONG ReturnLength)
Definition: query.c:211
@ ProcessDefaultHardErrorMode
Definition: winternl.h:1894

◆ my_LoadLibraryA()

static HMODULE WINAPI my_LoadLibraryA ( PCSTR  Name)
static

Definition at line 64 of file ignoreloadlib.c.

65{
66 DWORD dwErrorMode = GetErrorMode();
68 "Unexpected error mode: 0x%x\n", dwErrorMode);
69 return g_hSentinelModule;
70}
#define ok(value,...)
Definition: atltest.h:57
UINT WINAPI DECLSPEC_HOTPATCH GetErrorMode(void)
Definition: process.c:775
unsigned long DWORD
Definition: ntddk_ex.h:95
static HMODULE g_hSentinelModule
Definition: ignoreloadlib.c:18
#define SEM_NOGPFAULTERRORBOX
Definition: rtltypes.h:70
#define SEM_NOOPENFILEERRORBOX
Definition: rtltypes.h:72

Referenced by test_LoadLibraryA().

◆ my_LoadLibraryExA()

static HMODULE WINAPI my_LoadLibraryExA ( PCSTR  Name,
HANDLE  hFile,
DWORD  dwFlags 
)
static

Definition at line 72 of file ignoreloadlib.c.

73{
74 DWORD dwErrorMode = GetErrorMode();
76 "Unexpected error mode: 0x%x\n", dwErrorMode);
77 return g_hSentinelModule;
78}

Referenced by test_LoadLibraryExA().

◆ my_LoadLibraryExW()

static HMODULE WINAPI my_LoadLibraryExW ( PCWSTR  Name,
HANDLE  hFile,
DWORD  dwFlags 
)
static

Definition at line 88 of file ignoreloadlib.c.

89{
90 DWORD dwErrorMode = GetErrorMode();
92 "Unexpected error mode: 0x%x\n", dwErrorMode);
93 return g_hSentinelModule;
94}

Referenced by test_LoadLibraryExW().

◆ my_LoadLibraryW()

static HMODULE WINAPI my_LoadLibraryW ( PCWSTR  Name)
static

Definition at line 80 of file ignoreloadlib.c.

81{
82 DWORD dwErrorMode = GetErrorMode();
84 "Unexpected error mode: 0x%x\n", dwErrorMode);
85 return g_hSentinelModule;
86}

Referenced by test_LoadLibraryW().

◆ START_TEST()

START_TEST ( ignoreloadlib  )

Definition at line 244 of file ignoreloadlib.c.

245{
246 DWORD num_shims = 0, n, dwErrorMode;
248
250
252 pGetHookAPIs = LoadShimDLL2(L"aclayers.dll");
253 else
254 pGetHookAPIs = LoadShimDLL2(L"acgenral.dll");
255
256 if (!pGetHookAPIs)
257 {
258 skip("GetHookAPIs not found\n");
259 return;
260 }
261
262 hook = pGetHookAPIs("test123.dll:123;test111:111;Something.mark:0;empty", L"IgnoreLoadLibrary", &num_shims);
263
264 ok(hook != NULL, "Expected hook to be a valid pointer\n");
265 ok(num_shims == 4, "Expected num_shims to be 0, was: %u\n", num_shims);
266
267 if (!hook || num_shims != 4)
268 return;
269
270 dwErrorMode = GetErrorMode();
271 trace("Error mode: 0x%x\n", dwErrorMode);
272
273#ifdef _M_IX86
275 {
278 }
279#endif
280
281 for (n = 0; n < num_shims; ++n)
282 {
283 ok_str(hook[n].LibraryName, "KERNEL32.DLL");
284 if (!_stricmp(hook[n].FunctionName, "LoadLibraryA"))
285 {
286 ok_int(n, 0);
288 }
289 else if (!_stricmp(hook[n].FunctionName, "LoadLibraryExA"))
290 {
291 ok_int(n, 1);
293 }
294 else if (!_stricmp(hook[n].FunctionName, "LoadLibraryW"))
295 {
296 ok_int(n, 2);
298 }
299 else if (!_stricmp(hook[n].FunctionName, "LoadLibraryExW"))
300 {
301 ok_int(n, 3);
303 }
304 else
305 {
306 ok(0, "Unknown function %s\n", hook[n].FunctionName);
307 }
308 }
309}
@ hook
Definition: SystemMenu.c:35
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char * FunctionName
Definition: acpixf.h:1279
tGETHOOKAPIS LoadShimDLL2(PCWSTR ShimDll)
Definition: versionlie.c:369
#define trace
Definition: atltest.h:70
#define ok_str(x, y)
Definition: atltest.h:127
#define skip(...)
Definition: atltest.h:64
#define ok_int(expression, result)
Definition: atltest.h:134
#define _stricmp
Definition: cat.c:22
#define L(x)
Definition: resources.c:13
GLdouble n
Definition: glext.h:7729
DWORD get_host_winver(void)
Definition: data.c:796
static HMODULE g_h111
Definition: ignoreloadlib.c:20
static void test_LoadLibraryA(PHOOKAPI hook)
Definition: ignoreloadlib.c:97
static void test_LoadLibraryExW(PHOOKAPI hook)
static void test_LoadLibraryW(PHOOKAPI hook)
static DWORD g_WinVersion
Definition: ignoreloadlib.c:16
static void test_LoadLibraryExA(PHOOKAPI hook)
static tGETHOOKAPIS pGetHookAPIs
Definition: ignoreloadlib.c:17
static HMODULE g_h0
Definition: ignoreloadlib.c:21
#define _WIN32_WINNT_WS03
Definition: sdkddkver.h:23
#define _WIN32_WINNT_WIN8
Definition: sdkddkver.h:29

◆ test_LoadLibraryA()

static void test_LoadLibraryA ( PHOOKAPI  hook)
static

Definition at line 97 of file ignoreloadlib.c.

98{
100 DWORD dwErrorMode, dwOldErrorMode;
101
102 hook->OriginalFunction = my_LoadLibraryA;
103 proc = hook->ReplacementFunction;
104
105 dwOldErrorMode = GetErrorMode();
106
107 /* Exact names return what is specified */
108 ok_ptr(proc("test123.dll"), g_h123);
109 ok_ptr(proc("test111"), g_h111);
110 /* Extension is not added */
111 ok_ptr(proc("test111.dll"), g_hSentinelModule);
112 /* Zero can be specified */
113 ok_ptr(proc("Something.mark"), g_h0);
114 /* Or default returned */
115 ok_ptr(proc("empty"), g_h0);
116
117 /* Paths, do not have to be valid */
118 ok_ptr(proc("\\test123.dll"), g_h123);
119 ok_ptr(proc("/test123.dll"), g_h123);
120 ok_ptr(proc("\\\\\\\\test123.dll"), g_h123);
121 ok_ptr(proc("////test123.dll"), g_h123);
122 ok_ptr(proc("mypath:something\\does\\not\\matter\\test123.dll"), g_h123);
123 ok_ptr(proc("/put/whatever/you/want/here/test123.dll"), g_h123);
124
125 /* path separator is checked, not just any point in the path */
126 ok_ptr(proc("-test123.dll"), g_hSentinelModule);
127 ok_ptr(proc("test123.dll-"), g_hSentinelModule);
128
129 dwErrorMode = GetErrorMode();
130 ok(dwErrorMode == dwOldErrorMode, "ErrorMode changed, was 0x%x, is 0x%x\n", dwOldErrorMode, dwErrorMode);
131}
#define ok_ptr(expression, result)
Definition: atltest.h:108
static HMODULE WINAPI my_LoadLibraryA(PCSTR Name)
Definition: ignoreloadlib.c:64
HMODULE(WINAPI * LOADLIBRARYAPROC)(LPCSTR lpLibFileName)
Definition: ignoreloadlib.c:23
static HMODULE g_h123
Definition: ignoreloadlib.c:19
static HANDLE proc()
Definition: pdb.c:32

Referenced by START_TEST().

◆ test_LoadLibraryExA()

static void test_LoadLibraryExA ( PHOOKAPI  hook)
static

Definition at line 169 of file ignoreloadlib.c.

170{
172 DWORD dwErrorMode, dwOldErrorMode;
173
174 hook->OriginalFunction = my_LoadLibraryExA;
175 proc = hook->ReplacementFunction;
176
177 dwOldErrorMode = GetErrorMode();
178
179 /* Exact names return what is specified */
180 ok_ptr(proc("test123.dll", INVALID_HANDLE_VALUE, 0), g_h123);
181 ok_ptr(proc("test111", INVALID_HANDLE_VALUE, 0), g_h111);
182 /* Extension is not added */
184 /* Zero can be specified */
185 ok_ptr(proc("Something.mark", INVALID_HANDLE_VALUE, 0), g_h0);
186 /* Or default returned */
187 ok_ptr(proc("empty", INVALID_HANDLE_VALUE, 0), g_h0);
188
189 /* Paths, do not have to be valid */
190 ok_ptr(proc("\\test123.dll", INVALID_HANDLE_VALUE, 0), g_h123);
191 ok_ptr(proc("/test123.dll", INVALID_HANDLE_VALUE, 0), g_h123);
192 ok_ptr(proc("\\\\\\\\test123.dll", INVALID_HANDLE_VALUE, 0), g_h123);
193 ok_ptr(proc("////test123.dll", INVALID_HANDLE_VALUE, 0), g_h123);
194 ok_ptr(proc("mypath:something\\does\\not\\matter\\test123.dll", INVALID_HANDLE_VALUE, 0), g_h123);
195 ok_ptr(proc("/put/whatever/you/want/here/test123.dll", INVALID_HANDLE_VALUE, 0), g_h123);
196
197 /* path separator is checked, not just any point in the path */
200
201 dwErrorMode = GetErrorMode();
202 ok(dwErrorMode == dwOldErrorMode, "ErrorMode changed, was 0x%x, is 0x%x\n", dwOldErrorMode, dwErrorMode);
203}
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
HMODULE(WINAPI * LOADLIBRARYEXAPROC)(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
Definition: ignoreloadlib.c:25
static HMODULE WINAPI my_LoadLibraryExA(PCSTR Name, HANDLE hFile, DWORD dwFlags)
Definition: ignoreloadlib.c:72

Referenced by START_TEST().

◆ test_LoadLibraryExW()

static void test_LoadLibraryExW ( PHOOKAPI  hook)
static

Definition at line 205 of file ignoreloadlib.c.

206{
208 DWORD dwErrorMode, dwOldErrorMode;
209
210 hook->OriginalFunction = my_LoadLibraryExW;
211 proc = hook->ReplacementFunction;
212
213 dwOldErrorMode = GetErrorMode();
214
215 /* Exact names return what is specified */
216 ok_ptr(proc(L"test123.dll", INVALID_HANDLE_VALUE, 0), g_h123);
217 ok_ptr(proc(L"test111", INVALID_HANDLE_VALUE, 0), g_h111);
218 /* Extension is not added */
220 /* Zero can be specified */
221 ok_ptr(proc(L"Something.mark", INVALID_HANDLE_VALUE, 0), g_h0);
222 /* Or default returned */
223 ok_ptr(proc(L"empty", INVALID_HANDLE_VALUE, 0), g_h0);
224
225 /* Paths, do not have to be valid */
226 ok_ptr(proc(L"\\test123.dll", INVALID_HANDLE_VALUE, 0), g_h123);
227 ok_ptr(proc(L"/test123.dll", INVALID_HANDLE_VALUE, 0), g_h123);
228 ok_ptr(proc(L"\\\\\\\\test123.dll", INVALID_HANDLE_VALUE, 0), g_h123);
229 ok_ptr(proc(L"////test123.dll", INVALID_HANDLE_VALUE, 0), g_h123);
230 ok_ptr(proc(L"mypath:something\\does\\not\\matter\\test123.dll", INVALID_HANDLE_VALUE, 0), g_h123);
231 ok_ptr(proc(L"/put/whatever/you/want/here/test123.dll", INVALID_HANDLE_VALUE, 0), g_h123);
232
233 /* path separator is checked, not just any point in the path */
236
237 dwErrorMode = GetErrorMode();
238 ok(dwErrorMode == dwOldErrorMode, "ErrorMode changed, was 0x%x, is 0x%x\n", dwOldErrorMode, dwErrorMode);
239}
static HMODULE WINAPI my_LoadLibraryExW(PCWSTR Name, HANDLE hFile, DWORD dwFlags)
Definition: ignoreloadlib.c:88
HMODULE(WINAPI * LOADLIBRARYEXWPROC)(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
Definition: ignoreloadlib.c:26

Referenced by START_TEST().

◆ test_LoadLibraryW()

static void test_LoadLibraryW ( PHOOKAPI  hook)
static

Definition at line 133 of file ignoreloadlib.c.

134{
136 DWORD dwErrorMode, dwOldErrorMode;
137
138 hook->OriginalFunction = my_LoadLibraryW;
139 proc = hook->ReplacementFunction;
140
141 dwOldErrorMode = GetErrorMode();
142
143 /* Exact names return what is specified */
144 ok_ptr(proc(L"test123.dll"), g_h123);
145 ok_ptr(proc(L"test111"), g_h111);
146 /* Extension is not added */
147 ok_ptr(proc(L"test111.dll"), g_hSentinelModule);
148 /* Zero can be specified */
149 ok_ptr(proc(L"Something.mark"), g_h0);
150 /* Or default returned */
151 ok_ptr(proc(L"empty"), g_h0);
152
153 /* Paths, do not have to be valid */
154 ok_ptr(proc(L"\\test123.dll"), g_h123);
155 ok_ptr(proc(L"/test123.dll"), g_h123);
156 ok_ptr(proc(L"\\\\\\\\test123.dll"), g_h123);
157 ok_ptr(proc(L"////test123.dll"), g_h123);
158 ok_ptr(proc(L"mypath:something\\does\\not\\matter\\test123.dll"), g_h123);
159 ok_ptr(proc(L"/put/whatever/you/want/here/test123.dll"), g_h123);
160
161 /* path separator is checked, not just any point in the path */
162 ok_ptr(proc(L"-test123.dll"), g_hSentinelModule);
163 ok_ptr(proc(L"test123.dll-"), g_hSentinelModule);
164
165 dwErrorMode = GetErrorMode();
166 ok(dwErrorMode == dwOldErrorMode, "ErrorMode changed, was 0x%x, is 0x%x\n", dwOldErrorMode, dwErrorMode);
167}
HMODULE(WINAPI * LOADLIBRARYWPROC)(LPCWSTR lpLibFileName)
Definition: ignoreloadlib.c:24
static HMODULE WINAPI my_LoadLibraryW(PCWSTR Name)
Definition: ignoreloadlib.c:80

Referenced by START_TEST().

Variable Documentation

◆ g_h0

◆ g_h111

HMODULE g_h111 = (HMODULE)111
static

◆ g_h123

HMODULE g_h123 = (HMODULE)123
static

◆ g_hSentinelModule

◆ g_WinVersion

DWORD g_WinVersion
static

Definition at line 16 of file ignoreloadlib.c.

Referenced by START_TEST().

◆ pGetHookAPIs

tGETHOOKAPIS pGetHookAPIs
static

Definition at line 17 of file ignoreloadlib.c.

Referenced by START_TEST().