ReactOS 0.4.17-dev-769-g1500a35
desktop.h
Go to the documentation of this file.
1#pragma once
2
3typedef struct _DESKTOP
4{
5 /* Must be the first member */
7
10 /* Pointer to the associated window station. */
26
27 /* One console input thread per desktop, maintained by CONSRV */
29
30 /* Use for tracking mouse moves. */
35
36 /* ReactOS */
37 /* Pointer to the active queue. */
39 /* Handle of the desktop window. */
41 /* Thread blocking input */
45
46// Desktop flags
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
53
54// Index offset for Desktop data. Should these be global?
55#define DT_GWL_PROCESSID 0
56#define DT_GWL_THREADID 4
57
66
67typedef struct _SHELL_HOOK_WINDOW
68{
72
73CODE_SEG("INIT")
77
85 IN OUT PUNICODE_STRING CompleteName,
90
95
100
102NTAPI
105
107NTAPI
110
113
116
119
122
125
128
131
134
137
138BOOL IntSetThreadDesktop(IN HDESK hDesktop,
139 IN BOOL FreeOnFailure);
140
145 IN PUNICODE_STRING DesktopPath,
146 IN BOOL bInherit,
147 OUT HWINSTA* phWinSta,
148 OUT HDESK* phDesktop);
149
152 HDESK Desktop,
156
160 OUT HDESK* phDesktop,
163 IN PUNICODE_STRING lpszDesktopDevice OPTIONAL,
164 IN LPDEVMODEW lpdmw OPTIONAL,
166 IN ACCESS_MASK dwDesiredAccess);
167
173
174#define IntIsActiveDesktop(Desktop) \
175 ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
176
179
180#if 0
181static __inline BOOL
183{
184 // return (pWnd == UserGetDesktopWindow());
185 return (pWnd && (pWnd->fnid == FNID_DESKTOP));
186}
187
188static __inline BOOL
190{
191 // return (pWnd == UserGetMessageWindow());
192 return (pWnd && (pWnd->fnid == FNID_MESSAGEWND));
193}
194#else
195
196#define UserIsDesktopWindow(pWnd) \
197 ((pWnd) && ((pWnd)->fnid == FNID_DESKTOP))
198
199#define UserIsMessageWindow(pWnd) \
200 ((pWnd) && ((pWnd)->fnid == FNID_MESSAGEWND))
201
202#endif
203
204
205static __inline PVOID
208{
209 /* Desktop heap has no lock, using global user lock instead. */
211 return RtlAllocateHeap(Desktop->pheapDesktop,
213 Bytes);
214}
215
216static __inline BOOL
218 IN PVOID lpMem)
219{
220 /* Desktop heap has no lock, using global user lock instead. */
222 return RtlFreeHeap(Desktop->pheapDesktop,
224 lpMem);
225}
226
227static __inline PVOID
229 IN PVOID lpMem,
231{
232#if 0
233 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
234 return RtlReAllocateHeap(Desktop->pheapDesktop,
236 lpMem,
237 Bytes);
238#else
239 SIZE_T PrevSize;
240 PVOID pNew;
241
242 /* Desktop heap has no lock, using global user lock instead. */
244
245 PrevSize = RtlSizeHeap(Desktop->pheapDesktop,
247 lpMem);
248
249 if (PrevSize == Bytes)
250 return lpMem;
251
252 pNew = RtlAllocateHeap(Desktop->pheapDesktop,
254 Bytes);
255 if (pNew != NULL)
256 {
257 if (PrevSize < Bytes)
258 Bytes = PrevSize;
259
260 RtlCopyMemory(pNew,
261 lpMem,
262 Bytes);
263
264 RtlFreeHeap(Desktop->pheapDesktop,
266 lpMem);
267 }
268
269 return pNew;
270#endif
271}
272
273static __inline ULONG_PTR
275{
277 PTHREADINFO pti;
278 PPROCESSINFO W32Process;
279 PWIN32HEAP pheapDesktop;
280 ULONG_PTR Delta = 0;
281
283 if (!pti->rpdesk)
284 return 0;
285
286 pheapDesktop = pti->rpdesk->pheapDesktop;
287
288 W32Process = PsGetCurrentProcessWin32Process();
289
290 /*
291 * Start the search at the next mapping: skip the first entry
292 * as it must be the global user heap mapping.
293 */
294 Mapping = W32Process->HeapMappings.Next;
295 while (Mapping != NULL)
296 {
297 if (Mapping->KernelMapping == (PVOID)pheapDesktop)
298 {
299 Delta = (ULONG_PTR)Mapping->KernelMapping - (ULONG_PTR)Mapping->UserMapping;
300 break;
301 }
302
303 Mapping = Mapping->Next;
304 }
305
306 return Delta;
307}
308
309static __inline PVOID
311{
313 PPROCESSINFO W32Process;
314
315 W32Process = PsGetCurrentProcessWin32Process();
316
317 /*
318 * Start the search at the next mapping: skip the first entry
319 * as it must be the global user heap mapping.
320 */
321 Mapping = W32Process->HeapMappings.Next;
322 while (Mapping != NULL)
323 {
324 if ((ULONG_PTR)lpMem >= (ULONG_PTR)Mapping->KernelMapping &&
325 (ULONG_PTR)lpMem < (ULONG_PTR)Mapping->KernelMapping + Mapping->Limit)
326 {
327 return (PVOID)(((ULONG_PTR)lpMem - (ULONG_PTR)Mapping->KernelMapping) +
328 (ULONG_PTR)Mapping->UserMapping);
329 }
330
331 Mapping = Mapping->Next;
332 }
333
334 return NULL;
335}
336
343HDESK UserOpenInputDesktop(DWORD dwFlags, BOOL fInherit, ACCESS_MASK dwDesiredAccess);
344
345/* EOF */
#define CODE_SEG(...)
#define __inline
Definition: _wctype.cpp:15
HWND hWnd
Definition: settings.c:17
LONG NTSTATUS
Definition: precomp.h:26
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:616
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:634
_Inout_ PFCB _Inout_ PUNICODE_STRING RemainingName
Definition: cdprocs.h:802
WPARAM wParam
Definition: combotst.c:138
struct @1802 Msg[]
LPARAM lParam
Definition: combotst.c:139
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
static CHAR Desktop[MAX_PATH]
Definition: dem.c:256
PDESKTOP FASTCALL IntGetActiveDesktop(VOID)
Definition: desktop.c:1290
PTHREADINFO gptiDesktopThread
Definition: desktop.c:53
PKEVENT gpDesktopSwitchEvent
WinSta0_DesktopSwitch legacy (NT 3.5+) event.
Definition: desktop.c:56
struct _DESKTOP * PDESKTOP
NTSTATUS FASTCALL IntCreateDesktop(OUT HDESK *phDesktop, IN POBJECT_ATTRIBUTES ObjectAttributes, IN KPROCESSOR_MODE AccessMode, IN PUNICODE_STRING lpszDesktopDevice OPTIONAL, IN LPDEVMODEW lpdmw OPTIONAL, IN DWORD dwFlags, IN ACCESS_MASK dwDesiredAccess)
Definition: desktop.c:2391
PWND FASTCALL IntGetThreadDesktopWindow(PTHREADINFO)
Definition: desktop.c:1387
struct _DESKTOP DESKTOP
HWND FASTCALL IntGetCurrentThreadDesktopWindow(VOID)
Definition: desktop.c:1447
NTSTATUS NTAPI IntDesktopOkToClose(_In_ PVOID Parameters)
Definition: desktop.c:210
NTSTATUS NTAPI InitDesktopImpl(VOID)
Definition: desktop.c:276
VOID APIENTRY UserRedrawDesktop(VOID)
Definition: desktop.c:1619
PKEVENT gpDesktopThreadStartedEvent
Definition: desktop.c:55
static __inline ULONG_PTR DesktopHeapGetUserDelta(VOID)
Definition: desktop.h:274
HDC ScreenDeviceContext
Definition: desktop.c:52
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1413
BOOL IntDeRegisterShellHookWindow(HWND hWnd)
Definition: desktop.c:1806
HWND FASTCALL IntGetMessageWindow(VOID)
Definition: desktop.c:1425
NTSTATUS FASTCALL IntHideDesktop(PDESKTOP Desktop)
Definition: desktop.c:1655
struct _SHELL_HOOK_WINDOW SHELL_HOOK_WINDOW
VOID NTAPI DesktopThreadMain(VOID)
Definition: desktop.c:1566
HDESK UserOpenInputDesktop(DWORD dwFlags, BOOL fInherit, ACCESS_MASK dwDesiredAccess)
Definition: desktop.c:2657
VOID FASTCALL IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue)
Definition: desktop.c:1347
HWND FASTCALL IntGetDesktopWindow(VOID)
Definition: desktop.c:1402
NTSTATUS FASTCALL co_IntShowDesktop(PDESKTOP Desktop, ULONG Width, ULONG Height, BOOL Redraw)
Definition: desktop.c:1637
PTHREADINFO gptiForeground
Definition: focus.c:15
NTSTATUS NTAPI IntDesktopObjectClose(_In_ PVOID Parameters)
Definition: desktop.c:251
BOOL IntRegisterShellHookWindow(HWND hWnd)
Definition: desktop.c:1774
NTSTATUS FASTCALL IntValidateDesktopHandle(HDESK Desktop, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PDESKTOP *Object)
Definition: desktop.c:1265
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
Definition: desktop.c:1335
struct _SHELL_HOOK_WINDOW * PSHELL_HOOK_WINDOW
HDC FASTCALL UserGetDesktopDC(ULONG, BOOL, BOOL)
Definition: desktop.c:1594
NTSTATUS APIENTRY IntDesktopObjectParse(IN PVOID ParseObject, IN PVOID ObjectType, IN OUT PACCESS_STATE AccessState, IN KPROCESSOR_MODE AccessMode, IN ULONG Attributes, IN OUT PUNICODE_STRING CompleteName, IN OUT PUNICODE_STRING RemainingName, IN OUT PVOID Context OPTIONAL, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, OUT PVOID *Object)
Definition: desktop.c:63
VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam)
Definition: desktop.c:1712
static __inline PVOID DesktopHeapAlloc(IN PDESKTOP Desktop, IN SIZE_T Bytes)
Definition: desktop.h:206
NTSTATUS FASTCALL IntResolveDesktop(IN PEPROCESS Process, IN PUNICODE_STRING DesktopPath, IN BOOL bInherit, OUT HWINSTA *phWinSta, OUT HDESK *phDesktop)
Definition: desktop.c:575
#define UserIsMessageWindow(pWnd)
Definition: desktop.h:199
static __inline BOOL DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem)
Definition: desktop.h:217
PCLS DesktopWindowClass
PWND FASTCALL co_GetDesktopWindow(PWND)
Definition: desktop.c:1394
static __inline PVOID DesktopHeapReAlloc(IN PDESKTOP Desktop, IN PVOID lpMem, IN SIZE_T Bytes)
Definition: desktop.h:228
BOOL FASTCALL UserMessageWindowProc(PWND pwnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *lResult)
Definition: desktop.c:1545
HANDLE ghDesktopSwitchEvent
WinSta0_DesktopSwitch handle in the CSRSS process.
Definition: desktop.c:57
NTSTATUS NTAPI IntDesktopObjectOpen(_In_ PVOID Parameters)
Definition: desktop.c:234
BOOL FASTCALL IntPaintDesktop(HDC)
Definition: desktop.c:1857
NTSTATUS NTAPI IntDesktopObjectDelete(_In_ PVOID Parameters)
Definition: desktop.c:179
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:196
PDESKTOP gpdeskInputDesktop
Currently active desktop.
Definition: desktop.c:51
BOOL IntSetThreadDesktop(IN HDESK hDesktop, IN BOOL FreeOnFailure)
Definition: desktop.c:3310
HDC FASTCALL IntGetScreenDC(VOID)
Definition: winsta.c:394
PWND FASTCALL UserGetMessageWindow(VOID)
Definition: desktop.c:1436
static __inline PVOID DesktopHeapAddressToUser(PVOID lpMem)
Definition: desktop.h:310
BOOL FASTCALL DesktopWindowProc(PWND, UINT, WPARAM, LPARAM, LRESULT *)
Definition: desktop.c:1462
_In_ ULONG Attributes
Definition: dispmprt.h:1077
_In_ HANDLE _In_ CONST PDXGKMDT_OPM_GET_INFO_PARAMETERS Parameters
Definition: dispmprt.h:321
_Check_return_ _In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ PDXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS _Out_ UINT _Out_ UINT * Height
Definition: dispmprt.h:1445
_Check_return_ _In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ PDXGKARG_SYSTEM_DISPLAY_ENABLE_FLAGS _Out_ UINT * Width
Definition: dispmprt.h:1444
#define NULL
Definition: types.h:112
#define APIENTRY
Definition: api.h:79
static const WCHAR Message[]
Definition: register.c:74
#define ULONG_PTR
Definition: config.h:101
static PVOID Mapping[EMS_PHYSICAL_PAGES]
Definition: emsdrv.c:41
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:223
unsigned int UINT
Definition: sysinfo.c:13
#define FNID_DESKTOP
Definition: ntuser.h:866
#define FNID_MESSAGEWND
Definition: ntuser.h:868
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
_In_ UINT Bytes
Definition: mmcopy.h:9
#define ASSERT(a)
Definition: mode.c:44
static HDC
Definition: imagelist.c:88
ObjectType
Definition: metafile.c:88
NTSYSAPI SIZE_T NTAPI RtlSizeHeap(_In_ PVOID HeapHandle, _In_ ULONG Flags, _In_ PVOID MemoryPointer)
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define _In_
Definition: no_sal2.h:158
ULONG ACCESS_MASK
Definition: nt_native.h:40
#define FASTCALL
Definition: nt_native.h:50
#define HEAP_NO_SERIALIZE
Definition: nt_native.h:1695
PVOID NTAPI PsGetCurrentProcessWin32Process(VOID)
Definition: process.c:1213
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
BOOL FASTCALL UserIsEnteredExclusive(VOID)
Definition: ntuser.c:231
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
_In_ PVOID Context
Definition: storport.h:2269
Definition: ntuser.h:570
PVOID hsectionDesktop
Definition: desktop.h:22
DWORD_PTR dwDesktopId
Definition: desktop.h:13
PVOID BlockInputThread
Definition: desktop.h:42
DWORD dwMouseHoverTime
Definition: desktop.h:34
struct _USER_MESSAGE_QUEUE * ActiveMessageQueue
Definition: desktop.h:38
LIST_ENTRY PtiList
Definition: desktop.h:25
LIST_ENTRY ListEntry
Definition: desktop.h:9
ULONG_PTR ulHeapSize
Definition: desktop.h:24
struct _WINSTATION_OBJECT * rpwinstaParent
Definition: desktop.h:11
LIST_ENTRY ShellHookWindows
Definition: desktop.h:43
PWND spwndTrack
Definition: desktop.h:31
PWIN32HEAP pheapDesktop
Definition: desktop.h:23
DWORD dwConsoleThreadId
Definition: desktop.h:28
PWND spwndForeground
Definition: desktop.h:18
PWND spwndTray
Definition: desktop.h:19
PMENU spmenuSys
Definition: desktop.h:14
PMENU spmenuDialogSys
Definition: desktop.h:15
PWND spwndMessage
Definition: desktop.h:20
PWND spwndTooltip
Definition: desktop.h:21
PMENU spmenuVScroll
Definition: desktop.h:17
DWORD htEx
Definition: desktop.h:32
HWND DesktopWindow
Definition: desktop.h:40
RECT rcMouseHover
Definition: desktop.h:33
PMENU spmenuHScroll
Definition: desktop.h:16
DWORD dwDTFlags
Definition: desktop.h:12
PDESKTOPINFO pDeskInfo
Definition: desktop.h:8
DWORD dwSessionId
Definition: desktop.h:6
Definition: typedefs.h:120
W32HEAP_USER_MAPPING HeapMappings
Definition: win32.h:292
LIST_ENTRY ListEntry
Definition: desktop.h:69
struct _DESKTOP * rpdesk
Definition: win32.h:93
struct _W32HEAP_USER_MAPPING * Next
Definition: win32.h:200
Definition: ntuser.h:698
uint32_t DWORD_PTR
Definition: typedefs.h:65
#define NTAPI
Definition: typedefs.h:36
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
struct _WIN32HEAP * PWIN32HEAP
Definition: usrheap.h:3
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
Definition: wdfdevice.h:2664
NTSYSAPI PVOID WINAPI RtlReAllocateHeap(HANDLE, ULONG, PVOID, SIZE_T) __WINE_ALLOC_SIZE(4) __WINE_DEALLOC(RtlFreeHeap
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7
_In_ PEPROCESS _In_ KPROCESSOR_MODE AccessMode
Definition: mmfuncs.h:396
_In_opt_ PVOID _In_opt_ PUNICODE_STRING _In_ PSECURITY_DESCRIPTOR _In_ PACCESS_STATE AccessState
Definition: sefuncs.h:417