* Sync up to trunk head (r64829).
[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 /* Use for tracking mouse moves. */
27 PWND spwndTrack;
28 DWORD htEx;
29 RECT rcMouseHover;
30 DWORD dwMouseHoverTime;
31
32 /* ReactOS */
33 /* Pointer to the active queue. */
34 struct _USER_MESSAGE_QUEUE *ActiveMessageQueue;
35 /* Handle of the desktop window. */
36 HWND DesktopWindow;
37 /* Thread blocking input */
38 PVOID BlockInputThread;
39 LIST_ENTRY ShellHookWindows;
40 } DESKTOP;
41
42 // Desktop flags
43 #define DF_TME_HOVER 0x00000400
44 #define DF_TME_LEAVE 0x00000800
45 #define DF_HOTTRACK 0x00004000
46 #define DF_DESTROYED 0x00008000
47 #define DF_DESKWNDDESTROYED 0x00010000
48 #define DF_DYING 0x00020000
49
50 // Index offset for Desktop data. Should these be global?
51 #define DT_GWL_PROCESSID 0
52 #define DT_GWL_THREADID 4
53
54 #define DESKTOP_READ STANDARD_RIGHTS_READ | \
55 DESKTOP_ENUMERATE | \
56 DESKTOP_READOBJECTS
57
58 #define DESKTOP_WRITE STANDARD_RIGHTS_WRITE | \
59 DESKTOP_CREATEMENU | \
60 DESKTOP_CREATEWINDOW | \
61 DESKTOP_HOOKCONTROL | \
62 DESKTOP_JOURNALPLAYBACK | \
63 DESKTOP_JOURNALRECORD | \
64 DESKTOP_WRITEOBJECTS
65
66 #define DESKTOP_EXECUTE STANDARD_RIGHTS_EXECUTE | \
67 DESKTOP_SWITCHDESKTOP
68
69 #define DESKTOP_ALL_ACCESS STANDARD_RIGHTS_REQUIRED | \
70 DESKTOP_CREATEMENU | \
71 DESKTOP_CREATEWINDOW | \
72 DESKTOP_ENUMERATE | \
73 DESKTOP_HOOKCONTROL | \
74 DESKTOP_JOURNALPLAYBACK | \
75 DESKTOP_JOURNALRECORD | \
76 DESKTOP_READOBJECTS | \
77 DESKTOP_SWITCHDESKTOP | \
78 DESKTOP_WRITEOBJECTS
79
80 extern PDESKTOP gpdeskInputDesktop;
81 extern PCLS DesktopWindowClass;
82 extern HDC ScreenDeviceContext;
83 extern PTHREADINFO gptiForeground;
84 extern PTHREADINFO gptiDesktopThread;
85
86 typedef struct _SHELL_HOOK_WINDOW
87 {
88 LIST_ENTRY ListEntry;
89 HWND hWnd;
90 } SHELL_HOOK_WINDOW, *PSHELL_HOOK_WINDOW;
91
92 INIT_FUNCTION
93 NTSTATUS
94 NTAPI
95 InitDesktopImpl(VOID);
96
97 NTSTATUS
98 APIENTRY
99 IntDesktopObjectParse(IN PVOID ParseObject,
100 IN PVOID ObjectType,
101 IN OUT PACCESS_STATE AccessState,
102 IN KPROCESSOR_MODE AccessMode,
103 IN ULONG Attributes,
104 IN OUT PUNICODE_STRING CompleteName,
105 IN OUT PUNICODE_STRING RemainingName,
106 IN OUT PVOID Context OPTIONAL,
107 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
108 OUT PVOID *Object);
109
110 NTSTATUS
111 NTAPI
112 IntDesktopObjectDelete(
113 _In_ PVOID Parameters);
114
115 NTSTATUS
116 NTAPI
117 IntDesktopOkToClose(
118 _In_ PVOID Parameters);
119
120 NTSTATUS
121 NTAPI
122 IntDesktopObjectOpen(
123 _In_ PVOID Parameters);
124
125 NTSTATUS
126 NTAPI
127 IntDesktopObjectClose(
128 _In_ PVOID Parameters);
129
130 HDC FASTCALL
131 IntGetScreenDC(VOID);
132
133 HWND FASTCALL
134 IntGetDesktopWindow (VOID);
135
136 PWND FASTCALL
137 UserGetDesktopWindow(VOID);
138
139 HWND FASTCALL
140 IntGetCurrentThreadDesktopWindow(VOID);
141
142 PUSER_MESSAGE_QUEUE FASTCALL
143 IntGetFocusMessageQueue(VOID);
144
145 VOID FASTCALL
146 IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue);
147
148 PDESKTOP FASTCALL
149 IntGetActiveDesktop(VOID);
150
151 NTSTATUS FASTCALL
152 co_IntShowDesktop(PDESKTOP Desktop, ULONG Width, ULONG Height, BOOL Redraw);
153
154 NTSTATUS FASTCALL
155 IntHideDesktop(PDESKTOP Desktop);
156
157 BOOL IntSetThreadDesktop(IN HDESK hDesktop,
158 IN BOOL FreeOnFailure);
159
160 NTSTATUS FASTCALL
161 IntValidateDesktopHandle(
162 HDESK Desktop,
163 KPROCESSOR_MODE AccessMode,
164 ACCESS_MASK DesiredAccess,
165 PDESKTOP *Object);
166
167 NTSTATUS FASTCALL
168 IntParseDesktopPath(PEPROCESS Process,
169 PUNICODE_STRING DesktopPath,
170 HWINSTA *hWinSta,
171 HDESK *hDesktop);
172
173 VOID APIENTRY UserRedrawDesktop(VOID);
174 BOOL IntRegisterShellHookWindow(HWND hWnd);
175 BOOL IntDeRegisterShellHookWindow(HWND hWnd);
176 VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam);
177 HDC FASTCALL UserGetDesktopDC(ULONG,BOOL,BOOL);
178
179 #define IntIsActiveDesktop(Desktop) \
180 ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
181
182 HWND FASTCALL IntGetMessageWindow(VOID);
183 PWND FASTCALL UserGetMessageWindow(VOID);
184
185 static __inline PVOID
186 DesktopHeapAlloc(IN PDESKTOP Desktop,
187 IN SIZE_T Bytes)
188 {
189 return RtlAllocateHeap(Desktop->pheapDesktop,
190 HEAP_NO_SERIALIZE,
191 Bytes);
192 }
193
194 static __inline BOOL
195 DesktopHeapFree(IN PDESKTOP Desktop,
196 IN PVOID lpMem)
197 {
198 return RtlFreeHeap(Desktop->pheapDesktop,
199 HEAP_NO_SERIALIZE,
200 lpMem);
201 }
202
203 static __inline PVOID
204 DesktopHeapReAlloc(IN PDESKTOP Desktop,
205 IN PVOID lpMem,
206 IN SIZE_T Bytes)
207 {
208 #if 0
209 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
210 return RtlReAllocateHeap(Desktop->pheapDesktop,
211 HEAP_NO_SERIALIZE,
212 lpMem,
213 Bytes);
214 #else
215 SIZE_T PrevSize;
216 PVOID pNew;
217
218 PrevSize = RtlSizeHeap(Desktop->pheapDesktop,
219 HEAP_NO_SERIALIZE,
220 lpMem);
221
222 if (PrevSize == Bytes)
223 return lpMem;
224
225 pNew = RtlAllocateHeap(Desktop->pheapDesktop,
226 HEAP_NO_SERIALIZE,
227 Bytes);
228 if (pNew != NULL)
229 {
230 if (PrevSize < Bytes)
231 Bytes = PrevSize;
232
233 RtlCopyMemory(pNew,
234 lpMem,
235 Bytes);
236
237 RtlFreeHeap(Desktop->pheapDesktop,
238 HEAP_NO_SERIALIZE,
239 lpMem);
240 }
241
242 return pNew;
243 #endif
244 }
245
246 static __inline ULONG_PTR
247 DesktopHeapGetUserDelta(VOID)
248 {
249 PW32HEAP_USER_MAPPING Mapping;
250 PTHREADINFO pti;
251 PPROCESSINFO W32Process;
252 PWIN32HEAP pheapDesktop;
253 ULONG_PTR Delta = 0;
254
255 pti = PsGetCurrentThreadWin32Thread();
256 if (!pti->rpdesk)
257 return 0;
258
259 pheapDesktop = pti->rpdesk->pheapDesktop;
260
261 W32Process = PsGetCurrentProcessWin32Process();
262 Mapping = W32Process->HeapMappings.Next;
263 while (Mapping != NULL)
264 {
265 if (Mapping->KernelMapping == (PVOID)pheapDesktop)
266 {
267 Delta = (ULONG_PTR)Mapping->KernelMapping - (ULONG_PTR)Mapping->UserMapping;
268 break;
269 }
270
271 Mapping = Mapping->Next;
272 }
273
274 return Delta;
275 }
276
277 static __inline PVOID
278 DesktopHeapAddressToUser(PVOID lpMem)
279 {
280 PW32HEAP_USER_MAPPING Mapping;
281 PPROCESSINFO W32Process;
282
283 W32Process = PsGetCurrentProcessWin32Process();
284 Mapping = W32Process->HeapMappings.Next;
285 while (Mapping != NULL)
286 {
287 if ((ULONG_PTR)lpMem >= (ULONG_PTR)Mapping->KernelMapping &&
288 (ULONG_PTR)lpMem < (ULONG_PTR)Mapping->KernelMapping + Mapping->Limit)
289 {
290 return (PVOID)(((ULONG_PTR)lpMem - (ULONG_PTR)Mapping->KernelMapping) +
291 (ULONG_PTR)Mapping->UserMapping);
292 }
293
294 Mapping = Mapping->Next;
295 }
296
297 return NULL;
298 }
299
300 PWND FASTCALL IntGetThreadDesktopWindow(PTHREADINFO);
301 PWND FASTCALL co_GetDesktopWindow(PWND);
302 BOOL FASTCALL IntPaintDesktop(HDC);
303 BOOL FASTCALL DesktopWindowProc(PWND, UINT, WPARAM, LPARAM, LRESULT *);
304 BOOL FASTCALL UserMessageWindowProc(PWND pwnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *lResult);
305 VOID NTAPI DesktopThreadMain();
306 /* EOF */