[WIN32K]: Move IntClientShutdown function to a dedicated file (that will contain other shutdown helper functions in the future). Part 3/X

CORE-8322

svn path=/trunk/; revision=65517
This commit is contained in:
Hermès Bélusca-Maïto 2014-11-28 21:48:44 +00:00
parent 331ed663bf
commit e10e14dcd4
7 changed files with 107 additions and 86 deletions

View file

@ -130,6 +130,7 @@ list(APPEND SOURCE
user/ntuser/prop.c user/ntuser/prop.c
user/ntuser/scrollbar.c user/ntuser/scrollbar.c
user/ntuser/session.c user/ntuser/session.c
user/ntuser/shutdown.c
user/ntuser/simplecall.c user/ntuser/simplecall.c
user/ntuser/sysparams.c user/ntuser/sysparams.c
user/ntuser/timer.c user/ntuser/timer.c

View file

@ -85,6 +85,7 @@ DBG_CHANNEL DbgChannels[DbgChCount]={
{L"UserProcess", DbgChUserProcess}, {L"UserProcess", DbgChUserProcess},
{L"UserProp", DbgChUserProp}, {L"UserProp", DbgChUserProp},
{L"UserScrollbar", DbgChUserScrollbar}, {L"UserScrollbar", DbgChUserScrollbar},
{L"UserShutdown", DbgChUserShutdown},
{L"UserSysparams", DbgChUserSysparams}, {L"UserSysparams", DbgChUserSysparams},
{L"UserTimer", DbgChUserTimer}, {L"UserTimer", DbgChUserTimer},
{L"UserThread", DbgChUserThread}, {L"UserThread", DbgChUserThread},

View file

@ -7,7 +7,6 @@
*/ */
#include <win32k.h> #include <win32k.h>
#include <windowsx.h> #include <windowsx.h>
DBG_DEFAULT_CHANNEL(UserDefwnd); DBG_DEFAULT_CHANNEL(UserDefwnd);
@ -32,91 +31,6 @@ DBG_DEFAULT_CHANNEL(UserDefwnd);
#define ON_BOTTOM_BORDER(hit) \ #define ON_BOTTOM_BORDER(hit) \
(((hit) == HTBOTTOM) || ((hit) == HTBOTTOMLEFT) || ((hit) == HTBOTTOMRIGHT)) (((hit) == HTBOTTOM) || ((hit) == HTBOTTOMLEFT) || ((hit) == HTBOTTOMRIGHT))
// Client Shutdown messages
#define MCS_SHUTDOWNTIMERS 1
#define MCS_QUERYENDSESSION 2
// Client Shutdown returns
#define MCSR_GOODFORSHUTDOWN 1
#define MCSR_SHUTDOWNFINISHED 2
#define MCSR_DONOTSHUTDOWN 3
/*
* Based on CSRSS and described in pages 1115 - 1118 "Windows Internals, Fifth Edition".
* Apparently CSRSS sends out messages to do this w/o going into win32k internals.
*/
static
LRESULT FASTCALL
IntClientShutdown(
PWND pWindow,
WPARAM wParam,
LPARAM lParam
)
{
LPARAM lParams;
BOOL KillTimers;
INT i;
LRESULT lResult = MCSR_GOODFORSHUTDOWN;
HWND *List;
lParams = wParam & (ENDSESSION_LOGOFF|ENDSESSION_CRITICAL|ENDSESSION_CLOSEAPP);
KillTimers = wParam & MCS_SHUTDOWNTIMERS ? TRUE : FALSE;
/*
First, send end sessions to children.
*/
List = IntWinListChildren(pWindow);
if (List)
{
for (i = 0; List[i]; i++)
{
PWND WndChild;
if (!(WndChild = UserGetWindowObject(List[i])))
continue;
if (wParam & MCS_QUERYENDSESSION)
{
if (!co_IntSendMessage(WndChild->head.h, WM_QUERYENDSESSION, 0, lParams))
{
lResult = MCSR_DONOTSHUTDOWN;
break;
}
}
else
{
co_IntSendMessage(WndChild->head.h, WM_ENDSESSION, KillTimers, lParams);
if (KillTimers)
{
DestroyTimersForWindow(WndChild->head.pti, WndChild);
}
lResult = MCSR_SHUTDOWNFINISHED;
}
}
ExFreePoolWithTag(List, USERTAG_WINDOWLIST);
}
if (List && (lResult == MCSR_DONOTSHUTDOWN)) return lResult;
/*
Send to the caller.
*/
if (wParam & MCS_QUERYENDSESSION)
{
if (!co_IntSendMessage(pWindow->head.h, WM_QUERYENDSESSION, 0, lParams))
{
lResult = MCSR_DONOTSHUTDOWN;
}
}
else
{
co_IntSendMessage(pWindow->head.h, WM_ENDSESSION, KillTimers, lParams);
if (KillTimers)
{
DestroyTimersForWindow(pWindow->head.pti, pWindow);
}
lResult = MCSR_SHUTDOWNFINISHED;
}
return lResult;
}
HBRUSH FASTCALL HBRUSH FASTCALL
DefWndControlColor(HDC hDC, UINT ctlType) DefWndControlColor(HDC hDC, UINT ctlType)
{ {
@ -916,6 +830,7 @@ IntDefWindowProc(
} }
} }
break; break;
case WM_CLIENTSHUTDOWN: case WM_CLIENTSHUTDOWN:
return IntClientShutdown(Wnd, wParam, lParam); return IntClientShutdown(Wnd, wParam, lParam);

View file

@ -0,0 +1,96 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Win32k subsystem
* PURPOSE: Shutdown routines
* FILE: subsystems/win32/win32k/ntuser/shutdown.c
* PROGRAMER: Hermes Belusca
*/
#include <win32k.h>
// DBG_DEFAULT_CHANNEL(UserShutdown);
// Client Shutdown messages
#define MCS_SHUTDOWNTIMERS 1
#define MCS_QUERYENDSESSION 2
// Client Shutdown returns
#define MCSR_GOODFORSHUTDOWN 1
#define MCSR_SHUTDOWNFINISHED 2
#define MCSR_DONOTSHUTDOWN 3
/*
* Based on CSRSS and described in pages 1115 - 1118 "Windows Internals, Fifth Edition".
* CSRSS sends WM_CLIENTSHUTDOWN messages to top-level windows, and it is our job
* to send WM_QUERYENDSESSION / WM_ENDSESSION messages in response.
*/
LRESULT
IntClientShutdown(IN PWND pWindow,
IN WPARAM wParam,
IN LPARAM lParam)
{
LPARAM lParams;
BOOL KillTimers;
INT i;
LRESULT lResult = MCSR_GOODFORSHUTDOWN;
HWND *List;
lParams = wParam & (ENDSESSION_LOGOFF|ENDSESSION_CRITICAL|ENDSESSION_CLOSEAPP);
KillTimers = wParam & MCS_SHUTDOWNTIMERS ? TRUE : FALSE;
/* First, send end sessions to children */
List = IntWinListChildren(pWindow);
if (List)
{
for (i = 0; List[i]; i++)
{
PWND WndChild;
if (!(WndChild = UserGetWindowObject(List[i])))
continue;
if (wParam & MCS_QUERYENDSESSION)
{
if (!co_IntSendMessage(WndChild->head.h, WM_QUERYENDSESSION, 0, lParams))
{
lResult = MCSR_DONOTSHUTDOWN;
break;
}
}
else
{
co_IntSendMessage(WndChild->head.h, WM_ENDSESSION, KillTimers, lParams);
if (KillTimers)
{
DestroyTimersForWindow(WndChild->head.pti, WndChild);
}
lResult = MCSR_SHUTDOWNFINISHED;
}
}
ExFreePoolWithTag(List, USERTAG_WINDOWLIST);
}
if (List && (lResult == MCSR_DONOTSHUTDOWN))
return lResult;
/* Send to the caller */
if (wParam & MCS_QUERYENDSESSION)
{
if (!co_IntSendMessage(pWindow->head.h, WM_QUERYENDSESSION, 0, lParams))
{
lResult = MCSR_DONOTSHUTDOWN;
}
}
else
{
co_IntSendMessage(pWindow->head.h, WM_ENDSESSION, KillTimers, lParams);
if (KillTimers)
{
DestroyTimersForWindow(pWindow->head.pti, pWindow);
}
lResult = MCSR_SHUTDOWNFINISHED;
}
return lResult;
}
/* EOF */

View file

@ -0,0 +1,6 @@
#pragma once
LRESULT
IntClientShutdown(IN PWND pWindow,
IN WPARAM wParam,
IN LPARAM lParam);

View file

@ -109,6 +109,7 @@
DbgChUserProcess, DbgChUserProcess,
DbgChUserProp, DbgChUserProp,
DbgChUserScrollbar, DbgChUserScrollbar,
DbgChUserShutdown,
DbgChUserSysparams, DbgChUserSysparams,
DbgChUserThread, DbgChUserThread,
DbgChUserTimer, DbgChUserTimer,

View file

@ -75,6 +75,7 @@ typedef struct _DESKTOP *PDESKTOP;
#include "user/ntuser/win32.h" #include "user/ntuser/win32.h"
#include "user/ntuser/object.h" #include "user/ntuser/object.h"
#include "user/ntuser/ntuser.h" #include "user/ntuser/ntuser.h"
#include "user/ntuser/shutdown.h"
#include "user/ntuser/cursoricon.h" #include "user/ntuser/cursoricon.h"
#include "user/ntuser/accelerator.h" #include "user/ntuser/accelerator.h"
#include "user/ntuser/hook.h" #include "user/ntuser/hook.h"