/* * Proxy.h -- Definitions for proxy-related functionality * * The proxy works roughly as follows: * - We define our exports in proxy.c (computer generated) * - loadProxy initializes the proxy: * 1. Look up the name of this DLL * 2. Find the original DLL with the same name * 3. Load the original DLL * 4. Load all functions into originalFunctions array * * For more information, refer to proxy.c */ #pragma once #pragma warning( disable : 4267 6387 6386 ) #include #include #include "assert_util.h" #include #define ALT_POSTFIX L"_alt.dll" #define DLL_POSTFIX L".dll" extern FARPROC originalFunctions[]; extern void loadFunctions(HMODULE dll); // Load the proxy functions into memory inline void loadProxy(wchar_t *moduleName) { size_t module_name_len = wcslen(moduleName); size_t alt_name_len = module_name_len + STR_LEN(ALT_POSTFIX); wchar_t *alt_name = memalloc(sizeof(wchar_t) * alt_name_len); wmemcpy(alt_name, moduleName, module_name_len); wmemcpy(alt_name + module_name_len, ALT_POSTFIX, STR_LEN(ALT_POSTFIX)); wchar_t *dll_path = NULL; // The final DLL path const int alt_full_path_len = GetFullPathNameW(alt_name, 0, NULL, NULL); wchar_t *alt_full_path = memalloc(sizeof(wchar_t) * alt_full_path_len); GetFullPathNameW(alt_name, alt_full_path_len, alt_full_path, NULL); memfree(alt_name); LOG("Looking for original DLL from %S\n", alt_full_path); // Try to look for the alternative first in the same directory. HMODULE handle = LoadLibrary(alt_full_path); if (handle == NULL) { size_t system_dir_len = GetSystemDirectoryW(NULL, 0); dll_path = memalloc(sizeof(wchar_t) * (system_dir_len + module_name_len + STR_LEN(DLL_POSTFIX))); _ASSERTE(dll_path != nullptr); GetSystemDirectoryW(dll_path, system_dir_len); dll_path[system_dir_len - 1] = L'\\'; wmemcpy(dll_path + system_dir_len, moduleName, module_name_len); wmemcpy(dll_path + system_dir_len + module_name_len, DLL_POSTFIX, STR_LEN(DLL_POSTFIX)); LOG("Looking for original DLL from %S\n", dll_path); handle = LoadLibraryW(dll_path); } ASSERT_F(handle != NULL, L"Unable to load the original %s.dll (looked from system directory and from %s_alt.dll)!", moduleName, moduleName); memfree(alt_full_path); memfree(dll_path); loadFunctions(handle); }