mirror of
https://github.com/reactos/reactos.git
synced 2024-10-19 23:50:05 +00:00
Add functionality to allow dll injection for all apps which link to user32.
svn path=/trunk/; revision=33678
This commit is contained in:
parent
22ab89339c
commit
e96c16aa1e
|
@ -1,6 +1,9 @@
|
||||||
#include <user32.h>
|
#include <user32.h>
|
||||||
|
|
||||||
#include <wine/debug.h>
|
#include <wine/debug.h>
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(user32);
|
||||||
|
|
||||||
|
#define KEY_LENGTH 1024
|
||||||
|
|
||||||
static ULONG User32TlsIndex;
|
static ULONG User32TlsIndex;
|
||||||
HINSTANCE User32Instance;
|
HINSTANCE User32Instance;
|
||||||
|
@ -9,6 +12,7 @@ PUSER_HANDLE_ENTRY gHandleEntries = NULL;
|
||||||
PW32PROCESSINFO g_pi = NULL; /* User Mode Pointer */
|
PW32PROCESSINFO g_pi = NULL; /* User Mode Pointer */
|
||||||
PW32PROCESSINFO g_kpi = NULL; /* Kernel Mode Pointer */
|
PW32PROCESSINFO g_kpi = NULL; /* Kernel Mode Pointer */
|
||||||
PSERVERINFO g_psi = NULL;
|
PSERVERINFO g_psi = NULL;
|
||||||
|
WCHAR szAppInit[KEY_LENGTH];
|
||||||
|
|
||||||
PW32PROCESSINFO
|
PW32PROCESSINFO
|
||||||
GetW32ProcessInfo(VOID);
|
GetW32ProcessInfo(VOID);
|
||||||
|
@ -19,6 +23,137 @@ User32GetThreadData()
|
||||||
return ((PUSER32_THREAD_DATA)TlsGetValue(User32TlsIndex));
|
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
|
BOOL
|
||||||
InitThread(VOID)
|
InitThread(VOID)
|
||||||
{
|
{
|
||||||
|
@ -77,6 +212,7 @@ Init(VOID)
|
||||||
InitializeCriticalSection(&U32AccelCacheLock);
|
InitializeCriticalSection(&U32AccelCacheLock);
|
||||||
GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL);
|
GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL);
|
||||||
InitStockObjects();
|
InitStockObjects();
|
||||||
|
LoadAppInitDlls();
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -95,6 +231,7 @@ Cleanup(VOID)
|
||||||
MenuCleanup();
|
MenuCleanup();
|
||||||
MessageCleanup();
|
MessageCleanup();
|
||||||
DeleteFrameBrushes();
|
DeleteFrameBrushes();
|
||||||
|
UnloadAppInitDlls();
|
||||||
GdiDllInitialize(NULL, DLL_PROCESS_DETACH, NULL);
|
GdiDllInitialize(NULL, DLL_PROCESS_DETACH, NULL);
|
||||||
TlsFree(User32TlsIndex);
|
TlsFree(User32TlsIndex);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue