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