[WIN32K:NTUSER]

- Make CaretInfo part of the USER_MESSAGE_QUEUE structure since the pointer can no longer change
CORE-10395

svn path=/trunk/; revision=69679
This commit is contained in:
Thomas Faber 2015-10-24 15:46:34 +00:00
parent 1bfbbb69c2
commit 910e2d7dc7
7 changed files with 56 additions and 58 deletions

View file

@ -101,7 +101,7 @@ CaretSystemTimerProc(HWND hwnd,
pti = PsGetCurrentThreadWin32Thread(); pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue; ThreadQueue = pti->MessageQueue;
if (ThreadQueue->CaretInfo->hWnd != hwnd) if (ThreadQueue->CaretInfo.hWnd != hwnd)
{ {
TRACE("Not the same caret window!\n"); TRACE("Not the same caret window!\n");
return; return;
@ -126,8 +126,8 @@ CaretSystemTimerProc(HWND hwnd,
{ {
case IDCARETTIMER: case IDCARETTIMER:
{ {
ThreadQueue->CaretInfo->Showing = (ThreadQueue->CaretInfo->Showing ? 0 : 1); ThreadQueue->CaretInfo.Showing = (ThreadQueue->CaretInfo.Showing ? 0 : 1);
co_IntDrawCaret(pWnd, ThreadQueue->CaretInfo); co_IntDrawCaret(pWnd, &ThreadQueue->CaretInfo);
} }
} }
return; return;
@ -155,18 +155,18 @@ co_IntDestroyCaret(PTHREADINFO Win32Thread)
{ {
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
PWND pWnd; PWND pWnd;
ThreadQueue = (PUSER_MESSAGE_QUEUE)Win32Thread->MessageQueue; ThreadQueue = Win32Thread->MessageQueue;
if(!ThreadQueue || !ThreadQueue->CaretInfo) if (!ThreadQueue)
return FALSE; return FALSE;
pWnd = ValidateHwndNoErr(ThreadQueue->CaretInfo->hWnd); pWnd = ValidateHwndNoErr(ThreadQueue->CaretInfo.hWnd);
co_IntHideCaret(ThreadQueue->CaretInfo); co_IntHideCaret(&ThreadQueue->CaretInfo);
ThreadQueue->CaretInfo->Bitmap = (HBITMAP)0; ThreadQueue->CaretInfo.Bitmap = (HBITMAP)0;
ThreadQueue->CaretInfo->hWnd = (HWND)0; ThreadQueue->CaretInfo.hWnd = (HWND)0;
ThreadQueue->CaretInfo->Size.cx = ThreadQueue->CaretInfo->Size.cy = 0; ThreadQueue->CaretInfo.Size.cx = ThreadQueue->CaretInfo.Size.cy = 0;
ThreadQueue->CaretInfo->Showing = 0; ThreadQueue->CaretInfo.Showing = 0;
ThreadQueue->CaretInfo->Visible = 0; ThreadQueue->CaretInfo.Visible = 0;
if (pWnd) if (pWnd)
{ {
IntNotifyWinEvent(EVENT_OBJECT_DESTROY, pWnd, OBJID_CARET, CHILDID_SELF, 0); IntNotifyWinEvent(EVENT_OBJECT_DESTROY, pWnd, OBJID_CARET, CHILDID_SELF, 0);
@ -201,16 +201,16 @@ co_IntSetCaretPos(int X, int Y)
pti = PsGetCurrentThreadWin32Thread(); pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue; ThreadQueue = pti->MessageQueue;
if(ThreadQueue->CaretInfo->hWnd) if(ThreadQueue->CaretInfo.hWnd)
{ {
pWnd = UserGetWindowObject(ThreadQueue->CaretInfo->hWnd); pWnd = UserGetWindowObject(ThreadQueue->CaretInfo.hWnd);
if(ThreadQueue->CaretInfo->Pos.x != X || ThreadQueue->CaretInfo->Pos.y != Y) if(ThreadQueue->CaretInfo.Pos.x != X || ThreadQueue->CaretInfo.Pos.y != Y)
{ {
co_IntHideCaret(ThreadQueue->CaretInfo); co_IntHideCaret(&ThreadQueue->CaretInfo);
ThreadQueue->CaretInfo->Showing = 1; ThreadQueue->CaretInfo.Showing = 1;
ThreadQueue->CaretInfo->Pos.x = X; ThreadQueue->CaretInfo.Pos.x = X;
ThreadQueue->CaretInfo->Pos.y = Y; ThreadQueue->CaretInfo.Pos.y = Y;
co_IntDrawCaret(pWnd, ThreadQueue->CaretInfo); co_IntDrawCaret(pWnd, &ThreadQueue->CaretInfo);
IntSetTimer(pWnd, IDCARETTIMER, gpsi->dtCaretBlink, CaretSystemTimerProc, TMRF_SYSTEM); IntSetTimer(pWnd, IDCARETTIMER, gpsi->dtCaretBlink, CaretSystemTimerProc, TMRF_SYSTEM);
IntNotifyWinEvent(EVENT_OBJECT_LOCATIONCHANGE, pWnd, OBJID_CARET, CHILDID_SELF, 0); IntNotifyWinEvent(EVENT_OBJECT_LOCATIONCHANGE, pWnd, OBJID_CARET, CHILDID_SELF, 0);
@ -237,20 +237,20 @@ BOOL FASTCALL co_UserHideCaret(PWND Window OPTIONAL)
pti = PsGetCurrentThreadWin32Thread(); pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue; ThreadQueue = pti->MessageQueue;
if(Window && ThreadQueue->CaretInfo->hWnd != Window->head.h) if(Window && ThreadQueue->CaretInfo.hWnd != Window->head.h)
{ {
EngSetLastError(ERROR_ACCESS_DENIED); EngSetLastError(ERROR_ACCESS_DENIED);
return FALSE; return FALSE;
} }
if(ThreadQueue->CaretInfo->Visible) if(ThreadQueue->CaretInfo.Visible)
{ {
PWND pwnd = UserGetWindowObject(ThreadQueue->CaretInfo->hWnd); PWND pwnd = UserGetWindowObject(ThreadQueue->CaretInfo.hWnd);
IntKillTimer(pwnd, IDCARETTIMER, TRUE); IntKillTimer(pwnd, IDCARETTIMER, TRUE);
co_IntHideCaret(ThreadQueue->CaretInfo); co_IntHideCaret(&ThreadQueue->CaretInfo);
ThreadQueue->CaretInfo->Visible = 0; ThreadQueue->CaretInfo.Visible = 0;
ThreadQueue->CaretInfo->Showing = 0; ThreadQueue->CaretInfo.Showing = 0;
} }
return TRUE; return TRUE;
@ -273,17 +273,17 @@ BOOL FASTCALL co_UserShowCaret(PWND Window OPTIONAL)
pti = PsGetCurrentThreadWin32Thread(); pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue; ThreadQueue = pti->MessageQueue;
if(Window && ThreadQueue->CaretInfo->hWnd != Window->head.h) if(Window && ThreadQueue->CaretInfo.hWnd != Window->head.h)
{ {
EngSetLastError(ERROR_ACCESS_DENIED); EngSetLastError(ERROR_ACCESS_DENIED);
return FALSE; return FALSE;
} }
if (!ThreadQueue->CaretInfo->Visible) if (!ThreadQueue->CaretInfo.Visible)
{ {
ThreadQueue->CaretInfo->Visible = 1; ThreadQueue->CaretInfo.Visible = 1;
pWnd = ValidateHwndNoErr(ThreadQueue->CaretInfo->hWnd); pWnd = ValidateHwndNoErr(ThreadQueue->CaretInfo.hWnd);
if (!ThreadQueue->CaretInfo->Showing && pWnd) if (!ThreadQueue->CaretInfo.Showing && pWnd)
{ {
IntNotifyWinEvent(EVENT_OBJECT_SHOW, pWnd, OBJID_CARET, OBJID_CARET, 0); IntNotifyWinEvent(EVENT_OBJECT_SHOW, pWnd, OBJID_CARET, OBJID_CARET, 0);
} }
@ -324,17 +324,17 @@ NtUserCreateCaret(
pti = PsGetCurrentThreadWin32Thread(); pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue; ThreadQueue = pti->MessageQueue;
if (ThreadQueue->CaretInfo->Visible) if (ThreadQueue->CaretInfo.Visible)
{ {
IntKillTimer(Window, IDCARETTIMER, TRUE); IntKillTimer(Window, IDCARETTIMER, TRUE);
co_IntHideCaret(ThreadQueue->CaretInfo); co_IntHideCaret(&ThreadQueue->CaretInfo);
} }
ThreadQueue->CaretInfo->hWnd = hWnd; ThreadQueue->CaretInfo.hWnd = hWnd;
if(hBitmap) if(hBitmap)
{ {
ThreadQueue->CaretInfo->Bitmap = hBitmap; ThreadQueue->CaretInfo.Bitmap = hBitmap;
ThreadQueue->CaretInfo->Size.cx = ThreadQueue->CaretInfo->Size.cy = 0; ThreadQueue->CaretInfo.Size.cx = ThreadQueue->CaretInfo.Size.cy = 0;
} }
else else
{ {
@ -346,12 +346,12 @@ NtUserCreateCaret(
{ {
nHeight = UserGetSystemMetrics(SM_CYBORDER); nHeight = UserGetSystemMetrics(SM_CYBORDER);
} }
ThreadQueue->CaretInfo->Bitmap = (HBITMAP)0; ThreadQueue->CaretInfo.Bitmap = (HBITMAP)0;
ThreadQueue->CaretInfo->Size.cx = nWidth; ThreadQueue->CaretInfo.Size.cx = nWidth;
ThreadQueue->CaretInfo->Size.cy = nHeight; ThreadQueue->CaretInfo.Size.cy = nHeight;
} }
ThreadQueue->CaretInfo->Visible = 0; ThreadQueue->CaretInfo.Visible = 0;
ThreadQueue->CaretInfo->Showing = 0; ThreadQueue->CaretInfo.Showing = 0;
IntSetTimer( Window, IDCARETTIMER, gpsi->dtCaretBlink, CaretSystemTimerProc, TMRF_SYSTEM ); IntSetTimer( Window, IDCARETTIMER, gpsi->dtCaretBlink, CaretSystemTimerProc, TMRF_SYSTEM );
@ -396,7 +396,7 @@ NtUserGetCaretPos(
pti = PsGetCurrentThreadWin32Thread(); pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue; ThreadQueue = pti->MessageQueue;
Status = MmCopyToCaller(lpPoint, &(ThreadQueue->CaretInfo->Pos), sizeof(POINT)); Status = MmCopyToCaller(lpPoint, &ThreadQueue->CaretInfo.Pos, sizeof(POINT));
if(!NT_SUCCESS(Status)) if(!NT_SUCCESS(Status))
{ {
SetLastNtError(Status); SetLastNtError(Status);

View file

@ -524,9 +524,9 @@ UserAttachThreadInput(PTHREADINFO ptiFrom, PTHREADINFO ptiTo, BOOL fAttach)
ptiTo->MessageQueue->spwndFocus = ptiFrom->MessageQueue->spwndFocus; ptiTo->MessageQueue->spwndFocus = ptiFrom->MessageQueue->spwndFocus;
ptiTo->MessageQueue->spwndCapture = ptiFrom->MessageQueue->spwndCapture; ptiTo->MessageQueue->spwndCapture = ptiFrom->MessageQueue->spwndCapture;
ptiTo->MessageQueue->QF_flags ^= ((ptiTo->MessageQueue->QF_flags ^ ptiFrom->MessageQueue->QF_flags) & QF_CAPTURELOCKED); ptiTo->MessageQueue->QF_flags ^= ((ptiTo->MessageQueue->QF_flags ^ ptiFrom->MessageQueue->QF_flags) & QF_CAPTURELOCKED);
RtlCopyMemory(ptiTo->MessageQueue->CaretInfo, RtlCopyMemory(&ptiTo->MessageQueue->CaretInfo,
ptiFrom->MessageQueue->CaretInfo, &ptiFrom->MessageQueue->CaretInfo,
sizeof(*ptiTo->MessageQueue->CaretInfo)); sizeof(ptiTo->MessageQueue->CaretInfo));
IntSetFocusMessageQueue(NULL); IntSetFocusMessageQueue(NULL);
IntSetFocusMessageQueue(ptiTo->MessageQueue); IntSetFocusMessageQueue(ptiTo->MessageQueue);
gptiForeground = ptiTo; gptiForeground = ptiTo;

View file

@ -394,7 +394,7 @@ NtUserGetGUIThreadInfo(
if ( Desktop ) MsgQueue = Desktop->ActiveMessageQueue; if ( Desktop ) MsgQueue = Desktop->ActiveMessageQueue;
} }
CaretInfo = MsgQueue->CaretInfo; CaretInfo = &MsgQueue->CaretInfo;
SafeGui.flags = (CaretInfo->Visible ? GUI_CARETBLINKING : 0); SafeGui.flags = (CaretInfo->Visible ? GUI_CARETBLINKING : 0);
/* /*

View file

@ -2080,7 +2080,6 @@ HungAppSysTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
BOOLEAN FASTCALL BOOLEAN FASTCALL
MsqInitializeMessageQueue(PTHREADINFO pti, PUSER_MESSAGE_QUEUE MessageQueue) MsqInitializeMessageQueue(PTHREADINFO pti, PUSER_MESSAGE_QUEUE MessageQueue)
{ {
MessageQueue->CaretInfo = (PTHRDCARETINFO)(MessageQueue + 1);
InitializeListHead(&MessageQueue->HardwareMessagesListHead); // Keep here! InitializeListHead(&MessageQueue->HardwareMessagesListHead); // Keep here!
MessageQueue->spwndFocus = NULL; MessageQueue->spwndFocus = NULL;
MessageQueue->iCursorLevel = 0; MessageQueue->iCursorLevel = 0;
@ -2269,16 +2268,16 @@ MsqCreateMessageQueue(PTHREADINFO pti)
{ {
PUSER_MESSAGE_QUEUE MessageQueue; PUSER_MESSAGE_QUEUE MessageQueue;
MessageQueue = (PUSER_MESSAGE_QUEUE)ExAllocatePoolWithTag(NonPagedPool, MessageQueue = ExAllocatePoolWithTag(NonPagedPool,
sizeof(USER_MESSAGE_QUEUE) + sizeof(THRDCARETINFO), sizeof(*MessageQueue),
USERTAG_Q); USERTAG_Q);
if (!MessageQueue) if (!MessageQueue)
{ {
return NULL; return NULL;
} }
RtlZeroMemory(MessageQueue, sizeof(USER_MESSAGE_QUEUE) + sizeof(THRDCARETINFO)); RtlZeroMemory(MessageQueue, sizeof(*MessageQueue));
/* hold at least one reference until it'll be destroyed */ /* hold at least one reference until it'll be destroyed */
IntReferenceMessageQueue(MessageQueue); IntReferenceMessageQueue(MessageQueue);
/* initialize the queue */ /* initialize the queue */
@ -2406,9 +2405,8 @@ MsqSetStateWindow(PTHREADINFO pti, ULONG Type, HWND hWnd)
MessageQueue->MoveSize = hWnd; MessageQueue->MoveSize = hWnd;
return Prev; return Prev;
case MSQ_STATE_CARET: case MSQ_STATE_CARET:
ASSERT(MessageQueue->CaretInfo); Prev = MessageQueue->CaretInfo.hWnd;
Prev = MessageQueue->CaretInfo->hWnd; MessageQueue->CaretInfo.hWnd = hWnd;
MessageQueue->CaretInfo->hWnd = hWnd;
return Prev; return Prev;
} }

View file

@ -67,8 +67,6 @@ typedef struct _USER_MESSAGE_QUEUE
HWND MenuOwner; HWND MenuOwner;
/* Identifes the menu state */ /* Identifes the menu state */
BYTE MenuState; BYTE MenuState;
/* Caret information for this queue */
PTHRDCARETINFO CaretInfo;
/* Message Queue Flags */ /* Message Queue Flags */
DWORD QF_flags; DWORD QF_flags;
DWORD cThreads; // Shared message queue counter. DWORD cThreads; // Shared message queue counter.
@ -85,6 +83,8 @@ typedef struct _USER_MESSAGE_QUEUE
/* Cursor object */ /* Cursor object */
PCURICON_OBJECT CursorObject; PCURICON_OBJECT CursorObject;
/* Caret information for this queue */
THRDCARETINFO CaretInfo;
} USER_MESSAGE_QUEUE, *PUSER_MESSAGE_QUEUE; } USER_MESSAGE_QUEUE, *PUSER_MESSAGE_QUEUE;
#define QF_UPDATEKEYSTATE 0x00000001 #define QF_UPDATEKEYSTATE 0x00000001

View file

@ -27,7 +27,7 @@ co_IntFixCaret(PWND Window, RECTL *lprc, UINT flags)
Desktop = pti->rpdesk; Desktop = pti->rpdesk;
ActiveMessageQueue = Desktop->ActiveMessageQueue; ActiveMessageQueue = Desktop->ActiveMessageQueue;
if (!ActiveMessageQueue) return 0; if (!ActiveMessageQueue) return 0;
CaretInfo = ActiveMessageQueue->CaretInfo; CaretInfo = &ActiveMessageQueue->CaretInfo;
hWndCaret = CaretInfo->hWnd; hWndCaret = CaretInfo->hWnd;
WndCaret = ValidateHwndNoErr(hWndCaret); WndCaret = ValidateHwndNoErr(hWndCaret);

View file

@ -417,7 +417,7 @@ static void IntSendDestroyMsg(HWND hWnd)
} }
} }
if (ti->MessageQueue->CaretInfo->hWnd == UserHMGetHandle(Window)) if (ti->MessageQueue->CaretInfo.hWnd == UserHMGetHandle(Window))
{ {
co_IntDestroyCaret(ti); co_IntDestroyCaret(ti);
} }