2 * PROJECT: appshim_apitest
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Test to document the hooks used by various shims in AcGenral
5 * COPYRIGHT: Copyright 2017-2018 Mark Jansen (mark.jansen@reactos.org)
9 #define WIN32_NO_STATUS
11 #include <ndk/rtlfuncs.h>
13 #include "wine/test.h"
15 #include "appshim_apitest.h"
17 static DWORD g_WinVersion
;
20 typedef struct expect_shim_hook
26 typedef struct expect_shim_data
28 const WCHAR
* ShimName
;
30 expect_shim_hook hooks
[4];
34 static expect_shim_data data
[] =
37 L
"IgnoreChromeSandbox",
40 { "KERNEL32.DLL", "CreateProcessW" },
44 L
"AddProcessParametersFlags",
55 static DWORD
count_shims(expect_shim_data
* data
)
58 for (num
= 0; num
< _countof(data
->hooks
) && data
->hooks
[num
].Library
;)
65 static const char* safe_str(const char* ptr
)
67 static char buffer
[2][30];
73 StringCchPrintfA(buffer
[index
], _countof(buffer
[index
]), "#%Id", (intptr_t)ptr
);
77 START_TEST(genral_hooks
)
79 RTL_OSVERSIONINFOEXW rtlinfo
= {0};
82 tGETHOOKAPIS pGetHookAPIs
= LoadShimDLL2(L
"AcGenral.dll");
86 rtlinfo
.dwOSVersionInfoSize
= sizeof(rtlinfo
);
87 RtlGetVersion((PRTL_OSVERSIONINFOW
)&rtlinfo
);
88 g_WinVersion
= (rtlinfo
.dwMajorVersion
<< 8) | rtlinfo
.dwMinorVersion
;
92 for (n
= 0; n
< _countof(data
); ++n
)
94 expect_shim_data
* current
= data
+ n
;
95 DWORD num_shims
= 0, expected_shims
= count_shims(current
);
97 PHOOKAPI hook
= pGetHookAPIs("", current
->ShimName
, &num_shims
);
99 if (current
->MinVersion
> g_WinVersion
&& !hook
)
101 skip("Shim %s not present\n", wine_dbgstr_w(current
->ShimName
));
105 ok(!!hook
, "Expected a valid pointer, got nothing for %s\n", wine_dbgstr_w(current
->ShimName
));
106 ok(num_shims
== expected_shims
, "Expected %u shims, got %u for %s\n",
107 expected_shims
, num_shims
, wine_dbgstr_w(current
->ShimName
));
108 for (h
= 0; h
< min(num_shims
, expected_shims
); ++h
)
110 expect_shim_hook
* expect_hk
= current
->hooks
+ h
;
111 PHOOKAPI got_hk
= hook
+h
;
112 int lib
= lstrcmpA(expect_hk
->Library
, got_hk
->LibraryName
);
113 int fn
= lstrcmpA(safe_str(expect_hk
->Function
), safe_str(got_hk
->FunctionName
));
114 ok(lib
== 0, "Expected LibraryName to be %s, was: %s for %s\n",
115 expect_hk
->Library
, got_hk
->LibraryName
, wine_dbgstr_w(current
->ShimName
));
116 ok(fn
== 0, "Expected FunctionName to be %s, was: %s for %s\n",
117 safe_str(expect_hk
->Function
), safe_str(got_hk
->FunctionName
), wine_dbgstr_w(current
->ShimName
));
119 if (num_shims
> expected_shims
)
121 for (h
= expected_shims
; h
< num_shims
; ++h
)
123 PHOOKAPI got_hk
= hook
+h
;
125 ok(0, "Extra shim: %s!%s for %s\n",
126 got_hk
->LibraryName
, safe_str(got_hk
->FunctionName
), wine_dbgstr_w(current
->ShimName
));
131 for (h
= num_shims
; h
< expected_shims
; ++h
)
133 expect_shim_hook
* expect_hk
= current
->hooks
+ h
;
135 ok(0, "Missing shim: %s!%s for %s\n",
136 expect_hk
->Library
, safe_str(expect_hk
->Function
), wine_dbgstr_w(current
->ShimName
));