- If given the EWX_FORCE flag, ExitWindowsEx() should not send the
WM_{QUERY}ENDSESSION messages. - Add support for EWX_FORCEIFHUNG. - ExitWindowsEx() should return true if it succeeds, even if the user cancels the shutdown. - Don't crash if there are no windows.
This commit is contained in:
parent
d06a464ce9
commit
20afe30d76
|
@ -409,31 +409,37 @@ static BOOL USER_StartRebootProcess(void)
|
||||||
BOOL WINAPI ExitWindowsEx( UINT flags, DWORD reserved )
|
BOOL WINAPI ExitWindowsEx( UINT flags, DWORD reserved )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
BOOL result;
|
BOOL result = FALSE;
|
||||||
HWND *list, *phwnd;
|
HWND *list, *phwnd;
|
||||||
|
|
||||||
/* We have to build a list of all windows first, as in EnumWindows */
|
/* We have to build a list of all windows first, as in EnumWindows */
|
||||||
|
TRACE("(%x,%lx)\n", flags, reserved);
|
||||||
|
|
||||||
if (!(list = WIN_ListChildren( GetDesktopWindow() ))) return FALSE;
|
list = WIN_ListChildren( GetDesktopWindow() );
|
||||||
|
if (list)
|
||||||
/* Send a WM_QUERYENDSESSION message to every window */
|
|
||||||
|
|
||||||
for (i = 0; list[i]; i++)
|
|
||||||
{
|
{
|
||||||
/* Make sure that the window still exists */
|
/* Send a WM_QUERYENDSESSION message to every window */
|
||||||
if (!IsWindow( list[i] )) continue;
|
|
||||||
if (!SendMessageW( list[i], WM_QUERYENDSESSION, 0, 0 )) break;
|
|
||||||
}
|
|
||||||
result = !list[i];
|
|
||||||
|
|
||||||
/* Now notify all windows that got a WM_QUERYENDSESSION of the result */
|
for (i = 0; list[i]; i++)
|
||||||
|
{
|
||||||
|
/* Make sure that the window still exists */
|
||||||
|
if (!IsWindow( list[i] )) continue;
|
||||||
|
if (!SendMessageW( list[i], WM_QUERYENDSESSION, 0, 0 )) break;
|
||||||
|
}
|
||||||
|
result = !list[i];
|
||||||
|
|
||||||
for (phwnd = list; i > 0; i--, phwnd++)
|
/* Now notify all windows that got a WM_QUERYENDSESSION of the result */
|
||||||
{
|
|
||||||
if (!IsWindow( *phwnd )) continue;
|
for (phwnd = list; i > 0; i--, phwnd++)
|
||||||
SendMessageW( *phwnd, WM_ENDSESSION, result, 0 );
|
{
|
||||||
|
if (!IsWindow( *phwnd )) continue;
|
||||||
|
SendMessageW( *phwnd, WM_ENDSESSION, result, 0 );
|
||||||
|
}
|
||||||
|
HeapFree( GetProcessHeap(), 0, list );
|
||||||
|
|
||||||
|
if ( !(result || (flags & EWX_FORCE) ))
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
HeapFree( GetProcessHeap(), 0, list );
|
|
||||||
|
|
||||||
/* USER_DoShutdown will kill all processes except the current process */
|
/* USER_DoShutdown will kill all processes except the current process */
|
||||||
USER_DoShutdown();
|
USER_DoShutdown();
|
||||||
|
|
Loading…
Reference in New Issue