Sync with trunk head (part 1 of 2)
[reactos.git] / subsystems / win32 / win32k / include / desktop.h
1 #pragma once
2
3 #include "msgqueue.h"
4 #include "window.h"
5
6 typedef struct _DESKTOP
7 {
8 PDESKTOPINFO pDeskInfo;
9 LIST_ENTRY ListEntry;
10 /* Pointer to the associated window station. */
11 struct _WINSTATION_OBJECT *rpwinstaParent;
12 PWND spwndForeground;
13 PWND spwndTray;
14 PWND spwndMessage;
15 PWND spwndTooltip;
16 PSECTION_OBJECT hsectionDesktop;
17 PWIN32HEAP pheapDesktop;
18 ULONG_PTR ulHeapSize;
19 LIST_ENTRY PtiList;
20 /* use for tracking mouse moves. */
21 PWND spwndTrack;
22 DWORD htEx;
23 RECT rcMouseHover;
24 DWORD dwMouseHoverTime;
25
26 /* ReactOS */
27 /* Rectangle of the work area */
28 RECTL WorkArea;
29 /* Pointer to the active queue. */
30 PVOID ActiveMessageQueue;
31 /* Handle of the desktop window. */
32 HANDLE DesktopWindow;
33 /* Thread blocking input */
34 PVOID BlockInputThread;
35 LIST_ENTRY ShellHookWindows;
36 } DESKTOP, *PDESKTOP;
37
38 extern PDESKTOP InputDesktop;
39 extern HDESK InputDesktopHandle;
40 extern PCLS DesktopWindowClass;
41 extern HDC ScreenDeviceContext;
42 extern BOOL g_PaintDesktopVersion;
43
44 typedef struct _SHELL_HOOK_WINDOW
45 {
46 LIST_ENTRY ListEntry;
47 HWND hWnd;
48 } SHELL_HOOK_WINDOW, *PSHELL_HOOK_WINDOW;
49
50 NTSTATUS FASTCALL
51 InitDesktopImpl(VOID);
52
53 NTSTATUS FASTCALL
54 CleanupDesktopImpl(VOID);
55
56 NTSTATUS
57 APIENTRY
58 IntDesktopObjectParse(IN PVOID ParseObject,
59 IN PVOID ObjectType,
60 IN OUT PACCESS_STATE AccessState,
61 IN KPROCESSOR_MODE AccessMode,
62 IN ULONG Attributes,
63 IN OUT PUNICODE_STRING CompleteName,
64 IN OUT PUNICODE_STRING RemainingName,
65 IN OUT PVOID Context OPTIONAL,
66 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
67 OUT PVOID *Object);
68
69 VOID APIENTRY
70 IntDesktopObjectDelete(PWIN32_DELETEMETHOD_PARAMETERS Parameters);
71
72 VOID FASTCALL
73 IntGetDesktopWorkArea(PDESKTOP Desktop, RECTL *Rect);
74
75 LRESULT CALLBACK
76 IntDesktopWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
77
78 HDC FASTCALL
79 IntGetScreenDC(VOID);
80
81 HWND FASTCALL
82 IntGetDesktopWindow (VOID);
83
84 PWINDOW_OBJECT FASTCALL
85 UserGetDesktopWindow(VOID);
86
87 HWND FASTCALL
88 IntGetCurrentThreadDesktopWindow(VOID);
89
90 PUSER_MESSAGE_QUEUE FASTCALL
91 IntGetFocusMessageQueue(VOID);
92
93 VOID FASTCALL
94 IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue);
95
96 PDESKTOP FASTCALL
97 IntGetActiveDesktop(VOID);
98
99 NTSTATUS FASTCALL
100 co_IntShowDesktop(PDESKTOP Desktop, ULONG Width, ULONG Height);
101
102 NTSTATUS FASTCALL
103 IntHideDesktop(PDESKTOP Desktop);
104
105 HDESK FASTCALL
106 IntGetDesktopObjectHandle(PDESKTOP DesktopObject);
107
108 BOOL IntSetThreadDesktop(IN PDESKTOP DesktopObject,
109 IN BOOL FreeOnFailure);
110
111 NTSTATUS FASTCALL
112 IntValidateDesktopHandle(
113 HDESK Desktop,
114 KPROCESSOR_MODE AccessMode,
115 ACCESS_MASK DesiredAccess,
116 PDESKTOP *Object);
117 NTSTATUS FASTCALL
118 IntParseDesktopPath(PEPROCESS Process,
119 PUNICODE_STRING DesktopPath,
120 HWINSTA *hWinSta,
121 HDESK *hDesktop);
122 BOOL FASTCALL IntDesktopUpdatePerUserSettings(BOOL bEnable);
123 VOID APIENTRY UserRedrawDesktop(VOID);
124 BOOL IntRegisterShellHookWindow(HWND hWnd);
125 BOOL IntDeRegisterShellHookWindow(HWND hWnd);
126 VOID co_IntShellHookNotify(WPARAM Message, LPARAM lParam);
127 HDC FASTCALL UserGetDesktopDC(ULONG,BOOL,BOOL);
128
129 #define IntIsActiveDesktop(Desktop) \
130 ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
131
132 #define GET_DESKTOP_NAME(d) \
133 OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d)) ? \
134 &(OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d))->Name) : \
135 NULL
136
137 HWND FASTCALL IntGetMessageWindow(VOID);
138
139 static __inline PVOID
140 DesktopHeapAlloc(IN PDESKTOP Desktop,
141 IN SIZE_T Bytes)
142 {
143 return RtlAllocateHeap(Desktop->pheapDesktop,
144 HEAP_NO_SERIALIZE,
145 Bytes);
146 }
147
148 static __inline BOOL
149 DesktopHeapFree(IN PDESKTOP Desktop,
150 IN PVOID lpMem)
151 {
152 return RtlFreeHeap(Desktop->pheapDesktop,
153 HEAP_NO_SERIALIZE,
154 lpMem);
155 }
156
157 static __inline PVOID
158 DesktopHeapReAlloc(IN PDESKTOP Desktop,
159 IN PVOID lpMem,
160 IN SIZE_T Bytes)
161 {
162 #if 0
163 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
164 return RtlReAllocateHeap(Desktop->pheapDesktop,
165 HEAP_NO_SERIALIZE,
166 lpMem,
167 Bytes);
168 #else
169 SIZE_T PrevSize;
170 PVOID pNew;
171
172 PrevSize = RtlSizeHeap(Desktop->pheapDesktop,
173 HEAP_NO_SERIALIZE,
174 lpMem);
175
176 if (PrevSize == Bytes)
177 return lpMem;
178
179 pNew = RtlAllocateHeap(Desktop->pheapDesktop,
180 HEAP_NO_SERIALIZE,
181 Bytes);
182 if (pNew != NULL)
183 {
184 if (PrevSize < Bytes)
185 Bytes = PrevSize;
186
187 RtlCopyMemory(pNew,
188 lpMem,
189 Bytes);
190
191 RtlFreeHeap(Desktop->pheapDesktop,
192 HEAP_NO_SERIALIZE,
193 lpMem);
194 }
195
196 return pNew;
197 #endif
198 }
199
200 static __inline ULONG_PTR
201 DesktopHeapGetUserDelta(VOID)
202 {
203 PW32HEAP_USER_MAPPING Mapping;
204 PTHREADINFO pti;
205 PPROCESSINFO W32Process;
206 PWIN32HEAP pheapDesktop;
207 ULONG_PTR Delta = 0;
208
209 pti = PsGetCurrentThreadWin32Thread();
210 if (!pti->rpdesk)
211 return 0;
212
213 pheapDesktop = pti->rpdesk->pheapDesktop;
214
215 W32Process = PsGetCurrentProcessWin32Process();
216 Mapping = W32Process->HeapMappings.Next;
217 while (Mapping != NULL)
218 {
219 if (Mapping->KernelMapping == (PVOID)pheapDesktop)
220 {
221 Delta = (ULONG_PTR)Mapping->KernelMapping - (ULONG_PTR)Mapping->UserMapping;
222 break;
223 }
224
225 Mapping = Mapping->Next;
226 }
227
228 return Delta;
229 }
230
231 static __inline PVOID
232 DesktopHeapAddressToUser(PVOID lpMem)
233 {
234 PW32HEAP_USER_MAPPING Mapping;
235 PPROCESSINFO W32Process;
236
237 W32Process = PsGetCurrentProcessWin32Process();
238 Mapping = W32Process->HeapMappings.Next;
239 while (Mapping != NULL)
240 {
241 if ((ULONG_PTR)lpMem >= (ULONG_PTR)Mapping->KernelMapping &&
242 (ULONG_PTR)lpMem < (ULONG_PTR)Mapping->KernelMapping + Mapping->Limit)
243 {
244 return (PVOID)(((ULONG_PTR)lpMem - (ULONG_PTR)Mapping->KernelMapping) +
245 (ULONG_PTR)Mapping->UserMapping);
246 }
247
248 Mapping = Mapping->Next;
249 }
250
251 return NULL;
252 }
253
254 /* EOF */