Win32 structure cleanup part 1 / x:

- replace W32THREAD with THREADINFO, define W32THREAD like it's on Windows and make it part of THREADINFO.

svn path=/trunk/; revision=36769
This commit is contained in:
Timo Kreuzer 2008-10-16 17:52:38 +00:00
parent 837002ff59
commit d13301ae65
32 changed files with 275 additions and 179 deletions

View file

@ -46,7 +46,7 @@ co_IntCallEventProc(HWINEVENTHOOK hook,
WINEVENTPROC Proc); WINEVENTPROC Proc);
VOID FASTCALL VOID FASTCALL
IntCleanupThreadCallbacks(PW32THREAD W32Thread); IntCleanupThreadCallbacks(PTHREADINFO W32Thread);
PVOID FASTCALL PVOID FASTCALL
IntCbAllocateMemory(ULONG Size); IntCbAllocateMemory(ULONG Size);

View file

@ -7,7 +7,7 @@
#define IDCARETTIMER (0xffff) #define IDCARETTIMER (0xffff)
BOOL FASTCALL BOOL FASTCALL
co_IntDestroyCaret(PW32THREAD Win32Thread); co_IntDestroyCaret(PTHREADINFO Win32Thread);
BOOL FASTCALL BOOL FASTCALL
IntSetCaretBlinkTime(UINT uMSeconds); IntSetCaretBlinkTime(UINT uMSeconds);

View file

@ -198,11 +198,13 @@ static __inline ULONG_PTR
DesktopHeapGetUserDelta(VOID) DesktopHeapGetUserDelta(VOID)
{ {
PW32HEAP_USER_MAPPING Mapping; PW32HEAP_USER_MAPPING Mapping;
PTHREADINFO pti;
HANDLE hDesktopHeap; HANDLE hDesktopHeap;
ULONG_PTR Delta = 0; ULONG_PTR Delta = 0;
ASSERT(PsGetCurrentThreadWin32Thread()->Desktop != NULL); pti = PsGetCurrentThreadWin32Thread();
hDesktopHeap = PsGetCurrentThreadWin32Thread()->Desktop->hDesktopHeap; ASSERT(pti->Desktop != NULL);
hDesktopHeap = pti->Desktop->hDesktopHeap;
Mapping = PsGetCurrentProcessWin32Process()->HeapMappings.Next; Mapping = PsGetCurrentProcessWin32Process()->HeapMappings.Next;
while (Mapping != NULL) while (Mapping != NULL)

View file

@ -18,7 +18,7 @@ typedef struct tagHOOK
#define NB_HOOKS (WH_MAXHOOK-WH_MINHOOK+1) #define NB_HOOKS (WH_MAXHOOK-WH_MINHOOK+1)
#define HOOKID_TO_INDEX(HookId) (HookId - WH_MINHOOK) #define HOOKID_TO_INDEX(HookId) (HookId - WH_MINHOOK)
#define HOOKID_TO_FLAG(HookId) (1 << ((HookId) + 1)) #define HOOKID_TO_FLAG(HookId) (1 << ((HookId) + 1))
#define ISITHOOKED(HookId) (PsGetCurrentThreadWin32Thread()->Hooks & HOOKID_TO_FLAG(HookId)) #define ISITHOOKED(HookId) (((PTHREADINFO)PsGetCurrentThreadWin32Thread())->Hooks & HOOKID_TO_FLAG(HookId))
typedef struct tagHOOKTABLE typedef struct tagHOOKTABLE
{ {

View file

@ -27,7 +27,7 @@ PUSER_MESSAGE_QUEUE W32kGetPrimitiveMessageQueue(VOID);
VOID W32kUnregisterPrimitiveMessageQueue(VOID); VOID W32kUnregisterPrimitiveMessageQueue(VOID);
PKBL W32kGetDefaultKeyLayout(VOID); PKBL W32kGetDefaultKeyLayout(VOID);
VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyLayout, BYTE Prefix); VOID FASTCALL W32kKeyProcessMessage(LPMSG Msg, PKBDTABLES KeyLayout, BYTE Prefix);
BOOL FASTCALL IntBlockInput(PW32THREAD W32Thread, BOOL BlockIt); BOOL FASTCALL IntBlockInput(PTHREADINFO W32Thread, BOOL BlockIt);
BOOL FASTCALL IntMouseInput(MOUSEINPUT *mi); BOOL FASTCALL IntMouseInput(MOUSEINPUT *mi);
BOOL FASTCALL IntKeyboardInput(KEYBDINPUT *ki); BOOL FASTCALL IntKeyboardInput(KEYBDINPUT *ki);

View file

@ -87,7 +87,7 @@ typedef struct _USER_REFERENCE_ENTRY
static __inline VOID static __inline VOID
UserAssertLastRef(PVOID obj, const char *file, int line) UserAssertLastRef(PVOID obj, const char *file, int line)
{ {
PW32THREAD W32Thread; PTHREADINFO W32Thread;
PSINGLE_LIST_ENTRY ReferenceEntry; PSINGLE_LIST_ENTRY ReferenceEntry;
PUSER_REFERENCE_ENTRY UserReferenceEntry; PUSER_REFERENCE_ENTRY UserReferenceEntry;
@ -122,7 +122,7 @@ VOID UserInitHandleTable(PUSER_HANDLE_TABLE ht, PVOID mem, ULONG bytes);
static __inline VOID static __inline VOID
UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry) UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
{ {
PW32THREAD W32Thread; PTHREADINFO W32Thread;
W32Thread = PsGetCurrentThreadWin32Thread(); W32Thread = PsGetCurrentThreadWin32Thread();
ASSERT(W32Thread != NULL); ASSERT(W32Thread != NULL);
@ -135,7 +135,7 @@ UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
static __inline VOID static __inline VOID
UserDerefObjectCo(PVOID obj) UserDerefObjectCo(PVOID obj)
{ {
PW32THREAD W32Thread; PTHREADINFO W32Thread;
PSINGLE_LIST_ENTRY ReferenceEntry; PSINGLE_LIST_ENTRY ReferenceEntry;
PUSER_REFERENCE_ENTRY UserReferenceEntry; PUSER_REFERENCE_ENTRY UserReferenceEntry;

View file

@ -10,7 +10,7 @@ co_UserRedrawWindow(PWINDOW_OBJECT Wnd, const RECT* UpdateRect, HRGN UpdateRgn,
VOID FASTCALL VOID FASTCALL
IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags); IntInvalidateWindows(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags);
BOOL FASTCALL BOOL FASTCALL
IntGetPaintMessage(HWND hWnd, UINT MsgFilterMin, UINT MsgFilterMax, PW32THREAD Thread, IntGetPaintMessage(HWND hWnd, UINT MsgFilterMin, UINT MsgFilterMax, PTHREADINFO Thread,
MSG *Message, BOOL Remove); MSG *Message, BOOL Remove);
INT FASTCALL UserRealizePalette(HDC); INT FASTCALL UserRealizePalette(HDC);

View file

@ -3,22 +3,42 @@
#include <pshpack1.h> #include <pshpack1.h>
typedef struct _TL
{
struct _TL* next;
PVOID pobj;
PVOID pfnFree;
} TL, *PTL;
typedef struct _W32THREAD typedef struct _W32THREAD
{ {
PETHREAD pEThread;
ULONG RefCount;
PTL ptlW32;
PVOID pgdiDcattr;
PVOID pgdiBrushAttr;
PVOID pUMPDObjs;
PVOID pUMPDHeap;
DWORD dwEngAcquireCount;
PVOID pSemTable;
PVOID pUMPDObj;
} W32THREAD, *PW32THREAD;
typedef struct _THREADINFO
{
W32THREAD W32Thread;
struct _USER_MESSAGE_QUEUE* MessageQueue; struct _USER_MESSAGE_QUEUE* MessageQueue;
LIST_ENTRY WindowListHead; LIST_ENTRY WindowListHead;
LIST_ENTRY W32CallbackListHead; LIST_ENTRY W32CallbackListHead;
struct _KBL* KeyboardLayout; struct _KBL* KeyboardLayout;
struct _DESKTOP_OBJECT* Desktop; struct _DESKTOP_OBJECT* Desktop;
HANDLE hDesktop; HANDLE hDesktop;
PVOID pgdiDcattr;
PVOID pgdiBrushAttr;
DWORD dwEngAcquireCount;
BOOLEAN IsExiting; BOOLEAN IsExiting;
SINGLE_LIST_ENTRY ReferencesList; SINGLE_LIST_ENTRY ReferencesList;
ULONG Hooks; ULONG Hooks;
PW32THREADINFO ThreadInfo; PW32THREADINFO ThreadInfo;
} W32THREAD, *PW32THREAD; } THREADINFO, *PTHREADINFO;
#include <poppack.h> #include <poppack.h>
@ -49,5 +69,4 @@ typedef struct _W32PROCESS
PW32PROCESSINFO ProcessInfo; PW32PROCESSINFO ProcessInfo;
} W32PROCESS, *PW32PROCESS; } W32PROCESS, *PW32PROCESS;
#endif /* __INCLUDE_NAPI_WIN32_H */ #endif /* __INCLUDE_NAPI_WIN32_H */

View file

@ -174,7 +174,7 @@ Win32kThreadCallback(struct _ETHREAD *Thread,
PSW32THREADCALLOUTTYPE Type) PSW32THREADCALLOUTTYPE Type)
{ {
struct _EPROCESS *Process; struct _EPROCESS *Process;
PW32THREAD Win32Thread; PTHREADINFO Win32Thread;
DECLARE_RETURN(NTSTATUS); DECLARE_RETURN(NTSTATUS);
DPRINT("Enter Win32kThreadCallback\n"); DPRINT("Enter Win32kThreadCallback\n");
@ -190,12 +190,12 @@ Win32kThreadCallback(struct _ETHREAD *Thread,
{ {
/* FIXME - lock the process */ /* FIXME - lock the process */
Win32Thread = ExAllocatePoolWithTag(NonPagedPool, Win32Thread = ExAllocatePoolWithTag(NonPagedPool,
sizeof(W32THREAD), sizeof(THREADINFO),
TAG('W', '3', '2', 't')); TAG('W', '3', '2', 't'));
if (Win32Thread == NULL) RETURN( STATUS_NO_MEMORY); if (Win32Thread == NULL) RETURN( STATUS_NO_MEMORY);
RtlZeroMemory(Win32Thread, sizeof(W32THREAD)); RtlZeroMemory(Win32Thread, sizeof(THREADINFO));
PsSetThreadWin32Thread(Thread, Win32Thread); PsSetThreadWin32Thread(Thread, Win32Thread);
/* FIXME - unlock the process */ /* FIXME - unlock the process */
@ -344,11 +344,11 @@ Win32kInitWin32Thread(PETHREAD Thread)
if (Thread->Tcb.Win32Thread == NULL) if (Thread->Tcb.Win32Thread == NULL)
{ {
Thread->Tcb.Win32Thread = ExAllocatePool (NonPagedPool, sizeof(W32THREAD)); Thread->Tcb.Win32Thread = ExAllocatePool (NonPagedPool, sizeof(THREADINFO));
if (Thread->Tcb.Win32Thread == NULL) if (Thread->Tcb.Win32Thread == NULL)
return STATUS_NO_MEMORY; return STATUS_NO_MEMORY;
RtlZeroMemory(Thread->Tcb.Win32Thread, sizeof(W32THREAD)); RtlZeroMemory(Thread->Tcb.Win32Thread, sizeof(THREADINFO));
Win32kThreadCallback(Thread, PsW32ThreadCalloutInitialize); Win32kThreadCallback(Thread, PsW32ThreadCalloutInitialize);
} }

View file

@ -42,7 +42,7 @@
typedef struct _INT_CALLBACK_HEADER typedef struct _INT_CALLBACK_HEADER
{ {
/* list entry in the W32THREAD structure */ /* list entry in the THREADINFO structure */
LIST_ENTRY ListEntry; LIST_ENTRY ListEntry;
} }
INT_CALLBACK_HEADER, *PINT_CALLBACK_HEADER; INT_CALLBACK_HEADER, *PINT_CALLBACK_HEADER;
@ -51,7 +51,7 @@ PVOID FASTCALL
IntCbAllocateMemory(ULONG Size) IntCbAllocateMemory(ULONG Size)
{ {
PINT_CALLBACK_HEADER Mem; PINT_CALLBACK_HEADER Mem;
PW32THREAD W32Thread; PTHREADINFO W32Thread;
if(!(Mem = ExAllocatePoolWithTag(PagedPool, Size + sizeof(INT_CALLBACK_HEADER), if(!(Mem = ExAllocatePoolWithTag(PagedPool, Size + sizeof(INT_CALLBACK_HEADER),
TAG_CALLBACK))) TAG_CALLBACK)))
@ -73,7 +73,7 @@ VOID FASTCALL
IntCbFreeMemory(PVOID Data) IntCbFreeMemory(PVOID Data)
{ {
PINT_CALLBACK_HEADER Mem; PINT_CALLBACK_HEADER Mem;
PW32THREAD W32Thread; PTHREADINFO W32Thread;
ASSERT(Data); ASSERT(Data);
@ -90,7 +90,7 @@ IntCbFreeMemory(PVOID Data)
} }
VOID FASTCALL VOID FASTCALL
IntCleanupThreadCallbacks(PW32THREAD W32Thread) IntCleanupThreadCallbacks(PTHREADINFO W32Thread)
{ {
PLIST_ENTRY CurrentEntry; PLIST_ENTRY CurrentEntry;
PINT_CALLBACK_HEADER Mem; PINT_CALLBACK_HEADER Mem;

View file

@ -40,7 +40,7 @@ co_IntHideCaret(PTHRDCARETINFO CaretInfo)
} }
BOOL FASTCALL BOOL FASTCALL
co_IntDestroyCaret(PW32THREAD Win32Thread) co_IntDestroyCaret(PTHREADINFO Win32Thread)
{ {
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
ThreadQueue = (PUSER_MESSAGE_QUEUE)Win32Thread->MessageQueue; ThreadQueue = (PUSER_MESSAGE_QUEUE)Win32Thread->MessageQueue;
@ -61,7 +61,8 @@ BOOL FASTCALL
IntSetCaretBlinkTime(UINT uMSeconds) IntSetCaretBlinkTime(UINT uMSeconds)
{ {
/* Don't save the new value to the registry! */ /* Don't save the new value to the registry! */
PWINSTATION_OBJECT WinStaObject = PsGetCurrentThreadWin32Thread()->Desktop->WindowStation; PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
PWINSTATION_OBJECT WinStaObject = pti->Desktop->WindowStation;
/* windows doesn't do this check */ /* windows doesn't do this check */
if((uMSeconds < MIN_CARETBLINKRATE) || (uMSeconds > MAX_CARETBLINKRATE)) if((uMSeconds < MIN_CARETBLINKRATE) || (uMSeconds > MAX_CARETBLINKRATE))
@ -146,10 +147,12 @@ static
UINT FASTCALL UINT FASTCALL
IntGetCaretBlinkTime(VOID) IntGetCaretBlinkTime(VOID)
{ {
PTHREADINFO pti;
PWINSTATION_OBJECT WinStaObject; PWINSTATION_OBJECT WinStaObject;
UINT Ret; UINT Ret;
WinStaObject = PsGetCurrentThreadWin32Thread()->Desktop->WindowStation; pti = PsGetCurrentThreadWin32Thread();
WinStaObject = pti->Desktop->WindowStation;
Ret = WinStaObject->CaretBlinkRate; Ret = WinStaObject->CaretBlinkRate;
if(!Ret) if(!Ret)
@ -171,8 +174,11 @@ IntGetCaretBlinkTime(VOID)
BOOL FASTCALL BOOL FASTCALL
co_IntSetCaretPos(int X, int Y) co_IntSetCaretPos(int X, int Y)
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue;
pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
if(ThreadQueue->CaretInfo->hWnd) if(ThreadQueue->CaretInfo->hWnd)
{ {
@ -194,8 +200,11 @@ co_IntSetCaretPos(int X, int Y)
BOOL FASTCALL BOOL FASTCALL
IntSwitchCaretShowing(PVOID Info) IntSwitchCaretShowing(PVOID Info)
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue;
pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
if(ThreadQueue->CaretInfo->hWnd) if(ThreadQueue->CaretInfo->hWnd)
{ {
@ -212,8 +221,11 @@ static
VOID FASTCALL VOID FASTCALL
co_IntDrawCaret(HWND hWnd) co_IntDrawCaret(HWND hWnd)
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue;
pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
if(ThreadQueue->CaretInfo->hWnd && ThreadQueue->CaretInfo->Visible && if(ThreadQueue->CaretInfo->hWnd && ThreadQueue->CaretInfo->Visible &&
ThreadQueue->CaretInfo->Showing) ThreadQueue->CaretInfo->Showing)
@ -228,6 +240,7 @@ co_IntDrawCaret(HWND hWnd)
BOOL FASTCALL co_UserHideCaret(PWINDOW_OBJECT Window OPTIONAL) BOOL FASTCALL co_UserHideCaret(PWINDOW_OBJECT Window OPTIONAL)
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
if (Window) ASSERT_REFS_CO(Window); if (Window) ASSERT_REFS_CO(Window);
@ -238,7 +251,8 @@ BOOL FASTCALL co_UserHideCaret(PWINDOW_OBJECT Window OPTIONAL)
return FALSE; return FALSE;
} }
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
if(Window && ThreadQueue->CaretInfo->hWnd != Window->hSelf) if(Window && ThreadQueue->CaretInfo->hWnd != Window->hSelf)
{ {
@ -261,6 +275,7 @@ BOOL FASTCALL co_UserHideCaret(PWINDOW_OBJECT Window OPTIONAL)
BOOL FASTCALL co_UserShowCaret(PWINDOW_OBJECT Window OPTIONAL) BOOL FASTCALL co_UserShowCaret(PWINDOW_OBJECT Window OPTIONAL)
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
if (Window) ASSERT_REFS_CO(Window); if (Window) ASSERT_REFS_CO(Window);
@ -271,7 +286,8 @@ BOOL FASTCALL co_UserShowCaret(PWINDOW_OBJECT Window OPTIONAL)
return FALSE; return FALSE;
} }
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
if(Window && ThreadQueue->CaretInfo->hWnd != Window->hSelf) if(Window && ThreadQueue->CaretInfo->hWnd != Window->hSelf)
{ {
@ -304,6 +320,7 @@ NtUserCreateCaret(
int nHeight) int nHeight)
{ {
PWINDOW_OBJECT Window; PWINDOW_OBJECT Window;
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
DECLARE_RETURN(BOOL); DECLARE_RETURN(BOOL);
@ -321,7 +338,8 @@ NtUserCreateCaret(
RETURN(FALSE); RETURN(FALSE);
} }
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
if (ThreadQueue->CaretInfo->Visible) if (ThreadQueue->CaretInfo->Visible)
{ {
@ -374,6 +392,7 @@ STDCALL
NtUserGetCaretPos( NtUserGetCaretPos(
LPPOINT lpPoint) LPPOINT lpPoint)
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
NTSTATUS Status; NTSTATUS Status;
DECLARE_RETURN(BOOL); DECLARE_RETURN(BOOL);
@ -381,7 +400,8 @@ NtUserGetCaretPos(
DPRINT("Enter NtUserGetCaretPos\n"); DPRINT("Enter NtUserGetCaretPos\n");
UserEnterShared(); UserEnterShared();
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
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))

View file

@ -15,27 +15,8 @@
#define DATA_DELAYED_RENDER 0 #define DATA_DELAYED_RENDER 0
#define DATA_SYNTHESIZED_RENDER -1 #define DATA_SYNTHESIZED_RENDER -1
#define USE_WINSTA \ PTHREADINFO ClipboardThread;
PWINSTATION_OBJECT WinStaObj; \ PTHREADINFO ClipboardOwnerThread;
WinStaObj = PsGetCurrentThreadWin32Thread()->Desktop->WindowStation;
#define WINSTA_ClipboardThread WinStaObj->Clipboard->ClipboardThread
#define WINSTA_ClipboardOwnerThread WinStaObj->Clipboard->ClipboardOwnerThread
#define WINSTA_ClipboardWindow WinStaObj->Clipboard->ClipboardWindow
#define WINSTA_ClipboardViewerWindow WinStaObj->Clipboard->ClipboardViewerWindow
#define WINSTA_ClipboardOwnerWindow WinStaObj->Clipboard->ClipboardOwnerWindow
#define WINSTA_sendDrawClipboardMsg WinStaObj->Clipboard->sendDrawClipboardMsg
#define WINSTA_recentlySetClipboard WinStaObj->Clipboard->recentlySetClipboard
#define WINSTA_delayedRender WinStaObj->Clipboard->delayedRender
#define WINSTA_lastEnumClipboardFormats WinStaObj->Clipboard->lastEnumClipboardFormats
#define WINSTA_ClipboardSequenceNumber WinStaObj->Clipboard->ClipboardSequenceNumber
#define WINSTA_WindowsChain WinStaObj->Clipboard->WindowsChain
#define WINSTA_ClipboardData WinStaObj->Clipboard->ClipboardData
#define WINSTA_synthesizedData WinStaObj->Clipboard->synthesizedData
#define WINSTA_synthesizedDataSize WinStaObj->Clipboard->synthesizedDataSize
PW32THREAD ClipboardThread;
PW32THREAD ClipboardOwnerThread;
PWINDOW_OBJECT ClipboardWindow; PWINDOW_OBJECT ClipboardWindow;
PWINDOW_OBJECT ClipboardViewerWindow; PWINDOW_OBJECT ClipboardViewerWindow;
PWINDOW_OBJECT ClipboardOwnerWindow; PWINDOW_OBJECT ClipboardOwnerWindow;
@ -1145,11 +1126,13 @@ IntEnumClipboardFormats(UINT uFormat)
VOID FASTCALL VOID FASTCALL
IntIncrementSequenceNumber(VOID) IntIncrementSequenceNumber(VOID)
{ {
PTHREADINFO pti;
PWINSTATION_OBJECT WinStaObj;
USE_WINSTA pti = PsGetCurrentThreadWin32Thread();
WinStaObj = pti->Desktop->WindowStation;
WINSTA_ClipboardSequenceNumber++;
WinStaObj->Clipboard->ClipboardSequenceNumber++;
} }
DWORD STDCALL DWORD STDCALL

View file

@ -1820,7 +1820,8 @@ int
NTAPI NTAPI
UserShowCursor(BOOL bShow) UserShowCursor(BOOL bShow)
{ {
PWINSTATION_OBJECT WinSta = PsGetCurrentThreadWin32Thread()->Desktop->WindowStation; PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
PWINSTATION_OBJECT WinSta = pti->Desktop->WindowStation;
PSYSTEM_CURSORINFO CurInfo; PSYSTEM_CURSORINFO CurInfo;
HDC Screen; HDC Screen;

View file

@ -580,7 +580,8 @@ PWINDOW_OBJECT FASTCALL UserGetDesktopWindow(VOID)
HWND FASTCALL IntGetCurrentThreadDesktopWindow(VOID) HWND FASTCALL IntGetCurrentThreadDesktopWindow(VOID)
{ {
PDESKTOP_OBJECT pdo = PsGetCurrentThreadWin32Thread()->Desktop; PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
PDESKTOP_OBJECT pdo = pti->Desktop;
if (NULL == pdo) if (NULL == pdo)
{ {
DPRINT1("Thread doesn't have a desktop\n"); DPRINT1("Thread doesn't have a desktop\n");
@ -782,7 +783,8 @@ VOID co_IntShellHookNotify(WPARAM Message, LPARAM lParam)
*/ */
BOOL IntRegisterShellHookWindow(HWND hWnd) BOOL IntRegisterShellHookWindow(HWND hWnd)
{ {
PDESKTOP_OBJECT Desktop = PsGetCurrentThreadWin32Thread()->Desktop; PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
PDESKTOP_OBJECT Desktop = pti->Desktop;
PSHELL_HOOK_WINDOW Entry; PSHELL_HOOK_WINDOW Entry;
DPRINT("IntRegisterShellHookWindow\n"); DPRINT("IntRegisterShellHookWindow\n");
@ -813,7 +815,8 @@ BOOL IntRegisterShellHookWindow(HWND hWnd)
*/ */
BOOL IntDeRegisterShellHookWindow(HWND hWnd) BOOL IntDeRegisterShellHookWindow(HWND hWnd)
{ {
PDESKTOP_OBJECT Desktop = PsGetCurrentThreadWin32Thread()->Desktop; PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
PDESKTOP_OBJECT Desktop = pti->Desktop;
PSHELL_HOOK_WINDOW Current; PSHELL_HOOK_WINDOW Current;
LIST_FOR_EACH(Current, &Desktop->ShellHookWindows, SHELL_HOOK_WINDOW, ListEntry) LIST_FOR_EACH(Current, &Desktop->ShellHookWindows, SHELL_HOOK_WINDOW, ListEntry)
@ -1363,7 +1366,8 @@ NtUserPaintDesktop(HDC hDC)
COLORREF color_old; COLORREF color_old;
UINT align_old; UINT align_old;
int mode_old; int mode_old;
PWINSTATION_OBJECT WinSta = PsGetCurrentThreadWin32Thread()->Desktop->WindowStation; PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
PWINSTATION_OBJECT WinSta = pti->Desktop->WindowStation;
DECLARE_RETURN(BOOL); DECLARE_RETURN(BOOL);
UserEnterExclusive(); UserEnterExclusive();
@ -1674,14 +1678,14 @@ NtUserGetThreadDesktop(DWORD dwThreadId, DWORD Unknown1)
{ {
/* just return the handle, we queried the desktop handle of a thread running /* just return the handle, we queried the desktop handle of a thread running
in the same context */ in the same context */
Ret = ((PW32THREAD)Thread->Tcb.Win32Thread)->hDesktop; Ret = ((PTHREADINFO)Thread->Tcb.Win32Thread)->hDesktop;
ObDereferenceObject(Thread); ObDereferenceObject(Thread);
RETURN(Ret); RETURN(Ret);
} }
/* get the desktop handle and the desktop of the thread */ /* get the desktop handle and the desktop of the thread */
if(!(hThreadDesktop = ((PW32THREAD)Thread->Tcb.Win32Thread)->hDesktop) || if(!(hThreadDesktop = ((PTHREADINFO)Thread->Tcb.Win32Thread)->hDesktop) ||
!(DesktopObject = ((PW32THREAD)Thread->Tcb.Win32Thread)->Desktop)) !(DesktopObject = ((PTHREADINFO)Thread->Tcb.Win32Thread)->Desktop))
{ {
ObDereferenceObject(Thread); ObDereferenceObject(Thread);
DPRINT1("Desktop information of thread 0x%x broken!?\n", dwThreadId); DPRINT1("Desktop information of thread 0x%x broken!?\n", dwThreadId);
@ -1854,7 +1858,7 @@ IntSetThreadDesktop(IN PDESKTOP_OBJECT DesktopObject,
IN BOOL FreeOnFailure) IN BOOL FreeOnFailure)
{ {
PDESKTOP_OBJECT OldDesktop; PDESKTOP_OBJECT OldDesktop;
PW32THREAD W32Thread; PTHREADINFO W32Thread;
NTSTATUS Status; NTSTATUS Status;
BOOL MapHeap; BOOL MapHeap;

View file

@ -105,7 +105,7 @@ IntCallLowLevelEvent( PEVENTHOOK pEH,
/* FIXME should get timeout from /* FIXME should get timeout from
* HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */ * HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */
Status = co_MsqSendMessage(((PW32THREAD)pEH->Thread->Tcb.Win32Thread)->MessageQueue, Status = co_MsqSendMessage(((PTHREADINFO)pEH->Thread->Tcb.Win32Thread)->MessageQueue,
hwnd, hwnd,
event, event,
0, 0,

View file

@ -40,8 +40,11 @@ IntGetFocusWindow()
HWND FASTCALL HWND FASTCALL
IntGetThreadFocusWindow() IntGetThreadFocusWindow()
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue;
pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
return ThreadQueue != NULL ? ThreadQueue->FocusWindow : 0; return ThreadQueue != NULL ? ThreadQueue->FocusWindow : 0;
} }
@ -312,6 +315,7 @@ co_IntMouseActivateWindow(PWINDOW_OBJECT Window)
HWND FASTCALL HWND FASTCALL
co_IntSetActiveWindow(PWINDOW_OBJECT Window OPTIONAL) co_IntSetActiveWindow(PWINDOW_OBJECT Window OPTIONAL)
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
HWND hWndPrev; HWND hWndPrev;
HWND hWnd = 0; HWND hWnd = 0;
@ -320,7 +324,8 @@ co_IntSetActiveWindow(PWINDOW_OBJECT Window OPTIONAL)
if (Window) if (Window)
ASSERT_REFS_CO(Window); ASSERT_REFS_CO(Window);
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
ASSERT(ThreadQueue != 0); ASSERT(ThreadQueue != 0);
if (Window != 0) if (Window != 0)
@ -358,12 +363,14 @@ HWND FASTCALL
co_IntSetFocusWindow(PWINDOW_OBJECT Window OPTIONAL) co_IntSetFocusWindow(PWINDOW_OBJECT Window OPTIONAL)
{ {
HWND hWndPrev = 0; HWND hWndPrev = 0;
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
if (Window) if (Window)
ASSERT_REFS_CO(Window); ASSERT_REFS_CO(Window);
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
ASSERT(ThreadQueue != 0); ASSERT(ThreadQueue != 0);
hWndPrev = ThreadQueue->FocusWindow; hWndPrev = ThreadQueue->FocusWindow;
@ -425,8 +432,11 @@ CLEANUP:
HWND FASTCALL UserGetActiveWindow() HWND FASTCALL UserGetActiveWindow()
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue;
pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
return( ThreadQueue ? ThreadQueue->ActiveWindow : 0); return( ThreadQueue ? ThreadQueue->ActiveWindow : 0);
} }
@ -443,6 +453,7 @@ NtUserSetActiveWindow(HWND hWnd)
if (hWnd) if (hWnd)
{ {
PWINDOW_OBJECT Window; PWINDOW_OBJECT Window;
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
HWND hWndPrev; HWND hWndPrev;
@ -451,7 +462,8 @@ NtUserSetActiveWindow(HWND hWnd)
RETURN( 0); RETURN( 0);
} }
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
if (Window->MessageQueue != ThreadQueue) if (Window->MessageQueue != ThreadQueue)
{ {
@ -482,12 +494,14 @@ CLEANUP:
HWND STDCALL HWND STDCALL
IntGetCapture(VOID) IntGetCapture(VOID)
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
DECLARE_RETURN(HWND); DECLARE_RETURN(HWND);
DPRINT("Enter IntGetCapture\n"); DPRINT("Enter IntGetCapture\n");
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
RETURN( ThreadQueue ? ThreadQueue->CaptureWindow : 0); RETURN( ThreadQueue ? ThreadQueue->CaptureWindow : 0);
CLEANUP: CLEANUP:
@ -501,6 +515,7 @@ CLEANUP:
HWND STDCALL HWND STDCALL
NtUserSetCapture(HWND hWnd) NtUserSetCapture(HWND hWnd)
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
PWINDOW_OBJECT Window; PWINDOW_OBJECT Window;
HWND hWndPrev; HWND hWndPrev;
@ -509,7 +524,8 @@ NtUserSetCapture(HWND hWnd)
DPRINT("Enter NtUserSetCapture(%x)\n", hWnd); DPRINT("Enter NtUserSetCapture(%x)\n", hWnd);
UserEnterExclusive(); UserEnterExclusive();
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
if((Window = UserGetWindowObject(hWnd))) if((Window = UserGetWindowObject(hWnd)))
{ {
@ -545,6 +561,7 @@ HWND FASTCALL co_UserSetFocus(PWINDOW_OBJECT Window OPTIONAL)
{ {
if (Window) if (Window)
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
HWND hWndPrev; HWND hWndPrev;
PWINDOW_OBJECT TopWnd; PWINDOW_OBJECT TopWnd;
@ -553,7 +570,8 @@ HWND FASTCALL co_UserSetFocus(PWINDOW_OBJECT Window OPTIONAL)
ASSERT_REFS_CO(Window); ASSERT_REFS_CO(Window);
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
Wnd = Window->Wnd; Wnd = Window->Wnd;
if (Wnd->Style & (WS_MINIMIZE | WS_DISABLED)) if (Wnd->Style & (WS_MINIMIZE | WS_DISABLED))

View file

@ -72,9 +72,9 @@ PHOOK FASTCALL IntGetHookObject(HHOOK hHook)
static PHOOK static PHOOK
IntAddHook(PETHREAD Thread, int HookId, BOOLEAN Global, PWINSTATION_OBJECT WinStaObj) IntAddHook(PETHREAD Thread, int HookId, BOOLEAN Global, PWINSTATION_OBJECT WinStaObj)
{ {
PW32THREAD W32Thread; PTHREADINFO W32Thread;
PHOOK Hook; PHOOK Hook;
PHOOKTABLE Table = Global ? GlobalHooks : MsqGetHooks(((PW32THREAD)Thread->Tcb.Win32Thread)->MessageQueue); PHOOKTABLE Table = Global ? GlobalHooks : MsqGetHooks(((PTHREADINFO)Thread->Tcb.Win32Thread)->MessageQueue);
HANDLE Handle; HANDLE Handle;
if (NULL == Table) if (NULL == Table)
@ -90,7 +90,7 @@ IntAddHook(PETHREAD Thread, int HookId, BOOLEAN Global, PWINSTATION_OBJECT WinSt
} }
else else
{ {
MsqSetHooks(((PW32THREAD)Thread->Tcb.Win32Thread)->MessageQueue, Table); MsqSetHooks(((PTHREADINFO)Thread->Tcb.Win32Thread)->MessageQueue, Table);
} }
} }
@ -106,7 +106,7 @@ IntAddHook(PETHREAD Thread, int HookId, BOOLEAN Global, PWINSTATION_OBJECT WinSt
if (Thread) if (Thread)
{ {
W32Thread = ((PW32THREAD)Thread->Tcb.Win32Thread); W32Thread = ((PTHREADINFO)Thread->Tcb.Win32Thread);
ASSERT(W32Thread != NULL); ASSERT(W32Thread != NULL);
W32Thread->Hooks |= HOOKID_TO_FLAG(HookId); W32Thread->Hooks |= HOOKID_TO_FLAG(HookId);
if (W32Thread->ThreadInfo != NULL) if (W32Thread->ThreadInfo != NULL)
@ -130,7 +130,7 @@ IntGetTable(PHOOK Hook)
return GlobalHooks; return GlobalHooks;
} }
return MsqGetHooks(((PW32THREAD)Hook->Thread->Tcb.Win32Thread)->MessageQueue); return MsqGetHooks(((PTHREADINFO)Hook->Thread->Tcb.Win32Thread)->MessageQueue);
} }
/* get the first hook in the chain */ /* get the first hook in the chain */
@ -208,7 +208,7 @@ IntFreeHook(PHOOKTABLE Table, PHOOK Hook, PWINSTATION_OBJECT WinStaObj)
static VOID static VOID
IntRemoveHook(PHOOK Hook, PWINSTATION_OBJECT WinStaObj, BOOL TableAlreadyLocked) IntRemoveHook(PHOOK Hook, PWINSTATION_OBJECT WinStaObj, BOOL TableAlreadyLocked)
{ {
PW32THREAD W32Thread; PTHREADINFO W32Thread;
PHOOKTABLE Table = IntGetTable(Hook); PHOOKTABLE Table = IntGetTable(Hook);
ASSERT(NULL != Table); ASSERT(NULL != Table);
@ -217,7 +217,7 @@ IntRemoveHook(PHOOK Hook, PWINSTATION_OBJECT WinStaObj, BOOL TableAlreadyLocked)
return; return;
} }
W32Thread = ((PW32THREAD)Hook->Thread->Tcb.Win32Thread); W32Thread = ((PTHREADINFO)Hook->Thread->Tcb.Win32Thread);
ASSERT(W32Thread != NULL); ASSERT(W32Thread != NULL);
W32Thread->Hooks &= ~HOOKID_TO_FLAG(Hook->HookId); W32Thread->Hooks &= ~HOOKID_TO_FLAG(Hook->HookId);
if (W32Thread->ThreadInfo != NULL) if (W32Thread->ThreadInfo != NULL)
@ -274,7 +274,7 @@ IntCallLowLevelHook(PHOOK Hook, INT Code, WPARAM wParam, LPARAM lParam)
/* FIXME should get timeout from /* FIXME should get timeout from
* HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */ * HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout */
Status = co_MsqSendMessage(((PW32THREAD)Hook->Thread->Tcb.Win32Thread)->MessageQueue, Status = co_MsqSendMessage(((PTHREADINFO)Hook->Thread->Tcb.Win32Thread)->MessageQueue,
(HWND) Code, (HWND) Code,
Hook->HookId, Hook->HookId,
wParam, wParam,
@ -295,7 +295,7 @@ FASTCALL
co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam) co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
{ {
PHOOK Hook, SaveHook; PHOOK Hook, SaveHook;
PW32THREAD Win32Thread; PTHREADINFO pti;
PCLIENTINFO ClientInfo; PCLIENTINFO ClientInfo;
PHOOKTABLE Table; PHOOKTABLE Table;
LRESULT Result; LRESULT Result;
@ -304,14 +304,14 @@ co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
ASSERT(WH_MINHOOK <= HookId && HookId <= WH_MAXHOOK); ASSERT(WH_MINHOOK <= HookId && HookId <= WH_MAXHOOK);
Win32Thread = PsGetCurrentThreadWin32Thread(); pti = PsGetCurrentThreadWin32Thread();
if (NULL == Win32Thread) if (!pti)
{ {
Table = NULL; Table = NULL;
} }
else else
{ {
Table = MsqGetHooks(Win32Thread->MessageQueue); Table = MsqGetHooks(pti->MessageQueue);
} }
if (NULL == Table || ! (Hook = IntGetFirstValidHook(Table, HookId))) if (NULL == Table || ! (Hook = IntGetFirstValidHook(Table, HookId)))
@ -361,7 +361,7 @@ co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
} }
else else
{ {
IntReleaseHookChain(MsqGetHooks(PsGetCurrentThreadWin32Thread()->MessageQueue), HookId, WinStaObj); IntReleaseHookChain(MsqGetHooks(pti->MessageQueue), HookId, WinStaObj);
IntReleaseHookChain(GlobalHooks, HookId, WinStaObj); IntReleaseHookChain(GlobalHooks, HookId, WinStaObj);
ObDereferenceObject(WinStaObj); ObDereferenceObject(WinStaObj);
} }

View file

@ -790,14 +790,14 @@ KeyboardThreadMain(PVOID StartContext)
FocusThread = FocusQueue->Thread; FocusThread = FocusQueue->Thread;
if (!(FocusThread && FocusThread->Tcb.Win32Thread && if (!(FocusThread && FocusThread->Tcb.Win32Thread &&
((PW32THREAD)FocusThread->Tcb.Win32Thread)->KeyboardLayout)) ((PTHREADINFO)FocusThread->Tcb.Win32Thread)->KeyboardLayout))
continue; continue;
/* This function uses lParam to fill wParam according to the /* This function uses lParam to fill wParam according to the
* keyboard layout in use. * keyboard layout in use.
*/ */
W32kKeyProcessMessage(&msg, W32kKeyProcessMessage(&msg,
((PW32THREAD)FocusThread->Tcb.Win32Thread)->KeyboardLayout->KBTables, ((PTHREADINFO)FocusThread->Tcb.Win32Thread)->KeyboardLayout->KBTables,
KeyInput.Flags & KEY_E0 ? 0xE0 : KeyInput.Flags & KEY_E0 ? 0xE0 :
(KeyInput.Flags & KEY_E1 ? 0xE1 : 0)); (KeyInput.Flags & KEY_E1 ? 0xE1 : 0));
@ -892,9 +892,9 @@ NtUserDragDetect(
} }
BOOL FASTCALL BOOL FASTCALL
IntBlockInput(PW32THREAD W32Thread, BOOL BlockIt) IntBlockInput(PTHREADINFO W32Thread, BOOL BlockIt)
{ {
PW32THREAD OldBlock; PTHREADINFO OldBlock;
ASSERT(W32Thread); ASSERT(W32Thread);
if(!W32Thread->Desktop || (W32Thread->IsExiting && BlockIt)) if(!W32Thread->Desktop || (W32Thread->IsExiting && BlockIt))
@ -1225,7 +1225,7 @@ NtUserSendInput(
LPINPUT pInput, LPINPUT pInput,
INT cbSize) INT cbSize)
{ {
PW32THREAD W32Thread; PTHREADINFO W32Thread;
UINT cnt; UINT cnt;
DECLARE_RETURN(UINT); DECLARE_RETURN(UINT);

View file

@ -407,7 +407,7 @@ BOOL UserUnloadKbl(PKBL pKbl)
return TRUE; return TRUE;
} }
static PKBL co_UserActivateKbl(PW32THREAD w32Thread, PKBL pKbl, UINT Flags) static PKBL co_UserActivateKbl(PTHREADINFO w32Thread, PKBL pKbl, UINT Flags)
{ {
PKBL Prev; PKBL Prev;
@ -444,7 +444,7 @@ UserGetKeyboardLayout(
{ {
NTSTATUS Status; NTSTATUS Status;
PETHREAD Thread; PETHREAD Thread;
PW32THREAD W32Thread; PTHREADINFO W32Thread;
HKL Ret; HKL Ret;
if(!dwThreadId) if(!dwThreadId)
@ -523,13 +523,15 @@ NtUserGetKeyboardLayoutName(
{ {
BOOL ret = FALSE; BOOL ret = FALSE;
PKBL pKbl; PKBL pKbl;
PTHREADINFO pti;
UserEnterShared(); UserEnterShared();
_SEH_TRY _SEH_TRY
{ {
ProbeForWrite(lpszName, KL_NAMELENGTH*sizeof(WCHAR), 1); ProbeForWrite(lpszName, KL_NAMELENGTH*sizeof(WCHAR), 1);
pKbl = PsGetCurrentThreadWin32Thread()->KeyboardLayout; pti = PsGetCurrentThreadWin32Thread();
pKbl = pti->KeyboardLayout;
RtlCopyMemory(lpszName, pKbl->Name, KL_NAMELENGTH*sizeof(WCHAR)); RtlCopyMemory(lpszName, pKbl->Name, KL_NAMELENGTH*sizeof(WCHAR));
ret = TRUE; ret = TRUE;
} }
@ -614,7 +616,7 @@ NtUserActivateKeyboardLayout(
{ {
PKBL pKbl; PKBL pKbl;
HKL Ret = NULL; HKL Ret = NULL;
PW32THREAD pWThread; PTHREADINFO pWThread;
UserEnterExclusive(); UserEnterExclusive();

View file

@ -420,6 +420,7 @@ BOOL FASTCALL
IntTranslateKbdMessage(LPMSG lpMsg, IntTranslateKbdMessage(LPMSG lpMsg,
HKL dwhkl) HKL dwhkl)
{ {
PTHREADINFO pti;
static INT dead_char = 0; static INT dead_char = 0;
LONG UState = 0; LONG UState = 0;
WCHAR wp[2] = { 0 }; WCHAR wp[2] = { 0 };
@ -428,8 +429,8 @@ IntTranslateKbdMessage(LPMSG lpMsg,
BOOL Result = FALSE; BOOL Result = FALSE;
DWORD ScanCode = 0; DWORD ScanCode = 0;
pti = PsGetCurrentThreadWin32Thread();
keyLayout = PsGetCurrentThreadWin32Thread()->KeyboardLayout->KBTables; keyLayout = pti->KeyboardLayout->KBTables;
if( !keyLayout ) if( !keyLayout )
return FALSE; return FALSE;
@ -439,7 +440,7 @@ IntTranslateKbdMessage(LPMSG lpMsg,
ScanCode = (lpMsg->lParam >> 16) & 0xff; ScanCode = (lpMsg->lParam >> 16) & 0xff;
/* All messages have to contain the cursor point. */ /* All messages have to contain the cursor point. */
IntGetCursorLocation(PsGetCurrentThreadWin32Thread()->Desktop->WindowStation, IntGetCursorLocation(pti->Desktop->WindowStation,
&NewMsg.pt); &NewMsg.pt);
UState = ToUnicodeInner(lpMsg->wParam, HIWORD(lpMsg->lParam) & 0xff, UState = ToUnicodeInner(lpMsg->wParam, HIWORD(lpMsg->lParam) & 0xff,
@ -476,14 +477,14 @@ IntTranslateKbdMessage(LPMSG lpMsg,
NewMsg.wParam = dead_char; NewMsg.wParam = dead_char;
NewMsg.lParam = lpMsg->lParam; NewMsg.lParam = lpMsg->lParam;
dead_char = 0; dead_char = 0;
MsqPostMessage(PsGetCurrentThreadWin32Thread()->MessageQueue, &NewMsg, FALSE, QS_KEY); MsqPostMessage(pti->MessageQueue, &NewMsg, FALSE, QS_KEY);
} }
NewMsg.hwnd = lpMsg->hwnd; NewMsg.hwnd = lpMsg->hwnd;
NewMsg.wParam = wp[0]; NewMsg.wParam = wp[0];
NewMsg.lParam = lpMsg->lParam; NewMsg.lParam = lpMsg->lParam;
DPRINT( "CHAR='%c' %04x %08x\n", wp[0], wp[0], lpMsg->lParam ); DPRINT( "CHAR='%c' %04x %08x\n", wp[0], wp[0], lpMsg->lParam );
MsqPostMessage(PsGetCurrentThreadWin32Thread()->MessageQueue, &NewMsg, FALSE, QS_KEY); MsqPostMessage(pti->MessageQueue, &NewMsg, FALSE, QS_KEY);
Result = TRUE; Result = TRUE;
} }
else if (UState == -1) else if (UState == -1)
@ -494,7 +495,7 @@ IntTranslateKbdMessage(LPMSG lpMsg,
NewMsg.wParam = wp[0]; NewMsg.wParam = wp[0];
NewMsg.lParam = lpMsg->lParam; NewMsg.lParam = lpMsg->lParam;
dead_char = wp[0]; dead_char = wp[0];
MsqPostMessage(PsGetCurrentThreadWin32Thread()->MessageQueue, &NewMsg, FALSE, QS_KEY); MsqPostMessage(pti->MessageQueue, &NewMsg, FALSE, QS_KEY);
Result = TRUE; Result = TRUE;
} }
@ -664,13 +665,15 @@ UINT
STDCALL STDCALL
NtUserMapVirtualKeyEx( UINT Code, UINT Type, DWORD keyboardId, HKL dwhkl ) NtUserMapVirtualKeyEx( UINT Code, UINT Type, DWORD keyboardId, HKL dwhkl )
{ {
PTHREADINFO pti;
PKBDTABLES keyLayout; PKBDTABLES keyLayout;
DECLARE_RETURN(UINT); DECLARE_RETURN(UINT);
DPRINT("Enter NtUserMapVirtualKeyEx\n"); DPRINT("Enter NtUserMapVirtualKeyEx\n");
UserEnterExclusive(); UserEnterExclusive();
keyLayout = PsGetCurrentThreadWin32Thread() ? PsGetCurrentThreadWin32Thread()->KeyboardLayout->KBTables : 0; pti = PsGetCurrentThreadWin32Thread();
keyLayout = pti ? pti->KeyboardLayout->KBTables : 0;
if( !keyLayout ) if( !keyLayout )
RETURN(0); RETURN(0);
@ -695,6 +698,7 @@ NtUserToUnicodeEx(
UINT wFlags, UINT wFlags,
HKL dwhkl ) HKL dwhkl )
{ {
PTHREADINFO pti;
BYTE KeyStateBuf[0x100]; BYTE KeyStateBuf[0x100];
PWCHAR OutPwszBuff = 0; PWCHAR OutPwszBuff = 0;
int ret = 0; int ret = 0;
@ -723,14 +727,14 @@ NtUserToUnicodeEx(
} }
RtlZeroMemory( OutPwszBuff, sizeof( WCHAR ) * cchBuff ); RtlZeroMemory( OutPwszBuff, sizeof( WCHAR ) * cchBuff );
pti = PsGetCurrentThreadWin32Thread();
ret = ToUnicodeInner( wVirtKey, ret = ToUnicodeInner( wVirtKey,
wScanCode, wScanCode,
KeyStateBuf, KeyStateBuf,
OutPwszBuff, OutPwszBuff,
cchBuff, cchBuff,
wFlags, wFlags,
PsGetCurrentThreadWin32Thread() ? pti ? pti->KeyboardLayout->KBTables : 0 );
PsGetCurrentThreadWin32Thread()->KeyboardLayout->KBTables : 0 );
MmCopyToCaller(pwszBuff,OutPwszBuff,sizeof(WCHAR)*cchBuff); MmCopyToCaller(pwszBuff,OutPwszBuff,sizeof(WCHAR)*cchBuff);
ExFreePool(OutPwszBuff); ExFreePool(OutPwszBuff);
@ -757,6 +761,7 @@ DWORD
STDCALL STDCALL
NtUserGetKeyNameText( LONG lParam, LPWSTR lpString, int nSize ) NtUserGetKeyNameText( LONG lParam, LPWSTR lpString, int nSize )
{ {
PTHREADINFO pti;
int i; int i;
DWORD ret = 0; DWORD ret = 0;
UINT CareVk = 0; UINT CareVk = 0;
@ -770,8 +775,8 @@ NtUserGetKeyNameText( LONG lParam, LPWSTR lpString, int nSize )
DPRINT("Enter NtUserGetKeyNameText\n"); DPRINT("Enter NtUserGetKeyNameText\n");
UserEnterShared(); UserEnterShared();
keyLayout = PsGetCurrentThreadWin32Thread() ? pti = PsGetCurrentThreadWin32Thread();
PsGetCurrentThreadWin32Thread()->KeyboardLayout->KBTables : 0; keyLayout = pti ? pti->KeyboardLayout->KBTables : 0;
if( !keyLayout || nSize < 1 ) if( !keyLayout || nSize < 1 )
RETURN(0); RETURN(0);

View file

@ -303,7 +303,7 @@ IntCallWndProc
{ {
BOOL SameThread = FALSE; BOOL SameThread = FALSE;
if (Window->ti == PsGetCurrentThreadWin32Thread()->ThreadInfo) if (Window->ti == ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->ThreadInfo)
SameThread = TRUE; SameThread = TRUE;
if ((!SameThread && (Window->ti->Hooks & HOOKID_TO_FLAG(WH_CALLWNDPROC))) || if ((!SameThread && (Window->ti->Hooks & HOOKID_TO_FLAG(WH_CALLWNDPROC))) ||
@ -325,7 +325,7 @@ IntCallWndProcRet
{ {
BOOL SameThread = FALSE; BOOL SameThread = FALSE;
if (Window->ti == PsGetCurrentThreadWin32Thread()->ThreadInfo) if (Window->ti == ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->ThreadInfo)
SameThread = TRUE; SameThread = TRUE;
if ((!SameThread && (Window->ti->Hooks & HOOKID_TO_FLAG(WH_CALLWNDPROCRET))) || if ((!SameThread && (Window->ti->Hooks & HOOKID_TO_FLAG(WH_CALLWNDPROCRET))) ||
@ -740,6 +740,7 @@ co_IntPeekMessage(PUSER_MESSAGE Msg,
UINT MsgFilterMax, UINT MsgFilterMax,
UINT RemoveMsg) UINT RemoveMsg)
{ {
PTHREADINFO pti;
LARGE_INTEGER LargeTickCount; LARGE_INTEGER LargeTickCount;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
PUSER_MESSAGE Message; PUSER_MESSAGE Message;
@ -751,7 +752,8 @@ co_IntPeekMessage(PUSER_MESSAGE Msg,
/* The queues and order in which they are checked are documented in the MSDN /* The queues and order in which they are checked are documented in the MSDN
article on GetMessage() */ article on GetMessage() */
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
/* Inspect RemoveMsg flags */ /* Inspect RemoveMsg flags */
/* FIXME: The only flag we process is PM_REMOVE - processing of others must still be implemented */ /* FIXME: The only flag we process is PM_REMOVE - processing of others must still be implemented */
@ -827,7 +829,7 @@ CheckMessages:
; ;
/* Check for paint messages. */ /* Check for paint messages. */
if (IntGetPaintMessage(hWnd, MsgFilterMin, MsgFilterMax, PsGetCurrentThreadWin32Thread(), &Msg->Msg, RemoveMessages)) if (IntGetPaintMessage(hWnd, MsgFilterMin, MsgFilterMax, pti, &Msg->Msg, RemoveMessages))
{ {
Msg->FreeLParam = FALSE; Msg->FreeLParam = FALSE;
goto MsgExit; goto MsgExit;
@ -1056,11 +1058,13 @@ co_IntWaitMessage(HWND Wnd,
UINT MsgFilterMin, UINT MsgFilterMin,
UINT MsgFilterMax) UINT MsgFilterMax)
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE ThreadQueue; PUSER_MESSAGE_QUEUE ThreadQueue;
NTSTATUS Status; NTSTATUS Status;
USER_MESSAGE Msg; USER_MESSAGE Msg;
ThreadQueue = (PUSER_MESSAGE_QUEUE)PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
do do
{ {
@ -1292,14 +1296,16 @@ UserPostMessage(HWND Wnd,
WPARAM wParam, WPARAM wParam,
LPARAM lParam) LPARAM lParam)
{ {
PTHREADINFO pti;
MSG UserModeMsg, KernelModeMsg; MSG UserModeMsg, KernelModeMsg;
LARGE_INTEGER LargeTickCount; LARGE_INTEGER LargeTickCount;
NTSTATUS Status; NTSTATUS Status;
PMSGMEMORY MsgMemoryEntry; PMSGMEMORY MsgMemoryEntry;
pti = PsGetCurrentThreadWin32Thread();
if (WM_QUIT == Msg) if (WM_QUIT == Msg)
{ {
MsqPostQuitMessage(PsGetCurrentThreadWin32Thread()->MessageQueue, wParam); MsqPostQuitMessage(pti->MessageQueue, wParam);
} }
else if (Wnd == HWND_BROADCAST) else if (Wnd == HWND_BROADCAST)
{ {
@ -1344,7 +1350,7 @@ UserPostMessage(HWND Wnd,
SetLastWin32Error(ERROR_INVALID_PARAMETER); SetLastWin32Error(ERROR_INVALID_PARAMETER);
return FALSE; return FALSE;
} }
IntGetCursorLocation(PsGetCurrentThreadWin32Thread()->Desktop->WindowStation, IntGetCursorLocation(pti->Desktop->WindowStation,
&KernelModeMsg.pt); &KernelModeMsg.pt);
KeQueryTickCount(&LargeTickCount); KeQueryTickCount(&LargeTickCount);
KernelModeMsg.time = MsqCalculateMessageTime(&LargeTickCount); KernelModeMsg.time = MsqCalculateMessageTime(&LargeTickCount);
@ -1386,7 +1392,7 @@ NtUserPostThreadMessage(DWORD idThread,
{ {
MSG UserModeMsg, KernelModeMsg; MSG UserModeMsg, KernelModeMsg;
PETHREAD peThread; PETHREAD peThread;
PW32THREAD pThread; PTHREADINFO pThread;
NTSTATUS Status; NTSTATUS Status;
PMSGMEMORY MsgMemoryEntry; PMSGMEMORY MsgMemoryEntry;
DECLARE_RETURN(BOOL); DECLARE_RETURN(BOOL);
@ -1398,7 +1404,7 @@ NtUserPostThreadMessage(DWORD idThread,
if( Status == STATUS_SUCCESS ) if( Status == STATUS_SUCCESS )
{ {
pThread = (PW32THREAD)peThread->Tcb.Win32Thread; pThread = (PTHREADINFO)peThread->Tcb.Win32Thread;
if( !pThread || !pThread->MessageQueue ) if( !pThread || !pThread->MessageQueue )
{ {
ObDereferenceObject( peThread ); ObDereferenceObject( peThread );
@ -1473,7 +1479,7 @@ co_IntSendMessageTimeoutSingle(HWND hWnd,
PMSGMEMORY MsgMemoryEntry; PMSGMEMORY MsgMemoryEntry;
INT lParamBufferSize; INT lParamBufferSize;
LPARAM lParamPacked; LPARAM lParamPacked;
PW32THREAD Win32Thread; PTHREADINFO Win32Thread;
DECLARE_RETURN(LRESULT); DECLARE_RETURN(LRESULT);
USER_REFERENCE_ENTRY Ref; USER_REFERENCE_ENTRY Ref;
@ -1642,6 +1648,7 @@ co_IntPostOrSendMessage(HWND hWnd,
LPARAM lParam) LPARAM lParam)
{ {
ULONG_PTR Result; ULONG_PTR Result;
PTHREADINFO pti;
PWINDOW_OBJECT Window; PWINDOW_OBJECT Window;
if(hWnd == HWND_BROADCAST) if(hWnd == HWND_BROADCAST)
@ -1654,7 +1661,8 @@ co_IntPostOrSendMessage(HWND hWnd,
return 0; return 0;
} }
if(Window->MessageQueue != PsGetCurrentThreadWin32Thread()->MessageQueue) pti = PsGetCurrentThreadWin32Thread();
if(Window->MessageQueue != pti->MessageQueue)
{ {
Result = UserPostMessage(hWnd, Msg, wParam, lParam); Result = UserPostMessage(hWnd, Msg, wParam, lParam);
} }
@ -1676,6 +1684,7 @@ co_IntDoSendMessage(HWND hWnd,
PDOSENDMESSAGE dsm, PDOSENDMESSAGE dsm,
PNTUSERSENDMESSAGEINFO UnsafeInfo) PNTUSERSENDMESSAGEINFO UnsafeInfo)
{ {
PTHREADINFO pti;
LRESULT Result = TRUE; LRESULT Result = TRUE;
NTSTATUS Status; NTSTATUS Status;
PWINDOW_OBJECT Window; PWINDOW_OBJECT Window;
@ -1704,8 +1713,9 @@ co_IntDoSendMessage(HWND hWnd,
/* FIXME: Check for an exiting window. */ /* FIXME: Check for an exiting window. */
/* See if the current thread can handle the message */ /* See if the current thread can handle the message */
if (HWND_BROADCAST != hWnd && NULL != PsGetCurrentThreadWin32Thread() && pti = PsGetCurrentThreadWin32Thread();
Window->MessageQueue == PsGetCurrentThreadWin32Thread()->MessageQueue) if (HWND_BROADCAST != hWnd && NULL != pti &&
Window->MessageQueue == pti->MessageQueue)
{ {
/* Gather the information usermode needs to call the window proc directly */ /* Gather the information usermode needs to call the window proc directly */
Info.HandledByKernel = FALSE; Info.HandledByKernel = FALSE;
@ -1870,6 +1880,7 @@ UserSendNotifyMessage(HWND hWnd,
else else
{ {
ULONG_PTR PResult; ULONG_PTR PResult;
PTHREADINFO pti;
PWINDOW_OBJECT Window; PWINDOW_OBJECT Window;
NTSTATUS Status; NTSTATUS Status;
MSG UserModeMsg; MSG UserModeMsg;
@ -1878,7 +1889,8 @@ UserSendNotifyMessage(HWND hWnd,
if(!(Window = UserGetWindowObject(hWnd))) return FALSE; if(!(Window = UserGetWindowObject(hWnd))) return FALSE;
if(Window->MessageQueue != PsGetCurrentThreadWin32Thread()->MessageQueue) pti = PsGetCurrentThreadWin32Thread();
if(Window->MessageQueue != pti->MessageQueue)
{ // Send message w/o waiting for it. { // Send message w/o waiting for it.
Result = UserPostMessage(hWnd, Msg, wParam, lParam); Result = UserPostMessage(hWnd, Msg, wParam, lParam);
} }
@ -1952,13 +1964,15 @@ CLEANUP:
DWORD STDCALL DWORD STDCALL
IntGetQueueStatus(BOOL ClearChanges) IntGetQueueStatus(BOOL ClearChanges)
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE Queue; PUSER_MESSAGE_QUEUE Queue;
DWORD Result; DWORD Result;
DECLARE_RETURN(DWORD); DECLARE_RETURN(DWORD);
DPRINT("Enter IntGetQueueStatus\n"); DPRINT("Enter IntGetQueueStatus\n");
Queue = PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
Queue = pti->MessageQueue;
Result = MAKELONG(Queue->QueueBits, Queue->ChangedBits); Result = MAKELONG(Queue->QueueBits, Queue->ChangedBits);
if (ClearChanges) if (ClearChanges)
@ -1976,9 +1990,9 @@ CLEANUP:
BOOL STDCALL BOOL STDCALL
IntInitMessagePumpHook() IntInitMessagePumpHook()
{ {
if (((PW32THREAD)PsGetCurrentThread()->Tcb.Win32Thread)->ThreadInfo) if (((PTHREADINFO)PsGetCurrentThread()->Tcb.Win32Thread)->ThreadInfo)
{ {
((PW32THREAD)PsGetCurrentThread()->Tcb.Win32Thread)->ThreadInfo->ClientThreadInfo.dwcPumpHook++; ((PTHREADINFO)PsGetCurrentThread()->Tcb.Win32Thread)->ThreadInfo->ClientThreadInfo.dwcPumpHook++;
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
@ -1987,13 +2001,13 @@ IntInitMessagePumpHook()
BOOL STDCALL BOOL STDCALL
IntUninitMessagePumpHook() IntUninitMessagePumpHook()
{ {
if (((PW32THREAD)PsGetCurrentThread()->Tcb.Win32Thread)->ThreadInfo) if (((PTHREADINFO)PsGetCurrentThread()->Tcb.Win32Thread)->ThreadInfo)
{ {
if (((PW32THREAD)PsGetCurrentThread()->Tcb.Win32Thread)->ThreadInfo->ClientThreadInfo.dwcPumpHook <= 0) if (((PTHREADINFO)PsGetCurrentThread()->Tcb.Win32Thread)->ThreadInfo->ClientThreadInfo.dwcPumpHook <= 0)
{ {
return FALSE; return FALSE;
} }
((PW32THREAD)PsGetCurrentThread()->Tcb.Win32Thread)->ThreadInfo->ClientThreadInfo.dwcPumpHook--; ((PTHREADINFO)PsGetCurrentThread()->Tcb.Win32Thread)->ThreadInfo->ClientThreadInfo.dwcPumpHook--;
return TRUE; return TRUE;
} }
return FALSE; return FALSE;

View file

@ -130,12 +130,12 @@ NtUserGetGUIThreadInfo(
SetLastWin32Error(ERROR_ACCESS_DENIED); SetLastWin32Error(ERROR_ACCESS_DENIED);
RETURN( FALSE); RETURN( FALSE);
} }
Desktop = ((PW32THREAD)Thread->Tcb.Win32Thread)->Desktop; Desktop = ((PTHREADINFO)Thread->Tcb.Win32Thread)->Desktop;
} }
else else
{ {
/* get the foreground thread */ /* get the foreground thread */
PW32THREAD W32Thread = (PW32THREAD)PsGetCurrentThread()->Tcb.Win32Thread; PTHREADINFO W32Thread = (PTHREADINFO)PsGetCurrentThread()->Tcb.Win32Thread;
Desktop = W32Thread->Desktop; Desktop = W32Thread->Desktop;
if(Desktop) if(Desktop)
{ {
@ -438,7 +438,7 @@ GetW32ThreadInfo(VOID)
PTEB Teb; PTEB Teb;
PW32THREADINFO ti; PW32THREADINFO ti;
PCLIENTINFO ci; PCLIENTINFO ci;
PW32THREAD W32Thread = PsGetCurrentThreadWin32Thread(); PTHREADINFO W32Thread = PsGetCurrentThreadWin32Thread();
if (W32Thread == NULL) if (W32Thread == NULL)
{ {
@ -446,7 +446,7 @@ GetW32ThreadInfo(VOID)
return NULL; return NULL;
} }
/* allocate a W32THREAD structure if neccessary */ /* allocate a THREADINFO structure if neccessary */
if (W32Thread->ThreadInfo == NULL) if (W32Thread->ThreadInfo == NULL)
{ {
ti = UserHeapAlloc(sizeof(W32THREADINFO)); ti = UserHeapAlloc(sizeof(W32THREADINFO));

View file

@ -93,7 +93,7 @@ IdlePing(VOID)
HANDLE FASTCALL HANDLE FASTCALL
IntMsqSetWakeMask(DWORD WakeMask) IntMsqSetWakeMask(DWORD WakeMask)
{ {
PW32THREAD Win32Thread; PTHREADINFO Win32Thread;
PUSER_MESSAGE_QUEUE MessageQueue; PUSER_MESSAGE_QUEUE MessageQueue;
HANDLE MessageEventHandle; HANDLE MessageEventHandle;
@ -111,7 +111,7 @@ IntMsqSetWakeMask(DWORD WakeMask)
BOOL FASTCALL BOOL FASTCALL
IntMsqClearWakeMask(VOID) IntMsqClearWakeMask(VOID)
{ {
PW32THREAD Win32Thread; PTHREADINFO Win32Thread;
PUSER_MESSAGE_QUEUE MessageQueue; PUSER_MESSAGE_QUEUE MessageQueue;
Win32Thread = PsGetCurrentThreadWin32Thread(); Win32Thread = PsGetCurrentThreadWin32Thread();
@ -235,17 +235,19 @@ MsqInsertSystemMessage(MSG* Msg)
BOOL FASTCALL BOOL FASTCALL
MsqIsDblClk(LPMSG Msg, BOOL Remove) MsqIsDblClk(LPMSG Msg, BOOL Remove)
{ {
PTHREADINFO pti;
PWINSTATION_OBJECT WinStaObject; PWINSTATION_OBJECT WinStaObject;
PSYSTEM_CURSORINFO CurInfo; PSYSTEM_CURSORINFO CurInfo;
LONG dX, dY; LONG dX, dY;
BOOL Res; BOOL Res;
if (PsGetCurrentThreadWin32Thread()->Desktop == NULL) pti = PsGetCurrentThreadWin32Thread();
if (pti->Desktop == NULL)
{ {
return FALSE; return FALSE;
} }
WinStaObject = PsGetCurrentThreadWin32Thread()->Desktop->WindowStation; WinStaObject = pti->Desktop->WindowStation;
CurInfo = IntGetSysCursorInfo(WinStaObject); CurInfo = IntGetSysCursorInfo(WinStaObject);
Res = (Msg->hwnd == (HWND)CurInfo->LastClkWnd) && Res = (Msg->hwnd == (HWND)CurInfo->LastClkWnd) &&
@ -811,7 +813,7 @@ VOID FASTCALL
MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam) MsqPostHotKeyMessage(PVOID Thread, HWND hWnd, WPARAM wParam, LPARAM lParam)
{ {
PWINDOW_OBJECT Window; PWINDOW_OBJECT Window;
PW32THREAD Win32Thread; PTHREADINFO Win32Thread;
PWINSTATION_OBJECT WinSta; PWINSTATION_OBJECT WinSta;
MSG Mesg; MSG Mesg;
LARGE_INTEGER LargeTickCount; LARGE_INTEGER LargeTickCount;
@ -1100,6 +1102,7 @@ co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue,
UINT uTimeout, BOOL Block, INT HookMessage, UINT uTimeout, BOOL Block, INT HookMessage,
ULONG_PTR *uResult) ULONG_PTR *uResult)
{ {
PTHREADINFO pti;
PUSER_SENT_MESSAGE Message; PUSER_SENT_MESSAGE Message;
KEVENT CompletionEvent; KEVENT CompletionEvent;
NTSTATUS WaitStatus; NTSTATUS WaitStatus;
@ -1116,7 +1119,8 @@ co_MsqSendMessage(PUSER_MESSAGE_QUEUE MessageQueue,
KeInitializeEvent(&CompletionEvent, NotificationEvent, FALSE); KeInitializeEvent(&CompletionEvent, NotificationEvent, FALSE);
ThreadQueue = PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
ThreadQueue = pti->MessageQueue;
ASSERT(ThreadQueue != MessageQueue); ASSERT(ThreadQueue != MessageQueue);
Timeout.QuadPart = (LONGLONG) uTimeout * (LONGLONG) -10000; Timeout.QuadPart = (LONGLONG) uTimeout * (LONGLONG) -10000;
@ -1603,9 +1607,11 @@ LPARAM FASTCALL
MsqSetMessageExtraInfo(LPARAM lParam) MsqSetMessageExtraInfo(LPARAM lParam)
{ {
LPARAM Ret; LPARAM Ret;
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE MessageQueue; PUSER_MESSAGE_QUEUE MessageQueue;
MessageQueue = PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
MessageQueue = pti->MessageQueue;
if(!MessageQueue) if(!MessageQueue)
{ {
return 0; return 0;
@ -1620,9 +1626,11 @@ MsqSetMessageExtraInfo(LPARAM lParam)
LPARAM FASTCALL LPARAM FASTCALL
MsqGetMessageExtraInfo(VOID) MsqGetMessageExtraInfo(VOID)
{ {
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE MessageQueue; PUSER_MESSAGE_QUEUE MessageQueue;
MessageQueue = PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
MessageQueue = pti->MessageQueue;
if(!MessageQueue) if(!MessageQueue)
{ {
return 0; return 0;
@ -1822,6 +1830,7 @@ MsqGetTimerMessage(PUSER_MESSAGE_QUEUE MessageQueue,
LARGE_INTEGER LargeTickCount; LARGE_INTEGER LargeTickCount;
PLIST_ENTRY EnumEntry; PLIST_ENTRY EnumEntry;
BOOLEAN GotMessage; BOOLEAN GotMessage;
PTHREADINFO pti;
DPRINT("MsqGetTimerMessage queue %p msg %p restart %s\n", DPRINT("MsqGetTimerMessage queue %p msg %p restart %s\n",
MessageQueue, Msg, Restart ? "TRUE" : "FALSE"); MessageQueue, Msg, Restart ? "TRUE" : "FALSE");
@ -1873,7 +1882,8 @@ MsqGetTimerMessage(PUSER_MESSAGE_QUEUE MessageQueue,
Msg->lParam = (LPARAM) Timer->TimerFunc; Msg->lParam = (LPARAM) Timer->TimerFunc;
KeQueryTickCount(&LargeTickCount); KeQueryTickCount(&LargeTickCount);
Msg->time = MsqCalculateMessageTime(&LargeTickCount); Msg->time = MsqCalculateMessageTime(&LargeTickCount);
IntGetCursorLocation(PsGetCurrentThreadWin32Thread()->Desktop->WindowStation, pti = PsGetCurrentThreadWin32Thread();
IntGetCursorLocation(pti->Desktop->WindowStation,
&Msg->pt); &Msg->pt);
if (Restart) if (Restart)

View file

@ -636,7 +636,7 @@ IntIsWindowDirty(PWINDOW_OBJECT Window)
} }
HWND FASTCALL HWND FASTCALL
IntFindWindowToRepaint(PWINDOW_OBJECT Window, PW32THREAD Thread) IntFindWindowToRepaint(PWINDOW_OBJECT Window, PTHREADINFO Thread)
{ {
HWND hChild; HWND hChild;
PWINDOW_OBJECT TempWindow; PWINDOW_OBJECT TempWindow;
@ -680,7 +680,7 @@ IntFindWindowToRepaint(PWINDOW_OBJECT Window, PW32THREAD Thread)
BOOL FASTCALL BOOL FASTCALL
IntGetPaintMessage(HWND hWnd, UINT MsgFilterMin, UINT MsgFilterMax, IntGetPaintMessage(HWND hWnd, UINT MsgFilterMin, UINT MsgFilterMax,
PW32THREAD Thread, MSG *Message, BOOL Remove) PTHREADINFO Thread, MSG *Message, BOOL Remove)
{ {
PUSER_MESSAGE_QUEUE MessageQueue = (PUSER_MESSAGE_QUEUE)Thread->MessageQueue; PUSER_MESSAGE_QUEUE MessageQueue = (PUSER_MESSAGE_QUEUE)Thread->MessageQueue;
@ -721,7 +721,7 @@ co_IntFixCaret(PWINDOW_OBJECT Window, LPRECT lprc, UINT flags)
ASSERT_REFS_CO(Window); ASSERT_REFS_CO(Window);
Desktop = ((PW32THREAD)PsGetCurrentThread()->Tcb.Win32Thread)->Desktop; Desktop = ((PTHREADINFO)PsGetCurrentThread()->Tcb.Win32Thread)->Desktop;
CaretInfo = ((PUSER_MESSAGE_QUEUE)Desktop->ActiveMessageQueue)->CaretInfo; CaretInfo = ((PUSER_MESSAGE_QUEUE)Desktop->ActiveMessageQueue)->CaretInfo;
hWndCaret = CaretInfo->hWnd; hWndCaret = CaretInfo->hWnd;

View file

@ -493,7 +493,7 @@ NtUserCallTwoParam(
case TWOPARAM_ROUTINE_SETGUITHRDHANDLE: case TWOPARAM_ROUTINE_SETGUITHRDHANDLE:
{ {
PUSER_MESSAGE_QUEUE MsgQueue = ((PW32THREAD)PsGetCurrentThread()->Tcb.Win32Thread)->MessageQueue; PUSER_MESSAGE_QUEUE MsgQueue = ((PTHREADINFO)PsGetCurrentThread()->Tcb.Win32Thread)->MessageQueue;
ASSERT(MsgQueue); ASSERT(MsgQueue);
RETURN( (DWORD)MsqSetStateWindow(MsgQueue, (ULONG)Param1, (HWND)Param2)); RETURN( (DWORD)MsqSetStateWindow(MsgQueue, (ULONG)Param1, (HWND)Param2));

View file

@ -465,7 +465,8 @@ IntSystemParametersInfo(
case SPI_SETWORKAREA: case SPI_SETWORKAREA:
{ {
RECT *rc; RECT *rc;
PDESKTOP_OBJECT Desktop = PsGetCurrentThreadWin32Thread()->Desktop; PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
PDESKTOP_OBJECT Desktop = pti->Desktop;
if(!Desktop) if(!Desktop)
{ {
@ -482,7 +483,8 @@ IntSystemParametersInfo(
} }
case SPI_GETWORKAREA: case SPI_GETWORKAREA:
{ {
PDESKTOP_OBJECT Desktop = PsGetCurrentThreadWin32Thread()->Desktop; PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
PDESKTOP_OBJECT Desktop = pti->Desktop;
if(!Desktop) if(!Desktop)
{ {

View file

@ -61,6 +61,7 @@ IntSetTimer(HWND Wnd, UINT_PTR IDEvent, UINT Elapse, TIMERPROC TimerFunc, BOOL S
{ {
PWINDOW_OBJECT Window; PWINDOW_OBJECT Window;
UINT_PTR Ret = 0; UINT_PTR Ret = 0;
PTHREADINFO pti;
PUSER_MESSAGE_QUEUE MessageQueue; PUSER_MESSAGE_QUEUE MessageQueue;
DPRINT("IntSetTimer wnd %x id %p elapse %u timerproc %p systemtimer %s\n", DPRINT("IntSetTimer wnd %x id %p elapse %u timerproc %p systemtimer %s\n",
@ -84,7 +85,8 @@ IntSetTimer(HWND Wnd, UINT_PTR IDEvent, UINT Elapse, TIMERPROC TimerFunc, BOOL S
HintIndex = ++IDEvent; HintIndex = ++IDEvent;
IntUnlockWindowlessTimerBitmap(); IntUnlockWindowlessTimerBitmap();
Ret = IDEvent; Ret = IDEvent;
MessageQueue = PsGetCurrentThreadWin32Thread()->MessageQueue; pti = PsGetCurrentThreadWin32Thread();
MessageQueue = pti->MessageQueue;
} }
else else
{ {
@ -149,16 +151,18 @@ IntSetTimer(HWND Wnd, UINT_PTR IDEvent, UINT Elapse, TIMERPROC TimerFunc, BOOL S
BOOL FASTCALL BOOL FASTCALL
IntKillTimer(HWND Wnd, UINT_PTR IDEvent, BOOL SystemTimer) IntKillTimer(HWND Wnd, UINT_PTR IDEvent, BOOL SystemTimer)
{ {
PTHREADINFO pti;
PWINDOW_OBJECT Window = NULL; PWINDOW_OBJECT Window = NULL;
DPRINT("IntKillTimer wnd %x id %p systemtimer %s\n", DPRINT("IntKillTimer wnd %x id %p systemtimer %s\n",
Wnd, IDEvent, SystemTimer ? "TRUE" : "FALSE"); Wnd, IDEvent, SystemTimer ? "TRUE" : "FALSE");
pti = PsGetCurrentThreadWin32Thread();
if (Wnd) if (Wnd)
{ {
Window = UserGetWindowObject(Wnd); Window = UserGetWindowObject(Wnd);
if (! MsqKillTimer(PsGetCurrentThreadWin32Thread()->MessageQueue, Wnd, if (! MsqKillTimer(pti->MessageQueue, Wnd,
IDEvent, SystemTimer ? WM_SYSTIMER : WM_TIMER)) IDEvent, SystemTimer ? WM_SYSTIMER : WM_TIMER))
{ {
// Give it another chance to find the timer. // Give it another chance to find the timer.
@ -175,7 +179,7 @@ IntKillTimer(HWND Wnd, UINT_PTR IDEvent, BOOL SystemTimer)
/* window-less timer? */ /* window-less timer? */
if ((Wnd == NULL) && ! SystemTimer) if ((Wnd == NULL) && ! SystemTimer)
{ {
if (! MsqKillTimer(PsGetCurrentThreadWin32Thread()->MessageQueue, Wnd, if (! MsqKillTimer(pti->MessageQueue, Wnd,
IDEvent, SystemTimer ? WM_SYSTIMER : WM_TIMER)) IDEvent, SystemTimer ? WM_SYSTIMER : WM_TIMER))
{ {
DPRINT1("Unable to locate timer in message queue for Window-less timer.\n"); DPRINT1("Unable to locate timer in message queue for Window-less timer.\n");

View file

@ -33,9 +33,11 @@ RTL_ATOM FASTCALL
IntAddAtom(LPWSTR AtomName) IntAddAtom(LPWSTR AtomName)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PTHREADINFO pti;
RTL_ATOM Atom; RTL_ATOM Atom;
if (PsGetCurrentThreadWin32Thread()->Desktop == NULL) pti = PsGetCurrentThreadWin32Thread();
if (pti->Desktop == NULL)
{ {
SetLastNtError(Status); SetLastNtError(Status);
return (RTL_ATOM)0; return (RTL_ATOM)0;
@ -55,9 +57,11 @@ ULONG FASTCALL
IntGetAtomName(RTL_ATOM nAtom, LPWSTR lpBuffer, ULONG nSize) IntGetAtomName(RTL_ATOM nAtom, LPWSTR lpBuffer, ULONG nSize)
{ {
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PTHREADINFO pti;
ULONG Size = nSize; ULONG Size = nSize;
if (PsGetCurrentThreadWin32Thread()->Desktop == NULL) pti = PsGetCurrentThreadWin32Thread();
if (pti->Desktop == NULL)
{ {
SetLastNtError(Status); SetLastNtError(Status);
return 0; return 0;

View file

@ -363,7 +363,7 @@ UserFreeWindowInfo(PW32THREADINFO ti, PWINDOW_OBJECT WindowObject)
*/ */
static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window, static LRESULT co_UserFreeWindow(PWINDOW_OBJECT Window,
PW32PROCESS ProcessData, PW32PROCESS ProcessData,
PW32THREAD ThreadData, PTHREADINFO ThreadData,
BOOLEAN SendMessages) BOOLEAN SendMessages)
{ {
HWND *Children; HWND *Children;
@ -697,11 +697,11 @@ IntSetMenu(
VOID FASTCALL VOID FASTCALL
co_DestroyThreadWindows(struct _ETHREAD *Thread) co_DestroyThreadWindows(struct _ETHREAD *Thread)
{ {
PW32THREAD WThread; PTHREADINFO WThread;
PLIST_ENTRY Current; PLIST_ENTRY Current;
PWINDOW_OBJECT Wnd; PWINDOW_OBJECT Wnd;
USER_REFERENCE_ENTRY Ref; USER_REFERENCE_ENTRY Ref;
WThread = (PW32THREAD)Thread->Tcb.Win32Thread; WThread = (PTHREADINFO)Thread->Tcb.Win32Thread;
while (!IsListEmpty(&WThread->WindowListHead)) while (!IsListEmpty(&WThread->WindowListHead))
{ {
@ -771,7 +771,7 @@ PMENU_OBJECT FASTCALL
IntGetSystemMenu(PWINDOW_OBJECT Window, BOOL bRevert, BOOL RetMenu) IntGetSystemMenu(PWINDOW_OBJECT Window, BOOL bRevert, BOOL RetMenu)
{ {
PMENU_OBJECT Menu, NewMenu = NULL, SysMenu = NULL, ret = NULL; PMENU_OBJECT Menu, NewMenu = NULL, SysMenu = NULL, ret = NULL;
PW32THREAD W32Thread; PTHREADINFO W32Thread;
HMENU hNewMenu, hSysMenu; HMENU hNewMenu, hSysMenu;
ROSMENUITEMINFO ItemInfo; ROSMENUITEMINFO ItemInfo;
@ -1315,7 +1315,7 @@ NtUserBuildHwndList(
else else
{ {
PETHREAD Thread; PETHREAD Thread;
PW32THREAD W32Thread; PTHREADINFO W32Thread;
PLIST_ENTRY Current; PLIST_ENTRY Current;
PWINDOW_OBJECT Window; PWINDOW_OBJECT Window;
@ -1324,7 +1324,7 @@ NtUserBuildHwndList(
{ {
return ERROR_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER;
} }
if(!(W32Thread = (PW32THREAD)Thread->Tcb.Win32Thread)) if(!(W32Thread = (PTHREADINFO)Thread->Tcb.Win32Thread))
{ {
ObDereferenceObject(Thread); ObDereferenceObject(Thread);
DPRINT("Thread is not a GUI Thread!\n"); DPRINT("Thread is not a GUI Thread!\n");
@ -1523,8 +1523,10 @@ co_IntCreateWindowEx(DWORD dwExStyle,
DECLARE_RETURN(HWND); DECLARE_RETURN(HWND);
BOOL HasOwner; BOOL HasOwner;
USER_REFERENCE_ENTRY ParentRef, Ref; USER_REFERENCE_ENTRY ParentRef, Ref;
PTHREADINFO pti;
ParentWindowHandle = PsGetCurrentThreadWin32Thread()->Desktop->DesktopWindow; pti = PsGetCurrentThreadWin32Thread();
ParentWindowHandle = pti->Desktop->DesktopWindow;
OwnerWindowHandle = NULL; OwnerWindowHandle = NULL;
if (hWndParent == HWND_MESSAGE) if (hWndParent == HWND_MESSAGE)
@ -1568,7 +1570,7 @@ co_IntCreateWindowEx(DWORD dwExStyle,
/* Check the window station. */ /* Check the window station. */
ti = GetW32ThreadInfo(); ti = GetW32ThreadInfo();
if (ti == NULL || PsGetCurrentThreadWin32Thread()->Desktop == NULL) if (ti == NULL || pti->Desktop == NULL)
{ {
DPRINT1("Thread is not attached to a desktop! Cannot create window!\n"); DPRINT1("Thread is not attached to a desktop! Cannot create window!\n");
RETURN( (HWND)0); RETURN( (HWND)0);
@ -1606,7 +1608,7 @@ co_IntCreateWindowEx(DWORD dwExStyle,
RETURN(NULL); RETURN(NULL);
} }
WinSta = PsGetCurrentThreadWin32Thread()->Desktop->WindowStation; WinSta = pti->Desktop->WindowStation;
//FIXME: Reference thread/desktop instead //FIXME: Reference thread/desktop instead
ObReferenceObjectByPointer(WinSta, KernelMode, ExWindowStationObjectType, 0); ObReferenceObjectByPointer(WinSta, KernelMode, ExWindowStationObjectType, 0);
@ -1644,11 +1646,11 @@ AllocErr:
ObDereferenceObject(WinSta); ObDereferenceObject(WinSta);
if (NULL == PsGetCurrentThreadWin32Thread()->Desktop->DesktopWindow) if (NULL == pti->Desktop->DesktopWindow)
{ {
/* If there is no desktop window yet, we must be creating it */ /* If there is no desktop window yet, we must be creating it */
PsGetCurrentThreadWin32Thread()->Desktop->DesktopWindow = hWnd; pti->Desktop->DesktopWindow = hWnd;
PsGetCurrentThreadWin32Thread()->Desktop->DesktopInfo->Wnd = Wnd; pti->Desktop->DesktopInfo->Wnd = Wnd;
} }
/* /*
@ -1664,7 +1666,7 @@ AllocErr:
Wnd->Instance = hInstance; Wnd->Instance = hInstance;
Window->hSelf = hWnd; Window->hSelf = hWnd;
Window->MessageQueue = PsGetCurrentThreadWin32Thread()->MessageQueue; Window->MessageQueue = pti->MessageQueue;
IntReferenceMessageQueue(Window->MessageQueue); IntReferenceMessageQueue(Window->MessageQueue);
Window->Parent = ParentWindow; Window->Parent = ParentWindow;
Wnd->Parent = ParentWindow ? ParentWindow->Wnd : NULL; Wnd->Parent = ParentWindow ? ParentWindow->Wnd : NULL;
@ -1790,7 +1792,7 @@ AllocErr:
Wnd->IDMenu = (UINT) hMenu; Wnd->IDMenu = (UINT) hMenu;
/* Insert the window into the thread's window list. */ /* Insert the window into the thread's window list. */
InsertTailList (&PsGetCurrentThreadWin32Thread()->WindowListHead, &Window->ThreadListEntry); InsertTailList (&pti->WindowListHead, &Window->ThreadListEntry);
/* Handle "CS_CLASSDC", it is tested first. */ /* Handle "CS_CLASSDC", it is tested first. */
if ((Wnd->Class->Style & CS_CLASSDC) && !(Wnd->Class->Dce)) // One DCE per class to have CLASS. if ((Wnd->Class->Style & CS_CLASSDC) && !(Wnd->Class->Dce)) // One DCE per class to have CLASS.
@ -1842,7 +1844,7 @@ AllocErr:
PRTL_USER_PROCESS_PARAMETERS ProcessParams; PRTL_USER_PROCESS_PARAMETERS ProcessParams;
BOOL CalculatedDefPosSize = FALSE; BOOL CalculatedDefPosSize = FALSE;
IntGetDesktopWorkArea(((PW32THREAD)Window->OwnerThread->Tcb.Win32Thread)->Desktop, &WorkArea); IntGetDesktopWorkArea(((PTHREADINFO)Window->OwnerThread->Tcb.Win32Thread)->Desktop, &WorkArea);
rc = WorkArea; rc = WorkArea;
ProcessParams = PsGetCurrentProcess()->Peb->ProcessParameters; ProcessParams = PsGetCurrentProcess()->Peb->ProcessParameters;
@ -3650,7 +3652,7 @@ co_UserSetWindowLong(HWND hWnd, DWORD Index, LONG NewValue, BOOL Ansi)
/* /*
* Remove extended window style bit WS_EX_TOPMOST for shell windows. * Remove extended window style bit WS_EX_TOPMOST for shell windows.
*/ */
WindowStation = ((PW32THREAD)Window->OwnerThread->Tcb.Win32Thread)->Desktop->WindowStation; WindowStation = ((PTHREADINFO)Window->OwnerThread->Tcb.Win32Thread)->Desktop->WindowStation;
if(WindowStation) if(WindowStation)
{ {
if (hWnd == WindowStation->ShellWindow || hWnd == WindowStation->ShellListView) if (hWnd == WindowStation->ShellWindow || hWnd == WindowStation->ShellListView)
@ -4485,6 +4487,7 @@ NtUserWindowFromPoint(LONG X, LONG Y)
if ((DesktopWindow = UserGetWindowObject(IntGetDesktopWindow()))) if ((DesktopWindow = UserGetWindowObject(IntGetDesktopWindow())))
{ {
PTHREADINFO pti;
USHORT Hit; USHORT Hit;
pt.x = X; pt.x = X;
@ -4494,7 +4497,8 @@ NtUserWindowFromPoint(LONG X, LONG Y)
//its possible this referencing is useless, thou it shouldnt hurt... //its possible this referencing is useless, thou it shouldnt hurt...
UserRefObjectCo(DesktopWindow, &Ref); UserRefObjectCo(DesktopWindow, &Ref);
Hit = co_WinPosWindowFromPoint(DesktopWindow, PsGetCurrentThreadWin32Thread()->MessageQueue, &pt, &Window); pti = PsGetCurrentThreadWin32Thread();
Hit = co_WinPosWindowFromPoint(DesktopWindow, pti->MessageQueue, &pt, &Window);
if(Window) if(Window)
{ {

View file

@ -257,7 +257,8 @@ WinPosInitInternalPos(PWINDOW_OBJECT Window, POINT *pt, PRECT RestoreRect)
if (!Wnd->InternalPosInitialized) if (!Wnd->InternalPosInitialized)
{ {
RECT WorkArea; RECT WorkArea;
PDESKTOP_OBJECT Desktop = PsGetCurrentThreadWin32Thread()->Desktop; /* Or rather get it from the window? */ PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
PDESKTOP_OBJECT Desktop = pti->Desktop; /* Or rather get it from the window? */
Parent = Window->Parent; Parent = Window->Parent;
if(Parent) if(Parent)
@ -401,7 +402,8 @@ WinPosFillMinMaxInfoStruct(PWINDOW_OBJECT Window, MINMAXINFO *Info)
{ {
UINT XInc, YInc; UINT XInc, YInc;
RECT WorkArea; RECT WorkArea;
PDESKTOP_OBJECT Desktop = PsGetCurrentThreadWin32Thread()->Desktop; /* Or rather get it from the window? */ PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
PDESKTOP_OBJECT Desktop = pti->Desktop; /* Or rather get it from the window? */
IntGetDesktopWorkArea(Desktop, &WorkArea); IntGetDesktopWorkArea(Desktop, &WorkArea);

View file

@ -918,6 +918,7 @@ HWINSTA FASTCALL
UserGetProcessWindowStation(VOID) UserGetProcessWindowStation(VOID)
{ {
NTSTATUS Status; NTSTATUS Status;
PTHREADINFO pti;
HWINSTA WinSta; HWINSTA WinSta;
if(PsGetCurrentProcess() != CsrProcess) if(PsGetCurrentProcess() != CsrProcess)
@ -927,7 +928,8 @@ UserGetProcessWindowStation(VOID)
else else
{ {
DPRINT1("Should use ObFindHandleForObject\n"); DPRINT1("Should use ObFindHandleForObject\n");
Status = ObOpenObjectByPointer(PsGetCurrentThreadWin32Thread()->Desktop->WindowStation, pti = PsGetCurrentThreadWin32Thread();
Status = ObOpenObjectByPointer(pti->Desktop->WindowStation,
0, 0,
NULL, NULL,
WINSTA_ALL_ACCESS, WINSTA_ALL_ACCESS,
@ -970,7 +972,7 @@ PWINSTATION_OBJECT FASTCALL
IntGetWinStaObj(VOID) IntGetWinStaObj(VOID)
{ {
PWINSTATION_OBJECT WinStaObj; PWINSTATION_OBJECT WinStaObj;
PW32THREAD Win32Thread; PTHREADINFO Win32Thread;
PEPROCESS CurrentProcess; PEPROCESS CurrentProcess;
/* /*

View file

@ -366,7 +366,7 @@ LockHandle:
PrevProcId = _InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, LockedProcessId, 0); PrevProcId = _InterlockedCompareExchangePointer((PVOID*)&Entry->ProcessId, LockedProcessId, 0);
if (PrevProcId == NULL) if (PrevProcId == NULL)
{ {
PW32THREAD Thread = PsGetCurrentThreadWin32Thread(); PW32THREAD Thread = (PW32THREAD)PsGetCurrentThreadWin32Thread();
HGDIOBJ Handle; HGDIOBJ Handle;
Entry->KernelData = newObject; Entry->KernelData = newObject;
@ -803,7 +803,7 @@ GDIOBJ_LockObj(HGDIOBJ hObj, DWORD ExpectedType)
if ( (Entry->KernelData != NULL) && if ( (Entry->KernelData != NULL) &&
((Entry->Type << GDI_ENTRY_UPPER_SHIFT) == HandleUpper) ) ((Entry->Type << GDI_ENTRY_UPPER_SHIFT) == HandleUpper) )
{ {
PW32THREAD Thread = PsGetCurrentThreadWin32Thread(); PW32THREAD Thread = (PW32THREAD)PsGetCurrentThreadWin32Thread();
Object = Entry->KernelData; Object = Entry->KernelData;
if (Object->cExclusiveLock == 0) if (Object->cExclusiveLock == 0)
@ -1046,7 +1046,7 @@ GDIOBJ_ConvertToStockObj(HGDIOBJ *phObj)
DPRINT("GDIOBJ_ConvertToStockObj: hObj: 0x%08x\n", hObj); DPRINT("GDIOBJ_ConvertToStockObj: hObj: 0x%08x\n", hObj);
Thread = PsGetCurrentThreadWin32Thread(); Thread = (PW32THREAD)PsGetCurrentThreadWin32Thread();
if (!GDI_HANDLE_IS_STOCKOBJ(hObj)) if (!GDI_HANDLE_IS_STOCKOBJ(hObj))
{ {
@ -1172,7 +1172,7 @@ GDIOBJ_SetOwnership(HGDIOBJ ObjectHandle, PEPROCESS NewOwner)
DPRINT("GDIOBJ_SetOwnership: hObj: 0x%x, NewProcess: 0x%x\n", ObjectHandle, (NewOwner ? PsGetProcessId(NewOwner) : 0)); DPRINT("GDIOBJ_SetOwnership: hObj: 0x%x, NewProcess: 0x%x\n", ObjectHandle, (NewOwner ? PsGetProcessId(NewOwner) : 0));
Thread = PsGetCurrentThreadWin32Thread(); Thread = (PW32THREAD)PsGetCurrentThreadWin32Thread();
if (!GDI_HANDLE_IS_STOCKOBJ(ObjectHandle)) if (!GDI_HANDLE_IS_STOCKOBJ(ObjectHandle))
{ {
@ -1301,7 +1301,7 @@ GDIOBJ_CopyOwnership(HGDIOBJ CopyFrom, HGDIOBJ CopyTo)
DPRINT("GDIOBJ_CopyOwnership: from: 0x%x, to: 0x%x\n", CopyFrom, CopyTo); DPRINT("GDIOBJ_CopyOwnership: from: 0x%x, to: 0x%x\n", CopyFrom, CopyTo);
Thread = PsGetCurrentThreadWin32Thread(); Thread = (PW32THREAD)PsGetCurrentThreadWin32Thread();
if (!GDI_HANDLE_IS_STOCKOBJ(CopyFrom) && !GDI_HANDLE_IS_STOCKOBJ(CopyTo)) if (!GDI_HANDLE_IS_STOCKOBJ(CopyFrom) && !GDI_HANDLE_IS_STOCKOBJ(CopyTo))
{ {