Sync with trunk r62754.
[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 PWND spwndForeground;
14 PWND spwndTray;
15 PWND spwndMessage;
16 PWND spwndTooltip;
17 PVOID hsectionDesktop;
18 PWIN32HEAP pheapDesktop;
19 ULONG_PTR ulHeapSize;
20 LIST_ENTRY PtiList;
21 /* Use for tracking mouse moves. */
22 PWND spwndTrack;
23 DWORD htEx;
24 RECT rcMouseHover;
25 DWORD dwMouseHoverTime;
26
27 /* ReactOS */
28 /* Pointer to the active queue. */
29 struct _USER_MESSAGE_QUEUE *ActiveMessageQueue;
30 /* Handle of the desktop window. */
31 HWND DesktopWindow;
32 /* Thread blocking input */
33 PVOID BlockInputThread;
34 LIST_ENTRY ShellHookWindows;
35 } DESKTOP;
36
37 // Desktop flags
38 #define DF_TME_HOVER 0x00000400
39 #define DF_TME_LEAVE 0x00000800
40 #define DF_HOTTRACK 0x00004000
41 #define DF_DESTROYED 0x00008000
42 #define DF_DESKWNDDESTROYED 0x00010000
43 #define DF_DYING 0x00020000
44
45 // Index offset for Desktop data. Should these be global?
46 #define DT_GWL_PROCESSID 0
47 #define DT_GWL_THREADID 4
48
49 #define DESKTOP_READ STANDARD_RIGHTS_READ | \
50 DESKTOP_ENUMERATE | \
51 DESKTOP_READOBJECTS
52
53 #define DESKTOP_WRITE STANDARD_RIGHTS_WRITE | \
54 DESKTOP_CREATEMENU | \
55 DESKTOP_CREATEWINDOW | \
56 DESKTOP_HOOKCONTROL | \
57 DESKTOP_JOURNALPLAYBACK | \
58 DESKTOP_JOURNALRECORD | \
59 DESKTOP_WRITEOBJECTS
60
61 #define DESKTOP_EXECUTE STANDARD_RIGHTS_EXECUTE | \
62 DESKTOP_SWITCHDESKTOP
63
64 #define DESKTOP_ALL_ACCESS STANDARD_RIGHTS_REQUIRED | \
65 DESKTOP_CREATEMENU | \
66 DESKTOP_CREATEWINDOW | \
67 DESKTOP_ENUMERATE | \
68 DESKTOP_HOOKCONTROL | \
69 DESKTOP_JOURNALPLAYBACK | \
70 DESKTOP_JOURNALRECORD | \
71 DESKTOP_READOBJECTS | \
72 DESKTOP_SWITCHDESKTOP | \
73 DESKTOP_WRITEOBJECTS
74
75 extern PDESKTOP gpdeskInputDesktop;
76 extern PCLS DesktopWindowClass;
77 extern HDC ScreenDeviceContext;
78 extern PTHREADINFO gptiForeground;
79 extern PTHREADINFO gptiDesktopThread;
80
81 typedef struct _SHELL_HOOK_WINDOW
82 {
83 LIST_ENTRY ListEntry;
84 HWND hWnd;
85 } SHELL_HOOK_WINDOW, *PSHELL_HOOK_WINDOW;
86
87 INIT_FUNCTION
88 NTSTATUS
89 NTAPI
90 InitDesktopImpl(VOID);
91
92 NTSTATUS
93 APIENTRY
94 IntDesktopObjectParse(IN PVOID ParseObject,
95 IN PVOID ObjectType,
96 IN OUT PACCESS_STATE AccessState,
97 IN KPROCESSOR_MODE AccessMode,
98 IN ULONG Attributes,
99 IN OUT PUNICODE_STRING CompleteName,
100 IN OUT PUNICODE_STRING RemainingName,
101 IN OUT PVOID Context OPTIONAL,
102 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
103 OUT PVOID *Object);
104
105 NTSTATUS
106 NTAPI
107 IntDesktopObjectDelete(
108 _In_ PVOID Parameters);
109
110 NTSTATUS
111 NTAPI
112 IntDesktopOkToClose(
113 _In_ PVOID Parameters);
114
115 NTSTATUS
116 NTAPI
117 IntDesktopObjectOpen(
118 _In_ PVOID Parameters);
119
120 NTSTATUS
121 NTAPI
122 IntDesktopObjectClose(
123 _In_ PVOID Parameters);
124
125 HDC FASTCALL
126 IntGetScreenDC(VOID);
127
128 HWND FASTCALL
129 IntGetDesktopWindow (VOID);
130
131 PWND FASTCALL
132 UserGetDesktopWindow(VOID);
133
134 HWND FASTCALL
135 IntGetCurrentThreadDesktopWindow(VOID);
136
137 PUSER_MESSAGE_QUEUE FASTCALL
138 IntGetFocusMessageQueue(VOID);
139
140 VOID FASTCALL
141 IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue);
142
143 PDESKTOP FASTCALL
144 IntGetActiveDesktop(VOID);
145
146 NTSTATUS FASTCALL
147 co_IntShowDesktop(PDESKTOP Desktop, ULONG Width, ULONG Height, BOOL Redraw);
148
149 NTSTATUS FASTCALL
150 IntHideDesktop(PDESKTOP Desktop);
151
152 BOOL IntSetThreadDesktop(IN HDESK hDesktop,
153 IN BOOL FreeOnFailure);
154
155 NTSTATUS FASTCALL
156 IntValidateDesktopHandle(
157 HDESK Desktop,
158 KPROCESSOR_MODE AccessMode,
159 ACCESS_MASK DesiredAccess,
160 PDESKTOP *Object);
161
162 NTSTATUS FASTCALL
163 IntParseDesktopPath(PEPROCESS Process,
164 PUNICODE_STRING DesktopPath,
165 HWINSTA *hWinSta,
166 HDESK *hDesktop);
167
168 VOID APIENTRY UserRedrawDesktop(VOID);
169 BOOL IntRegisterShellHookWindow(HWND hWnd);
170 BOOL IntDeRegisterShellHookWindow(HWND hWnd);
171 VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam);
172 HDC FASTCALL UserGetDesktopDC(ULONG,BOOL,BOOL);
173
174 #define IntIsActiveDesktop(Desktop) \
175 ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
176
177 #define GET_DESKTOP_NAME(d) \
178 OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d)) ? \
179 &(OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d))->Name) : \
180 NULL
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 */