[WIN32K:NTUSER] Split NtUserCreateDesktop() into the part that captures the user...
[reactos.git] / win32ss / user / ntuser / desktop.h
1 #pragma once
2
3 typedef struct _DESKTOP
4 {
5 /* Must be the first member */
6 DWORD dwSessionId;
7
8 PDESKTOPINFO pDeskInfo;
9 LIST_ENTRY ListEntry;
10 /* Pointer to the associated window station. */
11 struct _WINSTATION_OBJECT *rpwinstaParent;
12 DWORD dwDTFlags;
13 DWORD_PTR dwDesktopId;
14 PMENU spmenuSys;
15 PMENU spmenuDialogSys;
16 PMENU spmenuHScroll;
17 PMENU spmenuVScroll;
18 PWND spwndForeground;
19 PWND spwndTray;
20 PWND spwndMessage;
21 PWND spwndTooltip;
22 PVOID hsectionDesktop;
23 PWIN32HEAP pheapDesktop;
24 ULONG_PTR ulHeapSize;
25 LIST_ENTRY PtiList;
26
27 /* One console input thread per desktop, maintained by CONSRV */
28 DWORD dwConsoleThreadId;
29
30 /* Use for tracking mouse moves. */
31 PWND spwndTrack;
32 DWORD htEx;
33 RECT rcMouseHover;
34 DWORD dwMouseHoverTime;
35
36 /* ReactOS */
37 /* Pointer to the active queue. */
38 struct _USER_MESSAGE_QUEUE *ActiveMessageQueue;
39 /* Handle of the desktop window. */
40 HWND DesktopWindow;
41 /* Thread blocking input */
42 PVOID BlockInputThread;
43 LIST_ENTRY ShellHookWindows;
44 } DESKTOP, *PDESKTOP;
45
46 // Desktop flags
47 #define DF_TME_HOVER 0x00000400
48 #define DF_TME_LEAVE 0x00000800
49 #define DF_HOTTRACK 0x00004000
50 #define DF_DESTROYED 0x00008000
51 #define DF_DESKWNDDESTROYED 0x00010000
52 #define DF_DYING 0x00020000
53
54 // Index offset for Desktop data. Should these be global?
55 #define DT_GWL_PROCESSID 0
56 #define DT_GWL_THREADID 4
57
58 #define DESKTOP_READ STANDARD_RIGHTS_READ | \
59 DESKTOP_ENUMERATE | \
60 DESKTOP_READOBJECTS
61
62 #define DESKTOP_WRITE STANDARD_RIGHTS_WRITE | \
63 DESKTOP_CREATEMENU | \
64 DESKTOP_CREATEWINDOW | \
65 DESKTOP_HOOKCONTROL | \
66 DESKTOP_JOURNALPLAYBACK | \
67 DESKTOP_JOURNALRECORD | \
68 DESKTOP_WRITEOBJECTS
69
70 #define DESKTOP_EXECUTE STANDARD_RIGHTS_EXECUTE | \
71 DESKTOP_SWITCHDESKTOP
72
73 #define DESKTOP_ALL_ACCESS STANDARD_RIGHTS_REQUIRED | \
74 DESKTOP_CREATEMENU | \
75 DESKTOP_CREATEWINDOW | \
76 DESKTOP_ENUMERATE | \
77 DESKTOP_HOOKCONTROL | \
78 DESKTOP_JOURNALPLAYBACK | \
79 DESKTOP_JOURNALRECORD | \
80 DESKTOP_READOBJECTS | \
81 DESKTOP_SWITCHDESKTOP | \
82 DESKTOP_WRITEOBJECTS
83
84 extern PDESKTOP gpdeskInputDesktop;
85 extern PCLS DesktopWindowClass;
86 extern HDC ScreenDeviceContext;
87 extern PTHREADINFO gptiForeground;
88 extern PTHREADINFO gptiDesktopThread;
89
90 typedef struct _SHELL_HOOK_WINDOW
91 {
92 LIST_ENTRY ListEntry;
93 HWND hWnd;
94 } SHELL_HOOK_WINDOW, *PSHELL_HOOK_WINDOW;
95
96 INIT_FUNCTION
97 NTSTATUS
98 NTAPI
99 InitDesktopImpl(VOID);
100
101 NTSTATUS
102 APIENTRY
103 IntDesktopObjectParse(IN PVOID ParseObject,
104 IN PVOID ObjectType,
105 IN OUT PACCESS_STATE AccessState,
106 IN KPROCESSOR_MODE AccessMode,
107 IN ULONG Attributes,
108 IN OUT PUNICODE_STRING CompleteName,
109 IN OUT PUNICODE_STRING RemainingName,
110 IN OUT PVOID Context OPTIONAL,
111 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
112 OUT PVOID *Object);
113
114 NTSTATUS
115 NTAPI
116 IntDesktopObjectDelete(
117 _In_ PVOID Parameters);
118
119 NTSTATUS
120 NTAPI
121 IntDesktopOkToClose(
122 _In_ PVOID Parameters);
123
124 NTSTATUS
125 NTAPI
126 IntDesktopObjectOpen(
127 _In_ PVOID Parameters);
128
129 NTSTATUS
130 NTAPI
131 IntDesktopObjectClose(
132 _In_ PVOID Parameters);
133
134 HDC FASTCALL
135 IntGetScreenDC(VOID);
136
137 HWND FASTCALL
138 IntGetDesktopWindow (VOID);
139
140 PWND FASTCALL
141 UserGetDesktopWindow(VOID);
142
143 HWND FASTCALL
144 IntGetCurrentThreadDesktopWindow(VOID);
145
146 PUSER_MESSAGE_QUEUE FASTCALL
147 IntGetFocusMessageQueue(VOID);
148
149 VOID FASTCALL
150 IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue);
151
152 PDESKTOP FASTCALL
153 IntGetActiveDesktop(VOID);
154
155 NTSTATUS FASTCALL
156 co_IntShowDesktop(PDESKTOP Desktop, ULONG Width, ULONG Height, BOOL Redraw);
157
158 NTSTATUS FASTCALL
159 IntHideDesktop(PDESKTOP Desktop);
160
161 BOOL IntSetThreadDesktop(IN HDESK hDesktop,
162 IN BOOL FreeOnFailure);
163
164 NTSTATUS FASTCALL
165 IntValidateDesktopHandle(
166 HDESK Desktop,
167 KPROCESSOR_MODE AccessMode,
168 ACCESS_MASK DesiredAccess,
169 PDESKTOP *Object);
170
171 NTSTATUS
172 FASTCALL
173 IntCreateDesktop(
174 OUT HDESK* phDesktop,
175 IN POBJECT_ATTRIBUTES ObjectAttributes,
176 IN KPROCESSOR_MODE AccessMode,
177 IN PUNICODE_STRING lpszDesktopDevice OPTIONAL,
178 IN LPDEVMODEW lpdmw OPTIONAL,
179 IN DWORD dwFlags,
180 IN ACCESS_MASK dwDesiredAccess);
181
182 NTSTATUS FASTCALL
183 IntParseDesktopPath(PEPROCESS Process,
184 PUNICODE_STRING DesktopPath,
185 HWINSTA *hWinSta,
186 HDESK *hDesktop);
187
188 VOID APIENTRY UserRedrawDesktop(VOID);
189 BOOL IntRegisterShellHookWindow(HWND hWnd);
190 BOOL IntDeRegisterShellHookWindow(HWND hWnd);
191 VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam);
192 HDC FASTCALL UserGetDesktopDC(ULONG,BOOL,BOOL);
193
194 #define IntIsActiveDesktop(Desktop) \
195 ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
196
197 HWND FASTCALL IntGetMessageWindow(VOID);
198 PWND FASTCALL UserGetMessageWindow(VOID);
199
200 #if 0
201 static __inline BOOL
202 UserIsDesktopWindow(IN PWND pWnd)
203 {
204 // return (pWnd == UserGetDesktopWindow());
205 return (pWnd && (pWnd->fnid == FNID_DESKTOP));
206 }
207
208 static __inline BOOL
209 UserIsMessageWindow(IN PWND pWnd)
210 {
211 // return (pWnd == UserGetMessageWindow());
212 return (pWnd && (pWnd->fnid == FNID_MESSAGEWND));
213 }
214 #else
215
216 #define UserIsDesktopWindow(pWnd) \
217 ((pWnd) && ((pWnd)->fnid == FNID_DESKTOP))
218
219 #define UserIsMessageWindow(pWnd) \
220 ((pWnd) && ((pWnd)->fnid == FNID_MESSAGEWND))
221
222 #endif
223
224
225 static __inline PVOID
226 DesktopHeapAlloc(IN PDESKTOP Desktop,
227 IN SIZE_T Bytes)
228 {
229 return RtlAllocateHeap(Desktop->pheapDesktop,
230 HEAP_NO_SERIALIZE,
231 Bytes);
232 }
233
234 static __inline BOOL
235 DesktopHeapFree(IN PDESKTOP Desktop,
236 IN PVOID lpMem)
237 {
238 return RtlFreeHeap(Desktop->pheapDesktop,
239 HEAP_NO_SERIALIZE,
240 lpMem);
241 }
242
243 static __inline PVOID
244 DesktopHeapReAlloc(IN PDESKTOP Desktop,
245 IN PVOID lpMem,
246 IN SIZE_T Bytes)
247 {
248 #if 0
249 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
250 return RtlReAllocateHeap(Desktop->pheapDesktop,
251 HEAP_NO_SERIALIZE,
252 lpMem,
253 Bytes);
254 #else
255 SIZE_T PrevSize;
256 PVOID pNew;
257
258 PrevSize = RtlSizeHeap(Desktop->pheapDesktop,
259 HEAP_NO_SERIALIZE,
260 lpMem);
261
262 if (PrevSize == Bytes)
263 return lpMem;
264
265 pNew = RtlAllocateHeap(Desktop->pheapDesktop,
266 HEAP_NO_SERIALIZE,
267 Bytes);
268 if (pNew != NULL)
269 {
270 if (PrevSize < Bytes)
271 Bytes = PrevSize;
272
273 RtlCopyMemory(pNew,
274 lpMem,
275 Bytes);
276
277 RtlFreeHeap(Desktop->pheapDesktop,
278 HEAP_NO_SERIALIZE,
279 lpMem);
280 }
281
282 return pNew;
283 #endif
284 }
285
286 static __inline ULONG_PTR
287 DesktopHeapGetUserDelta(VOID)
288 {
289 PW32HEAP_USER_MAPPING Mapping;
290 PTHREADINFO pti;
291 PPROCESSINFO W32Process;
292 PWIN32HEAP pheapDesktop;
293 ULONG_PTR Delta = 0;
294
295 pti = PsGetCurrentThreadWin32Thread();
296 if (!pti->rpdesk)
297 return 0;
298
299 pheapDesktop = pti->rpdesk->pheapDesktop;
300
301 W32Process = PsGetCurrentProcessWin32Process();
302
303 /*
304 * Start the search at the next mapping: skip the first entry
305 * as it must be the global user heap mapping.
306 */
307 Mapping = W32Process->HeapMappings.Next;
308 while (Mapping != NULL)
309 {
310 if (Mapping->KernelMapping == (PVOID)pheapDesktop)
311 {
312 Delta = (ULONG_PTR)Mapping->KernelMapping - (ULONG_PTR)Mapping->UserMapping;
313 break;
314 }
315
316 Mapping = Mapping->Next;
317 }
318
319 return Delta;
320 }
321
322 static __inline PVOID
323 DesktopHeapAddressToUser(PVOID lpMem)
324 {
325 PW32HEAP_USER_MAPPING Mapping;
326 PPROCESSINFO W32Process;
327
328 W32Process = PsGetCurrentProcessWin32Process();
329
330 /*
331 * Start the search at the next mapping: skip the first entry
332 * as it must be the global user heap mapping.
333 */
334 Mapping = W32Process->HeapMappings.Next;
335 while (Mapping != NULL)
336 {
337 if ((ULONG_PTR)lpMem >= (ULONG_PTR)Mapping->KernelMapping &&
338 (ULONG_PTR)lpMem < (ULONG_PTR)Mapping->KernelMapping + Mapping->Limit)
339 {
340 return (PVOID)(((ULONG_PTR)lpMem - (ULONG_PTR)Mapping->KernelMapping) +
341 (ULONG_PTR)Mapping->UserMapping);
342 }
343
344 Mapping = Mapping->Next;
345 }
346
347 return NULL;
348 }
349
350 PWND FASTCALL IntGetThreadDesktopWindow(PTHREADINFO);
351 PWND FASTCALL co_GetDesktopWindow(PWND);
352 BOOL FASTCALL IntPaintDesktop(HDC);
353 BOOL FASTCALL DesktopWindowProc(PWND, UINT, WPARAM, LPARAM, LRESULT *);
354 BOOL FASTCALL UserMessageWindowProc(PWND pwnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *lResult);
355 VOID NTAPI DesktopThreadMain(VOID);
356
357 /* EOF */