Author: cfinck Date: Sun Mar 13 18:05:43 2011 New Revision: 51040
URL: http://svn.reactos.org/svn/reactos?rev=51040&view=rev Log: Revert r51031
[13:43] <smiley1_> fuck [13:44] <smiley1_> INVALID_KERNEL_HANDLE ?!? [13:45] <smiley1_> Caemyr: after my latest commit 5 tests end with this bugcheck
Modified: branches/ros-branch-0_3_13/reactos/subsystems/win32/win32k/ntuser/input.c branches/ros-branch-0_3_13/reactos/subsystems/win32/win32k/ntuser/message.c branches/ros-branch-0_3_13/reactos/subsystems/win32/win32k/ntuser/msgqueue.c
Modified: branches/ros-branch-0_3_13/reactos/subsystems/win32/win32k/ntuser/input.c URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_13/reactos/subsys... ============================================================================== --- branches/ros-branch-0_3_13/reactos/subsystems/win32/win32k/ntuser/input.c [iso-8859-1] (original) +++ branches/ros-branch-0_3_13/reactos/subsystems/win32/win32k/ntuser/input.c [iso-8859-1] Sun Mar 13 18:05:43 2011 @@ -708,7 +708,6 @@
if (ModifierState == 0) { - UserEnterExclusive(); if (fsModifiers == MOD_WIN) IntKeyboardSendWinKeyMsg(); else if (fsModifiers == MOD_ALT) @@ -724,7 +723,6 @@ } co_IntKeyboardSendAltKeyMsg(); } - UserLeave(); continue; }
@@ -732,8 +730,6 @@ } } } - - UserEnterExclusive();
for (;NumKeys;memcpy(&KeyInput, &NextKeyInput, sizeof(KeyInput)), NumKeys--) @@ -864,8 +860,6 @@ */ co_MsqPostKeyboardMessage(msg.message,msg.wParam,msg.lParam); } - - UserLeave(); }
KeyboardEscape: @@ -1249,11 +1243,17 @@ LARGE_INTEGER LargeTickCount; KBDLLHOOKSTRUCT KbdHookData; WORD flags, wVkStripped, wVkL, wVkR, wVk = ki->wVk, vk_hook = ki->wVk; + BOOLEAN Entered = FALSE;
Msg.lParam = 0;
- // Condition may arise when calling MsqPostMessage and waiting for an event. - ASSERT (UserIsEntered()); + // Condition may arise when calling MsqPostMessage and waiting for an event. + if (!UserIsEntered()) + { + // Fixme: Not sure ATM if this thread is locked. + UserEnterExclusive(); + Entered = TRUE; + }
wVk = LOBYTE(wVk); Msg.wParam = wVk; @@ -1352,7 +1352,7 @@ { DPRINT1("Kbd msg %d wParam %d lParam 0x%08x dropped by WH_KEYBOARD_LL hook\n", Msg.message, vk_hook, Msg.lParam); - + if (Entered) UserLeave(); return FALSE; }
@@ -1380,7 +1380,7 @@ if (FocusMessageQueue == NULL) { DPRINT("No focus message queue\n"); - + if (Entered) UserLeave(); return FALSE; }
@@ -1400,6 +1400,8 @@ { DPRINT("Invalid focus window handle\n"); } + + if (Entered) UserLeave();
return TRUE; }
Modified: branches/ros-branch-0_3_13/reactos/subsystems/win32/win32k/ntuser/message.c URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_13/reactos/subsys... ============================================================================== --- branches/ros-branch-0_3_13/reactos/subsystems/win32/win32k/ntuser/message.c [iso-8859-1] (original) +++ branches/ros-branch-0_3_13/reactos/subsystems/win32/win32k/ntuser/message.c [iso-8859-1] Sun Mar 13 18:05:43 2011 @@ -1447,7 +1447,7 @@ if(!(Message = ExAllocatePoolWithTag(NonPagedPool, sizeof(USER_SENT_MESSAGE), TAG_USRMSG))) { DPRINT1("MsqSendMessage(): Not enough memory to allocate a message"); - RETURN( FALSE); + return STATUS_INSUFFICIENT_RESOURCES; }
Message->Msg.hwnd = hWnd; @@ -1459,21 +1459,19 @@ Message->lResult = 0; Message->QS_Flags = 0; Message->SenderQueue = NULL; // mjmartin, you are right! This is null. - IntReferenceMessageQueue(Win32Thread->MessageQueue); Message->CallBackSenderQueue = Win32Thread->MessageQueue; + + IntReferenceMessageQueue(Window->head.pti->MessageQueue); Message->CompletionCallback = CompletionCallback; Message->CompletionCallbackContext = CompletionCallbackContext; - Message->HookMessage = MSQ_NORMAL; // | MSQ_SENTNOWAIT + Message->HookMessage = MSQ_NORMAL | MSQ_SENTNOWAIT; Message->HasPackedLParam = (lParamBufferSize > 0); - Message->DispatchingListEntry.Flink = NULL; + Message->QS_Flags = QS_SENDMESSAGE; - - IntReferenceMessageQueue(Window->head.pti->MessageQueue); - MsqWakeQueue(Window->head.pti->MessageQueue, QS_SENDMESSAGE, FALSE);
InsertTailList(&Window->head.pti->MessageQueue->SentMessagesListHead, &Message->ListEntry); - //IntDereferenceMessageQueue(Window->head.pti->MessageQueue); + IntDereferenceMessageQueue(Window->head.pti->MessageQueue);
RETURN(TRUE);
Modified: branches/ros-branch-0_3_13/reactos/subsystems/win32/win32k/ntuser/msgqueue.c URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_3_13/reactos/subsys... ============================================================================== --- branches/ros-branch-0_3_13/reactos/subsystems/win32/win32k/ntuser/msgqueue.c [iso-8859-1] (original) +++ branches/ros-branch-0_3_13/reactos/subsystems/win32/win32k/ntuser/msgqueue.c [iso-8859-1] Sun Mar 13 18:05:43 2011 @@ -279,12 +279,18 @@ MSG Msg; LARGE_INTEGER LargeTickCount; KBDLLHOOKSTRUCT KbdHookData; + BOOLEAN Entered = FALSE;
DPRINT("MsqPostKeyboardMessage(uMsg 0x%x, wParam 0x%x, lParam 0x%x)\n", uMsg, wParam, lParam);
// Condition may arise when calling MsqPostMessage and waiting for an event. - ASSERT(UserIsEntered()); + if (!UserIsEntered()) + { + // Fixme: Not sure ATM if this thread is locked. + UserEnterExclusive(); + Entered = TRUE; + }
FocusMessageQueue = IntGetFocusMessageQueue();
@@ -314,12 +320,14 @@ { DPRINT1("Kbd msg %d wParam %d lParam 0x%08x dropped by WH_KEYBOARD_LL hook\n", Msg.message, Msg.wParam, Msg.lParam); + if (Entered) UserLeave(); return; }
if (FocusMessageQueue == NULL) { DPRINT("No focus message queue\n"); + if (Entered) UserLeave(); return; }
@@ -338,6 +346,7 @@ DPRINT("Invalid focus window handle\n"); }
+ if (Entered) UserLeave(); return; }
@@ -406,42 +415,6 @@ ExFreeToPagedLookasideList(&MessageLookasideList, Message); }
-VOID FASTCALL -MsqDestroySentMessage(PUSER_MESSAGE_QUEUE MessageQueue, PUSER_SENT_MESSAGE SentMessage) -{ - /* remove the message from the dispatching list if needed */ - if (SentMessage->DispatchingListEntry.Flink != NULL) - { - RemoveEntryList(&SentMessage->DispatchingListEntry); - } - - /* wake the sender's thread */ - if (SentMessage->CompletionEvent != NULL) - { - KeSetEvent(SentMessage->CompletionEvent, IO_NO_INCREMENT, FALSE); - } - - /* dereference message queues */ - IntDereferenceMessageQueue(MessageQueue); - if (SentMessage->SenderQueue) - { - IntDereferenceMessageQueue(SentMessage->SenderQueue); - } - if (SentMessage->CallBackSenderQueue) - { - IntDereferenceMessageQueue(SentMessage->CallBackSenderQueue); - } - - /* free lParam if needed */ - if (SentMessage->HasPackedLParam == TRUE && SentMessage->Msg.lParam) - { - ExFreePool((PVOID)SentMessage->Msg.lParam); - } - - /* free the message */ - ExFreePoolWithTag(SentMessage, TAG_USRMSG); -} - BOOLEAN FASTCALL co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) { @@ -505,10 +478,13 @@ RemoveEntryList(&Message->ListEntry);
/* remove the message from the dispatching list if needed, so lock the sender's message queue */ - if (Message->DispatchingListEntry.Flink != NULL) - { - RemoveEntryList(&Message->DispatchingListEntry); - Message->DispatchingListEntry.Flink = NULL; + if (!(Message->HookMessage & MSQ_SENTNOWAIT)) + { + if (Message->DispatchingListEntry.Flink != NULL) + { + /* only remove it from the dispatching list if not already removed by a timeout */ + RemoveEntryList(&Message->DispatchingListEntry); + } } /* still keep the sender's message queue locked, so the sender can't exit the MsqSendMessage() function (if timed out) */ @@ -524,11 +500,16 @@ *Message->Result = Result; }
+ if (Message->HasPackedLParam == TRUE) + { + if (Message->Msg.lParam) + ExFreePool((PVOID)Message->Msg.lParam); + } + /* Notify the sender. */ if (Message->CompletionEvent != NULL) { KeSetEvent(Message->CompletionEvent, IO_NO_INCREMENT, FALSE); - Message->CompletionEvent = NULL; /* prevent MsqDestroySentMessage from setting this event again */ }
/* Call the callback if the message was sent with SendMessageCallback */ @@ -541,7 +522,15 @@ Result); }
- MsqDestroySentMessage(MessageQueue, Message); + /* Only if it is not a no wait message */ + if (!(Message->HookMessage & MSQ_SENTNOWAIT)) + { + IntDereferenceMessageQueue(Message->SenderQueue); + IntDereferenceMessageQueue(MessageQueue); + } + + /* free the message */ + ExFreePoolWithTag(Message, TAG_USRMSG);
/* do not hangup on the user if this is reentering */ if (!SaveMsg) pti->pcti->CTI_flags &= ~CTI_INSENDMESSAGE; @@ -571,14 +560,16 @@ { PostedMessage = CONTAINING_RECORD(CurrentEntry, USER_MESSAGE, ListEntry); - /* set CurrentEntry to next before destroying message */ - CurrentEntry = CurrentEntry->Flink; - if (PostedMessage->Msg.hwnd == Window->head.h) { RemoveEntryList(&PostedMessage->ListEntry); ClearMsgBitsMask(MessageQueue, PostedMessage->QS_Flags); MsqDestroyMessage(PostedMessage); + CurrentEntry = MessageQueue->PostedMessagesListHead.Flink; + } + else + { + CurrentEntry = CurrentEntry->Flink; } }
@@ -589,9 +580,6 @@ { SentMessage = CONTAINING_RECORD(CurrentEntry, USER_SENT_MESSAGE, ListEntry); - /* set CurrentEntry to next before destroying message */ - CurrentEntry = CurrentEntry->Flink; - if(SentMessage->Msg.hwnd == Window->head.h) { DPRINT("Notify the sender and remove a message from the queue that had not been dispatched\n"); @@ -599,7 +587,41 @@ RemoveEntryList(&SentMessage->ListEntry); ClearMsgBitsMask(MessageQueue, SentMessage->QS_Flags);
- MsqDestroySentMessage(MessageQueue, SentMessage); + /* remove the message from the dispatching list if neede */ + if ((!(SentMessage->HookMessage & MSQ_SENTNOWAIT)) + && (SentMessage->DispatchingListEntry.Flink != NULL)) + { + RemoveEntryList(&SentMessage->DispatchingListEntry); + } + + /* wake the sender's thread */ + if (SentMessage->CompletionEvent != NULL) + { + KeSetEvent(SentMessage->CompletionEvent, IO_NO_INCREMENT, FALSE); + } + + if (SentMessage->HasPackedLParam == TRUE) + { + if (SentMessage->Msg.lParam) + ExFreePool((PVOID)SentMessage->Msg.lParam); + } + + /* Only if it is not a no wait message */ + if (!(SentMessage->HookMessage & MSQ_SENTNOWAIT)) + { + /* dereference our and the sender's message queue */ + IntDereferenceMessageQueue(MessageQueue); + IntDereferenceMessageQueue(SentMessage->SenderQueue); + } + + /* free the message */ + ExFreePoolWithTag(SentMessage, TAG_USRMSG); + + CurrentEntry = MessageQueue->SentMessagesListHead.Flink; + } + else + { + CurrentEntry = CurrentEntry->Flink; } } } @@ -633,7 +655,7 @@
Timeout.QuadPart = (LONGLONG) uTimeout * (LONGLONG) -10000;
- /* FIXME - increase reference counter of sender's message queue here - isn't it done? */ + /* FIXME - increase reference counter of sender's message queue here */
Message->Msg.hwnd = Wnd; Message->Msg.message = Msg; @@ -643,9 +665,9 @@ Message->Result = &Result; Message->lResult = 0; Message->QS_Flags = 0; - IntReferenceMessageQueue(ThreadQueue); Message->SenderQueue = ThreadQueue; Message->CallBackSenderQueue = NULL; + IntReferenceMessageQueue(ThreadQueue); Message->CompletionCallback = NULL; Message->CompletionCallbackContext = 0; Message->HookMessage = HookMessage; @@ -1414,7 +1436,35 @@
DPRINT("Notify the sender and remove a message from the queue that had not been dispatched\n");
- MsqDestroySentMessage(MessageQueue, CurrentSentMessage); + /* remove the message from the dispatching list if needed */ + if ((!(CurrentSentMessage->HookMessage & MSQ_SENTNOWAIT)) + && (CurrentSentMessage->DispatchingListEntry.Flink != NULL)) + { + RemoveEntryList(&CurrentSentMessage->DispatchingListEntry); + } + + /* wake the sender's thread */ + if (CurrentSentMessage->CompletionEvent != NULL) + { + KeSetEvent(CurrentSentMessage->CompletionEvent, IO_NO_INCREMENT, FALSE); + } + + if (CurrentSentMessage->HasPackedLParam == TRUE) + { + if (CurrentSentMessage->Msg.lParam) + ExFreePool((PVOID)CurrentSentMessage->Msg.lParam); + } + + /* Only if it is not a no wait message */ + if (!(CurrentSentMessage->HookMessage & MSQ_SENTNOWAIT)) + { + /* dereference our and the sender's message queue */ + IntDereferenceMessageQueue(MessageQueue); + IntDereferenceMessageQueue(CurrentSentMessage->SenderQueue); + } + + /* free the message */ + ExFreePool(CurrentSentMessage); }
/* notify senders of dispatching messages. This needs to be cleaned up if e.g. @@ -1425,9 +1475,36 @@ CurrentSentMessage = CONTAINING_RECORD(CurrentEntry, USER_SENT_MESSAGE, ListEntry);
+ /* remove the message from the dispatching list */ + if(CurrentSentMessage->DispatchingListEntry.Flink != NULL) + { + RemoveEntryList(&CurrentSentMessage->DispatchingListEntry); + } + DPRINT("Notify the sender, the thread has been terminated while dispatching a message!\n");
- MsqDestroySentMessage(MessageQueue, CurrentSentMessage); + /* wake the sender's thread */ + if (CurrentSentMessage->CompletionEvent != NULL) + { + KeSetEvent(CurrentSentMessage->CompletionEvent, IO_NO_INCREMENT, FALSE); + } + + if (CurrentSentMessage->HasPackedLParam == TRUE) + { + if (CurrentSentMessage->Msg.lParam) + ExFreePool((PVOID)CurrentSentMessage->Msg.lParam); + } + + /* Only if it is not a no wait message */ + if (!(CurrentSentMessage->HookMessage & MSQ_SENTNOWAIT)) + { + /* dereference our and the sender's message queue */ + IntDereferenceMessageQueue(MessageQueue); + IntDereferenceMessageQueue(CurrentSentMessage->SenderQueue); + } + + /* free the message */ + ExFreePool(CurrentSentMessage); }
/* tell other threads not to bother returning any info to us */ @@ -1438,7 +1515,6 @@ DispatchingListEntry); CurrentSentMessage->CompletionEvent = NULL; CurrentSentMessage->Result = NULL; - CurrentSentMessage->DispatchingListEntry.Flink = NULL; // yeah!
/* do NOT dereference our message queue as it might get attempted to be locked later */