Author: jimtabor Date: Sat Nov 20 04:24:44 2010 New Revision: 49653
URL: http://svn.reactos.org/svn/reactos?rev=49653&view=rev Log: [Wine32k|User32] - Implement client thread information for the beginning of QS flag support and signaling synchronization of messages. - Set and clear idle event when setting clearing masks. This fixed the idle foreground hook call from user mode. - Fixed wine ListBox and ReactOS ComboBox tests. Critical note: SendMessageA/W, when IsThreadHooked is used and any global hooks are affirmed, all messages are sent to Win32k and the result is, A to W and W to A mismatch via UMToKM. Fixing Global hook support exposed a critical bug in ReactOS message system. Enable the appropriate hooks will temporarily remedy this bug. - All patches are from a checked out revision from 49475. Upping ntuser.h, win32k and user32 to sync.
Modified: trunk/reactos/dll/win32/user32/include/user32p.h trunk/reactos/dll/win32/user32/windows/hook.c trunk/reactos/dll/win32/user32/windows/message.c trunk/reactos/include/reactos/win32k/ntuser.h trunk/reactos/subsystems/win32/win32k/include/misc.h trunk/reactos/subsystems/win32/win32k/include/msgqueue.h trunk/reactos/subsystems/win32/win32k/main/dllmain.c trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c trunk/reactos/subsystems/win32/win32k/ntuser/message.c trunk/reactos/subsystems/win32/win32k/ntuser/misc.c trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c
Modified: trunk/reactos/dll/win32/user32/include/user32p.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/include/us... ============================================================================== --- trunk/reactos/dll/win32/user32/include/user32p.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/user32/include/user32p.h [iso-8859-1] Sat Nov 20 04:24:44 2010 @@ -28,7 +28,7 @@
/* One/Two Param Functions */ #define NtUserMsqSetWakeMask(dwWaitMask) \ - (HANDLE)NtUserCallOneParam(dwWaitMask, ONEPARAM_ROUTINE_MSQSETWAKEMASK) + (HANDLE)NtUserCallOneParam(dwWaitMask, ONEPARAM_ROUTINE_GETINPUTEVENT)
#define NtUserMsqClearWakeMask() \ NtUserCallNoParam(NOPARAM_ROUTINE_MSQCLEARWAKEMASK)
Modified: trunk/reactos/dll/win32/user32/windows/hook.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/ho... ============================================================================== --- trunk/reactos/dll/win32/user32/windows/hook.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/user32/windows/hook.c [iso-8859-1] Sat Nov 20 04:24:44 2010 @@ -19,8 +19,8 @@ /* * * PROJECT: ReactOS user32.dll - * FILE: lib/user32/windows/input.c - * PURPOSE: Input + * FILE: dll/win32/user32/windows/hook.c + * PURPOSE: Hooks * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net) * UPDATE HISTORY: * 09-05-2001 CSH Created @@ -155,7 +155,8 @@ int nCode) { MSG Msg; - if (NtCurrentTeb()->Win32ThreadInfo && IsThreadHooked(GetWin32ClientInfo())) + if ( NtCurrentTeb()->Win32ThreadInfo && + (ISITHOOKED(WH_MSGFILTER) || ISITHOOKED(WH_SYSMSGFILTER)) ) { if ( lpMsg->message & ~WM_MAXIMUM ) { @@ -179,7 +180,8 @@ int nCode) { MSG Msg; - if (NtCurrentTeb()->Win32ThreadInfo && IsThreadHooked(GetWin32ClientInfo())) + if ( NtCurrentTeb()->Win32ThreadInfo && + (ISITHOOKED(WH_MSGFILTER) || ISITHOOKED(WH_SYSMSGFILTER)) ) { if ( lpMsg->message & ~WM_MAXIMUM ) {
Modified: trunk/reactos/dll/win32/user32/windows/message.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/windows/me... ============================================================================== --- trunk/reactos/dll/win32/user32/windows/message.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/user32/windows/message.c [iso-8859-1] Sat Nov 20 04:24:44 2010 @@ -2066,14 +2066,16 @@ { if ( Window != NULL && Window->head.pti == ti && - !IsThreadHooked(GetWin32ClientInfo()) && +// !IsThreadHooked(GetWin32ClientInfo()) && // Enable to test message system bug. + !ISITHOOKED(WH_CALLWNDPROC) && + !ISITHOOKED(WH_CALLWNDPROCRET) && !(Window->state & WNDS_SERVERSIDEWINDOWPROC) ) { /* NOTE: We can directly send messages to the window procedure if *all* the following conditions are met:
* Window belongs to calling thread - * The calling thread is not being hooked + * The calling thread is not being hooked for CallWndProc * Not calling a server side proc: Desktop, Switch, ScrollBar, Menu, IconTitle, or hWndMessage */ @@ -2137,14 +2139,16 @@ { if ( Window != NULL && Window->head.pti == ti && - !IsThreadHooked(GetWin32ClientInfo()) && +// !IsThreadHooked(GetWin32ClientInfo()) && // Enable to test message system bug. + !ISITHOOKED(WH_CALLWNDPROC) && + !ISITHOOKED(WH_CALLWNDPROCRET) && !(Window->state & WNDS_SERVERSIDEWINDOWPROC) ) { /* NOTE: We can directly send messages to the window procedure if *all* the following conditions are met:
* Window belongs to calling thread - * The calling thread is not being hooked + * The calling thread is not being hooked for CallWndProc * Not calling a server side proc: Desktop, Switch, ScrollBar, Menu, IconTitle, or hWndMessage */ @@ -2694,9 +2698,8 @@ DWORD gfMessagePumpHook = 0;
BOOL WINAPI IsInsideMessagePumpHook() -{ // Fixme: Need to fully implement this! FF uses this and polls it when Min/Max +{ // FF uses this and polls it when Min/Max PCLIENTTHREADINFO pcti = GetWin32ClientInfo()->pClientThreadInfo; -// FIXME("IIMPH %x\n",pcti); return (gfMessagePumpHook && pcti && (pcti->dwcPumpHook > 0)); }
Modified: trunk/reactos/include/reactos/win32k/ntuser.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/win32k/ntus... ============================================================================== --- trunk/reactos/include/reactos/win32k/ntuser.h [iso-8859-1] (original) +++ trunk/reactos/include/reactos/win32k/ntuser.h [iso-8859-1] Sat Nov 20 04:24:44 2010 @@ -3161,7 +3161,6 @@ #define ONEPARAM_ROUTINE_SWITCHCARETSHOWING 0xfffe0008 #define ONEPARAM_ROUTINE_ENABLEPROCWNDGHSTING 0xfffe000d #define ONEPARAM_ROUTINE_GETDESKTOPMAPPING 0xfffe000e -#define ONEPARAM_ROUTINE_MSQSETWAKEMASK 0xfffe0027 #define ONEPARAM_ROUTINE_GETCURSORPOSITION 0xfffe0048 // use ONEPARAM_ or TWOPARAM routine ? #define TWOPARAM_ROUTINE_GETWINDOWRGNBOX 0xfffd0048 // user mode #define TWOPARAM_ROUTINE_GETWINDOWRGN 0xfffd0049 // user mode
Modified: trunk/reactos/subsystems/win32/win32k/include/misc.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/misc.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/include/misc.h [iso-8859-1] Sat Nov 20 04:24:44 2010 @@ -24,7 +24,7 @@ extern SHORT gusLanguageID;
SHORT FASTCALL IntGdiGetLanguageID(VOID); -DWORD APIENTRY IntGetQueueStatus(BOOL ClearChanges); +DWORD APIENTRY IntGetQueueStatus(DWORD); VOID FASTCALL IntUserManualGuiCheck(LONG Check); PVOID APIENTRY HackSecureVirtualMemory(IN PVOID,IN SIZE_T,IN ULONG,OUT PVOID *); VOID APIENTRY HackUnsecureVirtualMemory(IN PVOID);
Modified: trunk/reactos/subsystems/win32/win32k/include/msgqueue.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/inc... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/msgqueue.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/include/msgqueue.h [iso-8859-1] Sat Nov 20 04:24:44 2010 @@ -275,4 +275,7 @@ return (LONG)(TickCount->QuadPart * (KeQueryTimeIncrement() / 10000)); }
+VOID FASTCALL IdlePing(VOID); +VOID FASTCALL IdlePong(VOID); + /* EOF */
Modified: trunk/reactos/subsystems/win32/win32k/main/dllmain.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/mai... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/main/dllmain.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/main/dllmain.c [iso-8859-1] Sat Nov 20 04:24:44 2010 @@ -279,7 +279,6 @@ { /* Attempt to startup client support which should have been initialized in IntSetThreadDesktop. */ PCLIENTINFO pci = (PCLIENTINFO)pTeb->Win32ClientInfo; Win32Thread->pClientInfo = pci; - pci->pClientThreadInfo = NULL; pci->ppi = Win32Thread->ppi; pci->fsHooks = Win32Thread->fsHooks; if (Win32Thread->KeyboardLayout) pci->hKL = Win32Thread->KeyboardLayout->hkl; @@ -291,6 +290,10 @@
pci->pDeskInfo = (PVOID)((ULONG_PTR)Win32Thread->pDeskInfo - pci->ulClientDelta); } + if (Win32Thread->pcti && pci->pDeskInfo) + pci->pClientThreadInfo = (PVOID)((ULONG_PTR)Win32Thread->pcti - pci->ulClientDelta); + else + pci->pClientThreadInfo = NULL; } else { @@ -331,6 +334,7 @@
IntSetThreadDesktop(NULL, TRUE); +
PsSetThreadWin32Thread(Thread, NULL); }
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c [iso-8859-1] Sat Nov 20 04:24:44 2010 @@ -1835,7 +1835,6 @@ static NTSTATUS IntMapDesktopView(IN PDESKTOP DesktopObject) { - PTHREADINFO ti; PPROCESSINFO CurrentWin32Process; PW32HEAP_USER_MAPPING HeapMapping, *PrevLink; PVOID UserBase = NULL; @@ -1898,19 +1897,6 @@
ObReferenceObject(DesktopObject);
- /* create a W32THREADINFO structure if not already done, or update it */ - ti = GetW32ThreadInfo(); - GetWin32ClientInfo()->ulClientDelta = DesktopHeapGetUserDelta(); - if (ti != NULL) - { - if (GetWin32ClientInfo()->pDeskInfo == NULL) - { - GetWin32ClientInfo()->pDeskInfo = - (PVOID)((ULONG_PTR)DesktopObject->pDeskInfo - - GetWin32ClientInfo()->ulClientDelta); - } - } - return STATUS_SUCCESS; }
@@ -1922,6 +1908,7 @@ PTHREADINFO W32Thread; NTSTATUS Status; BOOL MapHeap; + CLIENTTHREADINFO ctiSave;
DPRINT("IntSetThreadDesktop() DO=%p, FOF=%d\n", DesktopObject, FreeOnFailure); MapHeap = (PsGetCurrentProcess() != PsInitialSystemProcess); @@ -1948,9 +1935,27 @@ SetLastNtError(Status); return FALSE; } + W32Thread->pDeskInfo = DesktopObject->pDeskInfo; }
- /* Hack for system threads */ + RtlZeroMemory(&ctiSave, sizeof(CLIENTTHREADINFO)); + + if (W32Thread->pcti && OldDesktop) + { + RtlCopyMemory(&ctiSave, W32Thread->pcti, sizeof(CLIENTTHREADINFO)); + DPRINT("Free ClientThreadInfo\n"); + DesktopHeapFree(OldDesktop, W32Thread->pcti); + W32Thread->pcti = NULL; + } + + if (!W32Thread->pcti && DesktopObject) + { + DPRINT("Allocate ClientThreadInfo\n"); + W32Thread->pcti = DesktopHeapAlloc( DesktopObject, + sizeof(CLIENTTHREADINFO)); + RtlCopyMemory(W32Thread->pcti, &ctiSave, sizeof(CLIENTTHREADINFO)); + } + if (NtCurrentTeb()) { PCLIENTINFO pci = GetWin32ClientInfo(); @@ -1958,6 +1963,7 @@ if (DesktopObject) { pci->pDeskInfo = (PVOID)((ULONG_PTR)DesktopObject->pDeskInfo - pci->ulClientDelta); + if (W32Thread->pcti) pci->pClientThreadInfo = (PVOID)((ULONG_PTR)W32Thread->pcti - pci->ulClientDelta); } }
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/message.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/message.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/message.c [iso-8859-1] Sat Nov 20 04:24:44 2010 @@ -1901,7 +1901,7 @@
DWORD APIENTRY -IntGetQueueStatus(BOOL ClearChanges) +IntGetQueueStatus(DWORD Changes) { PTHREADINFO pti; PUSER_MESSAGE_QUEUE Queue; @@ -1909,12 +1909,18 @@
pti = PsGetCurrentThreadWin32Thread(); Queue = pti->MessageQueue; - - Result = MAKELONG(Queue->QueueBits, Queue->ChangedBits); - if (ClearChanges) - { - Queue->ChangedBits = 0; - } +// wine: + Changes &= (QS_ALLINPUT|QS_ALLPOSTMESSAGE|QS_SMRESULT); + + Result = MAKELONG(Queue->ChangedBits & Changes, Queue->QueueBits & Changes); + + if (pti->pcti) + { + pti->pcti->fsChangeBits = Queue->ChangedBits; + pti->pcti->fsChangeBits &= ~Changes; + } + + Queue->ChangedBits &= ~Changes;
return Result; } @@ -2089,7 +2095,6 @@ { NTUSERGETMESSAGEINFO Info; NTSTATUS Status; - /* FIXME: if initialization is removed, gcc complains that this may be used before initialization. Please review */ PMSGMEMORY MsgMemoryEntry; PVOID UserMem; ULONG Size; @@ -2110,7 +2115,7 @@
UserLeave();
- Info.Msg = Msg; //.Msg; + Info.Msg = Msg; /* See if this message type is present in the table */ MsgMemoryEntry = FindMsgMemory(Info.Msg.message);
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/misc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/misc.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/misc.c [iso-8859-1] Sat Nov 20 04:24:44 2010 @@ -125,7 +125,7 @@ break;
case THREADSTATE_GETINPUTSTATE: - ret = HIWORD(IntGetQueueStatus(FALSE)) & (QS_KEY | QS_MOUSEBUTTON); + ret = LOWORD(IntGetQueueStatus(QS_POSTMESSAGE|QS_TIMER|QS_PAINT|QS_SENDMESSAGE|QS_INPUT)) & (QS_KEY | QS_MOUSEBUTTON); break; }
@@ -471,8 +471,6 @@ } /* initialize it */ pti->ppi = ppi = GetW32ProcessInfo(); - - pti->pcti = &pti->cti; // FIXME Need to set it in desktop.c!
if (pti->rpdesk != NULL) { @@ -494,7 +492,6 @@
Teb->Win32ThreadInfo = (PW32THREAD) pti;
- pci->pClientThreadInfo = NULL; // FIXME Need to set it in desktop.c! pci->ppi = ppi; pci->fsHooks = pti->fsHooks; if (pti->KeyboardLayout) pci->hKL = pti->KeyboardLayout->hkl; @@ -506,6 +503,11 @@
pci->pDeskInfo = (PVOID)((ULONG_PTR)pti->pDeskInfo - pci->ulClientDelta); } + if (pti->pcti && pci->pDeskInfo) + pci->pClientThreadInfo = (PVOID)((ULONG_PTR)pti->pcti - pci->ulClientDelta); + else + pci->pClientThreadInfo = NULL; + } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/msgqueue.c [iso-8859-1] Sat Nov 20 04:24:44 2010 @@ -77,6 +77,11 @@ MessageQueue->WakeMask = WakeMask; MessageEventHandle = MessageQueue->NewMessagesHandle;
+ if (Win32Thread->pcti) + Win32Thread->pcti->fsWakeMask = WakeMask; + + IdlePing(); + return MessageEventHandle; }
@@ -93,6 +98,11 @@ MessageQueue = Win32Thread->MessageQueue; // HACK!!!!!!! Newbies that wrote this should hold your head down in shame! (jt) MessageQueue->WakeMask = ~0; + + if (Win32Thread->pcti) + Win32Thread->pcti->fsWakeMask = 0; + + IdlePong();
return TRUE; }
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/simplecall.c [iso-8859-1] Sat Nov 20 04:24:44 2010 @@ -252,7 +252,7 @@ RETURN( FALSE); }
- case ONEPARAM_ROUTINE_MSQSETWAKEMASK: + case ONEPARAM_ROUTINE_GETINPUTEVENT: RETURN( (DWORD_PTR)IntMsqSetWakeMask(Param));
case ONEPARAM_ROUTINE_GETKEYBOARDTYPE: @@ -269,12 +269,7 @@
case ONEPARAM_ROUTINE_GETQUEUESTATUS: { - DWORD Ret; - WORD changed_bits, wake_bits; - Ret = IntGetQueueStatus(FALSE); - changed_bits = LOWORD(Ret); - wake_bits = HIWORD(Ret); - RETURN( MAKELONG(changed_bits & Param, wake_bits & Param)); + RETURN (IntGetQueueStatus((DWORD)Param)); } case ONEPARAM_ROUTINE_ENUMCLIPBOARDFORMATS: /* FIXME: Should use UserEnterShared */