- Implement SendMessageCallbackA/W, user32 only.

- Add client thread infomation structure to W32THREADINFO. Nothing is plugged in yet, the code is there.
- Fix IntBroadcastSystemMessage to correct filter action. More work is needed since our message system has issues.
- This could be a good project for newbies, rewrite message system could be placed into a branch.

svn path=/trunk/; revision=32884
This commit is contained in:
James Tabor 2008-04-06 18:24:30 +00:00
parent 03d8f3eaa9
commit 46780ff6d7
3 changed files with 66 additions and 41 deletions

View file

@ -1827,9 +1827,8 @@ SendMessageA(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
return Result; return Result;
} }
/* /*
* @unimplemented * @implemented
*/ */
BOOL BOOL
STDCALL STDCALL
@ -1841,13 +1840,17 @@ SendMessageCallbackA(
SENDASYNCPROC lpCallBack, SENDASYNCPROC lpCallBack,
ULONG_PTR dwData) ULONG_PTR dwData)
{ {
UNIMPLEMENTED; return NtUserMessageCall(hWnd,
return FALSE; Msg,
wParam,
lParam,
(ULONG_PTR)&lpCallBack,
NUMC_SENDMESSAGECALLBACK,
TRUE);
} }
/* /*
* @unimplemented * @implemented
*/ */
BOOL BOOL
STDCALL STDCALL
@ -1859,11 +1862,15 @@ SendMessageCallbackW(
SENDASYNCPROC lpCallBack, SENDASYNCPROC lpCallBack,
ULONG_PTR dwData) ULONG_PTR dwData)
{ {
UNIMPLEMENTED; return NtUserMessageCall(hWnd,
return FALSE; Msg,
wParam,
lParam,
(ULONG_PTR)&lpCallBack,
NUMC_SENDMESSAGECALLBACK,
FALSE);
} }
/* /*
* @implemented * @implemented
*/ */
@ -2303,21 +2310,9 @@ DWORD gfMessagePumpHook = 0;
BOOL WINAPI IsInsideMessagePumpHook() BOOL WINAPI IsInsideMessagePumpHook()
{ {
if(!gfMessagePumpHook) // PCLIENTTHREADINFO pcti = ((PW32CLIENTINFO)GetWin32ClientInfo())->pClientThreadInfo;
return FALSE; // return (gfMessagePumpHook && pcti && (pcti->dwcPumpHook > 0));
if(!gfMessagePumpHook) return FALSE;
/* This code checks if we're inside SendMessage. */
#if 0
/* Since our TEB doesnt match that of real windows, testing this value is useless until we know what it does
PUCHAR NtTeb = (PUCHAR)NtCurrentTeb();
if(!*(PLONG*)&NtTeb[0x708])
return FALSE;
if(**(PLONG*)&NtTeb[0x708] <= 0)
return FALSE;*/
#endif
return TRUE; return TRUE;
} }
@ -2564,6 +2559,9 @@ typedef struct _BROADCASTPARM
{ {
DWORD flags; DWORD flags;
LPDWORD recipients; LPDWORD recipients;
HDESK hDesk;
HWND hWnd;
LUID luid;
} BROADCASTPARM, *PBROADCASTPARM; } BROADCASTPARM, *PBROADCASTPARM;
LONG LONG
@ -2579,12 +2577,13 @@ IntBroadcastSystemMessage(
{ {
BROADCASTPARM parm; BROADCASTPARM parm;
DWORD recips = BSM_ALLCOMPONENTS; DWORD recips = BSM_ALLCOMPONENTS;
BOOL ret = TRUE; BOOL ret = -1; // Set to return fail
static const DWORD all_flags = ( BSF_QUERY | BSF_IGNORECURRENTTASK | BSF_FLUSHDISK | BSF_NOHANG static const DWORD all_flags = ( BSF_QUERY | BSF_IGNORECURRENTTASK | BSF_FLUSHDISK | BSF_NOHANG
| BSF_POSTMESSAGE | BSF_FORCEIFHUNG | BSF_NOTIMEOUTIFNOTHUNG | BSF_POSTMESSAGE | BSF_FORCEIFHUNG | BSF_NOTIMEOUTIFNOTHUNG
| BSF_ALLOWSFW | BSF_SENDNOTIFYMESSAGE | BSF_RETURNHDESK | BSF_LUID ); | BSF_ALLOWSFW | BSF_SENDNOTIFYMESSAGE | BSF_RETURNHDESK | BSF_LUID );
if (dwflags & ~all_flags) if ((dwflags & ~all_flags) ||
(!pBSMInfo && (dwflags & (BSF_RETURNHDESK|BSF_LUID))) )
{ {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
return 0; return 0;
@ -2596,25 +2595,38 @@ IntBroadcastSystemMessage(
return 0; return 0;
} }
if (dwflags & BSF_FORCEIFHUNG) dwflags |= BSF_NOHANG;
if (dwflags & BSF_QUERY) dwflags &= ~BSF_SENDNOTIFYMESSAGE|BSF_POSTMESSAGE;
if (!lpdwRecipients) if (!lpdwRecipients)
lpdwRecipients = &recips; lpdwRecipients = &recips;
if ( pBSMInfo && dwflags & BSF_QUERY ) if (*lpdwRecipients & ~(BSM_APPLICATIONS|BSM_ALLDESKTOPS|BSM_INSTALLABLEDRIVERS|BSM_NETDRIVER|BSM_VXDS))
{
SetLastError(ERROR_INVALID_PARAMETER);
return 0;
}
if ( pBSMInfo && (dwflags & BSF_QUERY) )
{ {
if (pBSMInfo->cbSize != sizeof(BSMINFO)) if (pBSMInfo->cbSize != sizeof(BSMINFO))
{ {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
return 0; return 0;
} }
FIXME("Not returning PBSMINFO information yet\n");
} }
parm.hDesk = NULL;
parm.hWnd = NULL;
parm.flags = dwflags; parm.flags = dwflags;
parm.recipients = lpdwRecipients; parm.recipients = lpdwRecipients;
if (dwflags & BSF_LUID) parm.luid = pBSMInfo->luid;
if (*lpdwRecipients & BSM_APPLICATIONS) if (*lpdwRecipients & BSM_APPLICATIONS)
{ {
return NtUserMessageCall(GetDesktopWindow(), ret = NtUserMessageCall(GetDesktopWindow(),
uiMessage, uiMessage,
wParam, wParam,
lParam, lParam,
@ -2622,11 +2634,15 @@ IntBroadcastSystemMessage(
NUMC_BROADCASTSYSTEMMESSAGE, NUMC_BROADCASTSYSTEMMESSAGE,
Ansi); Ansi);
} }
else
{
FIXME("Recipients %08x not supported!\n", *lpdwRecipients);
}
if (!ret)
{
if ( pBSMInfo && (dwflags & BSF_QUERY) )
{
pBSMInfo->hdesk = parm.hDesk;
pBSMInfo->hwnd = parm.hWnd;
}
}
return ret; return ret;
} }

View file

@ -181,6 +181,11 @@ typedef struct _W32PROCESSINFO
} W32PROCESSINFO, *PW32PROCESSINFO; } W32PROCESSINFO, *PW32PROCESSINFO;
typedef struct _CLIENTTHREADINFO
{
DWORD dwcPumpHook;
} CLIENTTHREADINFO, *PCLIENTTHREADINFO;
typedef struct _W32THREADINFO typedef struct _W32THREADINFO
{ {
PW32PROCESSINFO pi; /* [USER] */ PW32PROCESSINFO pi; /* [USER] */
@ -194,6 +199,7 @@ typedef struct _W32THREADINFO
/* Application compatibility flags */ /* Application compatibility flags */
DWORD AppCompatFlags; DWORD AppCompatFlags;
DWORD AppCompatFlags2; DWORD AppCompatFlags2;
CLIENTTHREADINFO ClientThreadInfo;
} W32THREADINFO, *PW32THREADINFO; } W32THREADINFO, *PW32THREADINFO;
/* Window Client Information structure */ /* Window Client Information structure */
@ -221,7 +227,7 @@ typedef struct _W32CLIENTINFO
PVOID pvWND; // " " PVOID pvWND; // " "
DWORD dwHookCurrent; DWORD dwHookCurrent;
ULONG Win32ClientInfo1; ULONG Win32ClientInfo1;
PVOID pClientThreadInfo; PCLIENTTHREADINFO pClientThreadInfo;
DWORD dwHookData; DWORD dwHookData;
ULONG Win32ClientInfo2[8]; ULONG Win32ClientInfo2[8];
HANDLE hKL; HANDLE hKL;

View file

@ -436,6 +436,7 @@ GetW32ThreadInfo(VOID)
{ {
PTEB Teb; PTEB Teb;
PW32THREADINFO ti; PW32THREADINFO ti;
// PW32CLIENTINFO ci;
PW32THREAD W32Thread = PsGetCurrentThreadWin32Thread(); PW32THREAD W32Thread = PsGetCurrentThreadWin32Thread();
if (W32Thread == NULL) if (W32Thread == NULL)
@ -475,6 +476,7 @@ GetW32ThreadInfo(VOID)
W32Thread->ThreadInfo = ti; W32Thread->ThreadInfo = ti;
/* update the TEB */ /* update the TEB */
Teb = NtCurrentTeb(); Teb = NtCurrentTeb();
// ci = GetWin32ClientInfo();
_SEH_TRY _SEH_TRY
{ {
ProbeForWrite(Teb, ProbeForWrite(Teb,
@ -482,6 +484,7 @@ GetW32ThreadInfo(VOID)
sizeof(ULONG)); sizeof(ULONG));
Teb->Win32ThreadInfo = UserHeapAddressToUser(W32Thread->ThreadInfo); Teb->Win32ThreadInfo = UserHeapAddressToUser(W32Thread->ThreadInfo);
// ci->pClientThreadInfo = UserHeapAddressToUser(&ti->ClientThreadInfo);
} }
_SEH_HANDLE _SEH_HANDLE
{ {