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);
56 static BOOL
IsDxSetupW(PCUNICODE_STRING LibraryPath
)
58 static const UNICODE_STRING DxSetupDlls
[] = {
59 RTL_CONSTANT_STRING(L
"dsetup.dll"),
60 RTL_CONSTANT_STRING(L
"dsetup32.dll"),
61 RTL_CONSTANT_STRING(L
"dsetup"),
62 RTL_CONSTANT_STRING(L
"dsetup32"),
64 static const UNICODE_STRING PathDividerFind
= RTL_CONSTANT_STRING(L
"\\/");
65 UNICODE_STRING LibraryName
;
69 if (!NT_SUCCESS(RtlFindCharInUnicodeString(RTL_FIND_CHAR_IN_UNICODE_STRING_START_AT_END
, LibraryPath
, &PathDividerFind
, &PathDivider
)))
73 PathDivider
+= sizeof(WCHAR
);
75 LibraryName
.Buffer
= LibraryPath
->Buffer
+ PathDivider
/ sizeof(WCHAR
);
76 LibraryName
.Length
= LibraryPath
->Length
- PathDivider
;
77 LibraryName
.MaximumLength
= LibraryPath
->MaximumLength
- PathDivider
;
79 for (n
= 0; n
< ARRAYSIZE(DxSetupDlls
); ++n
)
81 if (RtlEqualUnicodeString(&LibraryName
, DxSetupDlls
+ n
, TRUE
))
83 SHIM_MSG("Found %wZ\n", DxSetupDlls
+ n
);
90 static BOOL
IsDxSetupA(PCANSI_STRING LibraryPath
)
93 UNICODE_STRING LibraryPathW
;
95 if (NT_SUCCESS(RtlAnsiStringToUnicodeString(&LibraryPathW
, LibraryPath
, TRUE
)))
97 bIsDxSetup
= IsDxSetupW(&LibraryPathW
);
98 RtlFreeUnicodeString(&LibraryPathW
);
104 HMODULE WINAPI
SHIM_OBJ_NAME(APIHook_LoadLibraryA
)(LPCSTR lpLibFileName
)
108 RtlInitAnsiString(&Library
, lpLibFileName
);
109 if (IsDxSetupA(&Library
))
110 return ShimLib_Instance();
112 return CALL_SHIM(0, LOADLIBRARYAPROC
)(lpLibFileName
);
115 HMODULE WINAPI
SHIM_OBJ_NAME(APIHook_LoadLibraryW
)(LPCWSTR lpLibFileName
)
117 UNICODE_STRING Library
;
119 RtlInitUnicodeString(&Library
, lpLibFileName
);
120 if (IsDxSetupW(&Library
))
121 return ShimLib_Instance();
123 return CALL_SHIM(1, LOADLIBRARYWPROC
)(lpLibFileName
);
126 HMODULE WINAPI
SHIM_OBJ_NAME(APIHook_LoadLibraryExA
)(LPCSTR lpLibFileName
, HANDLE hFile
, DWORD dwFlags
)
130 RtlInitAnsiString(&Library
, lpLibFileName
);
131 if (IsDxSetupA(&Library
))
132 return ShimLib_Instance();
134 return CALL_SHIM(2, LOADLIBRARYEXAPROC
)(lpLibFileName
, hFile
, dwFlags
);
137 HMODULE WINAPI
SHIM_OBJ_NAME(APIHook_LoadLibraryExW
)(LPCWSTR lpLibFileName
, HANDLE hFile
, DWORD dwFlags
)
139 UNICODE_STRING Library
;
141 RtlInitUnicodeString(&Library
, lpLibFileName
);
142 if (IsDxSetupW(&Library
))
143 return ShimLib_Instance();
145 return CALL_SHIM(3, LOADLIBRARYEXWPROC
)(lpLibFileName
, hFile
, dwFlags
);
148 FARPROC WINAPI
SHIM_OBJ_NAME(APIHook_GetProcAddress
)(HMODULE hModule
, LPCSTR lpProcName
)
150 static const STRING DxSetupFunctions
[] = {
151 RTL_CONSTANT_STRING("DirectXSetup"),
152 RTL_CONSTANT_STRING("DirectXSetupA"),
153 RTL_CONSTANT_STRING("DirectXSetupW"),
154 RTL_CONSTANT_STRING("DirectXSetupGetVersion"),
156 static const FARPROC DxSetupRedirections
[] = {
160 DirectXSetupGetVersion
,
164 if (hModule
== ShimLib_Instance() && ((ULONG_PTR
)lpProcName
> MAXUSHORT
))
167 RtlInitAnsiString(&ProcName
, lpProcName
);
168 for (n
= 0; n
< ARRAYSIZE(DxSetupFunctions
); ++n
)
170 if (RtlEqualString(&ProcName
, DxSetupFunctions
+ n
, TRUE
))
172 SHIM_MSG("Intercepted %Z\n", DxSetupFunctions
+ n
);
173 return DxSetupRedirections
[n
];
177 return CALL_SHIM(4, GETPROCADDRESSPROC
)(hModule
, lpProcName
);
180 BOOL WINAPI
SHIM_OBJ_NAME(APIHook_FreeLibrary
)(HINSTANCE hLibModule
)
182 if (hLibModule
== ShimLib_Instance())
184 SHIM_MSG("Intercepted\n");
188 return CALL_SHIM(5, FREELIBRARYPROC
)(hLibModule
);
192 #define SHIM_NUM_HOOKS 6
193 #define SHIM_SETUP_HOOKS \
194 SHIM_HOOK(0, "KERNEL32.DLL", "LoadLibraryA", SHIM_OBJ_NAME(APIHook_LoadLibraryA)) \
195 SHIM_HOOK(1, "KERNEL32.DLL", "LoadLibraryW", SHIM_OBJ_NAME(APIHook_LoadLibraryW)) \
196 SHIM_HOOK(2, "KERNEL32.DLL", "LoadLibraryExA", SHIM_OBJ_NAME(APIHook_LoadLibraryExA)) \
197 SHIM_HOOK(3, "KERNEL32.DLL", "LoadLibraryExW", SHIM_OBJ_NAME(APIHook_LoadLibraryExW)) \
198 SHIM_HOOK(4, "KERNEL32.DLL", "GetProcAddress", SHIM_OBJ_NAME(APIHook_GetProcAddress)) \
199 SHIM_HOOK(5, "KERNEL32.DLL", "FreeLibrary", SHIM_OBJ_NAME(APIHook_FreeLibrary))
201 #include <implement_shim.inl>