3 typedef struct _DESKTOP
5 /* Must be the first member */
8 PDESKTOPINFO pDeskInfo
;
10 /* Pointer to the associated window station. */
11 struct _WINSTATION_OBJECT
*rpwinstaParent
;
13 DWORD_PTR dwDesktopId
;
15 PMENU spmenuDialogSys
;
22 PVOID hsectionDesktop
;
23 PWIN32HEAP pheapDesktop
;
27 /* One console input thread per desktop, maintained by CONSRV */
28 DWORD dwConsoleThreadId
;
30 /* Use for tracking mouse moves. */
34 DWORD dwMouseHoverTime
;
37 /* Pointer to the active queue. */
38 struct _USER_MESSAGE_QUEUE
*ActiveMessageQueue
;
39 /* Handle of the desktop window. */
41 /* Thread blocking input */
42 PVOID BlockInputThread
;
43 LIST_ENTRY ShellHookWindows
;
47 #define DF_TME_HOVER 0x00000400
48 #define DF_TME_LEAVE 0x00000800
49 #define DF_HOTTRACK 0x00004000
50 #define DF_DESTROYED 0x00008000
51 #define DF_DESKWNDDESTROYED 0x00010000
52 #define DF_DYING 0x00020000
54 // Index offset for Desktop data. Should these be global?
55 #define DT_GWL_PROCESSID 0
56 #define DT_GWL_THREADID 4
58 extern PDESKTOP gpdeskInputDesktop
;
59 extern PCLS DesktopWindowClass
;
60 extern HDC ScreenDeviceContext
;
61 extern PTHREADINFO gptiForeground
;
62 extern PTHREADINFO gptiDesktopThread
;
63 extern PKEVENT gpDesktopThreadStartedEvent
;
65 typedef struct _SHELL_HOOK_WINDOW
69 } SHELL_HOOK_WINDOW
, *PSHELL_HOOK_WINDOW
;
74 InitDesktopImpl(VOID
);
78 IntDesktopObjectParse(IN PVOID ParseObject
,
80 IN OUT PACCESS_STATE AccessState
,
81 IN KPROCESSOR_MODE AccessMode
,
83 IN OUT PUNICODE_STRING CompleteName
,
84 IN OUT PUNICODE_STRING RemainingName
,
85 IN OUT PVOID Context OPTIONAL
,
86 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
91 IntDesktopObjectDelete(
92 _In_ PVOID Parameters
);
97 _In_ PVOID Parameters
);
101 IntDesktopObjectOpen(
102 _In_ PVOID Parameters
);
106 IntDesktopObjectClose(
107 _In_ PVOID Parameters
);
110 IntGetScreenDC(VOID
);
113 IntGetDesktopWindow (VOID
);
116 UserGetDesktopWindow(VOID
);
119 IntGetCurrentThreadDesktopWindow(VOID
);
121 PUSER_MESSAGE_QUEUE FASTCALL
122 IntGetFocusMessageQueue(VOID
);
125 IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue
);
128 IntGetActiveDesktop(VOID
);
131 co_IntShowDesktop(PDESKTOP Desktop
, ULONG Width
, ULONG Height
, BOOL Redraw
);
134 IntHideDesktop(PDESKTOP Desktop
);
136 BOOL
IntSetThreadDesktop(IN HDESK hDesktop
,
137 IN BOOL FreeOnFailure
);
142 IN PEPROCESS Process
,
143 IN PUNICODE_STRING DesktopPath
,
145 OUT HWINSTA
* phWinSta
,
146 OUT HDESK
* phDesktop
);
149 IntValidateDesktopHandle(
151 KPROCESSOR_MODE AccessMode
,
152 ACCESS_MASK DesiredAccess
,
158 OUT HDESK
* phDesktop
,
159 IN POBJECT_ATTRIBUTES ObjectAttributes
,
160 IN KPROCESSOR_MODE AccessMode
,
161 IN PUNICODE_STRING lpszDesktopDevice OPTIONAL
,
162 IN LPDEVMODEW lpdmw OPTIONAL
,
164 IN ACCESS_MASK dwDesiredAccess
);
166 VOID APIENTRY
UserRedrawDesktop(VOID
);
167 BOOL
IntRegisterShellHookWindow(HWND hWnd
);
168 BOOL
IntDeRegisterShellHookWindow(HWND hWnd
);
169 VOID
co_IntShellHookNotify(WPARAM Message
, WPARAM wParam
, LPARAM lParam
);
170 HDC FASTCALL
UserGetDesktopDC(ULONG
,BOOL
,BOOL
);
172 #define IntIsActiveDesktop(Desktop) \
173 ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
175 HWND FASTCALL
IntGetMessageWindow(VOID
);
176 PWND FASTCALL
UserGetMessageWindow(VOID
);
180 UserIsDesktopWindow(IN PWND pWnd
)
182 // return (pWnd == UserGetDesktopWindow());
183 return (pWnd
&& (pWnd
->fnid
== FNID_DESKTOP
));
187 UserIsMessageWindow(IN PWND pWnd
)
189 // return (pWnd == UserGetMessageWindow());
190 return (pWnd
&& (pWnd
->fnid
== FNID_MESSAGEWND
));
194 #define UserIsDesktopWindow(pWnd) \
195 ((pWnd) && ((pWnd)->fnid == FNID_DESKTOP))
197 #define UserIsMessageWindow(pWnd) \
198 ((pWnd) && ((pWnd)->fnid == FNID_MESSAGEWND))
203 static __inline PVOID
204 DesktopHeapAlloc(IN PDESKTOP Desktop
,
207 /* Desktop heap has no lock, using global user lock instead. */
208 ASSERT(UserIsEnteredExclusive());
209 return RtlAllocateHeap(Desktop
->pheapDesktop
,
215 DesktopHeapFree(IN PDESKTOP Desktop
,
218 /* Desktop heap has no lock, using global user lock instead. */
219 ASSERT(UserIsEnteredExclusive());
220 return RtlFreeHeap(Desktop
->pheapDesktop
,
225 static __inline PVOID
226 DesktopHeapReAlloc(IN PDESKTOP Desktop
,
231 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
232 return RtlReAllocateHeap(Desktop
->pheapDesktop
,
240 /* Desktop heap has no lock, using global user lock instead. */
241 ASSERT(UserIsEnteredExclusive());
243 PrevSize
= RtlSizeHeap(Desktop
->pheapDesktop
,
247 if (PrevSize
== Bytes
)
250 pNew
= RtlAllocateHeap(Desktop
->pheapDesktop
,
255 if (PrevSize
< Bytes
)
262 RtlFreeHeap(Desktop
->pheapDesktop
,
271 static __inline ULONG_PTR
272 DesktopHeapGetUserDelta(VOID
)
274 PW32HEAP_USER_MAPPING Mapping
;
276 PPROCESSINFO W32Process
;
277 PWIN32HEAP pheapDesktop
;
280 pti
= PsGetCurrentThreadWin32Thread();
284 pheapDesktop
= pti
->rpdesk
->pheapDesktop
;
286 W32Process
= PsGetCurrentProcessWin32Process();
289 * Start the search at the next mapping: skip the first entry
290 * as it must be the global user heap mapping.
292 Mapping
= W32Process
->HeapMappings
.Next
;
293 while (Mapping
!= NULL
)
295 if (Mapping
->KernelMapping
== (PVOID
)pheapDesktop
)
297 Delta
= (ULONG_PTR
)Mapping
->KernelMapping
- (ULONG_PTR
)Mapping
->UserMapping
;
301 Mapping
= Mapping
->Next
;
307 static __inline PVOID
308 DesktopHeapAddressToUser(PVOID lpMem
)
310 PW32HEAP_USER_MAPPING Mapping
;
311 PPROCESSINFO W32Process
;
313 W32Process
= PsGetCurrentProcessWin32Process();
316 * Start the search at the next mapping: skip the first entry
317 * as it must be the global user heap mapping.
319 Mapping
= W32Process
->HeapMappings
.Next
;
320 while (Mapping
!= NULL
)
322 if ((ULONG_PTR
)lpMem
>= (ULONG_PTR
)Mapping
->KernelMapping
&&
323 (ULONG_PTR
)lpMem
< (ULONG_PTR
)Mapping
->KernelMapping
+ Mapping
->Limit
)
325 return (PVOID
)(((ULONG_PTR
)lpMem
- (ULONG_PTR
)Mapping
->KernelMapping
) +
326 (ULONG_PTR
)Mapping
->UserMapping
);
329 Mapping
= Mapping
->Next
;
335 PWND FASTCALL
IntGetThreadDesktopWindow(PTHREADINFO
);
336 PWND FASTCALL
co_GetDesktopWindow(PWND
);
337 BOOL FASTCALL
IntPaintDesktop(HDC
);
338 BOOL FASTCALL
DesktopWindowProc(PWND
, UINT
, WPARAM
, LPARAM
, LRESULT
*);
339 BOOL FASTCALL
UserMessageWindowProc(PWND pwnd
, UINT Msg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*lResult
);
340 VOID NTAPI
DesktopThreadMain(VOID
);
341 HDESK
UserOpenInputDesktop(DWORD dwFlags
, BOOL fInherit
, ACCESS_MASK dwDesiredAccess
);