[Win32k|User32]

- Fix broadcast message, pass all wine tests. Code consolidation next round.

svn path=/trunk/; revision=54376
This commit is contained in:
James Tabor 2011-11-14 15:20:48 +00:00
parent d14aee58bb
commit 37fe8c8eff
2 changed files with 280 additions and 50 deletions

View file

@ -3059,8 +3059,6 @@ IntBroadcastSystemMessage(
if (dwflags & BSF_LUID) parm.luid = pBSMInfo->luid; if (dwflags & BSF_LUID) parm.luid = pBSMInfo->luid;
if (*lpdwRecipients & BSM_APPLICATIONS)
{
ret = NtUserMessageCall(GetDesktopWindow(), ret = NtUserMessageCall(GetDesktopWindow(),
uiMessage, uiMessage,
wParam, wParam,
@ -3068,7 +3066,6 @@ IntBroadcastSystemMessage(
(ULONG_PTR)&parm, (ULONG_PTR)&parm,
FNID_BROADCASTSYSTEMMESSAGE, FNID_BROADCASTSYSTEMMESSAGE,
Ansi); Ansi);
}
if (!ret) if (!ret)
{ {

View file

@ -2066,7 +2066,7 @@ NtUserMessageCall( HWND hWnd,
break; break;
case FNID_BROADCASTSYSTEMMESSAGE: case FNID_BROADCASTSYSTEMMESSAGE:
{ {
BROADCASTPARM parm; BROADCASTPARM parm, *retparam;
DWORD_PTR RetVal = 0; DWORD_PTR RetVal = 0;
if (ResultInfo) if (ResultInfo)
@ -2088,50 +2088,283 @@ NtUserMessageCall( HWND hWnd,
if ( parm.recipients & BSM_ALLDESKTOPS || if ( parm.recipients & BSM_ALLDESKTOPS ||
parm.recipients == BSM_ALLCOMPONENTS ) parm.recipients == BSM_ALLCOMPONENTS )
{ {
} PLIST_ENTRY DesktopEntry;
else if (parm.recipients & BSM_APPLICATIONS) PDESKTOP rpdesk;
HWND *List, hwndDenied = NULL;
HDESK hDesk = NULL;
PWND pwnd, pwndDesk;
ULONG i;
UINT fuFlags;
for (DesktopEntry = InputWindowStation->DesktopListHead.Flink;
DesktopEntry != &InputWindowStation->DesktopListHead;
DesktopEntry = DesktopEntry->Flink)
{ {
rpdesk = CONTAINING_RECORD(DesktopEntry, DESKTOP, ListEntry);
pwndDesk = rpdesk->pDeskInfo->spwnd;
List = IntWinListChildren(pwndDesk);
if (parm.flags & BSF_QUERY) if (parm.flags & BSF_QUERY)
{
if (List != NULL)
{ {
if (parm.flags & BSF_FORCEIFHUNG || parm.flags & BSF_NOHANG) if (parm.flags & BSF_FORCEIFHUNG || parm.flags & BSF_NOHANG)
{ {
co_IntSendMessageTimeout( HWND_BROADCAST, fuFlags = SMTO_ABORTIFHUNG;
Msg,
wParam,
lParam,
SMTO_ABORTIFHUNG,
2000,
&RetVal);
} }
else if (parm.flags & BSF_NOTIMEOUTIFNOTHUNG) else if (parm.flags & BSF_NOTIMEOUTIFNOTHUNG)
{ {
co_IntSendMessageTimeout( HWND_BROADCAST, fuFlags = SMTO_NOTIMEOUTIFNOTHUNG;
Msg,
wParam,
lParam,
SMTO_NOTIMEOUTIFNOTHUNG,
2000,
&RetVal);
} }
else else
{ {
co_IntSendMessageTimeout( HWND_BROADCAST, fuFlags = SMTO_NORMAL;
}
co_IntSendMessageTimeout( UserHMGetHandle(pwndDesk),
Msg, Msg,
wParam, wParam,
lParam, lParam,
SMTO_NORMAL, fuFlags,
2000, 2000,
&RetVal); &RetVal);
Ret = TRUE;
for (i = 0; List[i]; i++)
{
pwnd = UserGetWindowObject(List[i]);
if (!pwnd) continue;
if ( pwnd->fnid == FNID_MENU ||
pwnd->pcls->atomClassName == gpsi->atomSysClass[ICLS_SWITCH] )
continue;
if ( parm.flags & BSF_IGNORECURRENTTASK )
{
if ( pwnd->head.pti->MessageQueue == gptiCurrent->MessageQueue )
continue;
}
co_IntSendMessageTimeout( List[i],
Msg,
wParam,
lParam,
fuFlags,
2000,
&RetVal);
if (!RetVal && EngGetLastError() == ERROR_TIMEOUT)
{
if (!(parm.flags & BSF_FORCEIFHUNG))
Ret = FALSE;
}
if (RetVal == BROADCAST_QUERY_DENY)
{
hwndDenied = List[i];
hDesk = UserHMGetHandle(pwndDesk);
Ret = FALSE;
}
}
ExFreePoolWithTag(List, USERTAG_WINDOWLIST);
_SEH2_TRY
{
retparam = (PBROADCASTPARM) ResultInfo;
retparam->hDesk = hDesk;
retparam->hWnd = hwndDenied;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
_SEH2_YIELD(break);
}
_SEH2_END;
if (!Ret) break; // Have a hit! Let everyone know!
} }
Ret = RetVal;
} }
else if (parm.flags & BSF_POSTMESSAGE) else if (parm.flags & BSF_POSTMESSAGE)
{ {
Ret = UserPostMessage(HWND_BROADCAST, Msg, wParam, lParam); if (List != NULL)
}
else //Everything else,,,, if ( parm.flags & BSF_SENDNOTIFYMESSAGE)
{ {
Ret = UserSendNotifyMessage(HWND_BROADCAST, Msg, wParam, lParam); UserPostMessage(UserHMGetHandle(pwndDesk), Msg, wParam, lParam);
for (i = 0; List[i]; i++)
{
pwnd = UserGetWindowObject(List[i]);
if (!pwnd) continue;
if ( pwnd->fnid == FNID_MENU ||
pwnd->pcls->atomClassName == gpsi->atomSysClass[ICLS_SWITCH] )
continue;
if ( parm.flags & BSF_IGNORECURRENTTASK )
{
if ( pwnd->head.pti->MessageQueue == gptiCurrent->MessageQueue )
continue;
}
UserPostMessage(List[i], Msg, wParam, lParam);
}
ExFreePoolWithTag(List, USERTAG_WINDOWLIST);
}
Ret = TRUE;
}
else
{
if (List != NULL)
{
UserSendNotifyMessage(UserHMGetHandle(pwndDesk), Msg, wParam, lParam);
for (i = 0; List[i]; i++)
{
pwnd = UserGetWindowObject(List[i]);
if (!pwnd) continue;
if ( pwnd->fnid == FNID_MENU ||
pwnd->pcls->atomClassName == gpsi->atomSysClass[ICLS_SWITCH] )
continue;
if ( parm.flags & BSF_IGNORECURRENTTASK )
{
if ( pwnd->head.pti->MessageQueue == gptiCurrent->MessageQueue )
continue;
}
UserSendNotifyMessage(List[i], Msg, wParam, lParam);
}
ExFreePoolWithTag(List, USERTAG_WINDOWLIST);
}
Ret = TRUE;
}
}
}
else if (parm.recipients & BSM_APPLICATIONS)
{
HWND *List, hwndDenied = NULL;
HDESK hDesk = NULL;
PWND pwnd, pwndDesk;
ULONG i;
UINT fuFlags;
pwndDesk = UserGetWindowObject(IntGetDesktopWindow());
List = IntWinListChildren(pwndDesk);
if (parm.flags & BSF_QUERY)
{
if (List != NULL)
{
if (parm.flags & BSF_FORCEIFHUNG || parm.flags & BSF_NOHANG)
{
fuFlags = SMTO_ABORTIFHUNG;
}
else if (parm.flags & BSF_NOTIMEOUTIFNOTHUNG)
{
fuFlags = SMTO_NOTIMEOUTIFNOTHUNG;
}
else
{
fuFlags = SMTO_NORMAL;
}
co_IntSendMessageTimeout( UserHMGetHandle(pwndDesk),
Msg,
wParam,
lParam,
fuFlags,
2000,
&RetVal);
Ret = TRUE;
for (i = 0; List[i]; i++)
{
pwnd = UserGetWindowObject(List[i]);
if (!pwnd) continue;
if ( pwnd->fnid == FNID_MENU ||
pwnd->pcls->atomClassName == gpsi->atomSysClass[ICLS_SWITCH] )
continue;
if ( parm.flags & BSF_IGNORECURRENTTASK )
{
if ( pwnd->head.pti->MessageQueue == gptiCurrent->MessageQueue )
continue;
}
co_IntSendMessageTimeout( List[i],
Msg,
wParam,
lParam,
fuFlags,
2000,
&RetVal);
if (!RetVal && EngGetLastError() == ERROR_TIMEOUT)
{
if (!(parm.flags & BSF_FORCEIFHUNG))
Ret = FALSE;
}
if (RetVal == BROADCAST_QUERY_DENY)
{
hwndDenied = List[i];
hDesk = UserHMGetHandle(pwndDesk);
Ret = FALSE;
}
}
ExFreePoolWithTag(List, USERTAG_WINDOWLIST);
_SEH2_TRY
{
retparam = (PBROADCASTPARM) ResultInfo;
retparam->hDesk = hDesk;
retparam->hWnd = hwndDenied;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
_SEH2_YIELD(break);
}
_SEH2_END;
}
}
else if (parm.flags & BSF_POSTMESSAGE)
{
if (List != NULL)
{
UserPostMessage(UserHMGetHandle(pwndDesk), Msg, wParam, lParam);
for (i = 0; List[i]; i++)
{
pwnd = UserGetWindowObject(List[i]);
if (!pwnd) continue;
if ( pwnd->fnid == FNID_MENU ||
pwnd->pcls->atomClassName == gpsi->atomSysClass[ICLS_SWITCH] )
continue;
if ( parm.flags & BSF_IGNORECURRENTTASK )
{
if ( pwnd->head.pti->MessageQueue == gptiCurrent->MessageQueue )
continue;
}
UserPostMessage(List[i], Msg, wParam, lParam);
}
ExFreePoolWithTag(List, USERTAG_WINDOWLIST);
}
Ret = TRUE;
}
else
{
if (List != NULL)
{
UserSendNotifyMessage(UserHMGetHandle(pwndDesk), Msg, wParam, lParam);
for (i = 0; List[i]; i++)
{
pwnd = UserGetWindowObject(List[i]);
if (!pwnd) continue;
if ( pwnd->fnid == FNID_MENU ||
pwnd->pcls->atomClassName == gpsi->atomSysClass[ICLS_SWITCH] )
continue;
if ( parm.flags & BSF_IGNORECURRENTTASK )
{
if ( pwnd->head.pti->MessageQueue == gptiCurrent->MessageQueue )
continue;
}
UserSendNotifyMessage(List[i], Msg, wParam, lParam);
}
ExFreePoolWithTag(List, USERTAG_WINDOWLIST);
}
Ret = TRUE;
} }
} }
} }