[YAROTOWS] Reintegrate the branch. For a brighter future.
[reactos.git] / reactos / subsystems / win32 / win32k / main / dllmain.c
index 7062a10..b12d96f 100644 (file)
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-/* $Id$
- *
+/*
  *  Entry Point for win32k.sys
  */
 
-#include <w32k.h>
+#include <win32k.h>
 #include <include/napi.h>
 
 #define NDEBUG
 #include <debug.h>
 
+HANDLE hModuleWin;
+
 PGDI_HANDLE_TABLE INTERNAL_CALL GDIOBJ_iAllocHandleTable(OUT PSECTION_OBJECT *SectionObject);
 BOOL INTERNAL_CALL GDI_CleanupForProcess (struct _EPROCESS *Process);
 /* FIXME */
 PGDI_HANDLE_TABLE GdiHandleTable = NULL;
 PSECTION_OBJECT GdiTableSection = NULL;
 
-LIST_ENTRY GlobalDriverListHead;
-
 HANDLE GlobalUserHeap = NULL;
 PSECTION_OBJECT GlobalUserHeapSection = NULL;
 
@@ -53,7 +52,7 @@ APIENTRY
 Win32kProcessCallback(struct _EPROCESS *Process,
                       BOOLEAN Create)
 {
-    PW32PROCESS Win32Process;
+    PPROCESSINFO Win32Process;
     DECLARE_RETURN(NTSTATUS);
 
     DPRINT("Enter Win32kProcessCallback\n");
@@ -68,7 +67,7 @@ Win32kProcessCallback(struct _EPROCESS *Process,
         /* FIXME - lock the process */
         Win32Process = ExAllocatePoolWithTag(NonPagedPool,
                                              sizeof(PROCESSINFO),
-                                             TAG('W', '3', '2', 'p'));
+                                             'p23W');
 
         if (Win32Process == NULL) RETURN( STATUS_NO_MEMORY);
 
@@ -113,6 +112,9 @@ Win32kProcessCallback(struct _EPROCESS *Process,
 
       InitializeListHead(&Win32Process->MenuListHead);
 
+      InitializeListHead(&Win32Process->GDIBrushAttrFreeList);
+      InitializeListHead(&Win32Process->GDIDcAttrFreeList);
+
       InitializeListHead(&Win32Process->PrivateFontListHead);
       ExInitializeFastMutex(&Win32Process->PrivateFontListLock);
 
@@ -128,6 +130,7 @@ Win32kProcessCallback(struct _EPROCESS *Process,
         Process->Peb->GdiDCAttributeList = GDI_BATCH_LIMIT;
       }
 
+      Win32Process->peProcess = Process;
       /* setup process flags */
       Win32Process->W32PF_flags = 0;
     }
@@ -170,6 +173,7 @@ Win32kThreadCallback(struct _ETHREAD *Thread,
 {
     struct _EPROCESS *Process;
     PTHREADINFO Win32Thread;
+    int i;
     DECLARE_RETURN(NTSTATUS);
 
     DPRINT("Enter Win32kThreadCallback\n");
@@ -186,7 +190,7 @@ Win32kThreadCallback(struct _ETHREAD *Thread,
         /* FIXME - lock the process */
         Win32Thread = ExAllocatePoolWithTag(NonPagedPool,
                                             sizeof(THREADINFO),
-                                            TAG('W', '3', '2', 't'));
+                                            't23W');
 
         if (Win32Thread == NULL) RETURN( STATUS_NO_MEMORY);
 
@@ -209,6 +213,10 @@ Win32kThreadCallback(struct _ETHREAD *Thread,
       InitializeListHead(&Win32Thread->WindowListHead);
       InitializeListHead(&Win32Thread->W32CallbackListHead);
       InitializeListHead(&Win32Thread->PtiLink);
+      for (i = 0; i < NB_HOOKS; i++)
+      {
+         InitializeListHead(&Win32Thread->aphkStart[i]);
+      }
 
       /*
        * inherit the thread desktop and process window station (if not yet inherited) from the process startup
@@ -241,7 +249,7 @@ Win32kThreadCallback(struct _ETHREAD *Thread,
         if (hDesk != NULL)
         {
           PDESKTOP DesktopObject;
-          Win32Thread->Desktop = NULL;
+          Win32Thread->rpdesk = NULL;
           Status = ObReferenceObjectByHandle(hDesk,
                                              0,
                                              ExDesktopObjectType,
@@ -263,7 +271,7 @@ Win32kThreadCallback(struct _ETHREAD *Thread,
           }
         }
       }
-      Win32Thread->IsExiting = FALSE;
+      Win32Thread->TIF_flags &= ~TIF_INCLEANUP;
       co_IntDestroyCaret(Win32Thread);
       Win32Thread->ppi = PsGetCurrentProcessWin32Process();
       pTeb = NtCurrentTeb();
@@ -274,6 +282,7 @@ Win32kThreadCallback(struct _ETHREAD *Thread,
       }
       Win32Thread->MessageQueue = MsqCreateMessageQueue(Thread);
       Win32Thread->KeyboardLayout = W32kGetDefaultKeyLayout();
+      Win32Thread->pEThread = Thread;
     }
   else
     {
@@ -281,8 +290,13 @@ Win32kThreadCallback(struct _ETHREAD *Thread,
 
       DPRINT("Destroying W32 thread TID:%d at IRQ level: %lu\n", Thread->Cid.UniqueThread, KeGetCurrentIrql());
 
-      Win32Thread->IsExiting = TRUE;
+      Win32Thread->TIF_flags |= TIF_INCLEANUP;
+      DceFreeThreadDCE(Win32Thread);
       HOOK_DestroyThreadHooks(Thread);
+      EVENT_DestroyThreadEvents(Thread);
+      /* Cleanup timers */
+      DestroyTimersForThread(Win32Thread);
+      KeSetEvent(Win32Thread->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE);
       UnregisterThreadHotKeys(Thread);
       /* what if this co_ func crash in umode? what will clean us up then? */
       co_DestroyThreadWindows(Thread);
@@ -304,12 +318,6 @@ Win32kThreadCallback(struct _ETHREAD *Thread,
       IntSetThreadDesktop(NULL,
                           TRUE);
 
-      if (Win32Thread->ThreadInfo != NULL)
-      {
-          UserHeapFree(Win32Thread->ThreadInfo);
-          Win32Thread->ThreadInfo = NULL;
-      }
-
       PsSetThreadWin32Thread(Thread, NULL);
     }
 
@@ -333,7 +341,7 @@ Win32kInitWin32Thread(PETHREAD Thread)
   if (Process->Win32Process == NULL)
     {
       /* FIXME - lock the process */
-      Process->Win32Process = ExAllocatePool(NonPagedPool, sizeof(PROCESSINFO));
+      Process->Win32Process = ExAllocatePoolWithTag(NonPagedPool, sizeof(PROCESSINFO), USERTAG_PROCESSINFO);
 
       if (Process->Win32Process == NULL)
        return STATUS_NO_MEMORY;
@@ -346,7 +354,7 @@ Win32kInitWin32Thread(PETHREAD Thread)
 
   if (Thread->Tcb.Win32Thread == NULL)
     {
-      Thread->Tcb.Win32Thread = ExAllocatePool (NonPagedPool, sizeof(THREADINFO));
+      Thread->Tcb.Win32Thread = ExAllocatePoolWithTag(NonPagedPool, sizeof(THREADINFO), USERTAG_THREADINFO);
       if (Thread->Tcb.Win32Thread == NULL)
        return STATUS_NO_MEMORY;
 
@@ -358,6 +366,7 @@ Win32kInitWin32Thread(PETHREAD Thread)
   return(STATUS_SUCCESS);
 }
 
+C_ASSERT(sizeof(SERVERINFO) <= PAGE_SIZE);
 
 /*
  * This definition doesn't work
@@ -387,6 +396,8 @@ DriverEntry (
       return STATUS_UNSUCCESSFUL;
     }
 
+  hModuleWin = MmPageEntireDriver(DriverEntry);
+  DPRINT("Win32k hInstance 0x%x!\n",hModuleWin);
     /*
      * Register Object Manager Callbacks
      */
@@ -411,8 +422,19 @@ DriverEntry (
         return STATUS_UNSUCCESSFUL;
     }
 
-  /* Initialize a list of loaded drivers in Win32 subsystem */
-  InitializeListHead(&GlobalDriverListHead);
+   if (!gpsi)
+   {
+      gpsi = UserHeapAlloc(sizeof(SERVERINFO));
+      if (gpsi)
+      {
+         RtlZeroMemory(gpsi, sizeof(SERVERINFO));
+         DPRINT("Global Server Data -> %x\n", gpsi);
+      }
+      else
+      {
+          ASSERT(FALSE);
+      }
+   }
 
   if(!hsemDriverMgmt) hsemDriverMgmt = EngCreateSemaphore();
 
@@ -423,6 +445,26 @@ DriverEntry (
       return STATUS_UNSUCCESSFUL;
   }
 
+  /* Initialize default palettes */
+  PALETTE_Init();
+
+  /* Create stock objects, ie. precreated objects commonly
+     used by win32 applications */
+  CreateStockObjects();
+  CreateSysColorObjects();
+
+  InitXlateImpl();
+  InitPDEVImpl();
+  InitLDEVImpl();
+  InitDeviceImpl();
+
+  Status = InitDcImpl();
+  if (!NT_SUCCESS(Status))
+  {
+    DPRINT1("Failed to initialize Device context implementation!\n");
+    return STATUS_UNSUCCESSFUL;
+  }
+
   Status = InitUserImpl();
   if (!NT_SUCCESS(Status))
   {
@@ -514,13 +556,6 @@ DriverEntry (
       return(Status);
     }
 
-  Status = InitDcImpl();
-  if (!NT_SUCCESS(Status))
-  {
-    DPRINT1("Failed to initialize Device context implementation!\n");
-    return STATUS_UNSUCCESSFUL;
-  }
-
   /* Initialize FreeType library */
   if (! InitFontSupport())
     {
@@ -528,11 +563,6 @@ DriverEntry (
       return STATUS_UNSUCCESSFUL;
     }
 
-  /* Create stock objects, ie. precreated objects commonly
-     used by win32 applications */
-  CreateStockObjects();
-  CreateSysColorObjects();
-
   gusLanguageID = IntGdiGetLanguageID();
 
   return STATUS_SUCCESS;