[CMAKE]
[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 INIT_FUNCTION
49 NTSTATUS
50 NTAPI
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 LRESULT CALLBACK
73 IntDesktopWindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
74
75 HDC FASTCALL
76 IntGetScreenDC(VOID);
77
78 HWND FASTCALL
79 IntGetDesktopWindow (VOID);
80
81 PWND FASTCALL
82 UserGetDesktopWindow(VOID);
83
84 HWND FASTCALL
85 IntGetCurrentThreadDesktopWindow(VOID);
86
87 PUSER_MESSAGE_QUEUE FASTCALL
88 IntGetFocusMessageQueue(VOID);
89
90 VOID FASTCALL
91 IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue);
92
93 PDESKTOP FASTCALL
94 IntGetActiveDesktop(VOID);
95
96 NTSTATUS FASTCALL
97 co_IntShowDesktop(PDESKTOP Desktop, ULONG Width, ULONG Height);
98
99 NTSTATUS FASTCALL
100 IntHideDesktop(PDESKTOP Desktop);
101
102 HDESK FASTCALL
103 IntGetDesktopObjectHandle(PDESKTOP DesktopObject);
104
105 BOOL IntSetThreadDesktop(IN PDESKTOP DesktopObject,
106 IN BOOL FreeOnFailure);
107
108 NTSTATUS FASTCALL
109 IntValidateDesktopHandle(
110 HDESK Desktop,
111 KPROCESSOR_MODE AccessMode,
112 ACCESS_MASK DesiredAccess,
113 PDESKTOP *Object);
114 NTSTATUS FASTCALL
115 IntParseDesktopPath(PEPROCESS Process,
116 PUNICODE_STRING DesktopPath,
117 HWINSTA *hWinSta,
118 HDESK *hDesktop);
119 BOOL FASTCALL IntDesktopUpdatePerUserSettings(BOOL bEnable);
120 VOID APIENTRY UserRedrawDesktop(VOID);
121 BOOL IntRegisterShellHookWindow(HWND hWnd);
122 BOOL IntDeRegisterShellHookWindow(HWND hWnd);
123 VOID co_IntShellHookNotify(WPARAM Message, LPARAM lParam);
124 HDC FASTCALL UserGetDesktopDC(ULONG,BOOL,BOOL);
125
126 #define IntIsActiveDesktop(Desktop) \
127 ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
128
129 #define GET_DESKTOP_NAME(d) \
130 OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d)) ? \
131 &(OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d))->Name) : \
132 NULL
133
134 HWND FASTCALL IntGetMessageWindow(VOID);
135
136 static __inline PVOID
137 DesktopHeapAlloc(IN PDESKTOP Desktop,
138 IN SIZE_T Bytes)
139 {
140 return RtlAllocateHeap(Desktop->pheapDesktop,
141 HEAP_NO_SERIALIZE,
142 Bytes);
143 }
144
145 static __inline BOOL
146 DesktopHeapFree(IN PDESKTOP Desktop,
147 IN PVOID lpMem)
148 {
149 return RtlFreeHeap(Desktop->pheapDesktop,
150 HEAP_NO_SERIALIZE,
151 lpMem);
152 }
153
154 static __inline PVOID
155 DesktopHeapReAlloc(IN PDESKTOP Desktop,
156 IN PVOID lpMem,
157 IN SIZE_T Bytes)
158 {
159 #if 0
160 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
161 return RtlReAllocateHeap(Desktop->pheapDesktop,
162 HEAP_NO_SERIALIZE,
163 lpMem,
164 Bytes);
165 #else
166 SIZE_T PrevSize;
167 PVOID pNew;
168
169 PrevSize = RtlSizeHeap(Desktop->pheapDesktop,
170 HEAP_NO_SERIALIZE,
171 lpMem);
172
173 if (PrevSize == Bytes)
174 return lpMem;
175
176 pNew = RtlAllocateHeap(Desktop->pheapDesktop,
177 HEAP_NO_SERIALIZE,
178 Bytes);
179 if (pNew != NULL)
180 {
181 if (PrevSize < Bytes)
182 Bytes = PrevSize;
183
184 RtlCopyMemory(pNew,
185 lpMem,
186 Bytes);
187
188 RtlFreeHeap(Desktop->pheapDesktop,
189 HEAP_NO_SERIALIZE,
190 lpMem);
191 }
192
193 return pNew;
194 #endif
195 }
196
197 static __inline ULONG_PTR
198 DesktopHeapGetUserDelta(VOID)
199 {
200 PW32HEAP_USER_MAPPING Mapping;
201 PTHREADINFO pti;
202 PPROCESSINFO W32Process;
203 PWIN32HEAP pheapDesktop;
204 ULONG_PTR Delta = 0;
205
206 pti = PsGetCurrentThreadWin32Thread();
207 if (!pti->rpdesk)
208 return 0;
209
210 pheapDesktop = pti->rpdesk->pheapDesktop;
211
212 W32Process = PsGetCurrentProcessWin32Process();
213 Mapping = W32Process->HeapMappings.Next;
214 while (Mapping != NULL)
215 {
216 if (Mapping->KernelMapping == (PVOID)pheapDesktop)
217 {
218 Delta = (ULONG_PTR)Mapping->KernelMapping - (ULONG_PTR)Mapping->UserMapping;
219 break;
220 }
221
222 Mapping = Mapping->Next;
223 }
224
225 return Delta;
226 }
227
228 static __inline PVOID
229 DesktopHeapAddressToUser(PVOID lpMem)
230 {
231 PW32HEAP_USER_MAPPING Mapping;
232 PPROCESSINFO W32Process;
233
234 W32Process = PsGetCurrentProcessWin32Process();
235 Mapping = W32Process->HeapMappings.Next;
236 while (Mapping != NULL)
237 {
238 if ((ULONG_PTR)lpMem >= (ULONG_PTR)Mapping->KernelMapping &&
239 (ULONG_PTR)lpMem < (ULONG_PTR)Mapping->KernelMapping + Mapping->Limit)
240 {
241 return (PVOID)(((ULONG_PTR)lpMem - (ULONG_PTR)Mapping->KernelMapping) +
242 (ULONG_PTR)Mapping->UserMapping);
243 }
244
245 Mapping = Mapping->Next;
246 }
247
248 return NULL;
249 }
250
251 /* EOF */