ReactOS  0.4.15-dev-3165-gdf6fff7
layer_hooks.c
Go to the documentation of this file.
1 /*
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 AcLayers
5  * COPYRIGHT: Copyright 2018 Mark Jansen (mark.jansen@reactos.org)
6  */
7 
8 #include <ntstatus.h>
9 #define WIN32_NO_STATUS
10 #include <windows.h>
11 #include <ndk/rtlfuncs.h>
12 #include <strsafe.h>
13 #include "wine/test.h"
14 
15 #include "appshim_apitest.h"
16 
18 
19 
20 typedef struct expect_shim_hook
21 {
22  const char* Library;
23  const char* Function;
25 
26 typedef struct expect_shim_data
27 {
28  const WCHAR* ShimName;
32 
33 
35 {
36  {
37  L"ForceDXSetupSuccess",
38  0,
39  {
40  { "KERNEL32.DLL", "LoadLibraryA" },
41  { "KERNEL32.DLL", "LoadLibraryW" },
42  { "KERNEL32.DLL", "LoadLibraryExA" },
43  { "KERNEL32.DLL", "LoadLibraryExW" },
44  { "KERNEL32.DLL", "GetProcAddress" },
45  { "KERNEL32.DLL", "FreeLibrary" },
46  }
47  },
48  {
49  L"VerifyVersionInfoLite",
51  {
52  { "KERNEL32.DLL", "VerifyVersionInfoA" },
53  { "KERNEL32.DLL", "VerifyVersionInfoW" },
54  }
55  },
56  /* Show that it is not case sensitive */
57  {
58  L"VeRiFyVeRsIoNInFoLiTe",
60  {
61  { "KERNEL32.DLL", "VerifyVersionInfoA" },
62  { "KERNEL32.DLL", "VerifyVersionInfoW" },
63  }
64  },
65 };
66 
68 {
69  DWORD num;
70  for (num = 0; num < _countof(data->hooks) && data->hooks[num].Library;)
71  {
72  ++num;
73  }
74  return num;
75 }
76 
77 static const char* safe_str(const char* ptr)
78 {
79  static char buffer[2][30];
80  static int index = 0;
81  if (HIWORD(ptr))
82  return ptr;
83 
84  index ^= 1;
86  return buffer[index];
87 }
88 
89 START_TEST(layer_hooks)
90 {
91  RTL_OSVERSIONINFOEXW rtlinfo = {0};
92  size_t n, h;
93 
94  tGETHOOKAPIS pGetHookAPIs = LoadShimDLL2(L"AcLayers.dll");
95  if (!pGetHookAPIs)
96  return;
97 
98  rtlinfo.dwOSVersionInfoSize = sizeof(rtlinfo);
100  g_WinVersion = (rtlinfo.dwMajorVersion << 8) | rtlinfo.dwMinorVersion;
101 
102 
103 
104  for (n = 0; n < _countof(data); ++n)
105  {
107  DWORD num_shims = 0, expected_shims = count_shims(current);
108 
109  PHOOKAPI hook = pGetHookAPIs("", current->ShimName, &num_shims);
110 
111  if (current->MinVersion > g_WinVersion && !hook)
112  {
113  skip("Shim %s not present\n", wine_dbgstr_w(current->ShimName));
114  continue;
115  }
116 
117  ok(!!hook, "Expected a valid pointer, got nothing for %s\n", wine_dbgstr_w(current->ShimName));
118  ok(num_shims == expected_shims, "Expected %u shims, got %u for %s\n",
119  expected_shims, num_shims, wine_dbgstr_w(current->ShimName));
120  for (h = 0; h < min(num_shims, expected_shims); ++h)
121  {
122  expect_shim_hook* expect_hk = current->hooks + h;
123  PHOOKAPI got_hk = hook+h;
124  int lib = lstrcmpA(expect_hk->Library, got_hk->LibraryName);
125  int fn = lstrcmpA(safe_str(expect_hk->Function), safe_str(got_hk->FunctionName));
126  ok(lib == 0, "Expected LibraryName to be %s, was: %s for %s\n",
127  expect_hk->Library, got_hk->LibraryName, wine_dbgstr_w(current->ShimName));
128  ok(fn == 0, "Expected FunctionName to be %s, was: %s for %s\n",
129  safe_str(expect_hk->Function), safe_str(got_hk->FunctionName), wine_dbgstr_w(current->ShimName));
130  }
131  if (num_shims > expected_shims)
132  {
133  for (h = expected_shims; h < num_shims; ++h)
134  {
135  PHOOKAPI got_hk = hook+h;
136 
137  ok(0, "Extra shim: %s!%s for %s\n",
138  got_hk->LibraryName, safe_str(got_hk->FunctionName), wine_dbgstr_w(current->ShimName));
139  }
140  }
141  else
142  {
143  for (h = num_shims; h < expected_shims; ++h)
144  {
145  expect_shim_hook* expect_hk = current->hooks + h;
146 
147  ok(0, "Missing shim: %s!%s for %s\n",
148  expect_hk->Library, safe_str(expect_hk->Function), wine_dbgstr_w(current->ShimName));
149  }
150  }
151  }
152 }
ULONG dwOSVersionInfoSize
Definition: rtltypes.h:269
const char * Library
Definition: genral_hooks.c:22
NTSTATUS NTAPI RtlGetVersion(IN OUT PRTL_OSVERSIONINFOW lpVersionInformation)
Definition: version.c:158
struct expect_shim_data expect_shim_data
static GLenum _GLUfuncptr fn
Definition: wgl_font.c:159
PCSTR LibraryName
Definition: shimlib.h:18
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
GLdouble n
Definition: glext.h:7729
int WINAPI lstrcmpA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:18
GLuint buffer
Definition: glext.h:5915
const WCHAR * ShimName
Definition: genral_hooks.c:28
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
static DWORD g_WinVersion
Definition: layer_hooks.c:17
static PVOID ptr
Definition: dispmode.c:27
STRSAFEAPI StringCchPrintfA(STRSAFE_LPSTR pszDest, size_t cchDest, STRSAFE_LPCSTR pszFormat,...)
Definition: strsafe.h:520
struct expect_shim_hook expect_shim_hook
GLuint index
Definition: glext.h:6031
tGETHOOKAPIS LoadShimDLL2(PCWSTR ShimDll)
Definition: versionlie.c:369
const char * Function
Definition: genral_hooks.c:23
static DWORD count_shims(expect_shim_data *data)
Definition: layer_hooks.c:67
Definition: msg.h:42
ULONG dwMajorVersion
Definition: rtltypes.h:247
PHOOKAPI(WINAPI * tGETHOOKAPIS)(LPCSTR szCommandLine, LPCWSTR wszShimName, PDWORD pdwHookCount)
int intptr_t
Definition: crtdefs.h:304
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define _countof(array)
Definition: sndvol32.h:68
#define for
Definition: utility.h:88
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint num
Definition: glext.h:9618
static tGETHOOKAPIS pGetHookAPIs
Definition: dispmode.c:26
struct task_struct * current
Definition: linux.c:32
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
START_TEST(layer_hooks)
Definition: layer_hooks.c:89
#define index(s, c)
Definition: various.h:29
static const WCHAR L[]
Definition: oid.c:1250
#define ok(value,...)
Definition: atltest.h:57
PCSTR FunctionName
Definition: shimlib.h:19
#define min(a, b)
Definition: monoChain.cc:55
#define skip(...)
Definition: atltest.h:64
ULONG dwMinorVersion
Definition: rtltypes.h:248
#define HIWORD(l)
Definition: typedefs.h:247
expect_shim_hook hooks[4]
Definition: genral_hooks.c:30
static const char * safe_str(const char *ptr)
Definition: layer_hooks.c:77