- Add comment explaining the primitive message queue and fix IntTranslateKbdMessage to work with it.
- Fix one windows locking case in IntPeekMessage.
- Zero memory allocated for HOOKs, MENU_OBJECTs and MONITORs to avoid accessing uninitialized variables.
- Add check for hWnd == NULL to IntGetWindowObject. We mustn't access the window station in that case (it can happen to be call from the primitive message queue thread).
Modified: branches/win32k rewrite attempt/win32k/ntuser/focus.c
Modified: branches/win32k rewrite attempt/win32k/ntuser/hook.c
Modified: branches/win32k rewrite attempt/win32k/ntuser/keyboard.c
Modified: branches/win32k rewrite attempt/win32k/ntuser/menu.c
Modified: branches/win32k rewrite attempt/win32k/ntuser/message.c
Modified: branches/win32k rewrite attempt/win32k/ntuser/monitor.c
Modified: branches/win32k rewrite attempt/win32k/ntuser/msgqueue.c
Modified: branches/win32k rewrite attempt/win32k/ntuser/window.c

Modified: branches/win32k rewrite attempt/win32k/ntuser/focus.c
--- branches/win32k rewrite attempt/win32k/ntuser/focus.c	2005-08-03 11:10:21 UTC (rev 16994)
+++ branches/win32k rewrite attempt/win32k/ntuser/focus.c	2005-08-03 12:42:50 UTC (rev 16995)
@@ -250,7 +250,7 @@
    //      TopWindow = Window;
    //    }
 
-   /* TMN: Check return valud from this function? */
+   /* TMN: Check return value from this function? */
    IntSetForegroundAndFocusWindow(TopWnd, Window, TRUE);
 
    return TRUE;

Modified: branches/win32k rewrite attempt/win32k/ntuser/hook.c
--- branches/win32k rewrite attempt/win32k/ntuser/hook.c	2005-08-03 11:10:21 UTC (rev 16994)
+++ branches/win32k rewrite attempt/win32k/ntuser/hook.c	2005-08-03 12:42:50 UTC (rev 16995)
@@ -405,6 +405,7 @@
    
    mem = ExAllocatePool(PagedPool, sizeof(HOOK));
    if (!mem) return NULL;
+   RtlZeroMemory(mem, sizeof(HOOK));
 
    WinSta = UserGetCurrentWinSta();
    *hHook = UserAllocHandle(&WinSta->HandleTable, mem, USER_HOOK_PROC);

Modified: branches/win32k rewrite attempt/win32k/ntuser/keyboard.c
--- branches/win32k rewrite attempt/win32k/ntuser/keyboard.c	2005-08-03 11:10:21 UTC (rev 16994)
+++ branches/win32k rewrite attempt/win32k/ntuser/keyboard.c	2005-08-03 12:42:50 UTC (rev 16995)
@@ -665,7 +665,8 @@
   IntLockQueueState;
 
   /* All messages have to contain the cursor point. */
-  UserGetCursorLocation(UserGetCurrentWinSta(), &NewMsg.pt);
+  if (UserGetCurrentQueue() != W32kGetPrimitiveMessageQueue())
+    UserGetCursorLocation(UserGetCurrentWinSta(), &NewMsg.pt);
 
   UState = ToUnicodeInner(lpMsg->wParam, HIWORD(lpMsg->lParam) & 0xff,
 			  QueueKeyStateTable, wp, 2, 0,

Modified: branches/win32k rewrite attempt/win32k/ntuser/menu.c
--- branches/win32k rewrite attempt/win32k/ntuser/menu.c	2005-08-03 11:10:21 UTC (rev 16994)
+++ branches/win32k rewrite attempt/win32k/ntuser/menu.c	2005-08-03 12:42:50 UTC (rev 16995)
@@ -246,6 +246,7 @@
    
    mem = ExAllocatePool(PagedPool, sizeof(MENU_OBJECT));
    if (!mem) return NULL;
+   RtlZeroMemory(mem, sizeof(MENU_OBJECT));
 
    WinSta = UserGetCurrentWinSta();
    *h = UserAllocHandle(&WinSta->HandleTable, mem, USER_MENU);

Modified: branches/win32k rewrite attempt/win32k/ntuser/message.c
--- branches/win32k rewrite attempt/win32k/ntuser/message.c	2005-08-03 11:10:21 UTC (rev 16994)
+++ branches/win32k rewrite attempt/win32k/ntuser/message.c	2005-08-03 12:42:50 UTC (rev 16995)
@@ -774,11 +774,13 @@
       {
          PWINDOW_OBJECT MsgWindow = NULL;
 
-         if(Msg->Msg.hwnd && (MsgWindow = IntGetWindowObject(Msg->Msg.hwnd)) &&
-               Msg->Msg.message >= WM_MOUSEFIRST && Msg->Msg.message <= WM_MOUSELAST)
+         if(Msg->Msg.hwnd &&
+            Msg->Msg.message >= WM_MOUSEFIRST && Msg->Msg.message <= WM_MOUSELAST)
          {
             USHORT HitTest;
 
+            MsgWindow = IntGetWindowObject(Msg->Msg.hwnd);
+            ASSERT(MsgWindow != NULL);
             if(IntTranslateMouseMessage(ThreadQueue, &Msg->Msg, &HitTest, TRUE))
                /* FIXME - check message filter again, if the message doesn't match anymore,
                           search again */

Modified: branches/win32k rewrite attempt/win32k/ntuser/monitor.c
--- branches/win32k rewrite attempt/win32k/ntuser/monitor.c	2005-08-03 11:10:21 UTC (rev 16994)
+++ branches/win32k rewrite attempt/win32k/ntuser/monitor.c	2005-08-03 12:42:50 UTC (rev 16995)
@@ -85,6 +85,8 @@
    
    mem = ExAllocatePool(PagedPool, sizeof(MONITOR_OBJECT));
    if (!mem) return NULL;
+   RtlZeroMemory(mem, sizeof(MONITOR_OBJECT));
+
    WinSta = UserGetCurrentWinSta();
    
    *h = UserAllocHandle(&WinSta->HandleTable, mem, USER_MONITOR);

Modified: branches/win32k rewrite attempt/win32k/ntuser/msgqueue.c
--- branches/win32k rewrite attempt/win32k/ntuser/msgqueue.c	2005-08-03 11:10:21 UTC (rev 16994)
+++ branches/win32k rewrite attempt/win32k/ntuser/msgqueue.c	2005-08-03 12:42:50 UTC (rev 16995)
@@ -712,7 +712,18 @@
 
    FocusMessageQueue = UserGetFocusMessageQueue();
 
-   //FIXME: whats the point of this call????
+   /*
+    * FIXME: whats the point of this call???? -- Gunnar
+    *
+    * There's a dedicated thread in CSRSS that processes input messages for
+    * consoles and it's message queue is marked as "primitive message queue".
+    * We can assume that if there is no screen DC then we're in console mode
+    * and the keyboard messages should go to this queue.
+    *
+    * This behaviour should eventually be removed.
+    *
+    * -- Filip
+    */
    if( !IntGetScreenDC() )
    {
       /* FIXME: What to do about Msg.pt here? */
@@ -1659,7 +1670,7 @@
    
    Timer = UserFindExpiredTimer(
       Queue, 
-      GetWnd(WndFilter), 
+      GetWnd(WndFilter),
       MsgFilterMin, 
       MsgFilterMax,
       Restart

Modified: branches/win32k rewrite attempt/win32k/ntuser/window.c
--- branches/win32k rewrite attempt/win32k/ntuser/window.c	2005-08-03 11:10:21 UTC (rev 16994)
+++ branches/win32k rewrite attempt/win32k/ntuser/window.c	2005-08-03 12:42:50 UTC (rev 16995)
@@ -106,6 +106,8 @@
 PWINDOW_OBJECT FASTCALL IntGetWindowObject(HWND hWnd)
 {
    PWINSTATION_OBJECT WinSta;
+   if (hWnd == NULL)
+      return NULL;
    WinSta = UserGetCurrentWinSta();
    ASSERT(WinSta);
    return (PWINDOW_OBJECT)UserGetObject(&WinSta->HandleTable, hWnd, USER_WINDOW );
@@ -590,10 +592,10 @@
   
   while (!IsListEmpty(&Win32Thread->WindowListHead))
   {
-     Current = RemoveHeadList(&Win32Thread->WindowListHead);
+     Current = Win32Thread->WindowListHead.Flink;
      Wnd = CONTAINING_RECORD(Current, WINDOW_OBJECT, ThreadListEntry);
      /* window removes itself from the list */
-     UserDestroyWindow(Wnd);
+     ASSERT(UserDestroyWindow(Wnd));
   }
 
 #if 0