6 typedef struct _DESKTOP
8 PDESKTOPINFO pDeskInfo
;
10 /* Pointer to the associated window station. */
11 struct _WINSTATION_OBJECT
*rpwinstaParent
;
16 PSECTION_OBJECT hsectionDesktop
;
17 PWIN32HEAP pheapDesktop
;
20 /* use for tracking mouse moves. */
24 DWORD dwMouseHoverTime
;
27 /* Pointer to the active queue. */
28 PVOID ActiveMessageQueue
;
29 /* Handle of the desktop window. */
31 /* Thread blocking input */
32 PVOID BlockInputThread
;
33 LIST_ENTRY ShellHookWindows
;
36 extern PDESKTOP InputDesktop
;
37 extern HDESK InputDesktopHandle
;
38 extern PCLS DesktopWindowClass
;
39 extern HDC ScreenDeviceContext
;
40 extern BOOL g_PaintDesktopVersion
;
42 typedef struct _SHELL_HOOK_WINDOW
46 } SHELL_HOOK_WINDOW
, *PSHELL_HOOK_WINDOW
;
51 InitDesktopImpl(VOID
);
54 CleanupDesktopImpl(VOID
);
58 IntDesktopObjectParse(IN PVOID ParseObject
,
60 IN OUT PACCESS_STATE AccessState
,
61 IN KPROCESSOR_MODE AccessMode
,
63 IN OUT PUNICODE_STRING CompleteName
,
64 IN OUT PUNICODE_STRING RemainingName
,
65 IN OUT PVOID Context OPTIONAL
,
66 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
70 IntDesktopObjectDelete(PWIN32_DELETEMETHOD_PARAMETERS Parameters
);
73 IntDesktopOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters
);
76 IntDesktopWindowProc(HWND hWnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
);
82 IntGetDesktopWindow (VOID
);
85 UserGetDesktopWindow(VOID
);
88 IntGetCurrentThreadDesktopWindow(VOID
);
90 PUSER_MESSAGE_QUEUE FASTCALL
91 IntGetFocusMessageQueue(VOID
);
94 IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue
);
97 IntGetActiveDesktop(VOID
);
100 co_IntShowDesktop(PDESKTOP Desktop
, ULONG Width
, ULONG Height
);
103 IntHideDesktop(PDESKTOP Desktop
);
106 IntGetDesktopObjectHandle(PDESKTOP DesktopObject
);
108 BOOL
IntSetThreadDesktop(IN HDESK hDesktop
,
109 IN BOOL FreeOnFailure
);
112 IntValidateDesktopHandle(
114 KPROCESSOR_MODE AccessMode
,
115 ACCESS_MASK DesiredAccess
,
118 IntParseDesktopPath(PEPROCESS Process
,
119 PUNICODE_STRING DesktopPath
,
122 BOOL FASTCALL
IntDesktopUpdatePerUserSettings(BOOL bEnable
);
123 VOID APIENTRY
UserRedrawDesktop(VOID
);
124 BOOL
IntRegisterShellHookWindow(HWND hWnd
);
125 BOOL
IntDeRegisterShellHookWindow(HWND hWnd
);
126 VOID
co_IntShellHookNotify(WPARAM Message
, LPARAM lParam
);
127 HDC FASTCALL
UserGetDesktopDC(ULONG
,BOOL
,BOOL
);
129 #define IntIsActiveDesktop(Desktop) \
130 ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
132 #define GET_DESKTOP_NAME(d) \
133 OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d)) ? \
134 &(OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d))->Name) : \
137 HWND FASTCALL
IntGetMessageWindow(VOID
);
139 static __inline PVOID
140 DesktopHeapAlloc(IN PDESKTOP Desktop
,
143 return RtlAllocateHeap(Desktop
->pheapDesktop
,
149 DesktopHeapFree(IN PDESKTOP Desktop
,
152 return RtlFreeHeap(Desktop
->pheapDesktop
,
157 static __inline PVOID
158 DesktopHeapReAlloc(IN PDESKTOP Desktop
,
163 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
164 return RtlReAllocateHeap(Desktop
->pheapDesktop
,
172 PrevSize
= RtlSizeHeap(Desktop
->pheapDesktop
,
176 if (PrevSize
== Bytes
)
179 pNew
= RtlAllocateHeap(Desktop
->pheapDesktop
,
184 if (PrevSize
< Bytes
)
191 RtlFreeHeap(Desktop
->pheapDesktop
,
200 static __inline ULONG_PTR
201 DesktopHeapGetUserDelta(VOID
)
203 PW32HEAP_USER_MAPPING Mapping
;
205 PPROCESSINFO W32Process
;
206 PWIN32HEAP pheapDesktop
;
209 pti
= PsGetCurrentThreadWin32Thread();
213 pheapDesktop
= pti
->rpdesk
->pheapDesktop
;
215 W32Process
= PsGetCurrentProcessWin32Process();
216 Mapping
= W32Process
->HeapMappings
.Next
;
217 while (Mapping
!= NULL
)
219 if (Mapping
->KernelMapping
== (PVOID
)pheapDesktop
)
221 Delta
= (ULONG_PTR
)Mapping
->KernelMapping
- (ULONG_PTR
)Mapping
->UserMapping
;
225 Mapping
= Mapping
->Next
;
231 static __inline PVOID
232 DesktopHeapAddressToUser(PVOID lpMem
)
234 PW32HEAP_USER_MAPPING Mapping
;
235 PPROCESSINFO W32Process
;
237 W32Process
= PsGetCurrentProcessWin32Process();
238 Mapping
= W32Process
->HeapMappings
.Next
;
239 while (Mapping
!= NULL
)
241 if ((ULONG_PTR
)lpMem
>= (ULONG_PTR
)Mapping
->KernelMapping
&&
242 (ULONG_PTR
)lpMem
< (ULONG_PTR
)Mapping
->KernelMapping
+ Mapping
->Limit
)
244 return (PVOID
)(((ULONG_PTR
)lpMem
- (ULONG_PTR
)Mapping
->KernelMapping
) +
245 (ULONG_PTR
)Mapping
->UserMapping
);
248 Mapping
= Mapping
->Next
;