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