/* Pointer to the associated window station. */
struct _WINSTATION_OBJECT *rpwinstaParent;
DWORD dwDTFlags;
+ DWORD_PTR dwDesktopId;
+ PMENU spmenuSys;
+ PMENU spmenuDialogSys;
+ PMENU spmenuHScroll;
+ PMENU spmenuVScroll;
PWND spwndForeground;
PWND spwndTray;
PWND spwndMessage;
PWIN32HEAP pheapDesktop;
ULONG_PTR ulHeapSize;
LIST_ENTRY PtiList;
+
+ /* One console input thread per desktop, maintained by CONSRV */
+ DWORD dwConsoleThreadId;
+
/* Use for tracking mouse moves. */
PWND spwndTrack;
DWORD htEx;
/* Thread blocking input */
PVOID BlockInputThread;
LIST_ENTRY ShellHookWindows;
-} DESKTOP;
+} DESKTOP, *PDESKTOP;
// Desktop flags
#define DF_TME_HOVER 0x00000400
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,
ACCESS_MASK DesiredAccess,
PDESKTOP *Object);
-NTSTATUS FASTCALL
-IntParseDesktopPath(PEPROCESS Process,
- PUNICODE_STRING DesktopPath,
- HWINSTA *hWinSta,
- HDESK *hDesktop);
+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);
HDC FASTCALL UserGetDesktopDC(ULONG,BOOL,BOOL);
#define IntIsActiveDesktop(Desktop) \
- ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
-
-#define GET_DESKTOP_NAME(d) \
- OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d)) ? \
- &(OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(d))->Name) : \
- NULL
+ ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
HWND FASTCALL IntGetMessageWindow(VOID);
PWND FASTCALL UserGetMessageWindow(VOID);
+#if 0
+static __inline BOOL
+UserIsDesktopWindow(IN PWND pWnd)
+{
+ // return (pWnd == UserGetDesktopWindow());
+ return (pWnd && (pWnd->fnid == FNID_DESKTOP));
+}
+
+static __inline BOOL
+UserIsMessageWindow(IN PWND pWnd)
+{
+ // return (pWnd == UserGetMessageWindow());
+ return (pWnd && (pWnd->fnid == FNID_MESSAGEWND));
+}
+#else
+
+#define UserIsDesktopWindow(pWnd) \
+ ((pWnd) && ((pWnd)->fnid == FNID_DESKTOP))
+
+#define UserIsMessageWindow(pWnd) \
+ ((pWnd) && ((pWnd)->fnid == FNID_MESSAGEWND))
+
+#endif
+
+
static __inline PVOID
DesktopHeapAlloc(IN PDESKTOP Desktop,
IN SIZE_T Bytes)
pheapDesktop = pti->rpdesk->pheapDesktop;
W32Process = PsGetCurrentProcessWin32Process();
+
+ /*
+ * Start the search at the next mapping: skip the first entry
+ * as it must be the global user heap mapping.
+ */
Mapping = W32Process->HeapMappings.Next;
while (Mapping != NULL)
{
PPROCESSINFO W32Process;
W32Process = PsGetCurrentProcessWin32Process();
+
+ /*
+ * Start the search at the next mapping: skip the first entry
+ * as it must be the global user heap mapping.
+ */
Mapping = W32Process->HeapMappings.Next;
while (Mapping != NULL)
{
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 NTAPI DesktopThreadMain(VOID);
+
/* EOF */