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 DefWndHandleSysCommand(PWND pWnd
, WPARAM wParam
, LPARAM lParam
)
106 if (ISITHOOKED(WH_CBT
) || (pWnd
->head
.rpdesk
->pDeskInfo
->fsHooks
& HOOKID_TO_FLAG(WH_CBT
)))
109 lResult
= co_HOOK_CallHooks(WH_CBT
, HCBT_SYSCOMMAND
, wParam
, lParam
);
111 if (lResult
) return lResult
;
114 switch (wParam
& 0xfff0)
117 DPRINT1("Screensaver Called!\n");
125 return(Hook
? 1 : 0); // Don't call us again from user space.
129 Win32k counterpart of User DefWindowProc
141 if (Msg
> WM_USER
) return 0;
147 DPRINT1("hwnd %p WM_SYSCOMMAND %lx %lx\n", Wnd
->head
.h
, wParam
, lParam
);
148 lResult
= DefWndHandleSysCommand(Wnd
, wParam
, lParam
);
153 if ((Wnd
->style
& WS_VISIBLE
) && wParam
) break;
154 if (!(Wnd
->style
& WS_VISIBLE
) && !wParam
) break;
155 if (!Wnd
->spwndOwner
) break;
160 if (!(Wnd
->state
& WNDS_HIDDENPOPUP
)) break;
161 Wnd
->state
&= ~WNDS_HIDDENPOPUP
;
164 Wnd
->state
|= WNDS_HIDDENPOPUP
;
166 co_WinPosShowWindow(Wnd
, wParam
? SW_SHOWNOACTIVATE
: SW_HIDE
);
170 case WM_CLIENTSHUTDOWN
:
171 return IntClientShutdown(Wnd
, wParam
, lParam
);
174 return DefWndGetHotKey(UserHMGetHandle(Wnd
));
176 return DefWndSetHotKey(Wnd
, wParam
);
191 ProbeForRead((PVOID
)lParam
,
199 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
206 lResult
= co_HOOK_CallHooks(WH_CBT
, HCBT_MOVESIZE
, (WPARAM
)Wnd
->head
.h
, lParam
? (LPARAM
)&rt
: 0);