[WIN32K:NTUSER] Make NtUserResolveDesktop() and IntResolveDesktop() work in a more...
[reactos.git] / win32ss / user / ntuser / desktop.h
index 672303e..0e1950f 100644 (file)
@@ -2,19 +2,31 @@
 
 typedef struct _DESKTOP
 {
+    /* Must be the first member */
+    DWORD dwSessionId;
+
     PDESKTOPINFO pDeskInfo;
     LIST_ENTRY ListEntry;
     /* 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;
     PWND spwndTooltip;
-    PSECTION_OBJECT hsectionDesktop;
+    PVOID hsectionDesktop;
     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;
@@ -29,7 +41,7 @@ typedef struct _DESKTOP
     /* Thread blocking input */
     PVOID BlockInputThread;
     LIST_ENTRY ShellHookWindows;
-} DESKTOP;
+} DESKTOP, *PDESKTOP;
 
 // Desktop flags
 #define DF_TME_HOVER        0x00000400
@@ -69,9 +81,10 @@ typedef struct _DESKTOP
                             DESKTOP_SWITCHDESKTOP    | \
                             DESKTOP_WRITEOBJECTS
 
-extern PDESKTOP InputDesktop;
+extern PDESKTOP gpdeskInputDesktop;
 extern PCLS DesktopWindowClass;
 extern HDC ScreenDeviceContext;
+extern PTHREADINFO gptiForeground;
 extern PTHREADINFO gptiDesktopThread;
 
 typedef struct _SHELL_HOOK_WINDOW
@@ -98,17 +111,25 @@ IntDesktopObjectParse(IN PVOID ParseObject,
                       IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
                       OUT PVOID *Object);
 
-VOID APIENTRY
-IntDesktopObjectDelete(PWIN32_DELETEMETHOD_PARAMETERS Parameters);
+NTSTATUS
+NTAPI
+IntDesktopObjectDelete(
+    _In_ PVOID Parameters);
 
-NTSTATUS NTAPI 
-IntDesktopOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters);
+NTSTATUS
+NTAPI
+IntDesktopOkToClose(
+    _In_ PVOID Parameters);
 
-NTSTATUS NTAPI 
-IntDesktopObjectOpen(PWIN32_OPENMETHOD_PARAMETERS Parameters);
+NTSTATUS
+NTAPI
+IntDesktopObjectOpen(
+    _In_ PVOID Parameters);
 
-NTSTATUS NTAPI 
-IntDesktopObjectClose(PWIN32_CLOSEMETHOD_PARAMETERS Parameters);
+NTSTATUS
+NTAPI
+IntDesktopObjectClose(
+    _In_ PVOID Parameters);
 
 HDC FASTCALL
 IntGetScreenDC(VOID);
@@ -140,6 +161,15 @@ 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,
@@ -147,11 +177,16 @@ IntValidateDesktopHandle(
    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);
@@ -160,16 +195,36 @@ VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam);
 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)
@@ -247,6 +302,11 @@ DesktopHeapGetUserDelta(VOID)
     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)
     {
@@ -269,6 +329,11 @@ DesktopHeapAddressToUser(PVOID lpMem)
     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)
     {
@@ -290,5 +355,6 @@ 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 NTAPI DesktopThreadMain(VOID);
+
 /* EOF */