1 #ifndef _WIN32K_DESKTOP_H
2 #define _WIN32K_DESKTOP_H
7 typedef struct _DESKTOP
9 PDESKTOPINFO pDeskInfo
;
11 /* Pointer to the associated window station. */
12 struct _WINSTATION_OBJECT
*rpwinstaParent
;
17 PSECTION_OBJECT hsectionDesktop
;
18 PWIN32HEAP pheapDesktop
;
21 /* use for tracking mouse moves. */
25 DWORD dwMouseHoverTime
;
28 /* Rectangle of the work area */
30 /* Pointer to the active queue. */
31 PVOID ActiveMessageQueue
;
32 /* Handle of the desktop window. */
34 /* Thread blocking input */
35 PVOID BlockInputThread
;
36 LIST_ENTRY ShellHookWindows
;
39 extern PDESKTOP InputDesktop
;
40 extern HDESK InputDesktopHandle
;
41 extern PCLS DesktopWindowClass
;
42 extern HDC ScreenDeviceContext
;
43 extern BOOL g_PaintDesktopVersion
;
45 typedef struct _SHELL_HOOK_WINDOW
49 } SHELL_HOOK_WINDOW
, *PSHELL_HOOK_WINDOW
;
52 InitDesktopImpl(VOID
);
55 CleanupDesktopImpl(VOID
);
59 IntDesktopObjectParse(IN PVOID ParseObject
,
61 IN OUT PACCESS_STATE AccessState
,
62 IN KPROCESSOR_MODE AccessMode
,
64 IN OUT PUNICODE_STRING CompleteName
,
65 IN OUT PUNICODE_STRING RemainingName
,
66 IN OUT PVOID Context OPTIONAL
,
67 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL
,
71 IntDesktopObjectDelete(PWIN32_DELETEMETHOD_PARAMETERS Parameters
);
74 IntGetDesktopWorkArea(PDESKTOP Desktop
, RECTL
*Rect
);
77 IntDesktopWindowProc(HWND hWnd
, UINT msg
, WPARAM wParam
, LPARAM lParam
);
83 IntGetDesktopWindow (VOID
);
85 PWINDOW_OBJECT FASTCALL
86 UserGetDesktopWindow(VOID
);
89 IntGetCurrentThreadDesktopWindow(VOID
);
91 PUSER_MESSAGE_QUEUE FASTCALL
92 IntGetFocusMessageQueue(VOID
);
95 IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue
);
98 IntGetActiveDesktop(VOID
);
101 co_IntShowDesktop(PDESKTOP Desktop
, ULONG Width
, ULONG Height
);
104 IntHideDesktop(PDESKTOP Desktop
);
107 IntGetDesktopObjectHandle(PDESKTOP DesktopObject
);
109 BOOL
IntSetThreadDesktop(IN PDESKTOP DesktopObject
,
110 IN BOOL FreeOnFailure
);
113 IntValidateDesktopHandle(
115 KPROCESSOR_MODE AccessMode
,
116 ACCESS_MASK DesiredAccess
,
119 IntParseDesktopPath(PEPROCESS Process
,
120 PUNICODE_STRING DesktopPath
,
123 BOOL FASTCALL
IntDesktopUpdatePerUserSettings(BOOL bEnable
);
124 VOID APIENTRY
UserRedrawDesktop(VOID
);
125 BOOL
IntRegisterShellHookWindow(HWND hWnd
);
126 BOOL
IntDeRegisterShellHookWindow(HWND hWnd
);
127 VOID
co_IntShellHookNotify(WPARAM Message
, LPARAM lParam
);
128 HDC FASTCALL
UserGetDesktopDC(ULONG
,BOOL
,BOOL
);
130 #define IntIsActiveDesktop(Desktop) \
131 ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
133 #define GET_DESKTOP_NAME(d) \
134 OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d)) ? \
135 &(OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d))->Name) : \
138 HWND FASTCALL
IntGetMessageWindow(VOID
);
140 static __inline PVOID
141 DesktopHeapAlloc(IN PDESKTOP Desktop
,
144 return RtlAllocateHeap(Desktop
->pheapDesktop
,
150 DesktopHeapFree(IN PDESKTOP Desktop
,
153 return RtlFreeHeap(Desktop
->pheapDesktop
,
158 static __inline PVOID
159 DesktopHeapReAlloc(IN PDESKTOP Desktop
,
164 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
165 return RtlReAllocateHeap(Desktop
->pheapDesktop
,
173 PrevSize
= RtlSizeHeap(Desktop
->pheapDesktop
,
177 if (PrevSize
== Bytes
)
180 pNew
= RtlAllocateHeap(Desktop
->pheapDesktop
,
185 if (PrevSize
< Bytes
)
192 RtlFreeHeap(Desktop
->pheapDesktop
,
201 static __inline ULONG_PTR
202 DesktopHeapGetUserDelta(VOID
)
204 PW32HEAP_USER_MAPPING Mapping
;
206 PPROCESSINFO W32Process
;
207 PWIN32HEAP pheapDesktop
;
210 pti
= PsGetCurrentThreadWin32Thread();
214 pheapDesktop
= pti
->rpdesk
->pheapDesktop
;
216 W32Process
= PsGetCurrentProcessWin32Process();
217 Mapping
= W32Process
->HeapMappings
.Next
;
218 while (Mapping
!= NULL
)
220 if (Mapping
->KernelMapping
== (PVOID
)pheapDesktop
)
222 Delta
= (ULONG_PTR
)Mapping
->KernelMapping
- (ULONG_PTR
)Mapping
->UserMapping
;
226 Mapping
= Mapping
->Next
;
232 static __inline PVOID
233 DesktopHeapAddressToUser(PVOID lpMem
)
235 PW32HEAP_USER_MAPPING Mapping
;
236 PPROCESSINFO W32Process
;
238 W32Process
= PsGetCurrentProcessWin32Process();
239 Mapping
= W32Process
->HeapMappings
.Next
;
240 while (Mapping
!= NULL
)
242 if ((ULONG_PTR
)lpMem
>= (ULONG_PTR
)Mapping
->KernelMapping
&&
243 (ULONG_PTR
)lpMem
< (ULONG_PTR
)Mapping
->KernelMapping
+ Mapping
->Limit
)
245 return (PVOID
)(((ULONG_PTR
)lpMem
- (ULONG_PTR
)Mapping
->KernelMapping
) +
246 (ULONG_PTR
)Mapping
->UserMapping
);
249 Mapping
= Mapping
->Next
;
255 #endif /* _WIN32K_DESKTOP_H */