[ros-diffs] [gedmurphy] 33678: Add functionality to allow dll injection for all apps which link to user32.

gedmurphy at svn.reactos.org gedmurphy at svn.reactos.org
Sat May 24 23:21:59 CEST 2008


Author: gedmurphy
Date: Sat May 24 16:21:58 2008
New Revision: 33678

URL: http://svn.reactos.org/svn/reactos?rev=33678&view=rev
Log:
Add functionality to allow dll injection for all apps which link to user32.

Modified:
    trunk/reactos/dll/win32/user32/misc/dllmain.c

Modified: trunk/reactos/dll/win32/user32/misc/dllmain.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/misc/dllmain.c?rev=33678&r1=33677&r2=33678&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/misc/dllmain.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/misc/dllmain.c [iso-8859-1] Sat May 24 16:21:58 2008
@@ -1,6 +1,9 @@
 #include <user32.h>
 
 #include <wine/debug.h>
+WINE_DEFAULT_DEBUG_CHANNEL(user32);
+
+#define KEY_LENGTH 1024
 
 static ULONG User32TlsIndex;
 HINSTANCE User32Instance;
@@ -9,6 +12,7 @@
 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);
@@ -17,6 +21,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
@@ -77,6 +212,7 @@
             InitializeCriticalSection(&U32AccelCacheLock);
             GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL);
             InitStockObjects();
+            LoadAppInitDlls();
 
             return TRUE;
          }
@@ -95,6 +231,7 @@
    MenuCleanup();
    MessageCleanup();
    DeleteFrameBrushes();
+   UnloadAppInitDlls();
    GdiDllInitialize(NULL, DLL_PROCESS_DETACH, NULL);
    TlsFree(User32TlsIndex);
 }



More information about the Ros-diffs mailing list