2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: Misc User funcs
5 * FILE: subsystem/win32/win32k/ntuser/defwnd.c
15 // Client Shutdown messages
16 #define MCS_SHUTDOWNTIMERS 1
17 #define MCS_QUERYENDSESSION 2
18 // Client Shutdown returns
19 #define MCSR_GOODFORSHUTDOWN 1
20 #define MCSR_SHUTDOWNFINISHED 2
21 #define MCSR_DONOTSHUTDOWN 3
24 Based on CSRSS and described in pages 1115 - 1118 "Windows Internals, Fifth Edition".
25 Apparently CSRSS sends out messages to do this w/o going into win32k internals.
30 PWINDOW_OBJECT pWindow
,
38 LRESULT lResult
= MCSR_GOODFORSHUTDOWN
;
41 lParams
= wParam
& (ENDSESSION_LOGOFF
|ENDSESSION_CRITICAL
|ENDSESSION_CLOSEAPP
);
42 KillTimers
= wParam
& MCS_SHUTDOWNTIMERS
? TRUE
: FALSE
;
44 First, send end sessions to children.
46 List
= IntWinListChildren(pWindow
);
50 for (i
= 0; List
[i
]; i
++)
52 PWINDOW_OBJECT WndChild
;
54 if (!(WndChild
= UserGetWindowObject(List
[i
])) || !WndChild
->Wnd
)
57 if (wParam
& MCS_QUERYENDSESSION
)
59 if (!co_IntSendMessage(WndChild
->hSelf
, WM_QUERYENDSESSION
, 0, lParams
))
61 lResult
= MCSR_DONOTSHUTDOWN
;
67 co_IntSendMessage(WndChild
->hSelf
, WM_ENDSESSION
, KillTimers
, lParams
);
70 MsqRemoveTimersWindow(WndChild
->pti
->MessageQueue
, WndChild
->hSelf
);
72 lResult
= MCSR_SHUTDOWNFINISHED
;
77 if (List
&& (lResult
== MCSR_DONOTSHUTDOWN
)) return lResult
;
81 if (wParam
& MCS_QUERYENDSESSION
)
83 if (!co_IntSendMessage(pWindow
->hSelf
, WM_QUERYENDSESSION
, 0, lParams
))
85 lResult
= MCSR_DONOTSHUTDOWN
;
90 co_IntSendMessage(pWindow
->hSelf
, WM_ENDSESSION
, KillTimers
, lParams
);
93 MsqRemoveTimersWindow(pWindow
->pti
->MessageQueue
, pWindow
->hSelf
);
95 lResult
= MCSR_SHUTDOWNFINISHED
;
101 Win32k counterpart of User DefWindowProc
105 PWINDOW_OBJECT Window
,
114 if (Msg
> WM_USER
) return 0;
123 DPRINT1("hwnd %p WM_SYSCOMMAND %lx %lx\n", Window
->hSelf
, wParam
, lParam
);
124 if (!ISITHOOKED(WH_CBT
)) break;
125 lResult
= co_HOOK_CallHooks(WH_CBT
, HCBT_SYSCOMMAND
, wParam
, lParam
);
130 if ((Wnd
->style
& WS_VISIBLE
) && wParam
) break;
131 if (!(Wnd
->style
& WS_VISIBLE
) && !wParam
) break;
132 if (!Window
->hOwner
) break;
137 if (!(Wnd
->state
& WNDS_HIDDENPOPUP
)) break;
138 Wnd
->state
&= ~WNDS_HIDDENPOPUP
;
141 Wnd
->state
|= WNDS_HIDDENPOPUP
;
143 co_WinPosShowWindow(Window
, wParam
? SW_SHOWNOACTIVATE
: SW_HIDE
);
147 case WM_CLIENTSHUTDOWN
:
148 return IntClientShutdown(Window
, wParam
, lParam
);
152 if (!ISITHOOKED(WH_CBT
)) break;
164 ProbeForRead((PVOID
)lParam
,
172 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
179 lResult
= co_HOOK_CallHooks(WH_CBT
, HCBT_MOVESIZE
, (WPARAM
)Window
->hSelf
, lParam
? (LPARAM
)&rt
: 0);