2 * PROJECT: ReactOS 'Layers' Shim library
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: ForceDxSetupSuccess shim
5 * COPYRIGHT: Copyright 2019 Mark Jansen (mark.jansen@reactos.org)
8 #define WIN32_NO_STATUS
14 typedef HMODULE(WINAPI
* LOADLIBRARYAPROC
)(LPCSTR lpLibFileName
);
15 typedef HMODULE(WINAPI
* LOADLIBRARYWPROC
)(LPCWSTR lpLibFileName
);
16 typedef HMODULE(WINAPI
* LOADLIBRARYEXAPROC
)(LPCSTR lpLibFileName
, HANDLE hFile
, DWORD dwFlags
);
17 typedef HMODULE(WINAPI
* LOADLIBRARYEXWPROC
)(LPCWSTR lpLibFileName
, HANDLE hFile
, DWORD dwFlags
);
18 typedef FARPROC(WINAPI
* GETPROCADDRESSPROC
)(HMODULE hModule
, LPCSTR lpProcName
);
19 typedef BOOL (WINAPI
* FREELIBRARYPROC
)(HINSTANCE hLibModule
);
22 #define SHIM_NS ForceDxSetupSuccess
23 #include <setup_shim.inl>
26 #define DSETUPERR_SUCCESS 0
28 INT WINAPI
DirectXSetup(HWND hWnd
, LPSTR lpszRootPath
, DWORD dwFlags
)
30 SHIM_MSG("Returning DSETUPERR_SUCCESS\n");
31 return DSETUPERR_SUCCESS
;
34 INT WINAPI
DirectXSetupA(HWND hWnd
, LPSTR lpszRootPath
, DWORD dwFlags
)
36 SHIM_MSG("Returning DSETUPERR_SUCCESS\n");
37 return DSETUPERR_SUCCESS
;
40 INT WINAPI
DirectXSetupW(HWND hWnd
, LPWSTR lpszRootPath
, DWORD dwFlags
)
42 SHIM_MSG("Returning DSETUPERR_SUCCESS\n");
43 return DSETUPERR_SUCCESS
;
46 INT WINAPI
DirectXSetupGetVersion(DWORD
*lpdwVersion
, DWORD
*lpdwMinorVersion
)
49 *lpdwVersion
= MAKELONG(7, 4); // DirectX 7.0
51 *lpdwMinorVersion
= MAKELONG(1792, 0);
61 IN
const STRING
* MatchString
)
65 for (i
= 0; i
< MatchString
->Length
; i
++)
67 if (Char
== MatchString
->Buffer
[i
])
78 IN
const STRING
* SearchString
,
79 IN
const STRING
* MatchString
,
88 Length
= SearchString
->Length
;
89 for (i
= Length
- 1; (LONG
)i
>= 0; i
--)
91 Found
= IsCharInAnsiString(SearchString
->Buffer
[i
], MatchString
);
95 return STATUS_SUCCESS
;
99 return STATUS_NOT_FOUND
;
103 static BOOL
IsDxSetupA(const PSTRING LibraryPath
)
105 static const STRING DxSetupDlls
[] = {
106 RTL_CONSTANT_STRING("dsetup.dll"),
107 RTL_CONSTANT_STRING("dsetup32.dll"),
108 RTL_CONSTANT_STRING("dsetup"),
109 RTL_CONSTANT_STRING("dsetup32"),
111 static const STRING PathDividerFind
= RTL_CONSTANT_STRING("\\/");
116 if (!NT_SUCCESS(FindCharInAnsiString(LibraryPath
, &PathDividerFind
, &PathDivider
)))
120 PathDivider
+= sizeof(CHAR
);
122 LibraryName
.Buffer
= LibraryPath
->Buffer
+ PathDivider
;
123 LibraryName
.Length
= LibraryPath
->Length
- PathDivider
;
124 LibraryName
.MaximumLength
= LibraryPath
->MaximumLength
- PathDivider
;
126 for (n
= 0; n
< ARRAYSIZE(DxSetupDlls
); ++n
)
128 if (RtlEqualString(&LibraryName
, DxSetupDlls
+ n
, TRUE
))
130 SHIM_MSG("Found %Z\n", DxSetupDlls
+ n
);
137 static BOOL
IsDxSetupW(PCUNICODE_STRING LibraryPath
)
139 static const UNICODE_STRING DxSetupDlls
[] = {
140 RTL_CONSTANT_STRING(L
"dsetup.dll"),
141 RTL_CONSTANT_STRING(L
"dsetup32.dll"),
142 RTL_CONSTANT_STRING(L
"dsetup"),
143 RTL_CONSTANT_STRING(L
"dsetup32"),
145 static const UNICODE_STRING PathDividerFind
= RTL_CONSTANT_STRING(L
"\\/");
146 UNICODE_STRING LibraryName
;
150 if (!NT_SUCCESS(RtlFindCharInUnicodeString(RTL_FIND_CHAR_IN_UNICODE_STRING_START_AT_END
, LibraryPath
, &PathDividerFind
, &PathDivider
)))
154 PathDivider
+= sizeof(WCHAR
);
156 LibraryName
.Buffer
= LibraryPath
->Buffer
+ PathDivider
/ sizeof(WCHAR
);
157 LibraryName
.Length
= LibraryPath
->Length
- PathDivider
;
158 LibraryName
.MaximumLength
= LibraryPath
->MaximumLength
- PathDivider
;
160 for (n
= 0; n
< ARRAYSIZE(DxSetupDlls
); ++n
)
162 if (RtlEqualUnicodeString(&LibraryName
, DxSetupDlls
+ n
, TRUE
))
164 SHIM_MSG("Found %wZ\n", DxSetupDlls
+ n
);
171 HMODULE WINAPI
SHIM_OBJ_NAME(APIHook_LoadLibraryA
)(LPCSTR lpLibFileName
)
175 RtlInitAnsiString(&Library
, lpLibFileName
);
176 if (IsDxSetupA(&Library
))
177 return ShimLib_Instance();
179 return CALL_SHIM(0, LOADLIBRARYAPROC
)(lpLibFileName
);
182 HMODULE WINAPI
SHIM_OBJ_NAME(APIHook_LoadLibraryW
)(LPCWSTR lpLibFileName
)
184 UNICODE_STRING Library
;
186 RtlInitUnicodeString(&Library
, lpLibFileName
);
187 if (IsDxSetupW(&Library
))
188 return ShimLib_Instance();
190 return CALL_SHIM(1, LOADLIBRARYWPROC
)(lpLibFileName
);
193 HMODULE WINAPI
SHIM_OBJ_NAME(APIHook_LoadLibraryExA
)(LPCSTR lpLibFileName
, HANDLE hFile
, DWORD dwFlags
)
197 RtlInitAnsiString(&Library
, lpLibFileName
);
198 if (IsDxSetupA(&Library
))
199 return ShimLib_Instance();
201 return CALL_SHIM(2, LOADLIBRARYEXAPROC
)(lpLibFileName
, hFile
, dwFlags
);
204 HMODULE WINAPI
SHIM_OBJ_NAME(APIHook_LoadLibraryExW
)(LPCWSTR lpLibFileName
, HANDLE hFile
, DWORD dwFlags
)
206 UNICODE_STRING Library
;
208 RtlInitUnicodeString(&Library
, lpLibFileName
);
209 if (IsDxSetupW(&Library
))
210 return ShimLib_Instance();
212 return CALL_SHIM(3, LOADLIBRARYEXWPROC
)(lpLibFileName
, hFile
, dwFlags
);
215 FARPROC WINAPI
SHIM_OBJ_NAME(APIHook_GetProcAddress
)(HMODULE hModule
, LPCSTR lpProcName
)
217 static const STRING DxSetupFunctions
[] = {
218 RTL_CONSTANT_STRING("DirectXSetup"),
219 RTL_CONSTANT_STRING("DirectXSetupA"),
220 RTL_CONSTANT_STRING("DirectXSetupW"),
221 RTL_CONSTANT_STRING("DirectXSetupGetVersion"),
223 static const FARPROC DxSetupRedirections
[] = {
227 DirectXSetupGetVersion
,
231 if (hModule
== ShimLib_Instance() && ((ULONG_PTR
)lpProcName
> MAXUSHORT
))
234 RtlInitAnsiString(&ProcName
, lpProcName
);
235 for (n
= 0; n
< ARRAYSIZE(DxSetupFunctions
); ++n
)
237 if (RtlEqualString(&ProcName
, DxSetupFunctions
+ n
, TRUE
))
239 SHIM_MSG("Intercepted %Z\n", DxSetupFunctions
+ n
);
240 return DxSetupRedirections
[n
];
244 return CALL_SHIM(4, GETPROCADDRESSPROC
)(hModule
, lpProcName
);
247 BOOL WINAPI
SHIM_OBJ_NAME(APIHook_FreeLibrary
)(HINSTANCE hLibModule
)
249 if (hLibModule
== ShimLib_Instance())
251 SHIM_MSG("Intercepted\n");
255 return CALL_SHIM(5, FREELIBRARYPROC
)(hLibModule
);
259 #define SHIM_NUM_HOOKS 6
260 #define SHIM_SETUP_HOOKS \
261 SHIM_HOOK(0, "KERNEL32.DLL", "LoadLibraryA", SHIM_OBJ_NAME(APIHook_LoadLibraryA)) \
262 SHIM_HOOK(1, "KERNEL32.DLL", "LoadLibraryW", SHIM_OBJ_NAME(APIHook_LoadLibraryW)) \
263 SHIM_HOOK(2, "KERNEL32.DLL", "LoadLibraryExA", SHIM_OBJ_NAME(APIHook_LoadLibraryExA)) \
264 SHIM_HOOK(3, "KERNEL32.DLL", "LoadLibraryExW", SHIM_OBJ_NAME(APIHook_LoadLibraryExW)) \
265 SHIM_HOOK(4, "KERNEL32.DLL", "GetProcAddress", SHIM_OBJ_NAME(APIHook_GetProcAddress)) \
266 SHIM_HOOK(5, "KERNEL32.DLL", "FreeLibrary", SHIM_OBJ_NAME(APIHook_FreeLibrary))
268 #include <implement_shim.inl>