From e96c16aa1e8fb5f60fa7f0e8ad05aec99d1f8eea Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Sat, 24 May 2008 21:21:58 +0000 Subject: [PATCH] Add functionality to allow dll injection for all apps which link to user32. svn path=/trunk/; revision=33678 --- reactos/dll/win32/user32/misc/dllmain.c | 137 ++++++++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/reactos/dll/win32/user32/misc/dllmain.c b/reactos/dll/win32/user32/misc/dllmain.c index 63c10d8bc60..c1392b80706 100644 --- a/reactos/dll/win32/user32/misc/dllmain.c +++ b/reactos/dll/win32/user32/misc/dllmain.c @@ -1,6 +1,9 @@ #include #include +WINE_DEFAULT_DEBUG_CHANNEL(user32); + +#define KEY_LENGTH 1024 static ULONG User32TlsIndex; HINSTANCE User32Instance; @@ -9,6 +12,7 @@ PUSER_HANDLE_ENTRY gHandleEntries = NULL; PW32PROCESSINFO g_pi = NULL; /* User Mode Pointer */ PW32PROCESSINFO g_kpi = NULL; /* Kernel Mode Pointer */ PSERVERINFO g_psi = NULL; +WCHAR szAppInit[KEY_LENGTH]; PW32PROCESSINFO GetW32ProcessInfo(VOID); @@ -19,6 +23,137 @@ User32GetThreadData() return ((PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex)); } + +BOOL +GetDllList() +{ + NTSTATUS Status; + OBJECT_ATTRIBUTES Attributes; + BOOL bRet = FALSE; + BOOL bLoad; + HANDLE hKey = NULL; + DWORD dwSize; + PKEY_VALUE_PARTIAL_INFORMATION kvpInfo = NULL; + + UNICODE_STRING szKeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"); + UNICODE_STRING szLoadName = RTL_CONSTANT_STRING(L"LoadAppInit_DLLs"); + UNICODE_STRING szDllsName = RTL_CONSTANT_STRING(L"AppInit_DLLs"); + + InitializeObjectAttributes(&Attributes, &szKeyName, OBJ_CASE_INSENSITIVE, NULL, NULL); + Status = NtOpenKey(&hKey, KEY_READ, &Attributes); + if (NT_SUCCESS(Status)) + { + dwSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(DWORD); + kvpInfo = HeapAlloc(GetProcessHeap(), 0, dwSize); + if (!kvpInfo) + goto end; + + Status = NtQueryValueKey(hKey, + &szLoadName, + KeyValuePartialInformation, + kvpInfo, + dwSize, + &dwSize); + if (!NT_SUCCESS(Status)) + goto end; + + RtlMoveMemory(&bLoad, + kvpInfo->Data, + kvpInfo->DataLength); + + HeapFree(GetProcessHeap(), 0, kvpInfo); + kvpInfo = NULL; + + if (bLoad) + { + Status = NtQueryValueKey(hKey, + &szDllsName, + KeyValuePartialInformation, + NULL, + 0, + &dwSize); + if (Status != STATUS_BUFFER_TOO_SMALL) + goto end; + + kvpInfo = HeapAlloc(GetProcessHeap(), 0, dwSize); + if (!kvpInfo) + goto end; + + Status = NtQueryValueKey(hKey, + &szDllsName, + KeyValuePartialInformation, + kvpInfo, + dwSize, + &dwSize); + if (NT_SUCCESS(Status)) + { + LPWSTR lpBuffer = (LPWSTR)kvpInfo->Data; + if (lpBuffer != UNICODE_NULL) + { + RtlMoveMemory(szAppInit, + kvpInfo->Data, + min(kvpInfo->DataLength, KEY_LENGTH)); + bRet = TRUE; + } + } + } + } + +end: + if (hKey) + NtClose(hKey); + + if (kvpInfo) + HeapFree(GetProcessHeap(), 0, kvpInfo); + + return bRet; +} + + +VOID +LoadAppInitDlls() +{ + szAppInit[0] = UNICODE_NULL; + + if (GetDllList()) + { + WCHAR buffer[KEY_LENGTH]; + LPWSTR ptr; + LPWSTR seps = L" ,"; + + RtlCopyMemory(buffer, szAppInit, KEY_LENGTH);; + + ptr = wcstok(buffer, seps); + while (ptr) + { + LoadLibraryW(ptr); + ptr = wcstok(NULL, seps); + } + } +} + +VOID +UnloadAppInitDlls() +{ + if (szAppInit[0] != UNICODE_NULL) + { + WCHAR buffer[KEY_LENGTH]; + HMODULE hModule; + LPWSTR ptr; + LPWSTR seps = L" ,"; + + RtlCopyMemory(buffer, szAppInit, KEY_LENGTH); + + ptr = wcstok(buffer, seps); + while (ptr) + { + hModule = GetModuleHandleW(ptr); + FreeLibrary(hModule); + ptr = wcstok(NULL, seps); + } + } +} + BOOL InitThread(VOID) { @@ -77,6 +212,7 @@ Init(VOID) InitializeCriticalSection(&U32AccelCacheLock); GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL); InitStockObjects(); + LoadAppInitDlls(); return TRUE; } @@ -95,6 +231,7 @@ Cleanup(VOID) MenuCleanup(); MessageCleanup(); DeleteFrameBrushes(); + UnloadAppInitDlls(); GdiDllInitialize(NULL, DLL_PROCESS_DETACH, NULL); TlsFree(User32TlsIndex); } -- 2.17.1