0e1950ff64583d023211d0f0d0ef1610398a5c15
[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
165 FASTCALL
166 IntResolveDesktop(
167 IN PEPROCESS Process,
168 IN PUNICODE_STRING DesktopPath,
169 IN BOOL bInherit,
170 OUT HWINSTA* phWinSta,
171 OUT HDESK* phDesktop);
172
173 NTSTATUS FASTCALL
174 IntValidateDesktopHandle(
175 HDESK Desktop,
176 KPROCESSOR_MODE AccessMode,
177 ACCESS_MASK DesiredAccess,
178 PDESKTOP *Object);
179
180 NTSTATUS
181 FASTCALL
182 IntCreateDesktop(
183 OUT HDESK* phDesktop,
184 IN POBJECT_ATTRIBUTES ObjectAttributes,
185 IN KPROCESSOR_MODE AccessMode,
186 IN PUNICODE_STRING lpszDesktopDevice OPTIONAL,
187 IN LPDEVMODEW lpdmw OPTIONAL,
188 IN DWORD dwFlags,
189 IN ACCESS_MASK dwDesiredAccess);
190
191 VOID APIENTRY UserRedrawDesktop(VOID);
192 BOOL IntRegisterShellHookWindow(HWND hWnd);
193 BOOL IntDeRegisterShellHookWindow(HWND hWnd);
194 VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam);
195 HDC FASTCALL UserGetDesktopDC(ULONG,BOOL,BOOL);
196
197 #define IntIsActiveDesktop(Desktop) \
198 ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
199
200 HWND FASTCALL IntGetMessageWindow(VOID);
201 PWND FASTCALL UserGetMessageWindow(VOID);
202
203 #if 0
204 static __inline BOOL
205 UserIsDesktopWindow(IN PWND pWnd)
206 {
207 // return (pWnd == UserGetDesktopWindow());
208 return (pWnd && (pWnd->fnid == FNID_DESKTOP));
209 }
210
211 static __inline BOOL
212 UserIsMessageWindow(IN PWND pWnd)
213 {
214 // return (pWnd == UserGetMessageWindow());
215 return (pWnd && (pWnd->fnid == FNID_MESSAGEWND));
216 }
217 #else
218
219 #define UserIsDesktopWindow(pWnd) \
220 ((pWnd) && ((pWnd)->fnid == FNID_DESKTOP))
221
222 #define UserIsMessageWindow(pWnd) \
223 ((pWnd) && ((pWnd)->fnid == FNID_MESSAGEWND))
224
225 #endif
226
227
228 static __inline PVOID
229 DesktopHeapAlloc(IN PDESKTOP Desktop,
230 IN SIZE_T Bytes)
231 {
232 return RtlAllocateHeap(Desktop->pheapDesktop,
233 HEAP_NO_SERIALIZE,
234 Bytes);
235 }
236
237 static __inline BOOL
238 DesktopHeapFree(IN PDESKTOP Desktop,
239 IN PVOID lpMem)
240 {
241 return RtlFreeHeap(Desktop->pheapDesktop,
242 HEAP_NO_SERIALIZE,
243 lpMem);
244 }
245
246 static __inline PVOID
247 DesktopHeapReAlloc(IN PDESKTOP Desktop,
248 IN PVOID lpMem,
249 IN SIZE_T Bytes)
250 {
251 #if 0
252 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
253 return RtlReAllocateHeap(Desktop->pheapDesktop,
254 HEAP_NO_SERIALIZE,
255 lpMem,
256 Bytes);
257 #else
258 SIZE_T PrevSize;
259 PVOID pNew;
260
261 PrevSize = RtlSizeHeap(Desktop->pheapDesktop,
262 HEAP_NO_SERIALIZE,
263 lpMem);
264
265 if (PrevSize == Bytes)
266 return lpMem;
267
268 pNew = RtlAllocateHeap(Desktop->pheapDesktop,
269 HEAP_NO_SERIALIZE,
270 Bytes);
271 if (pNew != NULL)
272 {
273 if (PrevSize < Bytes)
274 Bytes = PrevSize;
275
276 RtlCopyMemory(pNew,
277 lpMem,
278 Bytes);
279
280 RtlFreeHeap(Desktop->pheapDesktop,
281 HEAP_NO_SERIALIZE,
282 lpMem);
283 }
284
285 return pNew;
286 #endif
287 }
288
289 static __inline ULONG_PTR
290 DesktopHeapGetUserDelta(VOID)
291 {
292 PW32HEAP_USER_MAPPING Mapping;
293 PTHREADINFO pti;
294 PPROCESSINFO W32Process;
295 PWIN32HEAP pheapDesktop;
296 ULONG_PTR Delta = 0;
297
298 pti = PsGetCurrentThreadWin32Thread();
299 if (!pti->rpdesk)
300 return 0;
301
302 pheapDesktop = pti->rpdesk->pheapDesktop;
303
304 W32Process = PsGetCurrentProcessWin32Process();
305
306 /*
307 * Start the search at the next mapping: skip the first entry
308 * as it must be the global user heap mapping.
309 */
310 Mapping = W32Process->HeapMappings.Next;
311 while (Mapping != NULL)
312 {
313 if (Mapping->KernelMapping == (PVOID)pheapDesktop)
314 {
315 Delta = (ULONG_PTR)Mapping->KernelMapping - (ULONG_PTR)Mapping->UserMapping;
316 break;
317 }
318
319 Mapping = Mapping->Next;
320 }
321
322 return Delta;
323 }
324
325 static __inline PVOID
326 DesktopHeapAddressToUser(PVOID lpMem)
327 {
328 PW32HEAP_USER_MAPPING Mapping;
329 PPROCESSINFO W32Process;
330
331 W32Process = PsGetCurrentProcessWin32Process();
332
333 /*
334 * Start the search at the next mapping: skip the first entry
335 * as it must be the global user heap mapping.
336 */
337 Mapping = W32Process->HeapMappings.Next;
338 while (Mapping != NULL)
339 {
340 if ((ULONG_PTR)lpMem >= (ULONG_PTR)Mapping->KernelMapping &&
341 (ULONG_PTR)lpMem < (ULONG_PTR)Mapping->KernelMapping + Mapping->Limit)
342 {
343 return (PVOID)(((ULONG_PTR)lpMem - (ULONG_PTR)Mapping->KernelMapping) +
344 (ULONG_PTR)Mapping->UserMapping);
345 }
346
347 Mapping = Mapping->Next;
348 }
349
350 return NULL;
351 }
352
353 PWND FASTCALL IntGetThreadDesktopWindow(PTHREADINFO);
354 PWND FASTCALL co_GetDesktopWindow(PWND);
355 BOOL FASTCALL IntPaintDesktop(HDC);
356 BOOL FASTCALL DesktopWindowProc(PWND, UINT, WPARAM, LPARAM, LRESULT *);
357 BOOL FASTCALL UserMessageWindowProc(PWND pwnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *lResult);
358 VOID NTAPI DesktopThreadMain(VOID);
359
360 /* EOF */