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