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.
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
++)
54 if (!(WndChild
= UserGetWindowObject(List
[i
])))
57 if (wParam
& MCS_QUERYENDSESSION
)
59 if (!co_IntSendMessage(WndChild
->head
.h
, WM_QUERYENDSESSION
, 0, lParams
))
61 lResult
= MCSR_DONOTSHUTDOWN
;
67 co_IntSendMessage(WndChild
->head
.h
, WM_ENDSESSION
, KillTimers
, lParams
);
70 DestroyTimersForWindow(WndChild
->head
.pti
, WndChild
);
72 lResult
= MCSR_SHUTDOWNFINISHED
;
77 if (List
&& (lResult
== MCSR_DONOTSHUTDOWN
)) return lResult
;
81 if (wParam
& MCS_QUERYENDSESSION
)
83 if (!co_IntSendMessage(pWindow
->head
.h
, WM_QUERYENDSESSION
, 0, lParams
))
85 lResult
= MCSR_DONOTSHUTDOWN
;
90 co_IntSendMessage(pWindow
->head
.h
, WM_ENDSESSION
, KillTimers
, lParams
);
93 DestroyTimersForWindow(pWindow
->head
.pti
, pWindow
);
95 lResult
= MCSR_SHUTDOWNFINISHED
;
101 Win32k counterpart of User DefWindowProc
113 if (Msg
> WM_USER
) return 0;
119 DPRINT1("hwnd %p WM_SYSCOMMAND %lx %lx\n", Wnd
->head
.h
, wParam
, lParam
);
120 lResult
= co_HOOK_CallHooks(WH_CBT
, HCBT_SYSCOMMAND
, wParam
, lParam
);
125 if ((Wnd
->style
& WS_VISIBLE
) && wParam
) break;
126 if (!(Wnd
->style
& WS_VISIBLE
) && !wParam
) break;
127 if (!Wnd
->spwndOwner
) break;
132 if (!(Wnd
->state
& WNDS_HIDDENPOPUP
)) break;
133 Wnd
->state
&= ~WNDS_HIDDENPOPUP
;
136 Wnd
->state
|= WNDS_HIDDENPOPUP
;
138 co_WinPosShowWindow(Wnd
, wParam
? SW_SHOWNOACTIVATE
: SW_HIDE
);
142 case WM_CLIENTSHUTDOWN
:
143 return IntClientShutdown(Wnd
, wParam
, lParam
);
157 ProbeForRead((PVOID
)lParam
,
165 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
172 lResult
= co_HOOK_CallHooks(WH_CBT
, HCBT_MOVESIZE
, (WPARAM
)Wnd
->head
.h
, lParam
? (LPARAM
)&rt
: 0);