- Update CLIENTTHREADINFO structure

- Rename W32CLIENTINFO to CLIENTINFO and update members
- C_ASERT that CLIENTINFO fits into the TEB

svn path=/trunk/; revision=36753
This commit is contained in:
Timo Kreuzer 2008-10-14 21:03:20 +00:00
parent c064c14ced
commit a075ba41c2
9 changed files with 50 additions and 40 deletions

View file

@ -462,12 +462,12 @@ FASTCALL
ValidateHwnd(HWND hwnd) ValidateHwnd(HWND hwnd)
{ {
PWINDOW Wnd; PWINDOW Wnd;
PW32CLIENTINFO ClientInfo = GetWin32ClientInfo(); PCLIENTINFO ClientInfo = GetWin32ClientInfo();
ASSERT(ClientInfo != NULL); ASSERT(ClientInfo != NULL);
/* See if the window is cached */ /* See if the window is cached */
if (hwnd == ClientInfo->hWND) if (hwnd == ClientInfo->CallbackWnd.hWnd)
return ClientInfo->pvWND; return ClientInfo->CallbackWnd.pvWnd;
Wnd = ValidateHandle((HANDLE)hwnd, VALIDATE_TYPE_WIN); Wnd = ValidateHandle((HANDLE)hwnd, VALIDATE_TYPE_WIN);
if (Wnd != NULL) if (Wnd != NULL)
@ -501,12 +501,12 @@ FASTCALL
ValidateHwndNoErr(HWND hwnd) ValidateHwndNoErr(HWND hwnd)
{ {
PWINDOW Wnd; PWINDOW Wnd;
PW32CLIENTINFO ClientInfo = GetWin32ClientInfo(); PCLIENTINFO ClientInfo = GetWin32ClientInfo();
ASSERT(ClientInfo != NULL); ASSERT(ClientInfo != NULL);
/* See if the window is cached */ /* See if the window is cached */
if (hwnd == ClientInfo->hWND) if (hwnd == ClientInfo->CallbackWnd.hWnd)
return ClientInfo->pvWND; return ClientInfo->CallbackWnd.pvWnd;
Wnd = ValidateHandleNoErr((HANDLE)hwnd, VALIDATE_TYPE_WIN); Wnd = ValidateHandleNoErr((HANDLE)hwnd, VALIDATE_TYPE_WIN);
if (Wnd != NULL) if (Wnd != NULL)

View file

@ -193,7 +193,7 @@ CallNextHookEx(
WPARAM wParam, WPARAM wParam,
LPARAM lParam) LPARAM lParam)
{ {
PW32CLIENTINFO ClientInfo; PCLIENTINFO ClientInfo;
DWORD Flags, Save; DWORD Flags, Save;
PHOOK pHook; PHOOK pHook;
LRESULT lResult = 0; LRESULT lResult = 0;

View file

@ -1081,7 +1081,7 @@ BOOL
STDCALL STDCALL
InSendMessage(VOID) InSendMessage(VOID)
{ {
PCLIENTTHREADINFO pcti = ((PW32CLIENTINFO)GetWin32ClientInfo())->pClientThreadInfo; PCLIENTTHREADINFO pcti = GetWin32ClientInfo()->pClientThreadInfo;
// FIXME("ISM %x\n",pcti); // FIXME("ISM %x\n",pcti);
if ( pcti ) if ( pcti )
{ {
@ -1103,7 +1103,7 @@ STDCALL
InSendMessageEx( InSendMessageEx(
LPVOID lpReserved) LPVOID lpReserved)
{ {
PCLIENTTHREADINFO pcti = ((PW32CLIENTINFO)GetWin32ClientInfo())->pClientThreadInfo; PCLIENTTHREADINFO pcti = GetWin32ClientInfo()->pClientThreadInfo;
// FIXME("ISMEX %x\n",pcti); // FIXME("ISMEX %x\n",pcti);
if (pcti && !(pcti->CTI_flags & CTI_INSENDMESSAGE)) return ISMEX_NOSEND; if (pcti && !(pcti->CTI_flags & CTI_INSENDMESSAGE)) return ISMEX_NOSEND;
else else
@ -2336,7 +2336,7 @@ DWORD gfMessagePumpHook = 0;
BOOL WINAPI IsInsideMessagePumpHook() BOOL WINAPI IsInsideMessagePumpHook()
{ // Fixme: Need to fully implement this! FF uses this and polls it when Min/Max { // 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); // FIXME("IIMPH %x\n",pcti);
return (gfMessagePumpHook && pcti && (pcti->dwcPumpHook > 0)); return (gfMessagePumpHook && pcti && (pcti->dwcPumpHook > 0));
} }

View file

@ -297,6 +297,11 @@ typedef struct _W32PROCESSINFO
typedef struct _CLIENTTHREADINFO typedef struct _CLIENTTHREADINFO
{ {
DWORD CTI_flags; DWORD CTI_flags;
WORD fsChangeBits;
WORD fsWakeBits;
WORD fsWakeBitsJournal;
WORD fsWakeMask;
LONG timeLastRead;
DWORD dwcPumpHook; DWORD dwcPumpHook;
} CLIENTTHREADINFO, *PCLIENTTHREADINFO; } CLIENTTHREADINFO, *PCLIENTTHREADINFO;
@ -340,34 +345,39 @@ typedef struct _CALLBACKWND
#define CI_CURTHPRHOOK 0x00000010 #define CI_CURTHPRHOOK 0x00000010
typedef struct _W32CLIENTINFO typedef struct _CLIENTINFO
{ {
ULONG CI_flags; ULONG CI_flags;
ULONG cSpins; ULONG cSpins;
ULONG ulWindowsVersion; DWORD dwExpWinVer;
ULONG ulAppCompatFlags; DWORD dwCompatFlags;
ULONG ulAppCompatFlags2; DWORD dwCompatFlags2;
DWORD dwTIFlags; DWORD dwTIFlags;
PVOID pDeskInfo; PVOID pDeskInfo;
ULONG_PTR ulClientDelta; ULONG_PTR ulClientDelta;
PHOOK phkCurrent; PHOOK phkCurrent;
ULONG fsHooks; ULONG fsHooks;
HWND hWND; // Will be replaced with CALLBACKWND. CALLBACKWND CallbackWnd;
PVOID pvWND; // " "
ULONG Win32ClientInfo; ULONG Win32ClientInfo;
DWORD dwHookCurrent; DWORD dwHookCurrent;
ULONG Win32ClientInfo1; INT cInDDEMLCallback;
PCLIENTTHREADINFO pClientThreadInfo; PCLIENTTHREADINFO pClientThreadInfo;
DWORD dwHookData; DWORD dwHookData;
DWORD dwKeyCache; DWORD dwKeyCache;
ULONG Win32ClientInfo2[7]; DWORD afKeyState[2];
DWORD dwAsyncKeyCache;
DWORD afAsyncKeyState[2];
DWORD afAsyncKeyStateRecentDow[2];
HKL hKL;
USHORT CodePage; USHORT CodePage;
USHORT csCF; USHORT achDbcsCF;
HANDLE hKL;
ULONG Win32ClientInfo3[35]; 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. // Server event activity bits.
#define SRV_EVENT_MENU 0x0001 #define SRV_EVENT_MENU 0x0001

View file

@ -116,22 +116,22 @@ IntSetTebWndCallback (HWND * hWnd, PVOID * pWnd)
{ {
HWND hWndS = *hWnd; HWND hWndS = *hWnd;
PWINDOW_OBJECT Window = UserGetWindowObject(*hWnd); PWINDOW_OBJECT Window = UserGetWindowObject(*hWnd);
PW32CLIENTINFO ClientInfo = GetWin32ClientInfo(); PCLIENTINFO ClientInfo = GetWin32ClientInfo();
*hWnd = ClientInfo->hWND; *hWnd = ClientInfo->CallbackWnd.hWnd;
*pWnd = ClientInfo->pvWND; *pWnd = ClientInfo->CallbackWnd.pvWnd;
ClientInfo->hWND = hWndS; ClientInfo->CallbackWnd.hWnd = hWndS;
ClientInfo->pvWND = DesktopHeapAddressToUser(Window->Wnd); ClientInfo->CallbackWnd.pvWnd = DesktopHeapAddressToUser(Window->Wnd);
} }
static VOID static VOID
IntRestoreTebWndCallback (HWND hWnd, PVOID pWnd) IntRestoreTebWndCallback (HWND hWnd, PVOID pWnd)
{ {
PW32CLIENTINFO ClientInfo = GetWin32ClientInfo(); PCLIENTINFO ClientInfo = GetWin32ClientInfo();
ClientInfo->hWND = hWnd; ClientInfo->CallbackWnd.hWnd = hWnd;
ClientInfo->pvWND = pWnd; ClientInfo->CallbackWnd.pvWnd = pWnd;
} }
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/

View file

@ -296,7 +296,7 @@ co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
{ {
PHOOK Hook, SaveHook; PHOOK Hook, SaveHook;
PW32THREAD Win32Thread; PW32THREAD Win32Thread;
PW32CLIENTINFO ClientInfo; PCLIENTINFO ClientInfo;
PHOOKTABLE Table; PHOOKTABLE Table;
LRESULT Result; LRESULT Result;
PWINSTATION_OBJECT WinStaObj; PWINSTATION_OBJECT WinStaObj;
@ -886,7 +886,7 @@ NtUserCallNextHookEx(
BOOL Ansi) BOOL Ansi)
{ {
PHOOK HookObj, NextObj; PHOOK HookObj, NextObj;
PW32CLIENTINFO ClientInfo; PCLIENTINFO ClientInfo;
PWINSTATION_OBJECT WinStaObj; PWINSTATION_OBJECT WinStaObj;
NTSTATUS Status; NTSTATUS Status;
DECLARE_RETURN(LRESULT); DECLARE_RETURN(LRESULT);
@ -962,7 +962,7 @@ NtUserSetWindowsHookEx(
BOOL Ansi) BOOL Ansi)
{ {
PWINSTATION_OBJECT WinStaObj; PWINSTATION_OBJECT WinStaObj;
PW32CLIENTINFO ClientInfo; PCLIENTINFO ClientInfo;
BOOLEAN Global; BOOLEAN Global;
PETHREAD Thread; PETHREAD Thread;
PHOOK Hook; PHOOK Hook;

View file

@ -2110,7 +2110,7 @@ NtUserMessageCall(
case FNID_CALLWNDPROC: case FNID_CALLWNDPROC:
case FNID_CALLWNDPROCRET: case FNID_CALLWNDPROCRET:
{ {
PW32CLIENTINFO ClientInfo = GetWin32ClientInfo(); PCLIENTINFO ClientInfo = GetWin32ClientInfo();
PHOOK NextObj, Hook = ClientInfo->phkCurrent; PHOOK NextObj, Hook = ClientInfo->phkCurrent;
if (!ClientInfo || !Hook) break; if (!ClientInfo || !Hook) break;

View file

@ -437,7 +437,7 @@ GetW32ThreadInfo(VOID)
{ {
PTEB Teb; PTEB Teb;
PW32THREADINFO ti; PW32THREADINFO ti;
PW32CLIENTINFO ci; PCLIENTINFO ci;
PW32THREAD W32Thread = PsGetCurrentThreadWin32Thread(); PW32THREAD W32Thread = PsGetCurrentThreadWin32Thread();
if (W32Thread == NULL) if (W32Thread == NULL)
@ -477,7 +477,7 @@ GetW32ThreadInfo(VOID)
W32Thread->ThreadInfo = ti; W32Thread->ThreadInfo = ti;
/* update the TEB */ /* update the TEB */
Teb = NtCurrentTeb(); Teb = NtCurrentTeb();
ci = ((PW32CLIENTINFO)Teb->Win32ClientInfo); ci = GetWin32ClientInfo();
_SEH_TRY _SEH_TRY
{ {
ProbeForWrite(Teb, ProbeForWrite(Teb,

View file

@ -330,13 +330,13 @@ static void IntSendDestroyMsg(HWND hWnd)
static VOID static VOID
UserFreeWindowInfo(PW32THREADINFO ti, PWINDOW_OBJECT WindowObject) UserFreeWindowInfo(PW32THREADINFO ti, PWINDOW_OBJECT WindowObject)
{ {
PW32CLIENTINFO ClientInfo = GetWin32ClientInfo(); PCLIENTINFO ClientInfo = GetWin32ClientInfo();
PWINDOW Wnd = WindowObject->Wnd; PWINDOW Wnd = WindowObject->Wnd;
if (ClientInfo->pvWND == DesktopHeapAddressToUser(WindowObject->Wnd)) if (ClientInfo->CallbackWnd.pvWnd == DesktopHeapAddressToUser(WindowObject->Wnd))
{ {
ClientInfo->hWND = NULL; ClientInfo->CallbackWnd.hWnd = NULL;
ClientInfo->pvWND = NULL; ClientInfo->CallbackWnd.pvWnd = NULL;
} }
if (Wnd->WindowName.Buffer != NULL) if (Wnd->WindowName.Buffer != NULL)