From e10e14dcd456dce3f4b399f43468d331cd52c40b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Fri, 28 Nov 2014 21:48:44 +0000 Subject: [PATCH] [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 --- reactos/win32ss/CMakeLists.txt | 1 + reactos/win32ss/gdi/ntgdi/gdidbg.c | 1 + reactos/win32ss/user/ntuser/defwnd.c | 87 +------------------- reactos/win32ss/user/ntuser/shutdown.c | 96 +++++++++++++++++++++++ reactos/win32ss/user/ntuser/shutdown.h | 6 ++ reactos/win32ss/user/ntuser/win32kdebug.h | 1 + reactos/win32ss/win32kp.h | 1 + 7 files changed, 107 insertions(+), 86 deletions(-) create mode 100644 reactos/win32ss/user/ntuser/shutdown.c create mode 100644 reactos/win32ss/user/ntuser/shutdown.h diff --git a/reactos/win32ss/CMakeLists.txt b/reactos/win32ss/CMakeLists.txt index e5bfa1d41eb..87260ae6f50 100644 --- a/reactos/win32ss/CMakeLists.txt +++ b/reactos/win32ss/CMakeLists.txt @@ -130,6 +130,7 @@ list(APPEND SOURCE user/ntuser/prop.c user/ntuser/scrollbar.c user/ntuser/session.c + user/ntuser/shutdown.c user/ntuser/simplecall.c user/ntuser/sysparams.c user/ntuser/timer.c diff --git a/reactos/win32ss/gdi/ntgdi/gdidbg.c b/reactos/win32ss/gdi/ntgdi/gdidbg.c index ef8f6296c64..b92ee0ae04b 100644 --- a/reactos/win32ss/gdi/ntgdi/gdidbg.c +++ b/reactos/win32ss/gdi/ntgdi/gdidbg.c @@ -85,6 +85,7 @@ DBG_CHANNEL DbgChannels[DbgChCount]={ {L"UserProcess", DbgChUserProcess}, {L"UserProp", DbgChUserProp}, {L"UserScrollbar", DbgChUserScrollbar}, + {L"UserShutdown", DbgChUserShutdown}, {L"UserSysparams", DbgChUserSysparams}, {L"UserTimer", DbgChUserTimer}, {L"UserThread", DbgChUserThread}, diff --git a/reactos/win32ss/user/ntuser/defwnd.c b/reactos/win32ss/user/ntuser/defwnd.c index 1fbd21a7757..cfdfb921116 100644 --- a/reactos/win32ss/user/ntuser/defwnd.c +++ b/reactos/win32ss/user/ntuser/defwnd.c @@ -7,7 +7,6 @@ */ #include - #include DBG_DEFAULT_CHANNEL(UserDefwnd); @@ -32,91 +31,6 @@ DBG_DEFAULT_CHANNEL(UserDefwnd); #define ON_BOTTOM_BORDER(hit) \ (((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 DefWndControlColor(HDC hDC, UINT ctlType) { @@ -916,6 +830,7 @@ IntDefWindowProc( } } break; + case WM_CLIENTSHUTDOWN: return IntClientShutdown(Wnd, wParam, lParam); diff --git a/reactos/win32ss/user/ntuser/shutdown.c b/reactos/win32ss/user/ntuser/shutdown.c new file mode 100644 index 00000000000..4a2496980f0 --- /dev/null +++ b/reactos/win32ss/user/ntuser/shutdown.c @@ -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 +// 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 */ diff --git a/reactos/win32ss/user/ntuser/shutdown.h b/reactos/win32ss/user/ntuser/shutdown.h new file mode 100644 index 00000000000..b60d55c54e8 --- /dev/null +++ b/reactos/win32ss/user/ntuser/shutdown.h @@ -0,0 +1,6 @@ +#pragma once + +LRESULT +IntClientShutdown(IN PWND pWindow, + IN WPARAM wParam, + IN LPARAM lParam); diff --git a/reactos/win32ss/user/ntuser/win32kdebug.h b/reactos/win32ss/user/ntuser/win32kdebug.h index 0d405c80e7a..0259d6704e8 100644 --- a/reactos/win32ss/user/ntuser/win32kdebug.h +++ b/reactos/win32ss/user/ntuser/win32kdebug.h @@ -109,6 +109,7 @@ DbgChUserProcess, DbgChUserProp, DbgChUserScrollbar, + DbgChUserShutdown, DbgChUserSysparams, DbgChUserThread, DbgChUserTimer, diff --git a/reactos/win32ss/win32kp.h b/reactos/win32ss/win32kp.h index daca0222325..5e60855f84e 100644 --- a/reactos/win32ss/win32kp.h +++ b/reactos/win32ss/win32kp.h @@ -75,6 +75,7 @@ typedef struct _DESKTOP *PDESKTOP; #include "user/ntuser/win32.h" #include "user/ntuser/object.h" #include "user/ntuser/ntuser.h" +#include "user/ntuser/shutdown.h" #include "user/ntuser/cursoricon.h" #include "user/ntuser/accelerator.h" #include "user/ntuser/hook.h"