diff --git a/reactos/dll/win32/user32/misc/misc.c b/reactos/dll/win32/user32/misc/misc.c index 84bb9613a61..9865f7eb1d0 100644 --- a/reactos/dll/win32/user32/misc/misc.c +++ b/reactos/dll/win32/user32/misc/misc.c @@ -462,12 +462,12 @@ FASTCALL ValidateHwnd(HWND hwnd) { PWINDOW Wnd; - PW32CLIENTINFO ClientInfo = GetWin32ClientInfo(); + PCLIENTINFO ClientInfo = GetWin32ClientInfo(); ASSERT(ClientInfo != NULL); /* See if the window is cached */ - if (hwnd == ClientInfo->hWND) - return ClientInfo->pvWND; + if (hwnd == ClientInfo->CallbackWnd.hWnd) + return ClientInfo->CallbackWnd.pvWnd; Wnd = ValidateHandle((HANDLE)hwnd, VALIDATE_TYPE_WIN); if (Wnd != NULL) @@ -501,12 +501,12 @@ FASTCALL ValidateHwndNoErr(HWND hwnd) { PWINDOW Wnd; - PW32CLIENTINFO ClientInfo = GetWin32ClientInfo(); + PCLIENTINFO ClientInfo = GetWin32ClientInfo(); ASSERT(ClientInfo != NULL); /* See if the window is cached */ - if (hwnd == ClientInfo->hWND) - return ClientInfo->pvWND; + if (hwnd == ClientInfo->CallbackWnd.hWnd) + return ClientInfo->CallbackWnd.pvWnd; Wnd = ValidateHandleNoErr((HANDLE)hwnd, VALIDATE_TYPE_WIN); if (Wnd != NULL) diff --git a/reactos/dll/win32/user32/windows/hook.c b/reactos/dll/win32/user32/windows/hook.c index 7e4d39b1569..fc37287deaf 100644 --- a/reactos/dll/win32/user32/windows/hook.c +++ b/reactos/dll/win32/user32/windows/hook.c @@ -193,7 +193,7 @@ CallNextHookEx( WPARAM wParam, LPARAM lParam) { - PW32CLIENTINFO ClientInfo; + PCLIENTINFO ClientInfo; DWORD Flags, Save; PHOOK pHook; LRESULT lResult = 0; diff --git a/reactos/dll/win32/user32/windows/message.c b/reactos/dll/win32/user32/windows/message.c index 3296aa08920..a95091f7885 100644 --- a/reactos/dll/win32/user32/windows/message.c +++ b/reactos/dll/win32/user32/windows/message.c @@ -1081,7 +1081,7 @@ BOOL STDCALL InSendMessage(VOID) { - PCLIENTTHREADINFO pcti = ((PW32CLIENTINFO)GetWin32ClientInfo())->pClientThreadInfo; + PCLIENTTHREADINFO pcti = GetWin32ClientInfo()->pClientThreadInfo; // FIXME("ISM %x\n",pcti); if ( pcti ) { @@ -1103,7 +1103,7 @@ STDCALL InSendMessageEx( LPVOID lpReserved) { - PCLIENTTHREADINFO pcti = ((PW32CLIENTINFO)GetWin32ClientInfo())->pClientThreadInfo; + PCLIENTTHREADINFO pcti = GetWin32ClientInfo()->pClientThreadInfo; // FIXME("ISMEX %x\n",pcti); if (pcti && !(pcti->CTI_flags & CTI_INSENDMESSAGE)) return ISMEX_NOSEND; else @@ -2336,7 +2336,7 @@ DWORD gfMessagePumpHook = 0; BOOL WINAPI IsInsideMessagePumpHook() { // Fixme: Need to fully implement this! FF uses this and polls it when Min/Max - PCLIENTTHREADINFO pcti = ((PW32CLIENTINFO)GetWin32ClientInfo())->pClientThreadInfo; + PCLIENTTHREADINFO pcti = GetWin32ClientInfo()->pClientThreadInfo; // FIXME("IIMPH %x\n",pcti); return (gfMessagePumpHook && pcti && (pcti->dwcPumpHook > 0)); } diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index 023cd3b8e3c..5c5065f6b2c 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -297,6 +297,11 @@ typedef struct _W32PROCESSINFO typedef struct _CLIENTTHREADINFO { DWORD CTI_flags; + WORD fsChangeBits; + WORD fsWakeBits; + WORD fsWakeBitsJournal; + WORD fsWakeMask; + LONG timeLastRead; DWORD dwcPumpHook; } CLIENTTHREADINFO, *PCLIENTTHREADINFO; @@ -340,34 +345,39 @@ typedef struct _CALLBACKWND #define CI_CURTHPRHOOK 0x00000010 -typedef struct _W32CLIENTINFO +typedef struct _CLIENTINFO { ULONG CI_flags; ULONG cSpins; - ULONG ulWindowsVersion; - ULONG ulAppCompatFlags; - ULONG ulAppCompatFlags2; + DWORD dwExpWinVer; + DWORD dwCompatFlags; + DWORD dwCompatFlags2; DWORD dwTIFlags; PVOID pDeskInfo; ULONG_PTR ulClientDelta; PHOOK phkCurrent; ULONG fsHooks; - HWND hWND; // Will be replaced with CALLBACKWND. - PVOID pvWND; // " " + CALLBACKWND CallbackWnd; ULONG Win32ClientInfo; DWORD dwHookCurrent; - ULONG Win32ClientInfo1; + INT cInDDEMLCallback; PCLIENTTHREADINFO pClientThreadInfo; DWORD dwHookData; DWORD dwKeyCache; - ULONG Win32ClientInfo2[7]; + DWORD afKeyState[2]; + DWORD dwAsyncKeyCache; + DWORD afAsyncKeyState[2]; + DWORD afAsyncKeyStateRecentDow[2]; + HKL hKL; USHORT CodePage; - USHORT csCF; - HANDLE hKL; + USHORT achDbcsCF; ULONG Win32ClientInfo3[35]; -} W32CLIENTINFO, *PW32CLIENTINFO; +} CLIENTINFO, *PCLIENTINFO; -#define GetWin32ClientInfo() (PW32CLIENTINFO)(NtCurrentTeb()->Win32ClientInfo) +/* Make sure it fits exactly into the TEB */ +C_ASSERT(sizeof(CLIENTINFO) == FIELD_OFFSET(TEB, glDispatchTable) - FIELD_OFFSET(TEB, Win32ClientInfo)); + +#define GetWin32ClientInfo() ((PCLIENTINFO)(NtCurrentTeb()->Win32ClientInfo)) // Server event activity bits. #define SRV_EVENT_MENU 0x0001 diff --git a/reactos/subsystems/win32/win32k/ntuser/callback.c b/reactos/subsystems/win32/win32k/ntuser/callback.c index 6fdad2e714f..db1cda38c29 100644 --- a/reactos/subsystems/win32/win32k/ntuser/callback.c +++ b/reactos/subsystems/win32/win32k/ntuser/callback.c @@ -116,22 +116,22 @@ IntSetTebWndCallback (HWND * hWnd, PVOID * pWnd) { HWND hWndS = *hWnd; PWINDOW_OBJECT Window = UserGetWindowObject(*hWnd); - PW32CLIENTINFO ClientInfo = GetWin32ClientInfo(); + PCLIENTINFO ClientInfo = GetWin32ClientInfo(); - *hWnd = ClientInfo->hWND; - *pWnd = ClientInfo->pvWND; + *hWnd = ClientInfo->CallbackWnd.hWnd; + *pWnd = ClientInfo->CallbackWnd.pvWnd; - ClientInfo->hWND = hWndS; - ClientInfo->pvWND = DesktopHeapAddressToUser(Window->Wnd); + ClientInfo->CallbackWnd.hWnd = hWndS; + ClientInfo->CallbackWnd.pvWnd = DesktopHeapAddressToUser(Window->Wnd); } static VOID IntRestoreTebWndCallback (HWND hWnd, PVOID pWnd) { - PW32CLIENTINFO ClientInfo = GetWin32ClientInfo(); + PCLIENTINFO ClientInfo = GetWin32ClientInfo(); - ClientInfo->hWND = hWnd; - ClientInfo->pvWND = pWnd; + ClientInfo->CallbackWnd.hWnd = hWnd; + ClientInfo->CallbackWnd.pvWnd = pWnd; } /* FUNCTIONS *****************************************************************/ diff --git a/reactos/subsystems/win32/win32k/ntuser/hook.c b/reactos/subsystems/win32/win32k/ntuser/hook.c index 525e323e159..39ade2515d9 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hook.c +++ b/reactos/subsystems/win32/win32k/ntuser/hook.c @@ -296,7 +296,7 @@ co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam) { PHOOK Hook, SaveHook; PW32THREAD Win32Thread; - PW32CLIENTINFO ClientInfo; + PCLIENTINFO ClientInfo; PHOOKTABLE Table; LRESULT Result; PWINSTATION_OBJECT WinStaObj; @@ -886,7 +886,7 @@ NtUserCallNextHookEx( BOOL Ansi) { PHOOK HookObj, NextObj; - PW32CLIENTINFO ClientInfo; + PCLIENTINFO ClientInfo; PWINSTATION_OBJECT WinStaObj; NTSTATUS Status; DECLARE_RETURN(LRESULT); @@ -962,7 +962,7 @@ NtUserSetWindowsHookEx( BOOL Ansi) { PWINSTATION_OBJECT WinStaObj; - PW32CLIENTINFO ClientInfo; + PCLIENTINFO ClientInfo; BOOLEAN Global; PETHREAD Thread; PHOOK Hook; diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index 0889c717191..64908ae0fba 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -2110,7 +2110,7 @@ NtUserMessageCall( case FNID_CALLWNDPROC: case FNID_CALLWNDPROCRET: { - PW32CLIENTINFO ClientInfo = GetWin32ClientInfo(); + PCLIENTINFO ClientInfo = GetWin32ClientInfo(); PHOOK NextObj, Hook = ClientInfo->phkCurrent; if (!ClientInfo || !Hook) break; diff --git a/reactos/subsystems/win32/win32k/ntuser/misc.c b/reactos/subsystems/win32/win32k/ntuser/misc.c index 365debf64d0..cbe521285b1 100644 --- a/reactos/subsystems/win32/win32k/ntuser/misc.c +++ b/reactos/subsystems/win32/win32k/ntuser/misc.c @@ -437,7 +437,7 @@ GetW32ThreadInfo(VOID) { PTEB Teb; PW32THREADINFO ti; - PW32CLIENTINFO ci; + PCLIENTINFO ci; PW32THREAD W32Thread = PsGetCurrentThreadWin32Thread(); if (W32Thread == NULL) @@ -477,7 +477,7 @@ GetW32ThreadInfo(VOID) W32Thread->ThreadInfo = ti; /* update the TEB */ Teb = NtCurrentTeb(); - ci = ((PW32CLIENTINFO)Teb->Win32ClientInfo); + ci = GetWin32ClientInfo(); _SEH_TRY { ProbeForWrite(Teb, diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 08a2e43b171..acca4e9133b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -330,13 +330,13 @@ static void IntSendDestroyMsg(HWND hWnd) static VOID UserFreeWindowInfo(PW32THREADINFO ti, PWINDOW_OBJECT WindowObject) { - PW32CLIENTINFO ClientInfo = GetWin32ClientInfo(); + PCLIENTINFO ClientInfo = GetWin32ClientInfo(); PWINDOW Wnd = WindowObject->Wnd; - if (ClientInfo->pvWND == DesktopHeapAddressToUser(WindowObject->Wnd)) + if (ClientInfo->CallbackWnd.pvWnd == DesktopHeapAddressToUser(WindowObject->Wnd)) { - ClientInfo->hWND = NULL; - ClientInfo->pvWND = NULL; + ClientInfo->CallbackWnd.hWnd = NULL; + ClientInfo->CallbackWnd.pvWnd = NULL; } if (Wnd->WindowName.Buffer != NULL)