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