[ros-diffs] [fireball] 42043: - Fix win32k process and thread callouts. - Do proper initialization.

fireball at svn.reactos.org fireball at svn.reactos.org
Sat Jul 18 14:41:27 CEST 2009


Author: fireball
Date: Sat Jul 18 14:41:27 2009
New Revision: 42043

URL: http://svn.reactos.org/svn/reactos?rev=42043&view=rev
Log:
- Fix win32k process and thread callouts.
- Do proper initialization.

Modified:
    branches/arwinss/reactos/subsystems/win32/win32k/main/init.c

Modified: branches/arwinss/reactos/subsystems/win32/win32k/main/init.c
URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32/win32k/main/init.c?rev=42043&r1=42042&r2=42043&view=diff
==============================================================================
--- branches/arwinss/reactos/subsystems/win32/win32k/main/init.c [iso-8859-1] (original)
+++ branches/arwinss/reactos/subsystems/win32/win32k/main/init.c [iso-8859-1] Sat Jul 18 14:41:27 2009
@@ -13,8 +13,12 @@
 /* System service call table */
 #include <include/napi.h>
 
-//#define NDEBUG
+#include <handle.h>
+
+#define NDEBUG
 #include <debug.h>
+
+void init_directories(void);
 
 /* GLOBALS *******************************************************************/
 
@@ -34,25 +38,8 @@
 
     /* Get the Win32 Process */
     Win32Process = PsGetProcessWin32Process(Process);
-
-    /* Allocate one if needed */
-    if (!Win32Process)
-    {
-        /* FIXME - lock the process */
-        Win32Process = ExAllocatePoolWithTag(NonPagedPool,
-            sizeof(PROCESSINFO),
-            TAG('W', '3', '2', 'p'));
-
-        if (!Win32Process)
-            return STATUS_NO_MEMORY;
-
-        RtlZeroMemory(Win32Process, sizeof(PROCESSINFO));
-
-        PsSetProcessWin32Process(Process, Win32Process);
-        /* FIXME - unlock the process */
-    }
-
-    if (Create)
+    DPRINT("Win32Process %p, Create %d\n", Win32Process, Create);
+    if (Create && !Win32Process)
     {
         SIZE_T ViewSize = 0;
         LARGE_INTEGER Offset;
@@ -60,6 +47,20 @@
         NTSTATUS Status;
         extern PSECTION_OBJECT GlobalUserHeapSection;
         DPRINT("Creating W32 process PID:%d at IRQ level: %lu\n", Process->UniqueProcessId, KeGetCurrentIrql());
+
+        /* Allocate one if needed */
+        /* FIXME - lock the process */
+        Win32Process = ExAllocatePoolWithTag(NonPagedPool,
+            sizeof(PROCESSINFO),
+            TAG('W', '3', '2', 'p'));
+
+        if (!Win32Process) return STATUS_NO_MEMORY;
+
+        RtlZeroMemory(Win32Process, sizeof(PROCESSINFO));
+
+        PsSetProcessWin32Process(Process, Win32Process);
+        Win32Process->peProcess = Process;
+        /* FIXME - unlock the process */
 
         /* map the global heap into the process */
         Offset.QuadPart = 0;
@@ -82,7 +83,9 @@
         Win32Process->HeapMappings.KernelMapping = (PVOID)GlobalUserHeap;
         Win32Process->HeapMappings.UserMapping = UserBase;
         Win32Process->HeapMappings.Count = 1;
+
         InitializeListHead(&Win32Process->Classes);
+        Win32Process->handles = alloc_handle_table(Win32Process, 0);
     }
     else
     {
@@ -100,14 +103,16 @@
 {
     struct _EPROCESS *Process;
     PTHREADINFO Win32Thread;
-
-    DPRINT("Enter Win32kThreadCallback\n");
+    PPROCESSINFO Win32Process;
+
+    DPRINT("Enter Win32kThreadCallback, current thread id %d, process id %d\n", PsGetCurrentThread()->Tcb.Teb->ClientId.UniqueThread, PsGetCurrentThread()->Tcb.Teb->ClientId.UniqueProcess);
 
     Process = Thread->ThreadsProcess;
 
-    /* Get the Win32 Thread */
+    /* Get the Win32 Thread and Process */
     Win32Thread = PsGetThreadWin32Thread(Thread);
-
+    Win32Process = PsGetProcessWin32Process(Process);
+    DPRINT("Win32 thread %p, process %p\n", Win32Thread, Win32Process);
     /* Allocate one if needed */
     if (!Win32Thread)
     {
@@ -126,28 +131,15 @@
     }
     if (Type == PsW32ThreadCalloutInitialize)
     {
-        //PTEB pTeb;
-
-        DPRINT("Creating W32 thread TID:%d at IRQ level: %lu\n", Thread->Cid.UniqueThread, KeGetCurrentIrql());
-
-        Win32Thread->ppi = PsGetCurrentProcessWin32Process();
-        /*pTeb = NtCurrentTeb();
-        if (pTeb)
-        {
-            Win32Thread->pClientInfo = (PCLIENTINFO)pTeb->Win32ClientInfo;
-            Win32Thread->pClientInfo->pClientThreadInfo = NULL;
-        }*/
+        DPRINT("Creating W32 thread TID:%d at IRQ level: %lu. Win32Process %p\n", Thread->Tcb.Teb->ClientId.UniqueThread, KeGetCurrentIrql(), Win32Process);
+
+        Win32Thread->process = Win32Process;
+        Win32Thread->peThread = Thread;
+        Win32Thread->desktop = Win32Process->desktop;
     }
     else
     {
-        DPRINT("Destroying W32 thread TID:%d at IRQ level: %lu\n", Thread->Cid.UniqueThread, KeGetCurrentIrql());
-
-        /*if (Win32Thread->ThreadInfo != NULL)
-        {
-            UserHeapFree(Win32Thread->ThreadInfo);
-            Win32Thread->ThreadInfo = NULL;
-        }*/
-
+        DPRINT("Destroying W32 thread TID:%d at IRQ level: %lu\n", Thread->Tcb.Teb->ClientId.UniqueThread, KeGetCurrentIrql());
         PsSetThreadWin32Thread(Thread, NULL);
     }
 
@@ -160,7 +152,7 @@
 APIENTRY
 Win32kGlobalAtomTableCallout(VOID)
 {
-    UNIMPLEMENTED;
+    DPRINT("Win32kGlobalAtomTableCallout() is UNIMPLEMENTED\n");
     return STATUS_SUCCESS;
 }
 
@@ -322,6 +314,9 @@
     /* Register them */
     PsEstablishWin32Callouts(&CalloutData);
 
+    /* Initialize user implementation */
+    UserInitialize();
+
     /* Create global heap */
     GlobalUserHeap = UserCreateHeap(&GlobalUserHeapSection,
                                     &GlobalUserHeapBase,
@@ -332,5 +327,14 @@
         return STATUS_UNSUCCESSFUL;
     }
 
-    return STATUS_SUCCESS;
-}
+    /* Init object directories implementation */
+    init_directories();
+
+    /* Initialize GDI objects implementation */
+    if (!GDIOBJ_Init()) return STATUS_UNSUCCESSFUL;
+
+    /* Init video driver implementation */
+    //InitDcImpl();
+
+    return STATUS_SUCCESS;
+}



More information about the Ros-diffs mailing list