ReactOS 0.4.16-dev-1247-g7d8d8a6
desktop.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _DESKTOP
 
struct  _SHELL_HOOK_WINDOW
 

Macros

#define DF_TME_HOVER   0x00000400
 
#define DF_TME_LEAVE   0x00000800
 
#define DF_HOTTRACK   0x00004000
 
#define DF_DESTROYED   0x00008000
 
#define DF_DESKWNDDESTROYED   0x00010000
 
#define DF_DYING   0x00020000
 
#define DT_GWL_PROCESSID   0
 
#define DT_GWL_THREADID   4
 
#define IntIsActiveDesktop(Desktop)    ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
 
#define UserIsDesktopWindow(pWnd)    ((pWnd) && ((pWnd)->fnid == FNID_DESKTOP))
 
#define UserIsMessageWindow(pWnd)    ((pWnd) && ((pWnd)->fnid == FNID_MESSAGEWND))
 

Typedefs

typedef struct _DESKTOP DESKTOP
 
typedef struct _DESKTOPPDESKTOP
 
typedef struct _SHELL_HOOK_WINDOW SHELL_HOOK_WINDOW
 
typedef struct _SHELL_HOOK_WINDOWPSHELL_HOOK_WINDOW
 

Functions

NTSTATUS NTAPI InitDesktopImpl (VOID)
 
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)
 
NTSTATUS NTAPI IntDesktopObjectDelete (_In_ PVOID Parameters)
 
NTSTATUS NTAPI IntDesktopOkToClose (_In_ PVOID Parameters)
 
NTSTATUS NTAPI IntDesktopObjectOpen (_In_ PVOID Parameters)
 
NTSTATUS NTAPI IntDesktopObjectClose (_In_ PVOID Parameters)
 
HDC FASTCALL IntGetScreenDC (VOID)
 
HWND FASTCALL IntGetDesktopWindow (VOID)
 
PWND FASTCALL UserGetDesktopWindow (VOID)
 
HWND FASTCALL IntGetCurrentThreadDesktopWindow (VOID)
 
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue (VOID)
 
VOID FASTCALL IntSetFocusMessageQueue (PUSER_MESSAGE_QUEUE NewQueue)
 
PDESKTOP FASTCALL IntGetActiveDesktop (VOID)
 
NTSTATUS FASTCALL co_IntShowDesktop (PDESKTOP Desktop, ULONG Width, ULONG Height, BOOL Redraw)
 
NTSTATUS FASTCALL IntHideDesktop (PDESKTOP Desktop)
 
BOOL IntSetThreadDesktop (IN HDESK hDesktop, IN BOOL FreeOnFailure)
 
NTSTATUS FASTCALL IntResolveDesktop (IN PEPROCESS Process, IN PUNICODE_STRING DesktopPath, IN BOOL bInherit, OUT HWINSTA *phWinSta, OUT HDESK *phDesktop)
 
NTSTATUS FASTCALL IntValidateDesktopHandle (HDESK Desktop, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PDESKTOP *Object)
 
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)
 
VOID APIENTRY UserRedrawDesktop (VOID)
 
BOOL IntRegisterShellHookWindow (HWND hWnd)
 
BOOL IntDeRegisterShellHookWindow (HWND hWnd)
 
VOID co_IntShellHookNotify (WPARAM Message, WPARAM wParam, LPARAM lParam)
 
HDC FASTCALL UserGetDesktopDC (ULONG, BOOL, BOOL)
 
HWND FASTCALL IntGetMessageWindow (VOID)
 
PWND FASTCALL UserGetMessageWindow (VOID)
 
static __inline PVOID DesktopHeapAlloc (IN PDESKTOP Desktop, IN SIZE_T Bytes)
 
static __inline BOOL DesktopHeapFree (IN PDESKTOP Desktop, IN PVOID lpMem)
 
static __inline PVOID DesktopHeapReAlloc (IN PDESKTOP Desktop, IN PVOID lpMem, IN SIZE_T Bytes)
 
static __inline ULONG_PTR DesktopHeapGetUserDelta (VOID)
 
static __inline PVOID DesktopHeapAddressToUser (PVOID lpMem)
 
PWND FASTCALL IntGetThreadDesktopWindow (PTHREADINFO)
 
PWND FASTCALL co_GetDesktopWindow (PWND)
 
BOOL FASTCALL IntPaintDesktop (HDC)
 
BOOL FASTCALL DesktopWindowProc (PWND, UINT, WPARAM, LPARAM, LRESULT *)
 
BOOL FASTCALL UserMessageWindowProc (PWND pwnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *lResult)
 
VOID NTAPI DesktopThreadMain (VOID)
 
HDESK UserOpenInputDesktop (DWORD dwFlags, BOOL fInherit, ACCESS_MASK dwDesiredAccess)
 

Variables

PDESKTOP gpdeskInputDesktop
 
PCLS DesktopWindowClass
 
HDC ScreenDeviceContext
 
PTHREADINFO gptiForeground
 
PTHREADINFO gptiDesktopThread
 
PKEVENT gpDesktopThreadStartedEvent
 

Macro Definition Documentation

◆ DF_DESKWNDDESTROYED

#define DF_DESKWNDDESTROYED   0x00010000

Definition at line 51 of file desktop.h.

◆ DF_DESTROYED

#define DF_DESTROYED   0x00008000

Definition at line 50 of file desktop.h.

◆ DF_DYING

#define DF_DYING   0x00020000

Definition at line 52 of file desktop.h.

◆ DF_HOTTRACK

#define DF_HOTTRACK   0x00004000

Definition at line 49 of file desktop.h.

◆ DF_TME_HOVER

#define DF_TME_HOVER   0x00000400

Definition at line 47 of file desktop.h.

◆ DF_TME_LEAVE

#define DF_TME_LEAVE   0x00000800

Definition at line 48 of file desktop.h.

◆ DT_GWL_PROCESSID

#define DT_GWL_PROCESSID   0

Definition at line 55 of file desktop.h.

◆ DT_GWL_THREADID

#define DT_GWL_THREADID   4

Definition at line 56 of file desktop.h.

◆ IntIsActiveDesktop

#define IntIsActiveDesktop (   Desktop)     ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))

Definition at line 172 of file desktop.h.

◆ UserIsDesktopWindow

#define UserIsDesktopWindow (   pWnd)     ((pWnd) && ((pWnd)->fnid == FNID_DESKTOP))

Definition at line 194 of file desktop.h.

◆ UserIsMessageWindow

#define UserIsMessageWindow (   pWnd)     ((pWnd) && ((pWnd)->fnid == FNID_MESSAGEWND))

Definition at line 197 of file desktop.h.

Typedef Documentation

◆ DESKTOP

◆ PDESKTOP

◆ PSHELL_HOOK_WINDOW

◆ SHELL_HOOK_WINDOW

Function Documentation

◆ co_GetDesktopWindow()

PWND FASTCALL co_GetDesktopWindow ( PWND  pWnd)

Definition at line 1383 of file desktop.c.

1384{
1385 if (pWnd->head.rpdesk &&
1386 pWnd->head.rpdesk->pDeskInfo)
1387 return pWnd->head.rpdesk->pDeskInfo->spwnd;
1388 return NULL;
1389}
#define NULL
Definition: types.h:112
struct _DESKTOP * rpdesk
Definition: ntuser.h:194
THRDESKHEAD head
Definition: ntuser.h:695

Referenced by co_IntSendActivateMessages(), co_IntSetParent(), co_UserCreateWindowEx(), IntDefWindowProc(), IntIsTopLevelWindow(), and IntWinListOwnedPopups().

◆ co_IntShellHookNotify()

VOID co_IntShellHookNotify ( WPARAM  Message,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 1709 of file desktop.c.

1710{
1712 HWND* HwndList;
1713
1714 if (!gpsi->uiShellMsg)
1715 {
1716 gpsi->uiShellMsg = IntAddAtom(L"SHELLHOOK");
1717
1718 TRACE("MsgType = %x\n", gpsi->uiShellMsg);
1719 if (!gpsi->uiShellMsg)
1720 ERR("LastError: %x\n", EngGetLastError());
1721 }
1722
1723 if (!Desktop)
1724 {
1725 TRACE("IntShellHookNotify: No desktop!\n");
1726 return;
1727 }
1728
1729 // Allow other devices have a shot at foreground.
1730 if (Message == HSHELL_APPCOMMAND) ptiLastInput = NULL;
1731
1732 // FIXME: System Tray Support.
1733
1735 if (HwndList)
1736 {
1737 HWND* cursor = HwndList;
1738 LPARAM shellhookparam = (Message == HSHELL_LANGUAGE || Message == HSHELL_APPCOMMAND)
1739 ? lParam : (LPARAM)wParam;
1740
1741 for (; *cursor; cursor++)
1742 {
1743 TRACE("Sending notify\n");
1746 Message,
1747 shellhookparam);
1748/* co_IntPostOrSendMessage(*cursor,
1749 gpsi->uiShellMsg,
1750 Message,
1751 shellhookparam);*/
1752 }
1753
1755 }
1756
1757 if (ISITHOOKED(WH_SHELL))
1758 {
1760 }
1761}
#define ERR(fmt,...)
Definition: precomp.h:57
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
static const WCHAR Message[]
Definition: register.c:74
PTHREADINFO ptiLastInput
Definition: focus.c:18
#define ISITHOOKED(HookId)
Definition: hook.h:6
const char cursor[]
Definition: icontest.c:13
PSERVERINFO gpsi
Definition: imm.c:18
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
LRESULT APIENTRY co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
Definition: hook.c:1102
#define L(x)
Definition: ntvdm.h:50
#define TRACE(s)
Definition: solgame.cpp:4
UINT uiShellMsg
Definition: ntuser.h:1063
RTL_ATOM FASTCALL IntAddAtom(LPWSTR AtomName)
Definition: useratom.c:13
PDESKTOP FASTCALL IntGetActiveDesktop(VOID)
Definition: desktop.c:1279
static HWND *FASTCALL UserBuildShellHookHwndList(PDESKTOP Desktop)
Definition: desktop.c:1668
BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1395
#define USERTAG_WINDOWLIST
Definition: tags.h:298
ENGAPI ULONG APIENTRY EngGetLastError(VOID)
Definition: error.c:9
LONG_PTR LPARAM
Definition: windef.h:208
#define WH_SHELL
Definition: winuser.h:40

Referenced by co_IntLoadKeyboardLayoutEx(), co_IntUnloadKeyboardLayoutEx(), co_UserActivateKeyboardLayout(), co_UserCreateWindowEx(), co_UserDestroyWindow(), co_UserProcessHotKeys(), co_WinPosSetWindowPos(), DefSetText(), IntCheckFullscreen(), IntDefWindowProc(), NtUserCallHwndLock(), NtUserDefSetText(), and UpdateShellHook().

◆ co_IntShowDesktop()

NTSTATUS FASTCALL co_IntShowDesktop ( PDESKTOP  Desktop,
ULONG  Width,
ULONG  Height,
BOOL  Redraw 
)

Definition at line 1634 of file desktop.c.

1635{
1636 PWND pwnd = Desktop->pDeskInfo->spwnd;
1638 ASSERT(pwnd);
1639
1640 if (!bRedraw)
1642
1644
1645 if (bRedraw)
1647
1648 return STATUS_SUCCESS;
1649}
GLbitfield flags
Definition: glext.h:7161
#define ASSERT(a)
Definition: mode.c:44
unsigned int UINT
Definition: ndis.h:50
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1792
#define STATUS_SUCCESS
Definition: shellext.h:65
Definition: ntuser.h:694
BOOL FASTCALL co_UserRedrawWindow(PWND Window, const RECTL *UpdateRect, PREGION UpdateRgn, ULONG Flags)
Definition: painting.c:895
_In_ HFONT _Out_ PUINT _Out_ PUINT Width
Definition: font.h:89
_In_ HFONT _Out_ PUINT Height
Definition: font.h:88
#define SWP_NOACTIVATE
Definition: winuser.h:1253
#define SWP_NOREDRAW
Definition: winuser.h:1257
#define RDW_UPDATENOW
Definition: winuser.h:1231
#define RDW_ALLCHILDREN
Definition: winuser.h:1232
#define SWP_SHOWWINDOW
Definition: winuser.h:1259
#define SWP_NOZORDER
Definition: winuser.h:1258
#define RDW_INVALIDATE
Definition: winuser.h:1225

Referenced by co_IntInitializeDesktopGraphics(), and NtUserSwitchDesktop().

◆ DesktopHeapAddressToUser()

static __inline PVOID DesktopHeapAddressToUser ( PVOID  lpMem)
static

Definition at line 308 of file desktop.h.

309{
311 PPROCESSINFO W32Process;
312
313 W32Process = PsGetCurrentProcessWin32Process();
314
315 /*
316 * Start the search at the next mapping: skip the first entry
317 * as it must be the global user heap mapping.
318 */
319 Mapping = W32Process->HeapMappings.Next;
320 while (Mapping != NULL)
321 {
322 if ((ULONG_PTR)lpMem >= (ULONG_PTR)Mapping->KernelMapping &&
323 (ULONG_PTR)lpMem < (ULONG_PTR)Mapping->KernelMapping + Mapping->Limit)
324 {
325 return (PVOID)(((ULONG_PTR)lpMem - (ULONG_PTR)Mapping->KernelMapping) +
326 (ULONG_PTR)Mapping->UserMapping);
327 }
328
329 Mapping = Mapping->Next;
330 }
331
332 return NULL;
333}
#define ULONG_PTR
Definition: config.h:101
static PVOID Mapping[EMS_PHYSICAL_PAGES]
Definition: emsdrv.c:41
PVOID NTAPI PsGetCurrentProcessWin32Process(VOID)
Definition: process.c:1183
W32HEAP_USER_MAPPING HeapMappings
Definition: win32.h:291
struct _W32HEAP_USER_MAPPING * Next
Definition: win32.h:199
uint32_t ULONG_PTR
Definition: typedefs.h:65

Referenced by IntSetTebWndCallback(), NtUserCallOneParam(), and UserFreeWindowInfo().

◆ DesktopHeapAlloc()

static __inline PVOID DesktopHeapAlloc ( IN PDESKTOP  Desktop,
IN SIZE_T  Bytes 
)
static

Definition at line 204 of file desktop.h.

206{
207 /* Desktop heap has no lock, using global user lock instead. */
209 return RtlAllocateHeap(Desktop->pheapDesktop,
211 Bytes);
212}
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:616
_In_ UINT Bytes
Definition: mmcopy.h:9
#define HEAP_NO_SERIALIZE
Definition: nt_native.h:1692
BOOL FASTCALL UserIsEnteredExclusive(VOID)
Definition: ntuser.c:231

Referenced by AllocInputContextObject(), co_IntCreateScrollBars(), DefSetText(), IntCloneMenuItems(), IntCreateClass(), IntCreateWindow(), IntGetClassForDesktop(), IntSetMenuItemInfo(), IntSetThreadDesktop(), MENU_InsertItem(), NtUserDefSetText(), and PopupMenuWndProc().

◆ DesktopHeapFree()

static __inline BOOL DesktopHeapFree ( IN PDESKTOP  Desktop,
IN PVOID  lpMem 
)
static

Definition at line 215 of file desktop.h.

217{
218 /* Desktop heap has no lock, using global user lock instead. */
220 return RtlFreeHeap(Desktop->pheapDesktop,
222 lpMem);
223}
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:634

Referenced by DefSetText(), FreeDeskProcObject(), FreeDeskThreadObject(), IntCloneMenuItems(), IntCreateClass(), IntDestroyClass(), IntDestroyMenu(), IntDestroyScrollBars(), IntRemoveMenuItem(), IntSetThreadDesktop(), MENU_InsertItem(), NtUserDefSetText(), PopupMenuWndProc(), UserFreeInputContext(), and UserFreeWindowInfo().

◆ DesktopHeapGetUserDelta()

static __inline ULONG_PTR DesktopHeapGetUserDelta ( VOID  )
static

Definition at line 272 of file desktop.h.

273{
275 PTHREADINFO pti;
276 PPROCESSINFO W32Process;
277 PWIN32HEAP pheapDesktop;
278 ULONG_PTR Delta = 0;
279
281 if (!pti->rpdesk)
282 return 0;
283
284 pheapDesktop = pti->rpdesk->pheapDesktop;
285
286 W32Process = PsGetCurrentProcessWin32Process();
287
288 /*
289 * Start the search at the next mapping: skip the first entry
290 * as it must be the global user heap mapping.
291 */
292 Mapping = W32Process->HeapMappings.Next;
293 while (Mapping != NULL)
294 {
295 if (Mapping->KernelMapping == (PVOID)pheapDesktop)
296 {
297 Delta = (ULONG_PTR)Mapping->KernelMapping - (ULONG_PTR)Mapping->UserMapping;
298 break;
299 }
300
301 Mapping = Mapping->Next;
302 }
303
304 return Delta;
305}
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
struct _DESKTOP * rpdesk
Definition: win32.h:92
struct _WIN32HEAP * PWIN32HEAP
Definition: usrheap.h:3
static ULONG Delta
Definition: xboxvideo.c:33

Referenced by IntSetThreadDesktop(), and UserDbgAssertThreadInfo().

◆ DesktopHeapReAlloc()

static __inline PVOID DesktopHeapReAlloc ( IN PDESKTOP  Desktop,
IN PVOID  lpMem,
IN SIZE_T  Bytes 
)
static

Definition at line 226 of file desktop.h.

229{
230#if 0
231 /* NOTE: ntoskrnl doesn't export RtlReAllocateHeap... */
232 return RtlReAllocateHeap(Desktop->pheapDesktop,
234 lpMem,
235 Bytes);
236#else
237 SIZE_T PrevSize;
238 PVOID pNew;
239
240 /* Desktop heap has no lock, using global user lock instead. */
242
243 PrevSize = RtlSizeHeap(Desktop->pheapDesktop,
245 lpMem);
246
247 if (PrevSize == Bytes)
248 return lpMem;
249
250 pNew = RtlAllocateHeap(Desktop->pheapDesktop,
252 Bytes);
253 if (pNew != NULL)
254 {
255 if (PrevSize < Bytes)
256 Bytes = PrevSize;
257
258 RtlCopyMemory(pNew,
259 lpMem,
260 Bytes);
261
262 RtlFreeHeap(Desktop->pheapDesktop,
264 lpMem);
265 }
266
267 return pNew;
268#endif
269}
NTSYSAPI PVOID WINAPI RtlReAllocateHeap(HANDLE, ULONG, PVOID, SIZE_T)
Definition: heap.c:2686
NTSYSAPI SIZE_T NTAPI RtlSizeHeap(_In_ PVOID HeapHandle, _In_ ULONG Flags, _In_ PVOID MemoryPointer)
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263

Referenced by IntRemoveMenuItem().

◆ DesktopThreadMain()

VOID NTAPI DesktopThreadMain ( VOID  )

Definition at line 1563 of file desktop.c.

1564{
1565 BOOL Ret;
1566 MSG Msg;
1567
1569
1571
1572 /* Register system classes. This thread does not belong to any desktop so the
1573 classes will be allocated from the shared heap */
1575
1577
1578 while (TRUE)
1579 {
1580 Ret = co_IntGetPeekMessage(&Msg, 0, 0, 0, PM_REMOVE, TRUE);
1581 if (Ret)
1582 {
1584 }
1585 }
1586
1587 UserLeave();
1588}
struct @1708 Msg[]
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
unsigned int BOOL
Definition: ntddk_ex.h:94
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:258
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:249
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
BOOL FASTCALL UserRegisterSystemClasses(VOID)
Definition: class.c:2337
PTHREADINFO gptiDesktopThread
Definition: desktop.c:54
PKEVENT gpDesktopThreadStartedEvent
Definition: desktop.c:56
LRESULT FASTCALL IntDispatchMessage(PMSG pMsg)
Definition: message.c:890
BOOL APIENTRY co_IntGetPeekMessage(PMSG pMsg, HWND hWnd, UINT MsgFilterMin, UINT MsgFilterMax, UINT RemoveMsg, BOOL bGMSG)
Definition: message.c:1226
#define PM_REMOVE
Definition: winuser.h:1207
#define IO_NO_INCREMENT
Definition: iotypes.h:598

Referenced by UserSystemThreadProc().

◆ DesktopWindowProc()

BOOL FASTCALL DesktopWindowProc ( PWND  Wnd,
UINT  Msg,
WPARAM  wParam,
LPARAM  lParam,
LRESULT lResult 
)

Definition at line 1456 of file desktop.c.

1457{
1458 PAINTSTRUCT Ps;
1459 ULONG Value;
1460 //ERR("DesktopWindowProc\n");
1461
1462 *lResult = 0;
1463
1464 switch (Msg)
1465 {
1466 case WM_NCCREATE:
1467 if (!Wnd->fnid)
1468 {
1469 Wnd->fnid = FNID_DESKTOP;
1470 }
1471 *lResult = (LRESULT)TRUE;
1472 return TRUE;
1473
1474 case WM_CREATE:
1476 // Save Process ID
1479 // Save Thread ID
1481 case WM_CLOSE:
1482 return TRUE;
1483
1484 case WM_DISPLAYCHANGE:
1486 return TRUE;
1487
1488 case WM_ERASEBKGND:
1490 *lResult = 1;
1491 return TRUE;
1492
1493 case WM_PAINT:
1494 {
1495 if (IntBeginPaint(Wnd, &Ps))
1496 {
1497 IntEndPaint(Wnd, &Ps);
1498 }
1499 return TRUE;
1500 }
1501 case WM_SYSCOLORCHANGE:
1503 return TRUE;
1504
1505 case WM_SETCURSOR:
1506 {
1507 PCURICON_OBJECT pcurOld, pcurNew;
1509 if (!pcurNew)
1510 {
1511 return TRUE;
1512 }
1513
1514 pcurNew->CURSORF_flags |= CURSORF_CURRENT;
1515 pcurOld = UserSetCursor(pcurNew, FALSE);
1516 if (pcurOld)
1517 {
1518 pcurOld->CURSORF_flags &= ~CURSORF_CURRENT;
1519 UserDereferenceObject(pcurOld);
1520 }
1521 return TRUE;
1522 }
1523
1525 {
1526 PWINDOWPOS pWindowPos = (PWINDOWPOS)lParam;
1527 if ((pWindowPos->flags & SWP_SHOWWINDOW) != 0)
1528 {
1530 IntSetThreadDesktop(hdesk, FALSE);
1531 }
1532 break;
1533 }
1534 default:
1535 TRACE("DWP calling IDWP Msg %d\n",Msg);
1536 //*lResult = IntDefWindowProc(Wnd, Msg, wParam, lParam, FALSE);
1537 }
1538 return TRUE; /* We are done. Do not do any callbacks to user mode */
1539}
#define HandleToULong(h)
Definition: basetsd.h:95
PsGetCurrentThreadId
Definition: CrNtStubs.h:8
#define FNID_DESKTOP
Definition: ntuser.h:862
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
#define CURSORF_CURRENT
Definition: ntuser.h:1207
#define DESKTOP_ALL_ACCESS
Definition: precomp.h:22
static HDC
Definition: imagelist.c:88
PCURICON_OBJECT FASTCALL UserSetCursor(PCURICON_OBJECT NewCursor, BOOL ForceChange)
Definition: msgqueue.c:93
HANDLE NTAPI PsGetCurrentProcessId(VOID)
Definition: process.c:1123
#define LRESULT
Definition: ole.h:14
#define LOWORD(l)
Definition: pedump.c:82
ULONG CURSORF_flags
Definition: cursoricon.h:16
UINT flags
Definition: winuser.h:3670
DWORD fnid
Definition: ntuser.h:709
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
HDC FASTCALL IntBeginPaint(PWND Window, PPAINTSTRUCT Ps)
Definition: painting.c:1442
BOOL FASTCALL IntEndPaint(PWND Wnd, PPAINTSTRUCT Ps)
Definition: painting.c:1539
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
PCURICON_OBJECT FASTCALL UserGetCurIconObject(HCURSOR hCurIcon)
Definition: cursoricon.c:200
HCURSOR gDesktopCursor
Definition: desktop.c:55
HDESK UserOpenInputDesktop(DWORD dwFlags, BOOL fInherit, ACCESS_MASK dwDesiredAccess)
Definition: desktop.c:2655
BOOL FASTCALL IntPaintDesktop(HDC hDC)
Definition: desktop.c:1854
BOOL IntSetThreadDesktop(IN HDESK hDesktop, IN BOOL FreeOnFailure)
Definition: desktop.c:3298
#define DT_GWL_THREADID
Definition: desktop.h:56
#define DT_GWL_PROCESSID
Definition: desktop.h:55
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:644
LONG FASTCALL co_UserSetWindowLong(HWND hWnd, DWORD Index, LONG NewValue, BOOL Ansi)
Definition: window.c:4038
#define WM_PAINT
Definition: winuser.h:1639
#define WM_ERASEBKGND
Definition: winuser.h:1644
#define WM_CLOSE
Definition: winuser.h:1640
#define WM_WINDOWPOSCHANGING
Definition: winuser.h:1680
#define WM_CREATE
Definition: winuser.h:1627
#define RDW_ERASE
Definition: winuser.h:1222
#define WM_SYSCOLORCHANGE
Definition: winuser.h:1645
#define WM_NCCREATE
Definition: winuser.h:1702
#define WM_SETCURSOR
Definition: winuser.h:1655
struct _WINDOWPOS * PWINDOWPOS

Referenced by co_IntSendMessageTimeoutSingle(), co_IntSendMessageWithCallBack(), IntDispatchMessage(), and NtUserMessageCall().

◆ InitDesktopImpl()

NTSTATUS NTAPI InitDesktopImpl ( VOID  )

Definition at line 269 of file desktop.c.

270{
271 GENERIC_MAPPING IntDesktopMapping = { DESKTOP_READ,
275
276 /* Set Desktop Object Attributes */
278 ExDesktopObjectType->TypeInfo.GenericMapping = IntDesktopMapping;
280
281 /* Allocate memory for the event structure */
283 sizeof(KEVENT),
286 {
287 ERR("Failed to allocate event!\n");
288 return STATUS_NO_MEMORY;
289 }
290
291 /* Initialize the kernel event */
294 FALSE);
295
296 return STATUS_SUCCESS;
297}
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define NonPagedPool
Definition: env_spec_w32.h:307
@ SynchronizationEvent
GENERIC_MAPPING GenericMapping
Definition: obtypes.h:358
ULONG DefaultNonPagedPoolCharge
Definition: obtypes.h:365
OBJECT_TYPE_INITIALIZER TypeInfo
Definition: obtypes.h:390
POBJECT_TYPE ExDesktopObjectType
Definition: win32k.c:22
struct _DESKTOP DESKTOP
#define DESKTOP_WRITE
Definition: security.h:19
#define DESKTOP_EXECUTE
Definition: security.h:27
#define DESKTOP_READ
Definition: security.h:15
#define USERTAG_EVENT
Definition: tags.h:230

Referenced by DriverEntry().

◆ IntCreateDesktop()

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 at line 2390 of file desktop.c.

2398{
2400 PDESKTOP pdesk = NULL;
2401 HDESK hDesk;
2403 UNICODE_STRING ClassName;
2404 LARGE_STRING WindowName;
2405 BOOL NoHooks = FALSE;
2406 PWND pWnd = NULL;
2407 CREATESTRUCTW Cs;
2408 PTHREADINFO ptiCurrent;
2409 PCLS pcls;
2410
2411 TRACE("Enter IntCreateDesktop\n");
2412
2414
2415 ASSERT(phDesktop);
2416 *phDesktop = NULL;
2417
2418 ptiCurrent = PsGetCurrentThreadWin32Thread();
2419 ASSERT(ptiCurrent);
2421
2422 /* Turn off hooks when calling any CreateWindowEx from inside win32k */
2423 NoHooks = (ptiCurrent->TIF_flags & TIF_DISABLEHOOKS);
2424 ptiCurrent->TIF_flags |= TIF_DISABLEHOOKS;
2425 ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
2426
2427 /*
2428 * Try to open already existing desktop
2429 */
2432 AccessMode,
2433 NULL,
2434 dwDesiredAccess,
2435 (PVOID)&Context,
2436 (PHANDLE)&hDesk);
2437 if (!NT_SUCCESS(Status))
2438 {
2439 ERR("ObOpenObjectByName failed to open/create desktop\n");
2440 goto Quit;
2441 }
2442
2443 /* In case the object was not created (eg if it existed), return now */
2444 if (Context == FALSE)
2445 {
2446 TRACE("IntCreateDesktop opened desktop '%wZ'\n", ObjectAttributes->ObjectName);
2448 goto Quit;
2449 }
2450
2451 /* Reference the desktop */
2453 0,
2455 KernelMode,
2456 (PVOID*)&pdesk,
2457 NULL);
2458 if (!NT_SUCCESS(Status))
2459 {
2460 ERR("Failed to reference desktop object\n");
2461 goto Quit;
2462 }
2463
2464 /* Get the desktop window class. The thread desktop does not belong to any desktop
2465 * so the classes created there (including the desktop class) are allocated in the shared heap
2466 * It would cause problems if we used a class that belongs to the caller
2467 */
2468 ClassName.Buffer = WC_DESKTOP;
2469 ClassName.Length = 0;
2470 pcls = IntGetAndReferenceClass(&ClassName, 0, TRUE);
2471 if (pcls == NULL)
2472 {
2473 ASSERT(FALSE);
2475 goto Quit;
2476 }
2477
2478 RtlZeroMemory(&WindowName, sizeof(WindowName));
2479 RtlZeroMemory(&Cs, sizeof(Cs));
2485 Cs.hInstance = hModClient; // hModuleWin; // Server side winproc!
2486 Cs.lpszName = (LPCWSTR) &WindowName;
2487 Cs.lpszClass = (LPCWSTR) &ClassName;
2488
2489 /* Use IntCreateWindow instead of co_UserCreateWindowEx because the later expects a thread with a desktop */
2490 pWnd = IntCreateWindow(&Cs, &WindowName, pcls, NULL, NULL, NULL, pdesk, WINVER);
2491 if (pWnd == NULL)
2492 {
2493 ERR("Failed to create desktop window for the new desktop\n");
2495 goto Quit;
2496 }
2497
2499 pdesk->DesktopWindow = UserHMGetHandle(pWnd);
2500 pdesk->pDeskInfo->spwnd = pWnd;
2501 pWnd->fnid = FNID_DESKTOP;
2502
2503 ClassName.Buffer = MAKEINTATOM(gpsi->atomSysClass[ICLS_HWNDMESSAGE]);
2504 ClassName.Length = 0;
2505 pcls = IntGetAndReferenceClass(&ClassName, 0, TRUE);
2506 if (pcls == NULL)
2507 {
2508 ASSERT(FALSE);
2510 goto Quit;
2511 }
2512
2513 RtlZeroMemory(&WindowName, sizeof(WindowName));
2514 RtlZeroMemory(&Cs, sizeof(Cs));
2515 Cs.cx = Cs.cy = 100;
2517 Cs.hInstance = hModClient; // hModuleWin; // Server side winproc!
2518 Cs.lpszName = (LPCWSTR)&WindowName;
2519 Cs.lpszClass = (LPCWSTR)&ClassName;
2520 pWnd = IntCreateWindow(&Cs, &WindowName, pcls, NULL, NULL, NULL, pdesk, WINVER);
2521 if (pWnd == NULL)
2522 {
2523 ERR("Failed to create message window for the new desktop\n");
2525 goto Quit;
2526 }
2527
2528 pdesk->spwndMessage = pWnd;
2529 pWnd->fnid = FNID_MESSAGEWND;
2530
2531 /* Now...
2532 if !(WinStaObject->Flags & WSF_NOIO) is (not set) for desktop input output mode (see wiki)
2533 Create Tooltip. Saved in DesktopObject->spwndTooltip.
2534 Tooltip dwExStyle: WS_EX_TOOLWINDOW|WS_EX_TOPMOST
2535 hWndParent are spwndMessage. Use hModuleWin for server side winproc!
2536 The rest is same as message window.
2537 https://learn.microsoft.com/en-us/windows/win32/controls/tooltip-controls
2538 */
2540
2541Quit:
2542 if (pdesk != NULL)
2543 {
2544 ObDereferenceObject(pdesk);
2545 }
2546 if (!NT_SUCCESS(Status) && hDesk != NULL)
2547 {
2548 ObCloseHandle(hDesk, AccessMode);
2549 hDesk = NULL;
2550 }
2551 if (!NoHooks)
2552 {
2553 ptiCurrent->TIF_flags &= ~TIF_DISABLEHOOKS;
2554 ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
2555 }
2556
2557 TRACE("Leave IntCreateDesktop, Status 0x%08lx\n", Status);
2558
2559 if (NT_SUCCESS(Status))
2560 *phDesktop = hDesk;
2561 else
2563 return Status;
2564}
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
Status
Definition: gdiplustypes.h:25
#define FNID_MESSAGEWND
Definition: ntuser.h:864
#define TIF_DISABLEHOOKS
Definition: ntuser.h:291
#define KernelMode
Definition: asm.h:38
ULONG NTAPI PsGetCurrentProcessSessionId(VOID)
Definition: process.c:1133
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
HINSTANCE hModClient
Definition: ntuser.c:25
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3379
NTSTATUS NTAPI ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN OUT PVOID ParseContext, OUT PHANDLE Handle)
Definition: obhandle.c:2532
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
Definition: obref.c:494
#define WS_POPUP
Definition: pedump.c:616
#define WS_CLIPCHILDREN
Definition: pedump.c:619
Definition: ntuser.h:566
struct _WND * spwnd
Definition: ntuser.h:137
PWND spwndMessage
Definition: desktop.h:20
HWND DesktopWindow
Definition: desktop.h:40
PDESKTOPINFO pDeskInfo
Definition: desktop.h:8
DWORD dwSessionId
Definition: desktop.h:6
struct _CLIENTINFO * pClientInfo
Definition: win32.h:94
FLONG TIF_flags
Definition: win32.h:95
LPCWSTR lpszClass
Definition: winuser.h:3041
LPCWSTR lpszName
Definition: winuser.h:3040
HINSTANCE hInstance
Definition: winuser.h:3032
ATOM atomSysClass[ICLS_NOTUSED+1]
Definition: ntuser.h:1060
#define WINVER
Definition: targetver.h:11
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define WC_DESKTOP
Definition: undocuser.h:12
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
Definition: error.c:31
PCLS IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance, BOOL bDesktopThread)
Definition: class.c:1450
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:214
PWND FASTCALL IntCreateWindow(CREATESTRUCTW *Cs, PLARGE_STRING WindowName, PCLS Class, PWND ParentWindow, PWND OwnerWindow, PVOID acbiBuffer, PDESKTOP pdeskCreated, DWORD dwVer)
Definition: window.c:1808
#define MAKEINTATOM(i)
Definition: winbase.h:1504
#define SM_CYVIRTUALSCREEN
Definition: winuser.h:1050
#define SM_CXVIRTUALSCREEN
Definition: winuser.h:1049
#define SM_XVIRTUALSCREEN
Definition: winuser.h:1047
#define SM_YVIRTUALSCREEN
Definition: winuser.h:1048
_In_ PEPROCESS _In_ KPROCESSOR_MODE AccessMode
Definition: mmfuncs.h:396
#define ObDereferenceObject
Definition: obfuncs.h:203
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by IntResolveDesktop(), and NtUserCreateDesktop().

◆ IntDeRegisterShellHookWindow()

BOOL IntDeRegisterShellHookWindow ( HWND  hWnd)

Definition at line 1803 of file desktop.c.

1804{
1806 PDESKTOP Desktop = pti->rpdesk;
1807 PLIST_ENTRY ListEntry;
1808 PSHELL_HOOK_WINDOW Current;
1809
1810 // FIXME: This probably shouldn't happen, but it does
1811 if (Desktop == NULL)
1812 {
1814 if (Desktop == NULL)
1815 return FALSE;
1816 }
1817
1818 ListEntry = Desktop->ShellHookWindows.Flink;
1819 while (ListEntry != &Desktop->ShellHookWindows)
1820 {
1821 Current = CONTAINING_RECORD(ListEntry, SHELL_HOOK_WINDOW, ListEntry);
1822 ListEntry = ListEntry->Flink;
1823 if (Current->hWnd == hWnd)
1824 {
1825 RemoveEntryList(&Current->ListEntry);
1826 ExFreePoolWithTag(Current, TAG_WINSTA);
1827 return TRUE;
1828 }
1829 }
1830
1831 return FALSE;
1832}
HWND hWnd
Definition: settings.c:17
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
LIST_ENTRY ListEntry
Definition: desktop.h:67
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
#define TAG_WINSTA
Definition: tags.h:11

Referenced by co_UserFreeWindow(), IntRegisterShellHookWindow(), and NtUserCallHwnd().

◆ IntDesktopObjectClose()

NTSTATUS NTAPI IntDesktopObjectClose ( _In_ PVOID  Parameters)

Definition at line 244 of file desktop.c.

246{
247 NTSTATUS Ret;
249 PPROCESSINFO ppi = PsGetProcessWin32Process(CloseParameters->Process);
250 if (ppi == NULL)
251 {
252 /* This happens when the process leaks desktop handles.
253 * At this point the PPROCESSINFO is already destroyed */
254 return STATUS_SUCCESS;
255 }
256
258 Ret = IntUnmapDesktopView((PDESKTOP)CloseParameters->Object);
259 UserLeave();
260 return Ret;
261}
PVOID NTAPI PsGetProcessWin32Process(PEPROCESS Process)
Definition: process.c:1193
_Must_inspect_result_ _In_ WDFQUEUE _In_opt_ WDFREQUEST _In_opt_ WDFFILEOBJECT _Inout_opt_ PWDF_REQUEST_PARAMETERS Parameters
Definition: wdfio.h:869
static NTSTATUS IntUnmapDesktopView(IN PDESKTOP pdesk)
Definition: desktop.c:3180

Referenced by DriverEntry().

◆ IntDesktopObjectDelete()

NTSTATUS NTAPI IntDesktopObjectDelete ( _In_ PVOID  Parameters)

Definition at line 172 of file desktop.c.

174{
176 PDESKTOP pdesk = (PDESKTOP)DeleteParameters->Object;
177
178 TRACE("Deleting desktop object 0x%p\n", pdesk);
179
180 if (pdesk->pDeskInfo &&
181 pdesk->pDeskInfo->spwnd)
182 {
183 ASSERT(pdesk->pDeskInfo->spwnd->spwndChild == NULL);
185 }
186
187 if (pdesk->spwndMessage)
189
190 /* Remove the desktop from the window station's list of associated desktops */
191 RemoveEntryList(&pdesk->ListEntry);
192
193 /* Free the heap */
194 IntFreeDesktopHeap(pdesk);
195
197
198 return STATUS_SUCCESS;
199}
LIST_ENTRY ListEntry
Definition: desktop.h:9
struct _WINSTATION_OBJECT * rpwinstaParent
Definition: desktop.h:11
BOOLEAN co_UserDestroyWindow(PVOID Object)
Definition: window.c:2870
static VOID IntFreeDesktopHeap(IN PDESKTOP pdesk)
struct _DESKTOP * PDESKTOP

Referenced by DriverEntry().

◆ IntDesktopObjectOpen()

NTSTATUS NTAPI IntDesktopObjectOpen ( _In_ PVOID  Parameters)

Definition at line 227 of file desktop.c.

229{
230 NTSTATUS Ret;
232 PPROCESSINFO ppi = PsGetProcessWin32Process(OpenParameters->Process);
233 if (ppi == NULL)
234 return STATUS_SUCCESS;
235
237 Ret = IntMapDesktopView((PDESKTOP)OpenParameters->Object);
238 UserLeave();
239 return Ret;
240}
static NTSTATUS IntMapDesktopView(IN PDESKTOP pdesk)
Definition: desktop.c:3224

Referenced by DriverEntry().

◆ IntDesktopObjectParse()

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 at line 62 of file desktop.c.

72{
76 PLIST_ENTRY NextEntry, ListHead;
77 PWINSTATION_OBJECT WinStaObject = (PWINSTATION_OBJECT)ParseObject;
78 UNICODE_STRING DesktopName;
79 PBOOLEAN pContext = (PBOOLEAN) Context;
80
81 if (pContext)
82 *pContext = FALSE;
83
84 /* Set the list pointers and loop the window station */
85 ListHead = &WinStaObject->DesktopListHead;
86 NextEntry = ListHead->Flink;
87 while (NextEntry != ListHead)
88 {
89 /* Get the current desktop */
90 Desktop = CONTAINING_RECORD(NextEntry, DESKTOP, ListEntry);
91
92 /* Get the desktop name */
93 ASSERT(Desktop->pDeskInfo != NULL);
94 RtlInitUnicodeString(&DesktopName, Desktop->pDeskInfo->szDesktopName);
95
96 /* Compare the name */
98 &DesktopName,
100 {
101 /* We found a match. Did this come from a create? */
102 if (Context)
103 {
104 /* Unless OPEN_IF was given, fail with an error */
105 if (!(Attributes & OBJ_OPENIF))
106 {
107 /* Name collision */
109 }
110 else
111 {
112 /* Otherwise, return with a warning only */
114 }
115 }
116 else
117 {
118 /* This was a real open, so this is OK */
120 }
121
122 /* Reference the desktop and return it */
124 *Object = Desktop;
125 return Status;
126 }
127
128 /* Go to the next desktop */
129 NextEntry = NextEntry->Flink;
130 }
131
132 /* If we got here but this isn't a create, just fail */
134
135 /* Create the desktop object */
141 NULL,
142 sizeof(DESKTOP),
143 0,
144 0,
145 (PVOID*)&Desktop);
146 if (!NT_SUCCESS(Status)) return Status;
147
148 /* Assign security to the desktop we have created */
150 if (!NT_SUCCESS(Status))
151 {
153 return Status;
154 }
155
156 /* Initialize the desktop */
158 if (!NT_SUCCESS(Status))
159 {
161 return Status;
162 }
163
164 /* Set the desktop object and return success */
165 *Object = Desktop;
166 *pContext = TRUE;
167 return STATUS_SUCCESS;
168}
_Inout_ PFCB _Inout_ PUNICODE_STRING RemainingName
Definition: cdprocs.h:802
#define OBJ_OPENIF
Definition: winternl.h:229
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#define STATUS_OBJECT_NAME_EXISTS
Definition: ntstatus.h:114
NTSTATUS NTAPI ObCreateObject(IN KPROCESSOR_MODE ProbeMode OPTIONAL, IN POBJECT_TYPE Type, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext OPTIONAL, IN ULONG ObjectSize, IN ULONG PagedPoolCharge OPTIONAL, IN ULONG NonPagedPoolCharge OPTIONAL, OUT PVOID *Object)
Definition: oblife.c:1039
LIST_ENTRY DesktopListHead
Definition: winsta.h:19
unsigned char * PBOOLEAN
Definition: typedefs.h:53
#define STATUS_OBJECT_NAME_COLLISION
Definition: udferr_usr.h:150
#define STATUS_OBJECT_NAME_NOT_FOUND
Definition: udferr_usr.h:149
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes
static NTSTATUS UserInitializeDesktop(PDESKTOP pdesk, PUNICODE_STRING DesktopName, PWINSTATION_OBJECT pwinsta)
Definition: desktop.c:2279
NTSTATUS NTAPI IntAssignDesktopSecurityOnParse(_In_ PWINSTATION_OBJECT WinSta, _In_ PDESKTOP Desktop, _In_ PACCESS_STATE AccessState)
Assigns a security descriptor to the desktop object during a desktop object parse procedure.
Definition: security.c:270
struct _WINSTATION_OBJECT * PWINSTATION_OBJECT
#define ObReferenceObject
Definition: obfuncs.h:204
_In_opt_ PVOID _In_opt_ PUNICODE_STRING _In_ PSECURITY_DESCRIPTOR _In_ PACCESS_STATE AccessState
Definition: sefuncs.h:417

Referenced by IntWinStaObjectParse().

◆ IntDesktopOkToClose()

NTSTATUS NTAPI IntDesktopOkToClose ( _In_ PVOID  Parameters)

Definition at line 203 of file desktop.c.

205{
208
209 if (pti == NULL)
210 {
211 /* This happens when we leak desktop handles */
212 return STATUS_SUCCESS;
213 }
214
215 /* Do not allow the current desktop or the initial desktop to be closed */
216 if (OkToCloseParameters->Handle == pti->ppi->hdeskStartup ||
217 OkToCloseParameters->Handle == pti->hdesk)
218 {
220 }
221
222 return STATUS_SUCCESS;
223}
HDESK hdeskStartup
Definition: win32.h:264
PPROCESSINFO ppi
Definition: win32.h:88
HDESK hdesk
Definition: win32.h:108
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145

Referenced by DriverEntry().

◆ IntGetActiveDesktop()

◆ IntGetCurrentThreadDesktopWindow()

HWND FASTCALL IntGetCurrentThreadDesktopWindow ( VOID  )

Definition at line 1441 of file desktop.c.

1442{
1444 PDESKTOP pdo = pti->rpdesk;
1445 if (NULL == pdo)
1446 {
1447 ERR("Thread doesn't have a desktop\n");
1448 return NULL;
1449 }
1450 return pdo->DesktopWindow;
1451}

Referenced by NtUserFindWindowEx().

◆ IntGetDesktopWindow()

◆ IntGetFocusMessageQueue()

PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue ( VOID  )

◆ IntGetMessageWindow()

HWND FASTCALL IntGetMessageWindow ( VOID  )

Definition at line 1416 of file desktop.c.

1417{
1419
1420 if (!pdo)
1421 {
1422 TRACE("No active desktop\n");
1423 return NULL;
1424 }
1425 return UserHMGetHandle(pdo->spwndMessage);
1426}

Referenced by NtUserFindWindowEx(), and NtUserSetParent().

◆ IntGetScreenDC()

HDC FASTCALL IntGetScreenDC ( VOID  )

Definition at line 382 of file winsta.c.

383{
384 return ScreenDeviceContext;
385}
HDC ScreenDeviceContext
Definition: desktop.c:53

Referenced by co_MsqInsertMouseMessage(), MsqCleanupMessageQueue(), UserSetCursor(), and UserShowCursor().

◆ IntGetThreadDesktopWindow()

PWND FASTCALL IntGetThreadDesktopWindow ( PTHREADINFO  pti)

Definition at line 1376 of file desktop.c.

1377{
1378 if (!pti) pti = PsGetCurrentThreadWin32Thread();
1379 if (pti->pDeskInfo) return pti->pDeskInfo->spwnd;
1380 return NULL;
1381}
struct _DESKTOPINFO * pDeskInfo
Definition: win32.h:93

Referenced by ActivateOtherWindowMin().

◆ IntHideDesktop()

NTSTATUS FASTCALL IntHideDesktop ( PDESKTOP  Desktop)

Definition at line 1652 of file desktop.c.

1653{
1654 PWND DesktopWnd;
1655
1656 DesktopWnd = IntGetWindowObject(Desktop->DesktopWindow);
1657 if (! DesktopWnd)
1658 {
1660 }
1661 DesktopWnd->style &= ~WS_VISIBLE;
1662
1663 return STATUS_SUCCESS;
1664}
DWORD style
Definition: ntuser.h:706
PWND FASTCALL IntGetWindowObject(HWND hWnd)
Definition: window.c:75
#define ERROR_INVALID_WINDOW_HANDLE
Definition: winerror.h:881

Referenced by IntEndDesktopGraphics(), and NtUserSwitchDesktop().

◆ IntPaintDesktop()

BOOL FASTCALL IntPaintDesktop ( HDC  hDC)

Definition at line 1854 of file desktop.c.

1855{
1856 static WCHAR s_wszSafeMode[] = L"Safe Mode"; // FIXME: Localize!
1857
1858 RECTL Rect;
1859 HBRUSH DesktopBrush, PreviousBrush;
1860 HWND hWndDesktop;
1861 BOOL doPatBlt = TRUE;
1862 PWND WndDesktop;
1863 BOOLEAN InSafeMode;
1864
1865 if (GdiGetClipBox(hDC, &Rect) == ERROR)
1866 return FALSE;
1867
1868 hWndDesktop = IntGetDesktopWindow(); // rpdesk->DesktopWindow;
1869
1870 WndDesktop = UserGetWindowObject(hWndDesktop); // rpdesk->pDeskInfo->spwnd;
1871 if (!WndDesktop)
1872 return FALSE;
1873
1874 /* Retrieve the current SafeMode state */
1875 InSafeMode = (UserGetSystemMetrics(SM_CLEANBOOT) != 0); // gpsi->aiSysMet[SM_CLEANBOOT];
1876
1877 if (!InSafeMode)
1878 {
1879 DesktopBrush = (HBRUSH)WndDesktop->pcls->hbrBackground;
1880
1881 /*
1882 * Paint desktop background
1883 */
1885 {
1886 SIZE sz;
1887 int x, y;
1888 int scaledWidth, scaledHeight;
1889 int wallpaperX, wallpaperY, wallpaperWidth, wallpaperHeight;
1890 HDC hWallpaperDC;
1891
1892 sz.cx = WndDesktop->rcWindow.right - WndDesktop->rcWindow.left;
1893 sz.cy = WndDesktop->rcWindow.bottom - WndDesktop->rcWindow.top;
1894
1895 if (gspv.WallpaperMode == wmFit ||
1897 {
1898 int scaleNum, scaleDen;
1899
1900 // Precision improvement over ((sz.cx / gspv.cxWallpaper) > (sz.cy / gspv.cyWallpaper))
1901 if ((sz.cx * gspv.cyWallpaper) > (sz.cy * gspv.cxWallpaper))
1902 {
1903 if (gspv.WallpaperMode == wmFit)
1904 {
1905 scaleNum = sz.cy;
1906 scaleDen = gspv.cyWallpaper;
1907 }
1908 else
1909 {
1910 scaleNum = sz.cx;
1911 scaleDen = gspv.cxWallpaper;
1912 }
1913 }
1914 else
1915 {
1916 if (gspv.WallpaperMode == wmFit)
1917 {
1918 scaleNum = sz.cx;
1919 scaleDen = gspv.cxWallpaper;
1920 }
1921 else
1922 {
1923 scaleNum = sz.cy;
1924 scaleDen = gspv.cyWallpaper;
1925 }
1926 }
1927
1928 scaledWidth = EngMulDiv(gspv.cxWallpaper, scaleNum, scaleDen);
1929 scaledHeight = EngMulDiv(gspv.cyWallpaper, scaleNum, scaleDen);
1930
1931 if (gspv.WallpaperMode == wmFill)
1932 {
1933 wallpaperX = (((scaledWidth - sz.cx) * gspv.cxWallpaper) / (2 * scaledWidth));
1934 wallpaperY = (((scaledHeight - sz.cy) * gspv.cyWallpaper) / (2 * scaledHeight));
1935
1936 wallpaperWidth = (sz.cx * gspv.cxWallpaper) / scaledWidth;
1937 wallpaperHeight = (sz.cy * gspv.cyWallpaper) / scaledHeight;
1938 }
1939 }
1940
1941 if (gspv.WallpaperMode == wmStretch ||
1944 {
1945 x = 0;
1946 y = 0;
1947 }
1948 else if (gspv.WallpaperMode == wmFit)
1949 {
1950 x = (sz.cx - scaledWidth) / 2;
1951 y = (sz.cy - scaledHeight) / 2;
1952 }
1953 else
1954 {
1955 /* Find the upper left corner, can be negative if the bitmap is bigger than the screen */
1956 x = (sz.cx / 2) - (gspv.cxWallpaper / 2);
1957 y = (sz.cy / 2) - (gspv.cyWallpaper / 2);
1958 }
1959
1960 hWallpaperDC = NtGdiCreateCompatibleDC(hDC);
1961 if (hWallpaperDC != NULL)
1962 {
1963 HBITMAP hOldBitmap;
1964
1965 /* Fill in the area that the bitmap is not going to cover */
1966 if (x > 0 || y > 0)
1967 {
1968 /* FIXME: Clip out the bitmap
1969 can be replaced with "NtGdiPatBlt(hDC, x, y, gspv.cxWallpaper, gspv.cyWallpaper, PATCOPY | DSTINVERT);"
1970 once we support DSTINVERT */
1971 PreviousBrush = NtGdiSelectBrush(hDC, DesktopBrush);
1972 NtGdiPatBlt(hDC, Rect.left, Rect.top, Rect.right, Rect.bottom, PATCOPY);
1973 NtGdiSelectBrush(hDC, PreviousBrush);
1974 }
1975
1976 /* Do not fill the background after it is painted no matter the size of the picture */
1977 doPatBlt = FALSE;
1978
1979 hOldBitmap = NtGdiSelectBitmap(hWallpaperDC, gspv.hbmWallpaper);
1980
1982 {
1983 if (Rect.right && Rect.bottom)
1985 x,
1986 y,
1987 sz.cx,
1988 sz.cy,
1989 hWallpaperDC,
1990 0,
1991 0,
1994 SRCCOPY,
1995 0);
1996 }
1997 else if (gspv.WallpaperMode == wmTile)
1998 {
1999 /* Paint the bitmap across the screen then down */
2000 for (y = 0; y < Rect.bottom; y += gspv.cyWallpaper)
2001 {
2002 for (x = 0; x < Rect.right; x += gspv.cxWallpaper)
2003 {
2005 x,
2006 y,
2009 hWallpaperDC,
2010 0,
2011 0,
2012 SRCCOPY,
2013 0,
2014 0);
2015 }
2016 }
2017 }
2018 else if (gspv.WallpaperMode == wmFit)
2019 {
2020 if (Rect.right && Rect.bottom)
2021 {
2023 x,
2024 y,
2025 scaledWidth,
2026 scaledHeight,
2027 hWallpaperDC,
2028 0,
2029 0,
2032 SRCCOPY,
2033 0);
2034 }
2035 }
2036 else if (gspv.WallpaperMode == wmFill)
2037 {
2038 if (Rect.right && Rect.bottom)
2039 {
2041 x,
2042 y,
2043 sz.cx,
2044 sz.cy,
2045 hWallpaperDC,
2046 wallpaperX,
2047 wallpaperY,
2048 wallpaperWidth,
2049 wallpaperHeight,
2050 SRCCOPY,
2051 0);
2052 }
2053 }
2054 else
2055 {
2057 x,
2058 y,
2061 hWallpaperDC,
2062 0,
2063 0,
2064 SRCCOPY,
2065 0,
2066 0);
2067 }
2068 NtGdiSelectBitmap(hWallpaperDC, hOldBitmap);
2069 NtGdiDeleteObjectApp(hWallpaperDC);
2070 }
2071 }
2072 }
2073 else
2074 {
2075 /* Black desktop background in Safe Mode */
2076 DesktopBrush = StockObjects[BLACK_BRUSH];
2077 }
2078
2079 /* Background is set to none, clear the screen */
2080 if (doPatBlt)
2081 {
2082 PreviousBrush = NtGdiSelectBrush(hDC, DesktopBrush);
2083 NtGdiPatBlt(hDC, Rect.left, Rect.top, Rect.right, Rect.bottom, PATCOPY);
2084 NtGdiSelectBrush(hDC, PreviousBrush);
2085 }
2086
2087 /*
2088 * Display the system version on the desktop background
2089 */
2090 if (InSafeMode || g_AlwaysDisplayVersion || g_PaintDesktopVersion)
2091 {
2093 static WCHAR wszzVersion[1024] = L"\0";
2094
2095 /* Only used in normal mode */
2096 // We expect at most 4 strings (3 for version, 1 for optional NtSystemRoot)
2097 static POLYTEXTW VerStrs[4] = {{0},{0},{0},{0}};
2098 INT i = 0;
2099 SIZE_T len;
2100
2101 HFONT hFont1 = NULL, hFont2 = NULL, hOldFont = NULL;
2102 COLORREF crText, color_old;
2103 UINT align_old;
2104 INT mode_old;
2105 PDC pdc;
2106
2107 if (!UserSystemParametersInfo(SPI_GETWORKAREA, 0, &Rect, 0))
2108 {
2109 Rect.left = Rect.top = 0;
2112 }
2113 else
2114 {
2115 RECTL_vOffsetRect(&Rect, -Rect.left, -Rect.top);
2116 }
2117
2118 /*
2119 * Set up the fonts (otherwise use default ones)
2120 */
2121
2122 /* Font for the principal version string */
2123 hFont1 = GreCreateFontIndirectW(&gspv.ncm.lfCaptionFont);
2124 /* Font for the secondary version strings */
2125 hFont2 = GreCreateFontIndirectW(&gspv.ncm.lfMenuFont);
2126
2127 if (hFont1)
2128 hOldFont = NtGdiSelectFont(hDC, hFont1);
2129
2130 if (gspv.hbmWallpaper == NULL)
2131 {
2132 /* Retrieve the brush fill colour */
2133 // TODO: The following code constitutes "GreGetBrushColor".
2134 PreviousBrush = NtGdiSelectBrush(hDC, DesktopBrush);
2135 pdc = DC_LockDc(hDC);
2136 if (pdc)
2137 {
2138 crText = pdc->eboFill.ulRGBColor;
2139 DC_UnlockDc(pdc);
2140 }
2141 else
2142 {
2143 crText = RGB(0, 0, 0);
2144 }
2145 NtGdiSelectBrush(hDC, PreviousBrush);
2146
2147 /* Adjust text colour according to the brush */
2148 if (GetRValue(crText) + GetGValue(crText) + GetBValue(crText) > 128 * 3)
2149 crText = RGB(0, 0, 0);
2150 else
2151 crText = RGB(255, 255, 255);
2152 }
2153 else
2154 {
2155 /* Always use white when the text is displayed on top of a wallpaper */
2156 crText = RGB(255, 255, 255);
2157 }
2158
2159 color_old = IntGdiSetTextColor(hDC, crText);
2160 align_old = IntGdiSetTextAlign(hDC, TA_RIGHT);
2161 mode_old = IntGdiSetBkMode(hDC, TRANSPARENT);
2162
2163 /* Display the system version information */
2164 if (!*wszzVersion)
2165 {
2166 Status = GetSystemVersionString(wszzVersion,
2167 ARRAYSIZE(wszzVersion),
2168 InSafeMode,
2170 if (!InSafeMode && NT_SUCCESS(Status) && *wszzVersion)
2171 {
2172 PWCHAR pstr = wszzVersion;
2173 for (i = 0; (i < ARRAYSIZE(VerStrs)) && *pstr; ++i)
2174 {
2175 VerStrs[i].n = lstrlenW(pstr);
2176 VerStrs[i].lpstr = pstr;
2177 pstr += (VerStrs[i].n + 1);
2178 }
2179 }
2180 }
2181 else
2182 {
2184 }
2185 if (NT_SUCCESS(Status) && *wszzVersion)
2186 {
2187 if (!InSafeMode)
2188 {
2189 SIZE Size = {0, 0};
2190 LONG TotalHeight = 0;
2191
2192 /* Normal Mode: multiple version information text separated by newlines */
2194
2195 /* Compute the heights of the strings */
2196 if (hFont1) NtGdiSelectFont(hDC, hFont1);
2197 for (i = 0; i < ARRAYSIZE(VerStrs); ++i)
2198 {
2199 if (!VerStrs[i].lpstr || !*VerStrs[i].lpstr || (VerStrs[i].n == 0))
2200 break;
2201
2202 GreGetTextExtentW(hDC, VerStrs[i].lpstr, VerStrs[i].n, &Size, 1);
2203 VerStrs[i].y = Size.cy; // Store the string height
2204 TotalHeight += Size.cy;
2205
2206 /* While the first string was using hFont1, all the others use hFont2 */
2207 if (hFont2) NtGdiSelectFont(hDC, hFont2);
2208 }
2209 /* The total height must not exceed the screen height */
2210 TotalHeight = min(TotalHeight, Rect.bottom);
2211
2212 /* Display the strings */
2213 if (hFont1) NtGdiSelectFont(hDC, hFont1);
2214 for (i = 0; i < ARRAYSIZE(VerStrs); ++i)
2215 {
2216 if (!VerStrs[i].lpstr || !*VerStrs[i].lpstr || (VerStrs[i].n == 0))
2217 break;
2218
2219 TotalHeight -= VerStrs[i].y;
2221 Rect.right - 5,
2222 Rect.bottom - TotalHeight - 5,
2223 0, NULL,
2224 VerStrs[i].lpstr,
2225 VerStrs[i].n,
2226 NULL, 0);
2227
2228 /* While the first string was using hFont1, all the others use hFont2 */
2229 if (hFont2) NtGdiSelectFont(hDC, hFont2);
2230 }
2231 }
2232 else
2233 {
2234 if (hFont1) NtGdiSelectFont(hDC, hFont1);
2235
2236 /* Safe Mode: single version information text in top center */
2237 len = wcslen(wszzVersion);
2238
2240 GreExtTextOutW(hDC, (Rect.right + Rect.left)/2, Rect.top + 3, 0, NULL, wszzVersion, len, NULL, 0);
2241 }
2242 }
2243
2244 if (InSafeMode)
2245 {
2246 if (hFont1) NtGdiSelectFont(hDC, hFont1);
2247
2248 /* Print Safe Mode text in corners */
2249 len = wcslen(s_wszSafeMode);
2250
2252 GreExtTextOutW(hDC, Rect.left, Rect.top + 3, 0, NULL, s_wszSafeMode, len, NULL, 0);
2254 GreExtTextOutW(hDC, Rect.right, Rect.top + 3, 0, NULL, s_wszSafeMode, len, NULL, 0);
2256 GreExtTextOutW(hDC, Rect.left, Rect.bottom - 5, 0, NULL, s_wszSafeMode, len, NULL, 0);
2258 GreExtTextOutW(hDC, Rect.right, Rect.bottom - 5, 0, NULL, s_wszSafeMode, len, NULL, 0);
2259 }
2260
2261 IntGdiSetBkMode(hDC, mode_old);
2262 IntGdiSetTextAlign(hDC, align_old);
2263 IntGdiSetTextColor(hDC, color_old);
2264
2265 if (hFont2)
2266 GreDeleteObject(hFont2);
2267
2268 if (hFont1)
2269 {
2270 NtGdiSelectFont(hDC, hOldFont);
2271 GreDeleteObject(hFont1);
2272 }
2273 }
2274
2275 return TRUE;
2276}
static HDC hDC
Definition: 3dtext.c:33
FORCEINLINE VOID DC_UnlockDc(PDC pdc)
Definition: dc.h:238
COLORREF FASTCALL IntGdiSetTextColor(HDC hDC, COLORREF color)
Definition: dcutil.c:172
UINT FASTCALL IntGdiSetTextAlign(HDC hDC, UINT Mode)
Definition: dcutil.c:145
INT FASTCALL IntGdiSetBkMode(HDC hDC, INT backgroundMode)
Definition: dcutil.c:124
FORCEINLINE PDC DC_LockDc(HDC hdc)
Definition: dc.h:220
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define lstrlenW
Definition: compat.h:750
#define RGB(r, g, b)
Definition: precomp.h:71
#define GetBValue(quad)
Definition: precomp.h:75
#define GetGValue(quad)
Definition: precomp.h:74
#define GetRValue(quad)
Definition: precomp.h:73
#define ERROR(name)
Definition: error_private.h:53
BOOL APIENTRY GreExtTextOutW(_In_ HDC hDC, _In_ INT XStart, _In_ INT YStart, _In_ UINT fuOptions, _In_opt_ PRECTL lprc, _In_reads_opt_(Count) PCWCH String, _In_ INT Count, _In_opt_ const INT *Dx, _In_ DWORD dwCodePage)
Definition: freetype.c:7504
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLdouble n
Definition: glext.h:7729
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
if(dx< 0)
Definition: linetemp.h:194
static HBITMAP
Definition: button.c:44
static LPCSTR lpstr
Definition: font.c:51
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
#define min(a, b)
Definition: monoChain.cc:55
__kernel_entry W32KAPI HDC APIENTRY NtGdiCreateCompatibleDC(_In_opt_ HDC hdc)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiBitBlt(_In_ HDC hdcDst, _In_ INT x, _In_ INT y, _In_ INT cx, _In_ INT cy, _In_opt_ HDC hdcSrc, _In_ INT xSrc, _In_ INT ySrc, _In_ DWORD rop4, _In_ DWORD crBackColor, _In_ FLONG fl)
__kernel_entry W32KAPI HBRUSH APIENTRY NtGdiSelectBrush(_In_ HDC hdc, _In_ HBRUSH hbrush)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiStretchBlt(_In_ HDC hdcDst, _In_ INT xDst, _In_ INT yDst, _In_ INT cxDst, _In_ INT cyDst, _In_opt_ HDC hdcSrc, _In_ INT xSrc, _In_ INT ySrc, _In_ INT cxSrc, _In_ INT cySrc, _In_ DWORD dwRop, _In_ DWORD dwBackColor)
__kernel_entry W32KAPI HBITMAP APIENTRY NtGdiSelectBitmap(_In_ HDC hdc, _In_ HBITMAP hbm)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiPatBlt(_In_ HDC hdcDest, _In_ INT x, _In_ INT y, _In_ INT cx, _In_ INT cy, _In_ DWORD dwRop)
Definition: bitblt.c:990
__kernel_entry W32KAPI BOOL APIENTRY NtGdiDeleteObjectApp(_In_ HANDLE hobj)
__kernel_entry W32KAPI HFONT APIENTRY NtGdiSelectFont(_In_ HDC hdc, _In_ HFONT hf)
Definition: dcobjs.c:597
BOOL g_AlwaysDisplayVersion
Definition: ntuser.c:17
long LONG
Definition: pedump.c:60
Definition: polytest.cpp:41
HBRUSH hbrBackground
Definition: ntuser.h:587
LPCWSTR lpstr
Definition: wingdi.h:2564
UINT n
Definition: wingdi.h:2563
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
WALLPAPER_MODE WallpaperMode
Definition: sysparams.h:144
NONCLIENTMETRICSW ncm
Definition: sysparams.h:51
ULONG cxWallpaper
Definition: sysparams.h:143
ULONG cyWallpaper
Definition: sysparams.h:143
HANDLE hbmWallpaper
Definition: sysparams.h:142
PCLS pcls
Definition: ntuser.h:720
RECT rcWindow
Definition: ntuser.h:716
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
@ wmFill
Definition: sysparams.h:45
@ wmTile
Definition: sysparams.h:42
@ wmStretch
Definition: sysparams.h:43
@ wmFit
Definition: sysparams.h:44
int32_t INT
Definition: typedefs.h:58
uint16_t * PWCHAR
Definition: typedefs.h:56
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:124
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
HFONT FASTCALL GreCreateFontIndirectW(_In_ const LOGFONTW *lplf)
Definition: font.c:28
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1158
HGDIOBJ StockObjects[]
Definition: stockobj.c:100
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
BOOL FASTCALL GreGetTextExtentW(_In_ HDC hDC, _In_reads_(cwc) PCWCH lpwsz, _In_ INT cwc, _Out_ PSIZE psize, _In_ UINT flOpts)
Definition: text.c:77
HWND FASTCALL IntGetDesktopWindow(VOID)
Definition: desktop.c:1391
static NTSTATUS GetSystemVersionString(OUT PWSTR pwszzVersion, IN SIZE_T cchDest, IN BOOLEAN InSafeMode, IN BOOLEAN AppendNtSystemRoot)
Definition: desktop.c:300
BOOL g_PaintDesktopVersion
Definition: sysparams.c:19
SPIVALUES gspv
Definition: sysparams.c:17
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2116
ENGAPI INT APIENTRY EngMulDiv(_In_ INT a, _In_ INT b, _In_ INT c)
Definition: math.c:26
DWORD COLORREF
Definition: windef.h:300
#define TA_RIGHT
Definition: wingdi.h:933
#define TA_LEFT
Definition: wingdi.h:932
#define TRANSPARENT
Definition: wingdi.h:950
#define SRCCOPY
Definition: wingdi.h:333
#define PATCOPY
Definition: wingdi.h:335
#define BLACK_BRUSH
Definition: wingdi.h:896
#define TA_TOP
Definition: wingdi.h:930
#define TA_BOTTOM
Definition: wingdi.h:929
#define TA_CENTER
Definition: wingdi.h:931
#define SM_CYSCREEN
Definition: winuser.h:971
#define SM_CLEANBOOT
Definition: winuser.h:1038
#define SM_CXSCREEN
Definition: winuser.h:970
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by co_IntInitializeDesktopGraphics(), DesktopWindowProc(), EngpRegisterGraphicsDevice(), NtUserPaintDesktop(), and UserRealizePalette().

◆ IntRegisterShellHookWindow()

BOOL IntRegisterShellHookWindow ( HWND  hWnd)

Definition at line 1771 of file desktop.c.

1772{
1774 PDESKTOP Desktop = pti->rpdesk;
1776
1777 TRACE("IntRegisterShellHookWindow\n");
1778
1779 /* First deregister the window, so we can be sure it's never twice in the
1780 * list.
1781 */
1783
1785 sizeof(SHELL_HOOK_WINDOW),
1786 TAG_WINSTA);
1787
1788 if (!Entry)
1789 return FALSE;
1790
1791 Entry->hWnd = hWnd;
1792
1793 InsertTailList(&Desktop->ShellHookWindows, &Entry->ListEntry);
1794
1795 return TRUE;
1796}
#define InsertTailList(ListHead, Entry)
#define PagedPool
Definition: env_spec_w32.h:308
base of all file and directory entries
Definition: entries.h:83
BOOL IntDeRegisterShellHookWindow(HWND hWnd)
Definition: desktop.c:1803

Referenced by NtUserCallHwnd().

◆ IntResolveDesktop()

NTSTATUS FASTCALL IntResolveDesktop ( IN PEPROCESS  Process,
IN PUNICODE_STRING  DesktopPath,
IN BOOL  bInherit,
OUT HWINSTA *  phWinSta,
OUT HDESK *  phDesktop 
)

Definition at line 568 of file desktop.c.

574{
576 HWINSTA hWinSta = NULL, hWinStaDup = NULL;
577 HDESK hDesktop = NULL, hDesktopDup = NULL;
578 PPROCESSINFO ppi;
580 LUID ProcessLuid;
581 USHORT StrSize;
582 SIZE_T MemSize;
583 PSECURITY_DESCRIPTOR ServiceSD;
586 UNICODE_STRING WinStaName, DesktopName;
587 const UNICODE_STRING WinSta0Name = RTL_CONSTANT_STRING(L"WinSta0");
588 PWINSTATION_OBJECT WinStaObject;
589 HWINSTA hTempWinSta = NULL;
590 BOOLEAN bUseDefaultWinSta = FALSE;
591 BOOLEAN bInteractive = FALSE;
592 BOOLEAN bAccessAllowed = FALSE;
593
595
596 ASSERT(phWinSta);
597 ASSERT(phDesktop);
598 ASSERT(DesktopPath);
599
600 *phWinSta = NULL;
601 *phDesktop = NULL;
602
604 /* ppi is typically NULL for console applications that connect to Win32 USER */
605 if (!ppi) TRACE("IntResolveDesktop: ppi is NULL!\n");
606
607 if (ppi && ppi->hwinsta != NULL && ppi->hdeskStartup != NULL)
608 {
609 /*
610 * If this process is the current one, just return the cached handles.
611 * Otherwise, open the window station and desktop objects.
612 */
614 {
615 hWinSta = ppi->hwinsta;
616 hDesktop = ppi->hdeskStartup;
617 }
618 else
619 {
621 0,
622 NULL,
625 UserMode,
626 (PHANDLE)&hWinSta);
627 if (!NT_SUCCESS(Status))
628 {
629 ERR("IntResolveDesktop: Could not reference window station 0x%p\n", ppi->prpwinsta);
631 return Status;
632 }
633
635 0,
636 NULL,
639 UserMode,
640 (PHANDLE)&hDesktop);
641 if (!NT_SUCCESS(Status))
642 {
643 ERR("IntResolveDesktop: Could not reference desktop 0x%p\n", ppi->rpdeskStartup);
644 ObCloseHandle(hWinSta, UserMode);
646 return Status;
647 }
648 }
649
650 *phWinSta = hWinSta;
651 *phDesktop = hDesktop;
652 return STATUS_SUCCESS;
653 }
654
655 /* We will by default use the default window station and desktop */
656 RtlInitEmptyUnicodeString(&WinStaName, NULL, 0);
657 RtlInitEmptyUnicodeString(&DesktopName, NULL, 0);
658
659 /*
660 * Parse the desktop path string which can be of the form "WinSta\Desktop"
661 * or just "Desktop". In the latter case we use the default window station
662 * on which the process is attached to (or if none, "WinSta0").
663 */
664 if (DesktopPath->Buffer != NULL && DesktopPath->Length > sizeof(WCHAR))
665 {
666 DesktopName = *DesktopPath;
667
668 /* Find the separator */
669 while (DesktopName.Length > 0 && *DesktopName.Buffer &&
670 *DesktopName.Buffer != OBJ_NAME_PATH_SEPARATOR)
671 {
672 DesktopName.Buffer++;
673 DesktopName.Length -= sizeof(WCHAR);
674 DesktopName.MaximumLength -= sizeof(WCHAR);
675 }
676 if (DesktopName.Length > 0)
677 {
678 RtlInitEmptyUnicodeString(&WinStaName, DesktopPath->Buffer,
679 DesktopPath->Length - DesktopName.Length);
680 // (USHORT)((ULONG_PTR)DesktopName.Buffer - (ULONG_PTR)DesktopPath->Buffer);
681 WinStaName.Length = WinStaName.MaximumLength;
682
683 /* Skip the separator */
684 DesktopName.Buffer++;
685 DesktopName.Length -= sizeof(WCHAR);
686 DesktopName.MaximumLength -= sizeof(WCHAR);
687 }
688 else
689 {
690 RtlInitEmptyUnicodeString(&WinStaName, NULL, 0);
691 DesktopName = *DesktopPath;
692 }
693 }
694
695 TRACE("IntResolveDesktop: WinStaName:'%wZ' ; DesktopName:'%wZ'\n", &WinStaName, &DesktopName);
696
697 /* Retrieve the process LUID */
698 Status = GetProcessLuid(NULL, Process, &ProcessLuid);
699 if (!NT_SUCCESS(Status))
700 {
701 ERR("IntResolveDesktop: Failed to retrieve the process LUID, Status 0x%08lx\n", Status);
703 return Status;
704 }
705
706 /*
707 * If this process is not the current one, obtain a temporary handle
708 * to it so that we can perform handles duplication later.
709 */
711 {
714 NULL,
715 0,
718 &hProcess);
719 if (!NT_SUCCESS(Status))
720 {
721 ERR("IntResolveDesktop: Failed to obtain a handle to process 0x%p, Status 0x%08lx\n", Process, Status);
723 return Status;
724 }
726 }
727
728 /*
729 * If no window station has been specified, search the process handle table
730 * for inherited window station handles, otherwise use a default one.
731 */
732 if (WinStaName.Buffer == NULL)
733 {
734 /*
735 * We want to find a suitable default window station.
736 * For applications that can be interactive, i.e. that have allowed
737 * access to the single interactive window station on the system,
738 * the default window station is 'WinSta0'.
739 * For applications that cannot be interactive, i.e. that do not have
740 * access to 'WinSta0' (e.g. non-interactive services), the default
741 * window station is 'Service-0xXXXX-YYYY$' (created if needed).
742 * Precedence will however be taken by any inherited window station
743 * that possesses the required interactivity property.
744 */
745 bUseDefaultWinSta = TRUE;
746
747 /*
748 * Use the default 'WinSta0' window station. Whether we should
749 * use 'Service-0xXXXX-YYYY$' instead will be determined later.
750 */
751 // RtlInitUnicodeString(&WinStaName, L"WinSta0");
752 WinStaName = WinSta0Name;
753
755 NULL,
757 NULL,
758 (PHANDLE)&hWinSta))
759 {
760 TRACE("IntResolveDesktop: Inherited window station is: 0x%p\n", hWinSta);
761 }
762 }
763
764 /*
765 * If no desktop has been specified, search the process handle table
766 * for inherited desktop handles, otherwise use the Default desktop.
767 * Note that the inherited desktop that we may use, may not belong
768 * to the window station we will connect to.
769 */
770 if (DesktopName.Buffer == NULL)
771 {
772 /* Use a default desktop name */
773 RtlInitUnicodeString(&DesktopName, L"Default");
774
776 NULL,
778 NULL,
779 (PHANDLE)&hDesktop))
780 {
781 TRACE("IntResolveDesktop: Inherited desktop is: 0x%p\n", hDesktop);
782 }
783 }
784
785
786 /*
787 * We are going to open either a window station or a desktop.
788 * Even if this operation is done from kernel-mode, we should
789 * "emulate" an opening from user-mode (i.e. using an ObjectAttributes
790 * allocated in user-mode, with AccessMode == UserMode) for the
791 * Object Manager to perform proper access validation to the
792 * window station or desktop.
793 */
794
795 /*
796 * Estimate the maximum size needed for the window station name
797 * and desktop name to be given to ObjectAttributes->ObjectName.
798 */
799 StrSize = 0;
800
801 /* Window station name */
802 MemSize = _scwprintf(L"Service-0x%x-%x$", MAXULONG, MAXULONG) * sizeof(WCHAR);
804 + max(WinStaName.Length, MemSize) + sizeof(UNICODE_NULL);
805 if (MemSize > MAXUSHORT)
806 {
807 ERR("IntResolveDesktop: Window station name length is too long.\n");
809 goto Quit;
810 }
811 StrSize = max(StrSize, (USHORT)MemSize);
812
813 /* Desktop name */
814 MemSize = max(DesktopName.Length + sizeof(UNICODE_NULL), sizeof(L"Default"));
815 StrSize = max(StrSize, (USHORT)MemSize);
816
817 /* Size for the OBJECT_ATTRIBUTES */
818 MemSize = ALIGN_UP(sizeof(OBJECT_ATTRIBUTES), sizeof(PVOID));
819
820 /* Add the string size */
821 MemSize += ALIGN_UP(sizeof(UNICODE_STRING), sizeof(PVOID));
822 MemSize += StrSize;
823
824 /* Allocate the memory in user-mode */
825 Status = ZwAllocateVirtualMemory(ZwCurrentProcess(),
827 0,
828 &MemSize,
831 if (!NT_SUCCESS(Status))
832 {
833 ERR("ZwAllocateVirtualMemory() failed, Status 0x%08lx\n", Status);
834 goto Quit;
835 }
836
838 ALIGN_UP(sizeof(OBJECT_ATTRIBUTES), sizeof(PVOID)));
839
840 RtlInitEmptyUnicodeString(ObjectName,
842 ALIGN_UP(sizeof(UNICODE_STRING), sizeof(PVOID))),
843 StrSize);
844
845
846 /* If we got an inherited window station handle, duplicate and use it */
847 if (hWinSta)
848 {
849 ASSERT(bUseDefaultWinSta);
850
851 /* Duplicate the handle if it belongs to another process than the current one */
853 {
855 Status = ZwDuplicateObject(hProcess,
856 hWinSta,
858 (PHANDLE)&hWinStaDup,
859 0,
860 0,
862 if (!NT_SUCCESS(Status))
863 {
864 ERR("IntResolveDesktop: Failed to duplicate the window station handle, Status 0x%08lx\n", Status);
865 /* We will use a default window station */
866 hWinSta = NULL;
867 }
868 else
869 {
870 hWinSta = hWinStaDup;
871 }
872 }
873 }
874
875 /*
876 * If we have an inherited window station, check whether
877 * it is interactive and remember that for later.
878 */
879 if (hWinSta)
880 {
881 ASSERT(bUseDefaultWinSta);
882
883 /* Reference the inherited window station */
885 0,
888 (PVOID*)&WinStaObject,
889 NULL);
890 if (!NT_SUCCESS(Status))
891 {
892 ERR("Failed to reference the inherited window station, Status 0x%08lx\n", Status);
893 /* We will use a default window station */
894 if (hWinStaDup)
895 {
896 ASSERT(hWinSta == hWinStaDup);
897 ObCloseHandle(hWinStaDup, UserMode);
898 hWinStaDup = NULL;
899 }
900 hWinSta = NULL;
901 }
902 else
903 {
904 ERR("Process LUID is: 0x%x-%x, inherited window station LUID is: 0x%x-%x\n",
905 ProcessLuid.HighPart, ProcessLuid.LowPart,
906 WinStaObject->luidUser.HighPart, WinStaObject->luidUser.LowPart);
907
908 /* Check whether this window station is interactive, and remember it for later */
909 bInteractive = !(WinStaObject->Flags & WSS_NOIO);
910
911 /* Dereference the window station */
912 ObDereferenceObject(WinStaObject);
913 }
914 }
915
916 /* Build a valid window station name */
918 ObjectName->MaximumLength,
919 L"%wZ\\%wZ",
921 &WinStaName);
922 if (!NT_SUCCESS(Status))
923 {
924 ERR("Impossible to build a valid window station name, Status 0x%08lx\n", Status);
925 goto Quit;
926 }
927 ObjectName->Length = (USHORT)(wcslen(ObjectName->Buffer) * sizeof(WCHAR));
928
929 TRACE("Parsed initial window station: '%wZ'\n", ObjectName);
930
931 /* Try to open the window station */
935 NULL,
936 NULL);
937 if (bInherit)
938 ObjectAttributes->Attributes |= OBJ_INHERIT;
939
942 UserMode,
943 NULL,
945 NULL,
946 (PHANDLE)&hTempWinSta);
947 if (!NT_SUCCESS(Status))
948 {
949 ERR("Failed to open the window station '%wZ', Status 0x%08lx\n", ObjectName, Status);
950 }
951 else
952 {
953 //
954 // FIXME TODO: Perform a window station access check!!
955 // If we fail AND bUseDefaultWinSta == FALSE we just quit.
956 //
957
958 /*
959 * Check whether we are opening the (single) interactive
960 * window station, and if so, perform an access check.
961 */
962 /* Check whether we are allowed to perform interactions */
963 if (RtlEqualUnicodeString(&WinStaName, &WinSta0Name, TRUE))
964 {
965 LUID SystemLuid = SYSTEM_LUID;
966
967 /* Interactive window station: check for user LUID */
968 WinStaObject = InputWindowStation;
969
971
972 // TODO: Check also that we compare wrt. window station WinSta0
973 // which is the only one that can be interactive on the system.
974 if (((!bUseDefaultWinSta || bInherit) && RtlEqualLuid(&ProcessLuid, &SystemLuid)) ||
975 RtlEqualLuid(&ProcessLuid, &WinStaObject->luidUser))
976 {
977 /* We are interactive on this window station */
978 bAccessAllowed = TRUE;
980 }
981 }
982 else
983 {
984 /* Non-interactive window station: we have access since we were able to open it */
985 bAccessAllowed = TRUE;
987 }
988 }
989
990 /* If we failed, bail out if we were not trying to open the default window station */
991 if (!NT_SUCCESS(Status) && !bUseDefaultWinSta) // if (!bAccessAllowed)
992 goto Quit;
993
994 if (/* bAccessAllowed && */ bInteractive || !bAccessAllowed)
995 {
996 /*
997 * Close WinSta0 if the inherited window station is interactive so that
998 * we can use it, or we do not have access to the interactive WinSta0.
999 */
1000 ObCloseHandle(hTempWinSta, UserMode);
1001 hTempWinSta = NULL;
1002 }
1003 if (bInteractive == bAccessAllowed)
1004 {
1005 /* Keep using the inherited window station */
1006 NOTHING;
1007 }
1008 else // if (bInteractive != bAccessAllowed)
1009 {
1010 /*
1011 * Close the inherited window station, we will either keep using
1012 * the interactive WinSta0, or use Service-0xXXXX-YYYY$.
1013 */
1014 if (hWinStaDup)
1015 {
1016 ASSERT(hWinSta == hWinStaDup);
1017 ObCloseHandle(hWinStaDup, UserMode);
1018 hWinStaDup = NULL;
1019 }
1020 hWinSta = hTempWinSta; // hTempWinSta is NULL in case bAccessAllowed == FALSE
1021 }
1022
1023 if (bUseDefaultWinSta)
1024 {
1025 if (hWinSta == NULL && !bInteractive)
1026 {
1027 /* Build a valid window station name from the LUID */
1029 ObjectName->MaximumLength,
1030 L"%wZ\\Service-0x%x-%x$",
1032 ProcessLuid.HighPart,
1033 ProcessLuid.LowPart);
1034 if (!NT_SUCCESS(Status))
1035 {
1036 ERR("Impossible to build a valid window station name, Status 0x%08lx\n", Status);
1037 goto Quit;
1038 }
1039 ObjectName->Length = (USHORT)(wcslen(ObjectName->Buffer) * sizeof(WCHAR));
1040
1041 /*
1042 * Set up a security descriptor for the new service's window station.
1043 * A service has an associated window station and desktop. The newly
1044 * created window station and desktop will get this security descriptor
1045 * if such objects weren't created before.
1046 */
1047 Status = IntCreateServiceSecurity(&ServiceSD);
1048 if (!NT_SUCCESS(Status))
1049 {
1050 ERR("Failed to create a security descriptor for service window station, Status 0x%08lx\n", Status);
1051 goto Quit;
1052 }
1053
1054 /*
1055 * Create or open the non-interactive window station.
1056 * NOTE: The non-interactive window station handle is never inheritable.
1057 */
1059 ObjectName,
1061 NULL,
1062 ServiceSD);
1063
1064 Status = IntCreateWindowStation(&hWinSta,
1066 UserMode,
1067 KernelMode,
1069 0, 0, 0, 0, 0);
1070
1071 IntFreeSecurityBuffer(ServiceSD);
1072
1073 if (!NT_SUCCESS(Status))
1074 {
1075 ASSERT(hWinSta == NULL);
1076 ERR("Failed to create or open the non-interactive window station '%wZ', Status 0x%08lx\n",
1078 goto Quit;
1079 }
1080
1081 //
1082 // FIXME: We might not need to always create or open the "Default"
1083 // desktop on the Service-0xXXXX-YYYY$ window station; we may need
1084 // to use another one....
1085 //
1086
1087 /* Create or open the Default desktop on the window station */
1089 ObjectName->MaximumLength,
1090 L"Default");
1091 if (!NT_SUCCESS(Status))
1092 {
1093 ERR("Impossible to build a valid desktop name, Status 0x%08lx\n", Status);
1094 goto Quit;
1095 }
1096 ObjectName->Length = (USHORT)(wcslen(ObjectName->Buffer) * sizeof(WCHAR));
1097
1098 /*
1099 * NOTE: The non-interactive desktop handle is never inheritable.
1100 * The security descriptor is inherited from the newly created
1101 * window station for the desktop.
1102 */
1104 ObjectName,
1106 hWinSta,
1107 NULL);
1108
1109 Status = IntCreateDesktop(&hDesktop,
1111 UserMode,
1112 NULL,
1113 NULL,
1114 0,
1116 if (!NT_SUCCESS(Status))
1117 {
1118 ASSERT(hDesktop == NULL);
1119 ERR("Failed to create or open the desktop '%wZ' on window station 0x%p, Status 0x%08lx\n",
1120 ObjectName, hWinSta, Status);
1121 }
1122
1123 goto Quit;
1124 }
1125/*
1126 if (hWinSta == NULL)
1127 {
1128 Status = STATUS_UNSUCCESSFUL;
1129 goto Quit;
1130 }
1131*/
1132 }
1133
1134 /*
1135 * If we got an inherited desktop handle, duplicate and use it,
1136 * otherwise open a new desktop.
1137 */
1138 if (hDesktop != NULL)
1139 {
1140 /* Duplicate the handle if it belongs to another process than the current one */
1142 {
1144 Status = ZwDuplicateObject(hProcess,
1145 hDesktop,
1147 (PHANDLE)&hDesktopDup,
1148 0,
1149 0,
1151 if (!NT_SUCCESS(Status))
1152 {
1153 ERR("IntResolveDesktop: Failed to duplicate the desktop handle, Status 0x%08lx\n", Status);
1154 /* We will use a default desktop */
1155 hDesktop = NULL;
1156 }
1157 else
1158 {
1159 hDesktop = hDesktopDup;
1160 }
1161 }
1162 }
1163
1164 if ((hWinSta != NULL) && (hDesktop == NULL))
1165 {
1167 ObjectName->MaximumLength,
1168 DesktopName.Buffer,
1169 DesktopName.Length);
1170 if (!NT_SUCCESS(Status))
1171 {
1172 ERR("Impossible to build a valid desktop name, Status 0x%08lx\n", Status);
1173 goto Quit;
1174 }
1175 ObjectName->Length = (USHORT)(wcslen(ObjectName->Buffer) * sizeof(WCHAR));
1176
1177 TRACE("Parsed initial desktop: '%wZ'\n", ObjectName);
1178
1179 /* Open the desktop object */
1181 ObjectName,
1183 hWinSta,
1184 NULL);
1185 if (bInherit)
1186 ObjectAttributes->Attributes |= OBJ_INHERIT;
1187
1190 UserMode,
1191 NULL,
1193 NULL,
1194 (PHANDLE)&hDesktop);
1195 if (!NT_SUCCESS(Status))
1196 {
1197 ERR("Failed to open the desktop '%wZ' on window station 0x%p, Status 0x%08lx\n",
1198 ObjectName, hWinSta, Status);
1199 goto Quit;
1200 }
1201 }
1202
1203Quit:
1204 /* Release the object attributes */
1205 if (ObjectAttributes)
1206 {
1207 MemSize = 0;
1208 ZwFreeVirtualMemory(ZwCurrentProcess(),
1210 &MemSize,
1211 MEM_RELEASE);
1212 }
1213
1214 /* Close the temporary process handle */
1215 if (hProcess) // if (Process != PsGetCurrentProcess())
1217
1218 if (NT_SUCCESS(Status))
1219 {
1220 *phWinSta = hWinSta;
1221 *phDesktop = hDesktop;
1222 return STATUS_SUCCESS;
1223 }
1224 else
1225 {
1226 ERR("IntResolveDesktop(%wZ) failed, Status 0x%08lx\n", DesktopPath, Status);
1227
1228 if (hDesktopDup)
1229 ObCloseHandle(hDesktopDup, UserMode);
1230 if (hWinStaDup)
1231 ObCloseHandle(hWinStaDup, UserMode);
1232
1233 if (hDesktop)
1234 ObCloseHandle(hDesktop, UserMode);
1235 if (hWinSta)
1236 ObCloseHandle(hWinSta, UserMode);
1237
1239 return Status;
1240 }
1241}
#define OBJ_NAME_PATH_SEPARATOR
Definition: arcname_tests.c:25
UNICODE_STRING * PUNICODE_STRING
Definition: env_spec_w32.h:373
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:223
_Check_return_ _CRTIMP int __cdecl _scwprintf(_In_z_ _Printf_format_string_ const wchar_t *_Format,...)
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_INHERIT
Definition: winternl.h:225
#define NOTHING
Definition: input_list.c:10
_In_ BOOL _In_ HANDLE hProcess
Definition: mapping.h:71
#define UserMode
Definition: asm.h:39
#define PAGE_READWRITE
Definition: nt_native.h:1304
#define MEM_RELEASE
Definition: nt_native.h:1316
#define MEM_COMMIT
Definition: nt_native.h:1313
#define MAXIMUM_ALLOWED
Definition: nt_native.h:83
#define UNICODE_NULL
POBJECT_TYPE PsProcessType
Definition: process.c:20
#define STATUS_NAME_TOO_LONG
Definition: ntstatus.h:498
NTSTRSAFEAPI RtlStringCbCopyW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ NTSTRSAFE_PCWSTR pszSrc)
Definition: ntstrsafe.h:174
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1173
NTSTRSAFEAPI RtlStringCbCopyNW(_Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc, _In_ size_t cbToCopy)
Definition: ntstrsafe.h:416
PWINSTATION_OBJECT InputWindowStation
Definition: winsta.c:21
UNICODE_STRING gustrWindowStationsDir
Definition: winsta.c:27
NTSTATUS FASTCALL IntCreateWindowStation(OUT HWINSTA *phWinSta, IN POBJECT_ATTRIBUTES ObjectAttributes, IN KPROCESSOR_MODE AccessMode, IN KPROCESSOR_MODE OwnerMode, IN ACCESS_MASK dwDesiredAccess, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4, DWORD Unknown5, DWORD Unknown6)
Definition: winsta.c:458
BOOLEAN NTAPI ObFindHandleForObject(IN PEPROCESS Process, IN PVOID Object, IN POBJECT_TYPE ObjectType, IN POBJECT_HANDLE_INFORMATION HandleInformation, OUT PHANDLE Handle)
Definition: obhandle.c:2856
NTSTATUS NTAPI ObOpenObjectByPointer(IN PVOID Object, IN ULONG HandleAttributes, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PHANDLE Handle)
Definition: obhandle.c:2742
unsigned short USHORT
Definition: pedump.c:61
LONG HighPart
DWORD LowPart
HWINSTA hwinsta
Definition: win32.h:268
struct _DESKTOP * rpdeskStartup
Definition: win32.h:259
struct _WINSTATION_OBJECT * prpwinsta
Definition: win32.h:267
USHORT MaximumLength
Definition: env_spec_w32.h:370
#define max(a, b)
Definition: svc.c:63
#define RTL_CONSTANT_STRING(s)
Definition: tunneltest.c:14
#define MAXULONG
Definition: typedefs.h:251
#define MAXUSHORT
Definition: typedefs.h:83
#define ALIGN_UP(size, type)
Definition: umtypes.h:91
POBJECT_TYPE ExWindowStationObjectType
Definition: win32k.c:21
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:2390
NTSTATUS GetProcessLuid(IN PETHREAD Thread OPTIONAL, IN PEPROCESS Process OPTIONAL, OUT PLUID Luid)
Definition: misc.c:815
NTSTATUS NTAPI IntCreateServiceSecurity(_Out_ PSECURITY_DESCRIPTOR *ServiceSd)
Creates a security descriptor for the service.
Definition: security.c:327
VOID IntFreeSecurityBuffer(_In_ PVOID Buffer)
Frees an allocated security buffer from UM memory that is been previously allocated by IntAllocateSec...
Definition: security.c:133
#define WINSTA_ACCESS_ALL
Definition: security.h:57
#define WSS_NOIO
Definition: winsta.h:9
_In_ PVOID _Out_opt_ PULONG_PTR _Outptr_opt_ PCUNICODE_STRING * ObjectName
Definition: cmfuncs.h:64
#define DUPLICATE_SAME_ACCESS
#define PsGetCurrentProcess
Definition: psfuncs.h:17
#define RtlEqualLuid(Luid1, Luid2)
Definition: rtlfuncs.h:304
#define SYSTEM_LUID
Definition: setypes.h:700
#define ZwCurrentProcess()

Referenced by InitThreadCallback(), and NtUserResolveDesktop().

◆ IntSetFocusMessageQueue()

VOID FASTCALL IntSetFocusMessageQueue ( PUSER_MESSAGE_QUEUE  NewQueue)

Definition at line 1336 of file desktop.c.

1337{
1340 if (!pdo)
1341 {
1342 TRACE("No active desktop\n");
1343 return;
1344 }
1345 if (NewQueue != NULL)
1346 {
1347 if (NewQueue->Desktop != NULL)
1348 {
1349 TRACE("Message Queue already attached to another desktop!\n");
1350 return;
1351 }
1352 IntReferenceMessageQueue(NewQueue);
1353 (void)InterlockedExchangePointer((PVOID*)&NewQueue->Desktop, pdo);
1354 }
1356 if (Old != NULL)
1357 {
1359 gpqForegroundPrev = Old;
1361 }
1362 // Only one Q can have active foreground even when there are more than one desktop.
1363 if (NewQueue)
1364 {
1366 }
1367 else
1368 {
1370 ERR("ptiLastInput is CLEARED!!\n");
1371 ptiLastInput = NULL; // ReactOS hacks... should check for process death.
1372 }
1373}
#define InterlockedExchangePointer(Target, Value)
Definition: dshow.h:45
PUSER_MESSAGE_QUEUE gpqForeground
Definition: focus.c:13
PUSER_MESSAGE_QUEUE gpqForegroundPrev
Definition: focus.c:14
#define IntReferenceMessageQueue(MsgQueue)
Definition: msgqueue.h:217
#define IntDereferenceMessageQueue(MsgQueue)
Definition: msgqueue.h:220
struct _USER_MESSAGE_QUEUE * PUSER_MESSAGE_QUEUE
struct _DESKTOP * Desktop
Definition: msgqueue.h:50

Referenced by co_IntSetForegroundMessageQueue(), co_WinPosActivateOtherWindow(), IntSetThreadDesktop(), MsqCleanupMessageQueue(), and UserAttachThreadInput().

◆ IntSetThreadDesktop()

BOOL IntSetThreadDesktop ( IN HDESK  hDesktop,
IN BOOL  FreeOnFailure 
)

Definition at line 3298 of file desktop.c.

3300{
3301 PDESKTOP pdesk = NULL, pdeskOld;
3302 PTHREADINFO pti;
3304 PCLIENTTHREADINFO pctiOld, pctiNew = NULL;
3305 PCLIENTINFO pci;
3306
3308
3309 TRACE("IntSetThreadDesktop hDesktop:0x%p, FOF:%i\n",hDesktop, FreeOnFailure);
3310
3312 pci = pti->pClientInfo;
3313
3314 /* If the caller gave us a desktop, ensure it is valid */
3315 if (hDesktop != NULL)
3316 {
3317 /* Validate the new desktop. */
3318 Status = IntValidateDesktopHandle(hDesktop, UserMode, 0, &pdesk);
3319 if (!NT_SUCCESS(Status))
3320 {
3321 ERR("Validation of desktop handle 0x%p failed\n", hDesktop);
3322 return FALSE;
3323 }
3324
3325 if (pti->rpdesk == pdesk)
3326 {
3327 /* Nothing to do */
3328 ObDereferenceObject(pdesk);
3329 return TRUE;
3330 }
3331 }
3332
3333 /* Make sure that we don't own any window in the current desktop */
3334 if (!IsListEmpty(&pti->WindowListHead))
3335 {
3336 if (pdesk)
3337 ObDereferenceObject(pdesk);
3338 ERR("Attempted to change thread desktop although the thread has windows!\n");
3340 return FALSE;
3341 }
3342
3343 /* Desktop is being re-set so clear out foreground. */
3344 if (pti->rpdesk != pdesk && pti->MessageQueue == gpqForeground)
3345 {
3346 // Like above, there shouldn't be any windows, hooks or anything active on this threads desktop!
3348 }
3349
3350 /* Before doing the switch, map the new desktop heap and allocate the new pcti */
3351 if (pdesk != NULL)
3352 {
3353 Status = IntMapDesktopView(pdesk);
3354 if (!NT_SUCCESS(Status))
3355 {
3356 ERR("Failed to map desktop heap!\n");
3357 ObDereferenceObject(pdesk);
3359 return FALSE;
3360 }
3361
3362 pctiNew = DesktopHeapAlloc(pdesk, sizeof(CLIENTTHREADINFO));
3363 if (pctiNew == NULL)
3364 {
3365 ERR("Failed to allocate new pcti\n");
3366 IntUnmapDesktopView(pdesk);
3367 ObDereferenceObject(pdesk);
3369 return FALSE;
3370 }
3371 }
3372
3373 /*
3374 * Processes, in particular Winlogon.exe, that manage window stations
3375 * (especially the interactive WinSta0 window station) and desktops,
3376 * may not be able to connect at startup to a window station and have
3377 * an associated desktop as well, if none exists on the system already.
3378 * Because creating a new window station does not affect the window station
3379 * associated to the process, and because neither by associating a window
3380 * station to the process nor creating a new desktop on it does associate
3381 * a startup desktop to that process, the process has to actually assigns
3382 * one of its threads to a desktop so that it gets automatically an assigned
3383 * startup desktop.
3384 *
3385 * This is what actually happens for Winlogon.exe, which is started without
3386 * any window station and desktop. By creating the first (and therefore
3387 * interactive) WinSta0 window station, then assigning WinSta0 to itself
3388 * and creating the Default desktop on it, and then assigning this desktop
3389 * to its main thread, Winlogon.exe basically does the similar steps that
3390 * would have been done automatically at its startup if there were already
3391 * an existing WinSta0 window station and Default desktop.
3392 *
3393 * Of course all this must not be done if we are a SYSTEM or CSRSS thread.
3394 */
3395 // if (pti->ppi->peProcess != gpepCSRSS)
3396 if (!(pti->TIF_flags & (TIF_SYSTEMTHREAD | TIF_CSRSSTHREAD)) &&
3397 pti->ppi->rpdeskStartup == NULL && hDesktop != NULL)
3398 {
3399 ERR("The process 0x%p '%s' didn't have an assigned startup desktop before, assigning it now!\n",
3400 pti->ppi->peProcess, pti->ppi->peProcess->ImageFileName);
3401
3402 pti->ppi->hdeskStartup = hDesktop;
3403 pti->ppi->rpdeskStartup = pdesk;
3404 }
3405
3406 /* free all classes or move them to the shared heap */
3407 if (pti->rpdesk != NULL)
3408 {
3409 if (!IntCheckProcessDesktopClasses(pti->rpdesk, FreeOnFailure))
3410 {
3411 ERR("Failed to move process classes to shared heap!\n");
3412 if (pdesk)
3413 {
3414 DesktopHeapFree(pdesk, pctiNew);
3415 IntUnmapDesktopView(pdesk);
3416 ObDereferenceObject(pdesk);
3417 }
3418 return FALSE;
3419 }
3420 }
3421
3422 pdeskOld = pti->rpdesk;
3423 if (pti->pcti != &pti->cti)
3424 pctiOld = pti->pcti;
3425 else
3426 pctiOld = NULL;
3427
3428 /* do the switch */
3429 if (pdesk != NULL)
3430 {
3431 pti->rpdesk = pdesk;
3432 pti->hdesk = hDesktop;
3433 pti->pDeskInfo = pti->rpdesk->pDeskInfo;
3434 pti->pcti = pctiNew;
3435
3437 pci->pDeskInfo = (PVOID)((ULONG_PTR)pti->pDeskInfo - pci->ulClientDelta);
3438 pci->pClientThreadInfo = (PVOID)((ULONG_PTR)pti->pcti - pci->ulClientDelta);
3439
3440 /* initialize the new pcti */
3441 if (pctiOld != NULL)
3442 {
3443 RtlCopyMemory(pctiNew, pctiOld, sizeof(CLIENTTHREADINFO));
3444 }
3445 else
3446 {
3447 RtlZeroMemory(pctiNew, sizeof(CLIENTTHREADINFO));
3448 pci->fsHooks = pti->fsHooks;
3449 pci->dwTIFlags = pti->TIF_flags;
3450 }
3451 }
3452 else
3453 {
3454 pti->rpdesk = NULL;
3455 pti->hdesk = NULL;
3456 pti->pDeskInfo = NULL;
3457 pti->pcti = &pti->cti; // Always point inside so there will be no crash when posting or sending msg's!
3458 pci->ulClientDelta = 0;
3459 pci->pDeskInfo = NULL;
3460 pci->pClientThreadInfo = NULL;
3461 }
3462
3463 /* clean up the old desktop */
3464 if (pdeskOld != NULL)
3465 {
3466 RemoveEntryList(&pti->PtiLink);
3467 if (pctiOld) DesktopHeapFree(pdeskOld, pctiOld);
3468 IntUnmapDesktopView(pdeskOld);
3469 ObDereferenceObject(pdeskOld);
3470 }
3471
3472 if (pdesk)
3473 {
3474 InsertTailList(&pdesk->PtiList, &pti->PtiLink);
3475 }
3476
3477 TRACE("IntSetThreadDesktop: pti 0x%p ppi 0x%p switched from object 0x%p to 0x%p\n", pti, pti->ppi, pdeskOld, pdesk);
3478
3479 return TRUE;
3480}
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define ERROR_BUSY
Definition: dderror.h:12
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
#define TIF_CSRSSTHREAD
Definition: ntuser.h:266
#define TIF_SYSTEMTHREAD
Definition: ntuser.h:265
#define NtCurrentTeb
ULONG_PTR ulClientDelta
Definition: ntuser.h:326
ULONG fsHooks
Definition: ntuser.h:328
PCLIENTTHREADINFO pClientThreadInfo
Definition: ntuser.h:332
DWORD dwTIFlags
Definition: ntuser.h:324
PDESKTOPINFO pDeskInfo
Definition: ntuser.h:325
LIST_ENTRY PtiList
Definition: desktop.h:25
ULONG fsHooks
Definition: win32.h:117
CLIENTTHREADINFO cti
Definition: win32.h:144
struct _CLIENTTHREADINFO * pcti
Definition: win32.h:91
LIST_ENTRY WindowListHead
Definition: win32.h:155
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:89
LIST_ENTRY PtiLink
Definition: win32.h:126
void * PVOID
Definition: typedefs.h:50
BOOL IntCheckProcessDesktopClasses(IN PDESKTOP Desktop, IN BOOL FreeOnFailure)
Definition: class.c:1017
VOID FASTCALL IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue)
Definition: desktop.c:1336
NTSTATUS FASTCALL IntValidateDesktopHandle(HDESK Desktop, KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PDESKTOP *Object)
Definition: desktop.c:1254
static __inline ULONG_PTR DesktopHeapGetUserDelta(VOID)
Definition: desktop.h:272
static __inline PVOID DesktopHeapAlloc(IN PDESKTOP Desktop, IN SIZE_T Bytes)
Definition: desktop.h:204
static __inline BOOL DesktopHeapFree(IN PDESKTOP Desktop, IN PVOID lpMem)
Definition: desktop.h:215
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:22

Referenced by DesktopWindowProc(), ExitThreadCallback(), InitThreadCallback(), NtUserSetInformationThread(), and NtUserSetThreadDesktop().

◆ IntValidateDesktopHandle()

NTSTATUS FASTCALL IntValidateDesktopHandle ( HDESK  Desktop,
KPROCESSOR_MODE  AccessMode,
ACCESS_MASK  DesiredAccess,
PDESKTOP Object 
)

Definition at line 1254 of file desktop.c.

1259{
1261
1265 AccessMode,
1266 (PVOID*)Object,
1267 NULL);
1268
1269 TRACE("IntValidateDesktopHandle: handle:0x%p obj:0x%p access:0x%x Status:0x%lx\n",
1271
1272 if (!NT_SUCCESS(Status))
1274
1275 return Status;
1276}
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
Definition: wdfdevice.h:2658

Referenced by InitThreadCallback(), IntSetThreadDesktop(), NtUserBuildHwndList(), NtUserCloseDesktop(), NtUserGetObjectInformation(), and NtUserSwitchDesktop().

◆ UserGetDesktopDC()

HDC FASTCALL UserGetDesktopDC ( ULONG  DcType,
BOOL  bAltDc,
BOOL  ValidatehWnd 
)

Definition at line 1591 of file desktop.c.

1592{
1593 PWND DesktopObject = 0;
1594 HDC DesktopHDC = 0;
1595
1596 /* This can be called from GDI/DX, so acquire the USER lock */
1598
1599 if (DcType == DCTYPE_DIRECT)
1600 {
1601 DesktopObject = UserGetDesktopWindow();
1602 DesktopHDC = (HDC)UserGetWindowDC(DesktopObject);
1603 }
1604 else
1605 {
1606 PMONITOR pMonitor = UserGetPrimaryMonitor();
1607 DesktopHDC = IntGdiCreateDisplayDC(pMonitor->hDev, DcType, bAltDc);
1608 }
1609
1610 UserLeave();
1611
1612 return DesktopHDC;
1613}
@ DCTYPE_DIRECT
Definition: dc.h:41
HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC)
Definition: dclife.c:1063
HDEV hDev
Definition: monitor.h:23
HDC FASTCALL UserGetWindowDC(PWND Wnd)
Definition: windc.c:947
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1403
PMONITOR NTAPI UserGetPrimaryMonitor(VOID)
Definition: monitor.c:102

Referenced by DxEngGetDesktopDC().

◆ UserGetDesktopWindow()

◆ UserGetMessageWindow()

PWND FASTCALL UserGetMessageWindow ( VOID  )

Definition at line 1429 of file desktop.c.

1430{
1432
1433 if (!pdo)
1434 {
1435 TRACE("No active desktop\n");
1436 return NULL;
1437 }
1438 return pdo->spwndMessage;
1439}

◆ UserMessageWindowProc()

BOOL FASTCALL UserMessageWindowProc ( PWND  pwnd,
UINT  Msg,
WPARAM  wParam,
LPARAM  lParam,
LRESULT lResult 
)

Definition at line 1542 of file desktop.c.

1543{
1544 *lResult = 0;
1545
1546 switch(Msg)
1547 {
1548 case WM_NCCREATE:
1549 pwnd->fnid |= FNID_MESSAGEWND;
1550 *lResult = (LRESULT)TRUE;
1551 break;
1552 case WM_DESTROY:
1553 pwnd->fnid |= FNID_DESTROY;
1554 break;
1555 default:
1556 ERR("UMWP calling IDWP\n");
1557 *lResult = IntDefWindowProc(pwnd, Msg, wParam, lParam, FALSE);
1558 }
1559
1560 return TRUE; /* We are done. Do not do any callbacks to user mode */
1561}
#define FNID_DESTROY
Definition: ntuser.h:898
LRESULT FASTCALL IntDefWindowProc(PWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Ansi)
Definition: defwnd.c:587
#define WM_DESTROY
Definition: winuser.h:1628

Referenced by co_IntSendMessageTimeoutSingle(), co_IntSendMessageWithCallBack(), IntDispatchMessage(), and NtUserMessageCall().

◆ UserOpenInputDesktop()

HDESK UserOpenInputDesktop ( DWORD  dwFlags,
BOOL  fInherit,
ACCESS_MASK  dwDesiredAccess 
)

Definition at line 2655 of file desktop.c.

2658{
2662 HDESK hdesk = NULL;
2663
2664 if (!gpdeskInputDesktop)
2665 {
2666 return NULL;
2667 }
2668
2669 if (pti->ppi->prpwinsta != InputWindowStation)
2670 {
2671 ERR("Tried to open input desktop from non interactive winsta!\n");
2673 return NULL;
2674 }
2675
2676 if (fInherit) HandleAttributes = OBJ_INHERIT;
2677
2678 /* Create a new handle to the object */
2682 NULL,
2683 dwDesiredAccess,
2685 UserMode,
2686 (PHANDLE)&hdesk);
2687
2688 if (!NT_SUCCESS(Status))
2689 {
2690 ERR("Failed to open input desktop object\n");
2692 }
2693
2694 return hdesk;
2695}
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
_In_ HANDLE _In_opt_ HANDLE _Out_opt_ PHANDLE _In_ ACCESS_MASK _In_ ULONG HandleAttributes
Definition: obfuncs.h:433

Referenced by DesktopWindowProc(), and NtUserOpenInputDesktop().

◆ UserRedrawDesktop()

VOID APIENTRY UserRedrawDesktop ( VOID  )

Definition at line 1616 of file desktop.c.

1617{
1618 PWND Window = NULL;
1619 PREGION Rgn;
1620
1622 Rgn = IntSysCreateRectpRgnIndirect(&Window->rcWindow);
1623
1625 Rgn,
1628
1629 REGION_Delete(Rgn);
1630}
#define IntSysCreateRectpRgnIndirect(prc)
Definition: region.h:93
Definition: window.c:28
Definition: region.h:8
VOID FASTCALL IntInvalidateWindows(PWND Wnd, PREGION Rgn, ULONG Flags)
Definition: painting.c:643
VOID FASTCALL REGION_Delete(PREGION pRgn)
Definition: region.c:2449
#define RDW_FRAME
Definition: winuser.h:1223

Referenced by DxEngRedrawDesktop(), NtUserSetSysColors(), UserChangeDisplaySettings(), and UserRefreshDisplay().

Variable Documentation

◆ DesktopWindowClass

PCLS DesktopWindowClass
extern

◆ gpdeskInputDesktop

◆ gpDesktopThreadStartedEvent

PKEVENT gpDesktopThreadStartedEvent
extern

Definition at line 56 of file desktop.c.

Referenced by DesktopThreadMain(), InitDesktopImpl(), and IntCreateWindowStation().

◆ gptiDesktopThread

◆ gptiForeground

◆ ScreenDeviceContext