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
;
17 PVOID hsectionDesktop
;
18 PWIN32HEAP pheapDesktop
;
21 /* Use for tracking mouse moves. */
25 DWORD dwMouseHoverTime
;
28 /* Pointer to the active queue. */
29 struct _USER_MESSAGE_QUEUE
*ActiveMessageQueue
;
30 /* Handle of the desktop window. */
32 /* Thread blocking input */
33 PVOID BlockInputThread
;
34 LIST_ENTRY ShellHookWindows
;
38 #define DF_TME_HOVER 0x00000400
39 #define DF_TME_LEAVE 0x00000800
40 #define DF_HOTTRACK 0x00004000
41 #define DF_DESTROYED 0x00008000
42 #define DF_DESKWNDDESTROYED 0x00010000
43 #define DF_DYING 0x00020000
45 // Index offset for Desktop data. Should these be global?
46 #define DT_GWL_PROCESSID 0
47 #define DT_GWL_THREADID 4
49 #define DESKTOP_READ STANDARD_RIGHTS_READ | \
53 #define DESKTOP_WRITE STANDARD_RIGHTS_WRITE | \
54 DESKTOP_CREATEMENU | \
55 DESKTOP_CREATEWINDOW | \
56 DESKTOP_HOOKCONTROL | \
57 DESKTOP_JOURNALPLAYBACK | \
58 DESKTOP_JOURNALRECORD | \
61 #define DESKTOP_EXECUTE STANDARD_RIGHTS_EXECUTE | \
64 #define DESKTOP_ALL_ACCESS STANDARD_RIGHTS_REQUIRED | \
65 DESKTOP_CREATEMENU | \
66 DESKTOP_CREATEWINDOW | \
68 DESKTOP_HOOKCONTROL | \
69 DESKTOP_JOURNALPLAYBACK | \
70 DESKTOP_JOURNALRECORD | \
71 DESKTOP_READOBJECTS | \
72 DESKTOP_SWITCHDESKTOP | \
75 extern PDESKTOP gpdeskInputDesktop
;
76 extern PCLS DesktopWindowClass
;
77 extern HDC ScreenDeviceContext
;
78 extern PTHREADINFO gptiForeground
;
79 extern PTHREADINFO gptiDesktopThread
;
81 typedef struct _SHELL_HOOK_WINDOW
85 } SHELL_HOOK_WINDOW
, *PSHELL_HOOK_WINDOW
;
90 InitDesktopImpl(VOID
);
94 IntDesktopObjectParse(IN PVOID ParseObject
,
96 IN OUT PACCESS_STATE AccessState
,
97 IN KPROCESSOR_MODE AccessMode
,
99 IN OUT PUNICODE_STRING CompleteName
,
100 IN OUT PUNICODE_STRING RemainingName
,
101 IN OUT PVOID Context OPTIONAL
,
102 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
107 IntDesktopObjectDelete(
108 _In_ PVOID Parameters
);
113 _In_ PVOID Parameters
);
117 IntDesktopObjectOpen(
118 _In_ PVOID Parameters
);
122 IntDesktopObjectClose(
123 _In_ PVOID Parameters
);
126 IntGetScreenDC(VOID
);
129 IntGetDesktopWindow (VOID
);
132 UserGetDesktopWindow(VOID
);
135 IntGetCurrentThreadDesktopWindow(VOID
);
137 PUSER_MESSAGE_QUEUE FASTCALL
138 IntGetFocusMessageQueue(VOID
);
141 IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue
);
144 IntGetActiveDesktop(VOID
);
147 co_IntShowDesktop(PDESKTOP Desktop
, ULONG Width
, ULONG Height
, BOOL Redraw
);
150 IntHideDesktop(PDESKTOP Desktop
);
152 BOOL
IntSetThreadDesktop(IN HDESK hDesktop
,
153 IN BOOL FreeOnFailure
);
156 IntValidateDesktopHandle(
158 KPROCESSOR_MODE AccessMode
,
159 ACCESS_MASK DesiredAccess
,
163 IntParseDesktopPath(PEPROCESS Process
,
164 PUNICODE_STRING DesktopPath
,
168 VOID APIENTRY
UserRedrawDesktop(VOID
);
169 BOOL
IntRegisterShellHookWindow(HWND hWnd
);
170 BOOL
IntDeRegisterShellHookWindow(HWND hWnd
);
171 VOID
co_IntShellHookNotify(WPARAM Message
, WPARAM wParam
, LPARAM lParam
);
172 HDC FASTCALL
UserGetDesktopDC(ULONG
,BOOL
,BOOL
);
174 #define IntIsActiveDesktop(Desktop) \
175 ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
177 #define GET_DESKTOP_NAME(d) \
178 OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d)) ? \
179 &(OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d))->Name) : \
182 HWND FASTCALL
IntGetMessageWindow(VOID
);
183 PWND FASTCALL
UserGetMessageWindow(VOID
);
185 static __inline PVOID
186 DesktopHeapAlloc(IN PDESKTOP Desktop
,
189 return RtlAllocateHeap(Desktop
->pheapDesktop
,
195 DesktopHeapFree(IN PDESKTOP Desktop
,
198 return RtlFreeHeap(Desktop
->pheapDesktop
,
203 static __inline PVOID
204 DesktopHeapReAlloc(IN PDESKTOP Desktop
,
209 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
210 return RtlReAllocateHeap(Desktop
->pheapDesktop
,
218 PrevSize
= RtlSizeHeap(Desktop
->pheapDesktop
,
222 if (PrevSize
== Bytes
)
225 pNew
= RtlAllocateHeap(Desktop
->pheapDesktop
,
230 if (PrevSize
< Bytes
)
237 RtlFreeHeap(Desktop
->pheapDesktop
,
246 static __inline ULONG_PTR
247 DesktopHeapGetUserDelta(VOID
)
249 PW32HEAP_USER_MAPPING Mapping
;
251 PPROCESSINFO W32Process
;
252 PWIN32HEAP pheapDesktop
;
255 pti
= PsGetCurrentThreadWin32Thread();
259 pheapDesktop
= pti
->rpdesk
->pheapDesktop
;
261 W32Process
= PsGetCurrentProcessWin32Process();
262 Mapping
= W32Process
->HeapMappings
.Next
;
263 while (Mapping
!= NULL
)
265 if (Mapping
->KernelMapping
== (PVOID
)pheapDesktop
)
267 Delta
= (ULONG_PTR
)Mapping
->KernelMapping
- (ULONG_PTR
)Mapping
->UserMapping
;
271 Mapping
= Mapping
->Next
;
277 static __inline PVOID
278 DesktopHeapAddressToUser(PVOID lpMem
)
280 PW32HEAP_USER_MAPPING Mapping
;
281 PPROCESSINFO W32Process
;
283 W32Process
= PsGetCurrentProcessWin32Process();
284 Mapping
= W32Process
->HeapMappings
.Next
;
285 while (Mapping
!= NULL
)
287 if ((ULONG_PTR
)lpMem
>= (ULONG_PTR
)Mapping
->KernelMapping
&&
288 (ULONG_PTR
)lpMem
< (ULONG_PTR
)Mapping
->KernelMapping
+ Mapping
->Limit
)
290 return (PVOID
)(((ULONG_PTR
)lpMem
- (ULONG_PTR
)Mapping
->KernelMapping
) +
291 (ULONG_PTR
)Mapping
->UserMapping
);
294 Mapping
= Mapping
->Next
;
300 PWND FASTCALL
IntGetThreadDesktopWindow(PTHREADINFO
);
301 PWND FASTCALL
co_GetDesktopWindow(PWND
);
302 BOOL FASTCALL
IntPaintDesktop(HDC
);
303 BOOL FASTCALL
DesktopWindowProc(PWND
, UINT
, WPARAM
, LPARAM
, LRESULT
*);
304 BOOL FASTCALL
UserMessageWindowProc(PWND pwnd
, UINT Msg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*lResult
);
305 VOID NTAPI
DesktopThreadMain();