[WIN32K:NTUSER] Make NtUserResolveDesktop() and IntResolveDesktop() work in a more...
[reactos.git] / win32ss / user / ntuser / desktop.h
index cdf160f..0e1950f 100644 (file)
@@ -23,6 +23,10 @@ typedef struct _DESKTOP
     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;
@@ -37,7 +41,7 @@ typedef struct _DESKTOP
     /* Thread blocking input */
     PVOID BlockInputThread;
     LIST_ENTRY ShellHookWindows;
-} DESKTOP;
+} DESKTOP, *PDESKTOP;
 
 // Desktop flags
 #define DF_TME_HOVER        0x00000400
@@ -157,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,
@@ -164,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);
@@ -177,11 +195,36 @@ VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam);
 HDC FASTCALL UserGetDesktopDC(ULONG,BOOL,BOOL);
 
 #define IntIsActiveDesktop(Desktop) \
-  ((Desktop)->rpwinstaParent->ActiveDesktop == (Desktop))
+    ((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)
@@ -259,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)
     {
@@ -281,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)
     {
@@ -302,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 */