== ERROR_SUCCESS) {
DWORD type, size;
LONG ret;
- char *buffer;
-
- /* Find out the string length */
- ret = RegQueryValueEx(regkey, "InstallDir", NULL, &type, NULL, &size);
+ wchar_t *buffer;
+ /* Find out the string length, in bytes, for a wchar_t */
+ ret = RegQueryValueExW(regkey, L"InstallDir", NULL, &type, NULL, &size);
if (ret == ERROR_SUCCESS && type == REG_SZ) {
buffer = snewn(size + 20, char);
- ret = RegQueryValueEx(regkey, "InstallDir", NULL,
- &type, (LPBYTE)buffer, &size);
+ ret = RegQueryValueExW(regkey, L"InstallDir", NULL,
+ &type, (LPBYTE)buffer, &size);
if (ret == ERROR_SUCCESS && type == REG_SZ) {
- strcat(buffer, "\\bin\\gssapi32.dll");
- module = LoadLibrary(buffer);
+ wcscat(buffer, L"\\bin\\");
+ dll_hijacking_protection_add_path(buffer);
+ /* If 32-bit */
+ module = LoadLibrary("gssapi32.dll");
+ /* elif 64-bit */
+ /* module = LoadLibrary("gssapi64.dll"); */
+
}
sfree(buffer);
}
}
if (p_SetDefaultDllDirectories) {
- /* LOAD_LIBRARY_SEARCH_SYSTEM32 only */
- p_SetDefaultDllDirectories(0x800);
+ /* LOAD_LIBRARY_SEARCH_SYSTEM32 | LOAD_LIBRARY_SEARCH_USER_DIRS only */
+ p_SetDefaultDllDirectories(0x800|0x400);
}
}
+void dll_hijacking_protection_add_path(const wchar_t *path)
+{
+ static HMODULE kernel32_module;
+ DECL_WINDOWS_FUNCTION(static, BOOL, AddDllDirectory, (PCWSTR));
+
+ if (!kernel32_module) {
+ kernel32_module = load_system32_dll("kernel32.dll");
+ GET_WINDOWS_FUNCTION(kernel32_module, AddDllDirectory);
+ }
+
+ if (p_AddDllDirectory) {
+ p_AddDllDirectory(path);
+ }
+}
BOOL init_winver(void)
{
ZeroMemory(&osVersion, sizeof(osVersion));
*/
extern OSVERSIONINFO osVersion;
void dll_hijacking_protection(void);
+void dll_hijacking_protection_add_path(const wchar_t*);
BOOL init_winver(void);
HMODULE load_system32_dll(const char *libname);
const char *win_strerror(int error);