3 typedef struct _DESKTOP
5 PDESKTOPINFO pDeskInfo
;
7 /* Pointer to the associated window station. */
8 struct _WINSTATION_OBJECT
*rpwinstaParent
;
14 PSECTION_OBJECT hsectionDesktop
;
15 PWIN32HEAP pheapDesktop
;
18 /* Use for tracking mouse moves. */
22 DWORD dwMouseHoverTime
;
25 /* Pointer to the active queue. */
26 struct _USER_MESSAGE_QUEUE
*ActiveMessageQueue
;
27 /* Handle of the desktop window. */
29 /* Thread blocking input */
30 PVOID BlockInputThread
;
31 LIST_ENTRY ShellHookWindows
;
35 #define DF_TME_HOVER 0x00000400
36 #define DF_TME_LEAVE 0x00000800
37 #define DF_HOTTRACK 0x00004000
38 #define DF_DESTROYED 0x00008000
39 #define DF_DESKWNDDESTROYED 0x00010000
40 #define DF_DYING 0x00020000
42 // Index offset for Desktop data. Should these be global?
43 #define DT_GWL_PROCESSID 0
44 #define DT_GWL_THREADID 4
46 #define DESKTOP_READ STANDARD_RIGHTS_READ | \
50 #define DESKTOP_WRITE STANDARD_RIGHTS_WRITE | \
51 DESKTOP_CREATEMENU | \
52 DESKTOP_CREATEWINDOW | \
53 DESKTOP_HOOKCONTROL | \
54 DESKTOP_JOURNALPLAYBACK | \
55 DESKTOP_JOURNALRECORD | \
58 #define DESKTOP_EXECUTE STANDARD_RIGHTS_EXECUTE | \
61 #define DESKTOP_ALL_ACCESS STANDARD_RIGHTS_REQUIRED | \
62 DESKTOP_CREATEMENU | \
63 DESKTOP_CREATEWINDOW | \
65 DESKTOP_HOOKCONTROL | \
66 DESKTOP_JOURNALPLAYBACK | \
67 DESKTOP_JOURNALRECORD | \
68 DESKTOP_READOBJECTS | \
69 DESKTOP_SWITCHDESKTOP | \
72 extern PDESKTOP InputDesktop
;
73 extern HDESK InputDesktopHandle
;
74 extern PCLS DesktopWindowClass
;
75 extern HDC ScreenDeviceContext
;
76 extern PTHREADINFO gptiDesktopThread
;
78 typedef struct _SHELL_HOOK_WINDOW
82 } SHELL_HOOK_WINDOW
, *PSHELL_HOOK_WINDOW
;
87 InitDesktopImpl(VOID
);
91 IntDesktopObjectParse(IN PVOID ParseObject
,
93 IN OUT PACCESS_STATE AccessState
,
94 IN KPROCESSOR_MODE AccessMode
,
96 IN OUT PUNICODE_STRING CompleteName
,
97 IN OUT PUNICODE_STRING RemainingName
,
98 IN OUT PVOID Context OPTIONAL
,
99 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
103 IntDesktopObjectDelete(PWIN32_DELETEMETHOD_PARAMETERS Parameters
);
106 IntDesktopOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters
);
109 IntDesktopObjectOpen(PWIN32_OPENMETHOD_PARAMETERS Parameters
);
112 IntDesktopObjectClose(PWIN32_CLOSEMETHOD_PARAMETERS Parameters
);
115 IntGetScreenDC(VOID
);
118 IntGetDesktopWindow (VOID
);
121 UserGetDesktopWindow(VOID
);
124 IntGetCurrentThreadDesktopWindow(VOID
);
126 PUSER_MESSAGE_QUEUE FASTCALL
127 IntGetFocusMessageQueue(VOID
);
130 IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue
);
133 IntGetActiveDesktop(VOID
);
136 co_IntShowDesktop(PDESKTOP Desktop
, ULONG Width
, ULONG Height
);
139 IntHideDesktop(PDESKTOP Desktop
);
141 BOOL
IntSetThreadDesktop(IN HDESK hDesktop
,
142 IN BOOL FreeOnFailure
);
145 IntValidateDesktopHandle(
147 KPROCESSOR_MODE AccessMode
,
148 ACCESS_MASK DesiredAccess
,
152 IntParseDesktopPath(PEPROCESS Process
,
153 PUNICODE_STRING DesktopPath
,
157 VOID APIENTRY
UserRedrawDesktop(VOID
);
158 BOOL
IntRegisterShellHookWindow(HWND hWnd
);
159 BOOL
IntDeRegisterShellHookWindow(HWND hWnd
);
160 VOID
co_IntShellHookNotify(WPARAM Message
, WPARAM wParam
, LPARAM lParam
);
161 HDC FASTCALL
UserGetDesktopDC(ULONG
,BOOL
,BOOL
);
163 #define IntIsActiveDesktop(Desktop) \
164 ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
166 #define GET_DESKTOP_NAME(d) \
167 OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d)) ? \
168 &(OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d))->Name) : \
171 HWND FASTCALL
IntGetMessageWindow(VOID
);
172 PWND FASTCALL
UserGetMessageWindow(VOID
);
174 static __inline PVOID
175 DesktopHeapAlloc(IN PDESKTOP Desktop
,
178 return RtlAllocateHeap(Desktop
->pheapDesktop
,
184 DesktopHeapFree(IN PDESKTOP Desktop
,
187 return RtlFreeHeap(Desktop
->pheapDesktop
,
192 static __inline PVOID
193 DesktopHeapReAlloc(IN PDESKTOP Desktop
,
198 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
199 return RtlReAllocateHeap(Desktop
->pheapDesktop
,
207 PrevSize
= RtlSizeHeap(Desktop
->pheapDesktop
,
211 if (PrevSize
== Bytes
)
214 pNew
= RtlAllocateHeap(Desktop
->pheapDesktop
,
219 if (PrevSize
< Bytes
)
226 RtlFreeHeap(Desktop
->pheapDesktop
,
235 static __inline ULONG_PTR
236 DesktopHeapGetUserDelta(VOID
)
238 PW32HEAP_USER_MAPPING Mapping
;
240 PPROCESSINFO W32Process
;
241 PWIN32HEAP pheapDesktop
;
244 pti
= PsGetCurrentThreadWin32Thread();
248 pheapDesktop
= pti
->rpdesk
->pheapDesktop
;
250 W32Process
= PsGetCurrentProcessWin32Process();
251 Mapping
= W32Process
->HeapMappings
.Next
;
252 while (Mapping
!= NULL
)
254 if (Mapping
->KernelMapping
== (PVOID
)pheapDesktop
)
256 Delta
= (ULONG_PTR
)Mapping
->KernelMapping
- (ULONG_PTR
)Mapping
->UserMapping
;
260 Mapping
= Mapping
->Next
;
266 static __inline PVOID
267 DesktopHeapAddressToUser(PVOID lpMem
)
269 PW32HEAP_USER_MAPPING Mapping
;
270 PPROCESSINFO W32Process
;
272 W32Process
= PsGetCurrentProcessWin32Process();
273 Mapping
= W32Process
->HeapMappings
.Next
;
274 while (Mapping
!= NULL
)
276 if ((ULONG_PTR
)lpMem
>= (ULONG_PTR
)Mapping
->KernelMapping
&&
277 (ULONG_PTR
)lpMem
< (ULONG_PTR
)Mapping
->KernelMapping
+ Mapping
->Limit
)
279 return (PVOID
)(((ULONG_PTR
)lpMem
- (ULONG_PTR
)Mapping
->KernelMapping
) +
280 (ULONG_PTR
)Mapping
->UserMapping
);
283 Mapping
= Mapping
->Next
;
289 PWND FASTCALL
IntGetThreadDesktopWindow(PTHREADINFO
);
290 PWND FASTCALL
co_GetDesktopWindow(PWND
);
291 BOOL FASTCALL
IntPaintDesktop(HDC
);
292 BOOL FASTCALL
DesktopWindowProc(PWND
, UINT
, WPARAM
, LPARAM
, LRESULT
*);
293 BOOL FASTCALL
UserMessageWindowProc(PWND pwnd
, UINT Msg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*lResult
);
294 VOID NTAPI
DesktopThreadMain();