Merge from HEAD: r14159
Now that CSRSS is getting unloaded we must unregister the primitive
message queue when it's about to be destroyed.
Modified:
branches/ros-branch-0_2_6/reactos/subsys/win32k/include/input.h
Modified: branches/ros-branch-0_2_6/reactos/subsys/win32k/ntuser/misc.c
Modified:
branches/ros-branch-0_2_6/reactos/subsys/win32k/ntuser/msgqueue.c
_____
Modified:
branches/ros-branch-0_2_6/reactos/subsys/win32k/include/input.h
--- branches/ros-branch-0_2_6/reactos/subsys/win32k/include/input.h
2005-03-23 13:26:38 UTC (rev 14275)
+++ branches/ros-branch-0_2_6/reactos/subsys/win32k/include/input.h
2005-03-23 17:06:29 UTC (rev 14276)
@@ -8,6 +8,7 @@
NTSTATUS FASTCALL
InitKeyboardImpl(VOID);
PUSER_MESSAGE_QUEUE W32kGetPrimitiveMessageQueue(VOID);
+VOID W32kUnregisterPrimitiveMessageQueue(VOID);
PKBDTABLES W32kGetDefaultKeyLayout(VOID);
VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyLayout);
BOOL FASTCALL IntBlockInput(PW32THREAD W32Thread, BOOL BlockIt);
_____
Modified: branches/ros-branch-0_2_6/reactos/subsys/win32k/ntuser/misc.c
--- branches/ros-branch-0_2_6/reactos/subsys/win32k/ntuser/misc.c
2005-03-23 13:26:38 UTC (rev 14275)
+++ branches/ros-branch-0_2_6/reactos/subsys/win32k/ntuser/misc.c
2005-03-23 17:06:29 UTC (rev 14276)
@@ -17,13 +17,15 @@
/* registered Logon process */
PW32PROCESS LogonProcess = NULL;
-void W32kRegisterPrimitiveMessageQueue() {
+VOID W32kRegisterPrimitiveMessageQueue(VOID)
+{
extern PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue;
if( !pmPrimitiveMessageQueue ) {
PW32THREAD pThread;
pThread = PsGetWin32Thread();
if( pThread && pThread->MessageQueue ) {
pmPrimitiveMessageQueue = pThread->MessageQueue;
+ IntReferenceMessageQueue(pmPrimitiveMessageQueue);
DPRINT( "Installed primitive input queue.\n" );
}
} else {
@@ -31,8 +33,16 @@
}
}
-PUSER_MESSAGE_QUEUE W32kGetPrimitiveMessageQueue() {
+VOID W32kUnregisterPrimitiveMessageQueue(VOID)
+{
extern PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue;
+ IntDereferenceMessageQueue(pmPrimitiveMessageQueue);
+ pmPrimitiveMessageQueue = NULL;
+}
+
+PUSER_MESSAGE_QUEUE W32kGetPrimitiveMessageQueue()
+{
+ extern PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue;
return pmPrimitiveMessageQueue;
}
_____
Modified:
branches/ros-branch-0_2_6/reactos/subsys/win32k/ntuser/msgqueue.c
--- branches/ros-branch-0_2_6/reactos/subsys/win32k/ntuser/msgqueue.c
2005-03-23 13:26:38 UTC (rev 14275)
+++ branches/ros-branch-0_2_6/reactos/subsys/win32k/ntuser/msgqueue.c
2005-03-23 17:06:29 UTC (rev 14276)
@@ -1413,15 +1413,21 @@
MsqDestroyMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue)
{
PDESKTOP_OBJECT desk;
+
/* remove the message queue from any desktops */
- if((desk =
(PDESKTOP_OBJECT)InterlockedExchange((LONG*)&MessageQueue->Desktop, 0)))
- {
- InterlockedExchange((LONG*)&desk->ActiveMessageQueue, 0);
- IntDereferenceMessageQueue(MessageQueue);
- }
+ if ((desk =
(PDESKTOP_OBJECT)InterlockedExchange((LONG*)&MessageQueue->Desktop, 0)))
+ {
+ InterlockedExchange((LONG*)&desk->ActiveMessageQueue, 0);
+ IntDereferenceMessageQueue(MessageQueue);
+ }
+ /* if this is the primitive message queue, deregister it */
+ if (MessageQueue == W32kGetPrimitiveMessageQueue())
+ W32kUnregisterPrimitiveMessageQueue();
+
/* clean it up */
MsqCleanupMessageQueue(MessageQueue);
+
/* decrease the reference counter, if it hits zero, the queue will be
freed */
IntDereferenceMessageQueue(MessageQueue);
}
Show replies by date