- Synchronize with trunk's revision r57633.
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 28 Oct 2012 12:13:03 +0000 (12:13 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 28 Oct 2012 12:13:03 +0000 (12:13 +0000)
[WIN32CSR/BOOTDATA]
- Finally get rid of win32csr, being replaced by winsrv and consrv.
- Remove it from the subsystem command-line.

[WINSRV]
- Move a hack from win32csr to winsrv.

svn path=/branches/ros-csrss/; revision=57635

46 files changed:
boot/bootdata/hivesys_amd64.inf
boot/bootdata/hivesys_arm.inf
boot/bootdata/hivesys_i386.inf
ntoskrnl/ex/win32k.c
ntoskrnl/ps/win32.c
win32ss/CMakeLists.txt
win32ss/gdi/ntgdi/device.c
win32ss/pch.h
win32ss/user/ntuser/accelerator.c
win32ss/user/ntuser/callback.c
win32ss/user/ntuser/callproc.c
win32ss/user/ntuser/class.c
win32ss/user/ntuser/class.h
win32ss/user/ntuser/clipboard.c
win32ss/user/ntuser/csr.c
win32ss/user/ntuser/cursoricon.c
win32ss/user/ntuser/desktop.c
win32ss/user/ntuser/desktop.h
win32ss/user/ntuser/event.c
win32ss/user/ntuser/hook.c
win32ss/user/ntuser/input.c
win32ss/user/ntuser/kbdlayout.c
win32ss/user/ntuser/main.c
win32ss/user/ntuser/menu.c
win32ss/user/ntuser/message.c
win32ss/user/ntuser/monitor.c
win32ss/user/ntuser/msgqueue.c
win32ss/user/ntuser/msgqueue.h
win32ss/user/ntuser/object.c
win32ss/user/ntuser/object.h
win32ss/user/ntuser/simplecall.c
win32ss/user/ntuser/timer.c
win32ss/user/ntuser/window.c
win32ss/user/ntuser/window.h
win32ss/user/ntuser/winsta.c
win32ss/user/user32/windows/cursoricon.c
win32ss/user/win32csr/CMakeLists.txt [deleted file]
win32ss/user/win32csr/desktopbg.c [deleted file]
win32ss/user/win32csr/desktopbg.h [deleted file]
win32ss/user/win32csr/dllmain.c [deleted file]
win32ss/user/win32csr/win32csr.h [deleted file]
win32ss/user/win32csr/win32csr.rc [deleted file]
win32ss/user/win32csr/win32csr.spec [deleted file]
win32ss/user/winsrv/harderror.c
win32ss/user/winsrv/init.c
win32ss/user/winsrv/shutdown.c

index 2c00e30..ad480cb 100644 (file)
@@ -1239,7 +1239,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Kmode",0x000
 HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Optional",0x00010000,"Posix"
 HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Posix",0x00020000,"%SystemRoot%\system32\psxss.exe"
 HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Required",0x00010000,"Debug","Windows"
-HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=consrv:ConServerDllInitialization,2 ServerDll=win32csr:Win32CsrInitialization,4 ProfileControl=Off MaxRequestThreads=16"
+HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=consrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16"
 
 ; WOW Support
 HKLM,"SYSTEM\CurrentControlSet\Control\Wow","",0x00000000,""
index 23deb8d..51aacec 100644 (file)
@@ -794,7 +794,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Kmode",0x000
 HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Optional",0x00010000,"Posix"
 HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Posix",0x00020000,"%SystemRoot%\system32\psxss.exe"
 HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Required",0x00010000,"Debug","Windows"
-HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=consrv:ConServerDllInitialization,2 ServerDll=win32csr:Win32CsrInitialization,4 ProfileControl=Off MaxRequestThreads=16"
+HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=consrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16"
 
 ; WOW Support
 HKLM,"SYSTEM\CurrentControlSet\Control\Wow","",0x00000000,""
index 2c00e30..ad480cb 100644 (file)
@@ -1239,7 +1239,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Kmode",0x000
 HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Optional",0x00010000,"Posix"
 HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Posix",0x00020000,"%SystemRoot%\system32\psxss.exe"
 HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Required",0x00010000,"Debug","Windows"
-HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=consrv:ConServerDllInitialization,2 ServerDll=win32csr:Win32CsrInitialization,4 ProfileControl=Off MaxRequestThreads=16"
+HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=consrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16"
 
 ; WOW Support
 HKLM,"SYSTEM\CurrentControlSet\Control\Wow","",0x00000000,""
index c710db5..7abfd29 100644 (file)
@@ -40,6 +40,8 @@ PKWIN32_DELETEMETHOD_CALLOUT ExpWindowStationObjectDelete = NULL;
 PKWIN32_OKTOCLOSEMETHOD_CALLOUT ExpWindowStationObjectOkToClose = NULL;
 PKWIN32_OKTOCLOSEMETHOD_CALLOUT ExpDesktopObjectOkToClose = NULL;
 PKWIN32_DELETEMETHOD_CALLOUT ExpDesktopObjectDelete = NULL;
+PKWIN32_OPENMETHOD_CALLOUT ExpDesktopObjectOpen = NULL;
+PKWIN32_CLOSEMETHOD_CALLOUT ExpDesktopObjectClose = NULL;
 
 /* FUNCTIONS ****************************************************************/
 
@@ -133,6 +135,44 @@ ExpDesktopDelete(PVOID DeletedObject)
     ExpDesktopObjectDelete(&Parameters);
 }
 
+NTSTATUS
+NTAPI 
+ExpDesktopOpen(IN OB_OPEN_REASON Reason,
+               IN PEPROCESS Process OPTIONAL,
+               IN PVOID ObjectBody,
+               IN ACCESS_MASK GrantedAccess,
+               IN ULONG HandleCount)
+{
+    WIN32_OPENMETHOD_PARAMETERS Parameters;
+
+    Parameters.OpenReason = Reason;
+    Parameters.Process = Process;
+    Parameters.Object = ObjectBody;
+    Parameters.GrantedAccess = GrantedAccess;
+    Parameters.HandleCount = HandleCount;
+
+    return ExpDesktopObjectOpen(&Parameters);
+}
+
+VOID
+NTAPI 
+ExpDesktopClose(IN PEPROCESS Process OPTIONAL,
+                IN PVOID Object,
+                IN ACCESS_MASK GrantedAccess,
+                IN ULONG ProcessHandleCount,
+                IN ULONG SystemHandleCount)
+{
+    WIN32_CLOSEMETHOD_PARAMETERS Parameters;
+
+    Parameters.Process = Process;
+    Parameters.Object = Object;
+    Parameters.AccessMask = GrantedAccess;
+    Parameters.ProcessHandleCount = ProcessHandleCount;
+    Parameters.SystemHandleCount = SystemHandleCount;
+
+    ExpDesktopObjectClose(&Parameters);
+}
+
 BOOLEAN
 INIT_FUNCTION
 NTAPI
@@ -169,6 +209,8 @@ ExpWin32kInit(VOID)
     ObjectTypeInitializer.DeleteProcedure = ExpDesktopDelete;
     ObjectTypeInitializer.ParseProcedure = NULL;
     ObjectTypeInitializer.OkayToCloseProcedure = ExpDesktopOkToClose;
+    ObjectTypeInitializer.OpenProcedure = ExpDesktopOpen;
+    ObjectTypeInitializer.CloseProcedure = ExpDesktopClose;
     ObCreateObjectType(&Name,
                        &ObjectTypeInitializer,
                        NULL,
index 19dd4e9..04c857f 100644 (file)
@@ -23,6 +23,8 @@ extern PKWIN32_DELETEMETHOD_CALLOUT ExpWindowStationObjectDelete;
 extern PKWIN32_OKTOCLOSEMETHOD_CALLOUT ExpWindowStationObjectOkToClose;
 extern PKWIN32_OKTOCLOSEMETHOD_CALLOUT ExpDesktopObjectOkToClose;
 extern PKWIN32_DELETEMETHOD_CALLOUT ExpDesktopObjectDelete;
+extern PKWIN32_OPENMETHOD_CALLOUT ExpDesktopObjectOpen;
+extern PKWIN32_CLOSEMETHOD_CALLOUT ExpDesktopObjectClose;
 extern PKWIN32_POWEREVENT_CALLOUT PopEventCallout;
 
 /* PRIVATE FUNCTIONS *********************************************************/
@@ -121,6 +123,8 @@ PsEstablishWin32Callouts(IN PWIN32_CALLOUTS_FPNS CalloutData)
     ExpWindowStationObjectOkToClose = CalloutData->WindowStationOkToCloseProcedure;
     ExpDesktopObjectOkToClose = CalloutData->DesktopOkToCloseProcedure;
     ExpDesktopObjectDelete = CalloutData->DesktopDeleteProcedure;
+    ExpDesktopObjectOpen = CalloutData->DesktopOpenProcedure;
+    ExpDesktopObjectClose = CalloutData->DesktopCloseProcedure;
     PopEventCallout = CalloutData->PowerEventCallout;
     KeGdiFlushUserBatch = CalloutData->BatchFlushRoutine;
 }
index f741756..0abce0e 100644 (file)
@@ -14,7 +14,6 @@ add_subdirectory(gdi/gdi32)
 add_subdirectory(reactx)
 add_subdirectory(user/consrv)
 add_subdirectory(user/user32)
-add_subdirectory(user/win32csr)
 add_subdirectory(user/winsrv)
 
 spec2def(win32k.sys win32k.spec ADD_IMPORTLIB)
index 94ac8ed..a54acde 100644 (file)
@@ -32,16 +32,16 @@ IntCreatePrimarySurface(VOID)
     SURFOBJ *pso;
     PDESKTOP rpDesk;
 
+    /* Create surface */
+    pso = &PDEVOBJ_pSurface(gppdevPrimary)->SurfObj;
+    SurfSize = pso->sizlBitmap;
+
     /* Attach monitor */
     UserAttachMonitor((HDEV)gppdevPrimary);
 
     DPRINT("IntCreatePrimarySurface, gppdevPrimary=%p, gppdevPrimary->pSurface = %p\n",
         gppdevPrimary, gppdevPrimary->pSurface);
 
-    /* Create surface */
-    pso = &PDEVOBJ_pSurface(gppdevPrimary)->SurfObj;
-    SurfSize = pso->sizlBitmap;
-
     /* Put the pointer in the center of the screen */
     gpsi->ptCursor.x = pso->sizlBitmap.cx / 2;
     gpsi->ptCursor.y = pso->sizlBitmap.cy / 2;
index 66a9724..f3a9d79 100644 (file)
@@ -36,6 +36,7 @@
 /* Win32 headers */
 /* FIXME: Defines in winbase.h that we need... */
 typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
+#define MAKEINTATOM(i) (LPWSTR)((ULONG_PTR)((WORD)(i)))
 #define WINBASEAPI
 #define STARTF_USESIZE 2
 #define STARTF_USEPOSITION 4
index c097823..24d1b61 100644 (file)
@@ -257,7 +257,7 @@ NtUserCreateAcceleratorTable(
         RETURN( (HACCEL) NULL );
     }
 
-    Accel = UserCreateObject(gHandleTable, NULL, (PHANDLE)&hAccel, otAccel, sizeof(ACCELERATOR_TABLE));
+    Accel = UserCreateObject(gHandleTable, NULL, NULL, (PHANDLE)&hAccel, otAccel, sizeof(ACCELERATOR_TABLE));
 
     if (Accel == NULL)
     {
index 4d84db4..e1a6948 100644 (file)
@@ -130,6 +130,9 @@ co_IntClientLoadLibrary(PUNICODE_STRING pstrLibName,
    BOOL bResult;
    ULONG_PTR pLibNameBuffer = 0, pInitFuncBuffer = 0;
 
+   /* Do not allow the desktop thread to do callback to user mode */
+   ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
    TRACE("co_IntClientLoadLibrary: %S, %S, %d, %d\n", pstrLibName->Buffer, pstrLibName->Buffer, Unload, ApiHook);
 
    /* Calculate the size of the argument */
@@ -236,6 +239,9 @@ co_IntCallSentMessageCallback(SENDASYNCPROC CompletionCallback,
    ULONG ResultLength;
    NTSTATUS Status;
 
+   /* Do not allow the desktop thread to do callback to user mode */
+   ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
    Arguments.Callback = CompletionCallback;
    Arguments.Wnd = hWnd;
    Arguments.Msg = Msg;
@@ -281,6 +287,9 @@ co_IntCallWindowProc(WNDPROC Proc,
    ULONG ArgumentLength;
    LRESULT Result;
 
+   /* Do not allow the desktop thread to do callback to user mode */
+   ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
    if (0 < lParamBufferSize)
    {
       ArgumentLength = sizeof(WINDOWPROC_CALLBACK_ARGUMENTS) + lParamBufferSize;
@@ -364,6 +373,9 @@ co_IntLoadSysMenuTemplate()
    PVOID ResultPointer;
    ULONG ResultLength;
 
+   /* Do not allow the desktop thread to do callback to user mode */
+   ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
    ResultPointer = NULL;
    ResultLength = sizeof(LRESULT);
 
@@ -394,6 +406,8 @@ co_IntLoadSysMenuTemplate()
    return (HMENU)Result;
 }
 
+extern HCURSOR gDesktopCursor;
+
 BOOL APIENTRY
 co_IntLoadDefaultCursors(VOID)
 {
@@ -402,8 +416,11 @@ co_IntLoadDefaultCursors(VOID)
    ULONG ResultLength;
    BOOL DefaultCursor = TRUE;
 
+   /* Do not allow the desktop thread to do callback to user mode */
+   ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
    ResultPointer = NULL;
-   ResultLength = sizeof(LRESULT);
+   ResultLength = sizeof(HCURSOR);
 
    UserLeaveCo();
 
@@ -415,6 +432,9 @@ co_IntLoadDefaultCursors(VOID)
 
    UserEnterCo();
 
+   /* HACK: The desktop class doen't have a proper cursor yet, so set it here */
+    gDesktopCursor = *((HCURSOR*)ResultPointer);
+
    if (!NT_SUCCESS(Status))
    {
       return FALSE;
@@ -448,6 +468,8 @@ co_IntCallHookProc(INT HookId,
    UINT lParamSize = 0;
 
    ASSERT(Proc);
+   /* Do not allow the desktop thread to do callback to user mode */
+   ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
 
    pti = PsGetCurrentThreadWin32Thread();
    if (pti->TIF_flags & TIF_INCLEANUP)
@@ -834,6 +856,9 @@ co_IntClientThreadSetup(VOID)
    ULONG ArgumentLength, ResultLength;
    PVOID Argument, ResultPointer;
 
+   /* Do not allow the desktop thread to do callback to user mode */
+   ASSERT(PsGetCurrentThreadWin32Thread() != gptiDesktopThread);
+
    ArgumentLength = ResultLength = 0;
    Argument = ResultPointer = NULL;
 
index 5284847..3d0f2fc 100644 (file)
@@ -35,6 +35,7 @@ CreateCallProc(IN PDESKTOP Desktop,
 
     NewCallProc = (PCALLPROCDATA)UserCreateObject(gHandleTable,
                                              Desktop,
+                                             NULL,
                                              &Handle,
                                              otCallProc,
                                              sizeof(CALLPROCDATA));
index a5b7a14..afba9eb 100644 (file)
@@ -641,9 +641,17 @@ IntReferenceClass(IN OUT PCLS BaseClass,
     PCLS Class;
     ASSERT(BaseClass->pclsBase == BaseClass);
 
-    Class = IntGetClassForDesktop(BaseClass,
-                                  ClassLink,
-                                  Desktop);
+    if (Desktop != NULL)
+    {
+        Class = IntGetClassForDesktop(BaseClass,
+                                      ClassLink,
+                                      Desktop);
+    }
+    else
+    {
+        Class = BaseClass;
+    }
+
     if (Class != NULL)
     {
         Class->cWndReferenceCount++;
@@ -1286,13 +1294,16 @@ FoundClass:
 }
 
 PCLS
-IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance)
+IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance, BOOL bDesktopThread)
 {
    PCLS *ClassLink, Class = NULL;
    RTL_ATOM ClassAtom;
    PTHREADINFO pti;
 
-   pti = PsGetCurrentThreadWin32Thread();
+   if (bDesktopThread)
+       pti = gptiDesktopThread;
+   else
+       pti = PsGetCurrentThreadWin32Thread();
 
    if ( !(pti->ppi->W32PF_flags & W32PF_CLASSESREGISTERED ))
    {
index d6603b6..f2d7978 100644 (file)
@@ -39,7 +39,7 @@ IntDereferenceClass(IN OUT PCLS Class,
                     IN PPROCESSINFO pi);
 
 PCLS
-IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance);
+IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance, BOOL bDesktopThread);
 
 BOOL FASTCALL UserRegisterSystemClasses(VOID);
 
index cfe6fd8..e238e54 100644 (file)
@@ -181,6 +181,7 @@ IntSynthesizeDib(
 
     /* Create the clipboard data */
     pClipboardData = (PCLIPBOARDDATA)UserCreateObject(gHandleTable,
+                                                      NULL,
                                                       NULL,
                                                       &hMem,
                                                       otClipBoardData,
@@ -293,7 +294,7 @@ IntAddSynthesizedFormats(PWINSTATION_OBJECT pWinStaObj)
         PCLIPBOARDDATA pMemObj;
         HANDLE hMem;
 
-        pMemObj = (PCLIPBOARDDATA)UserCreateObject(gHandleTable, NULL, &hMem, otClipBoardData,
+        pMemObj = (PCLIPBOARDDATA)UserCreateObject(gHandleTable, NULL, NULL, &hMem, otClipBoardData,
                                                    sizeof(CLIPBOARDDATA) + sizeof(LCID));
         if (pMemObj)
         {
@@ -1080,7 +1081,7 @@ NtUserConvertMemHandle(
     UserEnterExclusive();
 
     /* Create Clipboard data object */
-    pMemObj = UserCreateObject(gHandleTable, NULL, &hMem, otClipBoardData, sizeof(CLIPBOARDDATA) + cbData);
+    pMemObj = UserCreateObject(gHandleTable, NULL, NULL, &hMem, otClipBoardData, sizeof(CLIPBOARDDATA) + cbData);
     if (!pMemObj)
         goto cleanup;
 
index 7f53c5b..5bb9cb7 100644 (file)
@@ -93,74 +93,4 @@ co_CsrNotify(IN OUT PCSR_API_MESSAGE ApiMessage,
     return Status;
 }
 
-
-NTSTATUS
-APIENTRY
-CsrInsertObject(HANDLE ObjectHandle,
-                ACCESS_MASK DesiredAccess,
-                PHANDLE Handle)
-{
-   NTSTATUS Status;
-   HANDLE CsrProcessHandle;
-   OBJECT_ATTRIBUTES ObjectAttributes;
-   CLIENT_ID Cid;
-
-   /* Put CSR'S CID */
-   Cid.UniqueProcess = CsrProcess->UniqueProcessId;
-   Cid.UniqueThread = 0;
-
-   /* Empty Attributes */
-   InitializeObjectAttributes(&ObjectAttributes,
-                              NULL,
-                              0,
-                              NULL,
-                              NULL);
-
-   /* Get a Handle to Csrss */
-   Status = ZwOpenProcess(&CsrProcessHandle,
-                          PROCESS_DUP_HANDLE,
-                          &ObjectAttributes,
-                          &Cid);
-
-   if ((NT_SUCCESS(Status)))
-   {
-      /* Duplicate the Handle */
-      Status = ZwDuplicateObject(NtCurrentProcess(),
-                                 ObjectHandle,
-                                 CsrProcessHandle,
-                                 Handle,
-                                 DesiredAccess,
-                                 OBJ_INHERIT,
-                                 0);
-
-      /* Close our handle to CSRSS */
-      ZwClose(CsrProcessHandle);
-   }
-
-   return Status;
-}
-
-NTSTATUS FASTCALL
-CsrCloseHandle(HANDLE Handle)
-{
-   NTSTATUS Status;
-   PEPROCESS OldProcess;
-
-   /* Switch to the process in which the handle is valid */
-   OldProcess = PsGetCurrentProcess();
-   if (CsrProcess != OldProcess)
-   {
-      KeAttachProcess(&CsrProcess->Pcb);
-   }
-
-   Status = ZwClose(Handle);
-
-   if (CsrProcess != OldProcess)
-   {
-      KeDetachProcess();
-   }
-
-   return Status;
-}
-
 /* EOF */
index 4be2e64..593e6ae 100644 (file)
@@ -209,7 +209,7 @@ IntCreateCurIconHandle()
     PCURICON_OBJECT CurIcon;
     HANDLE hCurIcon;
 
-    CurIcon = UserCreateObject(gHandleTable, NULL, &hCurIcon, otCursorIcon, sizeof(CURICON_OBJECT));
+    CurIcon = UserCreateObject(gHandleTable, NULL, NULL, &hCurIcon, otCursorIcon, sizeof(CURICON_OBJECT));
 
     if (!CurIcon)
     {
index 976e6ba..da90932 100644 (file)
 #include <win32k.h>
 DBG_DEFAULT_CHANNEL(UserDesktop);
 
-static
-VOID
-IntFreeDesktopHeap(
-    IN OUT PDESKTOP Desktop
-);
+static NTSTATUS
+UserInitializeDesktop(PDESKTOP pdesk, PUNICODE_STRING DesktopName, PWINSTATION_OBJECT pwinsta);
+
+static NTSTATUS
+IntMapDesktopView(IN PDESKTOP pdesk);
+
+static NTSTATUS
+IntUnmapDesktopView(IN PDESKTOP pdesk);
+
+static VOID
+IntFreeDesktopHeap(IN PDESKTOP pdesk);
 
 /* GLOBALS *******************************************************************/
 
@@ -23,6 +29,8 @@ IntFreeDesktopHeap(
 PDESKTOP InputDesktop = NULL;
 HDESK InputDesktopHandle = NULL;
 HDC ScreenDeviceContext = NULL;
+PTHREADINFO gptiDesktopThread;
+HCURSOR gDesktopCursor = NULL;
 
 /* OBJECT CALLBACKS **********************************************************/
 
@@ -112,17 +120,16 @@ IntDesktopObjectParse(IN PVOID ParseObject,
                             sizeof(DESKTOP),
                             0,
                             0,
-                            (PVOID)&Desktop);
+                            (PVOID*)&Desktop);
     if (!NT_SUCCESS(Status)) return Status;
 
-    /* Initialize shell hook window list and set the parent */
-    RtlZeroMemory(Desktop, sizeof(DESKTOP));
-    InitializeListHead(&Desktop->ShellHookWindows);
-    Desktop->rpwinstaParent = (PWINSTATION_OBJECT)ParseObject;
-
-    /* Put the desktop on the window station's list of associated desktops */
-    InsertTailList(&Desktop->rpwinstaParent->DesktopListHead,
-                   &Desktop->ListEntry);
+    /* Initialize the desktop */
+    Status = UserInitializeDesktop(Desktop, RemainingName, WinStaObject);
+    if (!NT_SUCCESS(Status))
+    {
+        ObDereferenceObject(Desktop);
+        return Status;
+    }
 
     /* Set the desktop object and return success */
     *Object = Desktop;
@@ -133,22 +140,29 @@ IntDesktopObjectParse(IN PVOID ParseObject,
 VOID APIENTRY
 IntDesktopObjectDelete(PWIN32_DELETEMETHOD_PARAMETERS Parameters)
 {
-   PDESKTOP Desktop = (PDESKTOP)Parameters->Object;
+   PDESKTOP pdesk = (PDESKTOP)Parameters->Object;
+
+   TRACE("Deleting desktop object 0x%p\n", pdesk);
 
-   TRACE("Deleting desktop object 0x%p\n", Desktop);
+   ASSERT(pdesk->pDeskInfo->spwnd->spwndChild == NULL);
+
+   if (pdesk->pDeskInfo->spwnd)
+       co_UserDestroyWindow(pdesk->pDeskInfo->spwnd);
+
+   if (pdesk->spwndMessage)
+       co_UserDestroyWindow(pdesk->spwndMessage);
 
    /* Remove the desktop from the window station's list of associcated desktops */
-   RemoveEntryList(&Desktop->ListEntry);
+   RemoveEntryList(&pdesk->ListEntry);
 
-   IntFreeDesktopHeap(Desktop);
+   /* Free the heap */
+   IntFreeDesktopHeap(pdesk);
 }
 
 NTSTATUS NTAPI
 IntDesktopOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters)
 {
-    PTHREADINFO pti;
-
-    pti = PsGetCurrentThreadWin32Thread();
+    PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
 
     if( pti == NULL)
     {
@@ -166,6 +180,29 @@ IntDesktopOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters)
     return STATUS_SUCCESS;
 }
 
+NTSTATUS NTAPI IntDesktopObjectOpen(PWIN32_OPENMETHOD_PARAMETERS Parameters)
+{
+    PPROCESSINFO ppi = PsGetProcessWin32Process(Parameters->Process);
+    if (ppi == NULL)
+        return STATUS_SUCCESS;
+
+    return IntMapDesktopView((PDESKTOP)Parameters->Object);
+}
+
+NTSTATUS NTAPI IntDesktopObjectClose(PWIN32_CLOSEMETHOD_PARAMETERS Parameters)
+{
+    PPROCESSINFO ppi = PsGetProcessWin32Process(Parameters->Process);
+    if (ppi == NULL)
+    {
+        /* This happens when the process leaks desktop handles.
+         * At this point the PPROCESSINFO is already destroyed */
+         return STATUS_SUCCESS;
+    }
+
+    return IntUnmapDesktopView((PDESKTOP)Parameters->Object);
+}
+
+
 /* PRIVATE FUNCTIONS **********************************************************/
 
 INIT_FUNCTION
@@ -596,8 +633,66 @@ DesktopWindowProc(PWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *lRe
       case WM_SYSCOLORCHANGE:
          co_UserRedrawWindow(Wnd, NULL, NULL, RDW_INVALIDATE|RDW_ERASE|RDW_ALLCHILDREN);
          return TRUE;
+      case WM_SETCURSOR:
+      {
+          PCURICON_OBJECT pcurOld, pcurNew;
+          pcurNew = UserGetCurIconObject(gDesktopCursor);
+          if (!pcurNew)
+          {
+              return TRUE;
+          }
+          pcurOld = UserSetCursor(pcurNew, FALSE);
+          if (pcurOld)
+          {
+               UserDereferenceObject(pcurOld);
+          }
+      }
    }
-   return FALSE; // Not processed so go with callback.
+   return TRUE; /* We are done. Do not do any callbacks to user mode */
+}
+
+BOOL FASTCALL
+UserMessageWindowProc(PWND pwnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *lResult)
+{
+    *lResult = 0;
+
+    switch(Msg)
+    {
+    case WM_NCCREATE:
+        pwnd->fnid |= FNID_MESSAGEWND;
+        *lResult = (LRESULT)TRUE;
+        break;
+    case WM_DESTROY:
+        pwnd->fnid |= FNID_DESTROY;
+        break;
+    }
+
+    return TRUE; /* We are done. Do not do any callbacks to user mode */
+}
+
+VOID NTAPI DesktopThreadMain()
+{
+    BOOL Ret;
+    MSG Msg;
+
+    gptiDesktopThread = PsGetCurrentThreadWin32Thread();
+
+    UserEnterExclusive();
+
+    /* Register system classes. This thread does not belong to any desktop so the
+       classes will be allocated from the shared heap */
+    UserRegisterSystemClasses();
+
+    while(TRUE)
+    {
+        Ret = co_IntGetPeekMessage(&Msg, 0, 0, 0, PM_REMOVE, TRUE);
+        if (Ret)
+        {
+            IntDispatchMessage(&Msg);
+        }
+    }
+
+    UserLeave();
 }
 
 HDC FASTCALL
@@ -813,6 +908,8 @@ BOOL IntDeRegisterShellHookWindow(HWND hWnd)
 static VOID
 IntFreeDesktopHeap(IN OUT PDESKTOP Desktop)
 {
+    /* FIXME: Disable until unmapping works in mm */
+#if 0
     if (Desktop->pheapDesktop != NULL)
     {
         MmUnmapViewInSessionSpace(Desktop->pheapDesktop);
@@ -824,6 +921,7 @@ IntFreeDesktopHeap(IN OUT PDESKTOP Desktop)
         ObDereferenceObject(Desktop->hsectionDesktop);
         Desktop->hsectionDesktop = NULL;
     }
+#endif
 }
 
 BOOL FASTCALL
@@ -1030,6 +1128,61 @@ IntPaintDesktop(HDC hDC)
    return TRUE;
 }
 
+static NTSTATUS
+UserInitializeDesktop(PDESKTOP pdesk, PUNICODE_STRING DesktopName, PWINSTATION_OBJECT pwinsta)
+{
+    PVOID DesktopHeapSystemBase = NULL;
+    ULONG_PTR HeapSize = 400 * 1024;
+    SIZE_T DesktopInfoSize;
+    ULONG i;
+
+    TRACE("UserInitializeDesktop desktop 0x%p with name %wZ\n", pdesk, DesktopName);
+
+    RtlZeroMemory(pdesk, sizeof(DESKTOP));
+
+    /* Link the desktop with the parent window station */
+    pdesk->rpwinstaParent = pwinsta;
+    InsertTailList(&pwinsta->DesktopListHead, &pdesk->ListEntry);
+
+    /* Create the desktop heap */
+    pdesk->hsectionDesktop = NULL;
+    pdesk->pheapDesktop = UserCreateHeap(&pdesk->hsectionDesktop,
+                                         &DesktopHeapSystemBase,
+                                         HeapSize);
+   if (pdesk->pheapDesktop == NULL)
+   {
+       ERR("Failed to create desktop heap!\n");
+       return STATUS_NO_MEMORY;
+   }
+
+   /* Create DESKTOPINFO */
+   DesktopInfoSize = sizeof(DESKTOPINFO) + DesktopName->Length + sizeof(WCHAR);
+   pdesk->pDeskInfo = RtlAllocateHeap(pdesk->pheapDesktop,
+                                      HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY,
+                                      DesktopInfoSize);
+   if (pdesk->pDeskInfo == NULL)
+   {
+       ERR("Failed to create the DESKTOP structure!\n");
+       return STATUS_NO_MEMORY;
+   }
+
+   /* Initialize the DESKTOPINFO */
+   pdesk->pDeskInfo->pvDesktopBase = DesktopHeapSystemBase;
+   pdesk->pDeskInfo->pvDesktopLimit = (PVOID)((ULONG_PTR)DesktopHeapSystemBase + HeapSize);
+   RtlCopyMemory(pdesk->pDeskInfo->szDesktopName,
+                 DesktopName->Buffer,
+                 DesktopName->Length + sizeof(WCHAR));
+   for (i = 0; i < NB_HOOKS; i++)
+   {
+      InitializeListHead(&pdesk->pDeskInfo->aphkStart[i]);
+   }
+
+   InitializeListHead(&pdesk->ShellHookWindows);
+   InitializeListHead(&pdesk->PtiList);
+
+   return STATUS_SUCCESS;
+}
+
 /* SYSCALLS *******************************************************************/
 
 /*
@@ -1073,43 +1226,35 @@ NtUserCreateDesktop(
    DWORD dwFlags,
    ACCESS_MASK dwDesiredAccess)
 {
-   PDESKTOP DesktopObject;
-   UNICODE_STRING DesktopName;
+   PDESKTOP pdesk = NULL;
    NTSTATUS Status = STATUS_SUCCESS;
-   HDESK Desktop;
-   CSR_API_MESSAGE Request;
-   PVOID DesktopHeapSystemBase = NULL;
-   SIZE_T DesktopInfoSize;
+   HDESK hdesk;
    BOOLEAN Context;
-   ULONG_PTR HeapSize = 400 * 1024; /* FIXME: Windows uses 200KB by default */
    UNICODE_STRING ClassName;
    LARGE_STRING WindowName;
    BOOL NoHooks = FALSE;
    PWND pWnd = NULL;
    CREATESTRUCTW Cs;
-   INT i;
    PTHREADINFO ptiCurrent;
+   PCLS pcls;
+
    DECLARE_RETURN(HDESK);
 
    TRACE("Enter NtUserCreateDesktop\n");
    UserEnterExclusive();
 
    ptiCurrent = PsGetCurrentThreadWin32Thread();
-   if (ptiCurrent)
-   {
+   ASSERT(ptiCurrent);
+   ASSERT(gptiDesktopThread);
+
    /* Turn off hooks when calling any CreateWindowEx from inside win32k. */
-      NoHooks = (ptiCurrent->TIF_flags & TIF_DISABLEHOOKS);
-      ptiCurrent->TIF_flags |= TIF_DISABLEHOOKS;
-      ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
-   }
-   /*else
-   {ERR("NtUserCreateDesktop: No ptiCurrent\n");}*/
-   DesktopName.Buffer = NULL;
+   NoHooks = (ptiCurrent->TIF_flags & TIF_DISABLEHOOKS);
+   ptiCurrent->TIF_flags |= TIF_DISABLEHOOKS;
+   ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
 
    /*
     * Try to open already existing desktop
     */
-
    Status = ObOpenObjectByName(
                ObjectAttributes,
                ExDesktopObjectType,
@@ -1117,143 +1262,99 @@ NtUserCreateDesktop(
                NULL,
                dwDesiredAccess,
                (PVOID)&Context,
-               (HANDLE*)&Desktop);
-   if (!NT_SUCCESS(Status)) RETURN(NULL);
+               (HANDLE*)&hdesk);
+   if (!NT_SUCCESS(Status)) 
+   {
+      ERR("ObOpenObjectByName failed to open/create desktop\n");
+      SetLastNtError(Status);
+      RETURN(NULL);
+   }
 
    /* In case the object was not created (eg if it existed), return now */
    if (Context == FALSE)
    {
        TRACE("NtUserCreateDesktop opened desktop %wZ\n", ObjectAttributes->ObjectName);
-       RETURN( Desktop);
-   }
-
-   /* Capture desktop name */
-   _SEH2_TRY
-   {
-      ProbeForRead( ObjectAttributes, sizeof(OBJECT_ATTRIBUTES),  1);
-
-      Status = IntSafeCopyUnicodeStringTerminateNULL(&DesktopName, ObjectAttributes->ObjectName);
-   }
-   _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-   {
-      Status = _SEH2_GetExceptionCode();
-   }
-   _SEH2_END
-
-   if (! NT_SUCCESS(Status))
-   {
-      ERR("Failed reading Object Attributes from user space.\n");
-      SetLastNtError(Status);
-      RETURN( NULL);
+       RETURN( hdesk);
    }
 
    /* Reference the desktop */
-   Status = ObReferenceObjectByHandle(Desktop,
+   Status = ObReferenceObjectByHandle(hdesk,
                                       0,
                                       ExDesktopObjectType,
                                       KernelMode,
-                                      (PVOID)&DesktopObject,
+                                      (PVOID*)&pdesk,
                                       NULL);
    if (!NT_SUCCESS(Status))
    {
        ERR("Failed to reference desktop object\n");
+       SetLastNtError(Status);
        RETURN(NULL);
    }
 
-   TRACE("NtUserCreateDesktop created desktop 0x%p with name %wZ\n", DesktopObject, &DesktopName);
-
-   DesktopObject->hsectionDesktop = NULL;
-   DesktopObject->pheapDesktop = UserCreateHeap(&DesktopObject->hsectionDesktop,
-                                                &DesktopHeapSystemBase,
-                                                HeapSize);
-   if (DesktopObject->pheapDesktop == NULL)
-   {
-       ObDereferenceObject(DesktopObject);
-       ERR("Failed to create desktop heap!\n");
-       RETURN(NULL);
-   }
-
-   DesktopInfoSize = sizeof(DESKTOPINFO) + DesktopName.Length + sizeof(WCHAR);
+   if (!ptiCurrent->rpdesk) IntSetThreadDesktop(hdesk,FALSE);
 
-   DesktopObject->pDeskInfo = RtlAllocateHeap(DesktopObject->pheapDesktop,
-                                              HEAP_NO_SERIALIZE,
-                                              DesktopInfoSize);
-
-   if (DesktopObject->pDeskInfo == NULL)
+   /* Get the desktop window class. The thread desktop does not belong to any desktop
+    * so the classes created there (including the desktop class) are allocated in the shared heap
+    * It would cause problems if we used a class that belongs to the caller 
+    */
+   ClassName.Buffer = WC_DESKTOP;
+   ClassName.Length = 0;
+   pcls = IntGetAndReferenceClass(&ClassName, 0, TRUE);
+   if (pcls == NULL)
    {
-       ObDereferenceObject(DesktopObject);
-       ERR("Failed to create the DESKTOP structure!\n");
-       RETURN(NULL);
+      ASSERT(FALSE);
+      RETURN(NULL);
    }
 
-   RtlZeroMemory(DesktopObject->pDeskInfo,
-                 DesktopInfoSize);
-
-   DesktopObject->pDeskInfo->pvDesktopBase = DesktopHeapSystemBase;
-   DesktopObject->pDeskInfo->pvDesktopLimit = (PVOID)((ULONG_PTR)DesktopHeapSystemBase + HeapSize);
-   RtlCopyMemory(DesktopObject->pDeskInfo->szDesktopName,
-                 DesktopName.Buffer,
-                 DesktopName.Length + sizeof(WCHAR));
-
-   /* Initialize some local (to win32k) desktop state. */
-   InitializeListHead(&DesktopObject->PtiList);
-   DesktopObject->ActiveMessageQueue = NULL;
+   RtlZeroMemory(&WindowName, sizeof(WindowName));
+   RtlZeroMemory(&Cs, sizeof(Cs));
+   Cs.x = UserGetSystemMetrics(SM_XVIRTUALSCREEN),
+   Cs.y = UserGetSystemMetrics(SM_YVIRTUALSCREEN),
+   Cs.cx = UserGetSystemMetrics(SM_CXVIRTUALSCREEN),
+   Cs.cy = UserGetSystemMetrics(SM_CYVIRTUALSCREEN),
+   Cs.style = WS_POPUP|WS_CLIPCHILDREN;
+   Cs.hInstance = hModClient; // hModuleWin; // Server side winproc!
+   Cs.lpszName = (LPCWSTR) &WindowName;
+   Cs.lpszClass = (LPCWSTR) &ClassName;
 
-   /* Setup Global Hooks. */
-   for (i = 0; i < NB_HOOKS; i++)
+   /* Use IntCreateWindow instead of co_UserCreateWindowEx cause the later expects a thread with a desktop */
+   pWnd = IntCreateWindow(&Cs, &WindowName, pcls, NULL, NULL, NULL, pdesk);
+   if (pWnd == NULL)
    {
-      InitializeListHead(&DesktopObject->pDeskInfo->aphkStart[i]);
-   }
-
-   /*
-    * Create a handle for CSRSS and notify CSRSS for Creating Desktop Background Windows and Threads.
-    */
-   Request.ApiNumber = CSR_CREATE_API_NUMBER(CSR_GUI, CREATE_DESKTOP);
-   Status = CsrInsertObject(Desktop,
-                            GENERIC_ALL,
-                            (HANDLE*)&Request.Data.CreateDesktopRequest.DesktopHandle);
-   if (! NT_SUCCESS(Status))
-   {
-      ERR("Failed to create desktop handle for CSRSS\n");
-      ZwClose(Desktop);
-      SetLastNtError(Status);
-      RETURN( NULL);
+      ERR("Failed to create desktop window for the new desktop\n");
+      RETURN(NULL);
    }
 
-   Status = co_CsrNotify((PCSR_API_MESSAGE)&Request,
-                         sizeof(CSR_API_MESSAGE));
-   if (! NT_SUCCESS(Status))
+   pdesk->DesktopWindow = pWnd->head.h;
+   pdesk->pDeskInfo->spwnd = pWnd;
+   pWnd->fnid = FNID_DESKTOP;
+   
+   ClassName.Buffer = MAKEINTATOM(gpsi->atomSysClass[ICLS_HWNDMESSAGE]);
+   ClassName.Length = 0;
+   pcls = IntGetAndReferenceClass(&ClassName, 0, TRUE);
+   if (pcls == NULL)
    {
-      CsrCloseHandle(Request.Data.CreateDesktopRequest.DesktopHandle);
-      ERR("Failed to notify CSRSS about new desktop\n");
-      ZwClose(Desktop);
-      SetLastNtError(Status);
-      RETURN( NULL);
+      ASSERT(FALSE);
+      RETURN(NULL);
    }
 
-   if (ptiCurrent && !ptiCurrent->rpdesk) IntSetThreadDesktop(Desktop,FALSE);
-
-   ClassName.Buffer = ((PWSTR)((ULONG_PTR)(WORD)(gpsi->atomSysClass[ICLS_HWNDMESSAGE])));
-   ClassName.Length = 0;
    RtlZeroMemory(&WindowName, sizeof(WindowName));
-
    RtlZeroMemory(&Cs, sizeof(Cs));
    Cs.cx = Cs.cy = 100;
    Cs.style = WS_POPUP|WS_CLIPCHILDREN;
-   Cs.hInstance = hModClient; // hModuleWin; // Server side winproc! Leave it to Timo to not pass on notes!
+   Cs.hInstance = hModClient; // hModuleWin; // Server side winproc!
    Cs.lpszName = (LPCWSTR) &WindowName;
    Cs.lpszClass = (LPCWSTR) &ClassName;
-
-   pWnd = co_UserCreateWindowEx(&Cs, &ClassName, &WindowName, NULL);
-   if (!pWnd)
-   {
-      ERR("Failed to create Message window handle\n");
-   }
-   else
+   pWnd = IntCreateWindow(&Cs, &WindowName, pcls, NULL, NULL, NULL, pdesk);
+   if (pWnd == NULL)
    {
-      DesktopObject->spwndMessage = pWnd;
+      ERR("Failed to create message window for the new desktop\n");
+      RETURN(NULL);
    }
 
+   pdesk->spwndMessage = pWnd;
+   pWnd->fnid = FNID_MESSAGEWND;
+
    /* Now,,,
       if !(WinStaObject->Flags & WSF_NOIO) is (not set) for desktop input output mode (see wiki)
       Create Tooltip. Saved in DesktopObject->spwndTooltip.
@@ -1262,14 +1363,18 @@ NtUserCreateDesktop(
       The rest is same as message window.
       http://msdn.microsoft.com/en-us/library/bb760250(VS.85).aspx
    */
-   RETURN( Desktop);
+   RETURN( hdesk);
 
 CLEANUP:
-   if(DesktopName.Buffer != NULL)
+   if (pdesk != NULL)
+   {
+       ObDereferenceObject(pdesk);
+   }
+   if (_ret_ == NULL && hdesk != NULL)
    {
-       ExFreePoolWithTag(DesktopName.Buffer, TAG_STRING);
+      ObCloseHandle(hdesk, UserMode);
    }
-   if (!NoHooks && ptiCurrent)
+   if (!NoHooks)
    {
        ptiCurrent->TIF_flags &= ~TIF_DISABLEHOOKS;
        ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
index df87eb3..c05ae1f 100644 (file)
@@ -73,6 +73,7 @@ extern PDESKTOP InputDesktop;
 extern HDESK InputDesktopHandle;
 extern PCLS DesktopWindowClass;
 extern HDC ScreenDeviceContext;
+extern PTHREADINFO gptiDesktopThread;
 
 typedef struct _SHELL_HOOK_WINDOW
 {
@@ -104,6 +105,12 @@ IntDesktopObjectDelete(PWIN32_DELETEMETHOD_PARAMETERS Parameters);
 NTSTATUS NTAPI 
 IntDesktopOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters);
 
+NTSTATUS NTAPI 
+IntDesktopObjectOpen(PWIN32_OPENMETHOD_PARAMETERS Parameters);
+
+NTSTATUS NTAPI 
+IntDesktopObjectClose(PWIN32_CLOSEMETHOD_PARAMETERS Parameters);
+
 HDC FASTCALL
 IntGetScreenDC(VOID);
 
@@ -283,4 +290,6 @@ 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();
 /* EOF */
index ef10b9b..964119c 100644 (file)
@@ -378,7 +378,7 @@ NtUserSetWinEventHook(
       }
    }
    // Creator, pti is set here.
-   pEH = UserCreateObject(gHandleTable, NULL, &Handle, otEvent, sizeof(EVENTHOOK));
+   pEH = UserCreateObject(gHandleTable, NULL, NULL, &Handle, otEvent, sizeof(EVENTHOOK));
    if (pEH)
    {
       InsertTailList(&GlobalEvents->Events, &pEH->Chain);
index 09f9a37..31ebcbd 100644 (file)
@@ -1569,7 +1569,7 @@ NtUserSetWindowsHookEx( HINSTANCE Mod,
     }
     ObDereferenceObject(WinStaObj);
 
-    Hook = UserCreateObject(gHandleTable, NULL, (PHANDLE)&Handle, otHook, sizeof(HOOK));
+    Hook = UserCreateObject(gHandleTable, NULL, NULL, (PHANDLE)&Handle, otHook, sizeof(HOOK));
 
     if (!Hook)
     {
index b34f256..a3e4859 100644 (file)
@@ -304,6 +304,7 @@ CreateSystemThreads(UINT Type)
     switch (Type)
     {
         case 0: RawInputThreadMain(); break;
+        case 1: DesktopThreadMain(); break;
         default: ERR("Wrong type: %x\n", Type);
     }
 
index 256ddea..0aa1120 100644 (file)
@@ -131,7 +131,7 @@ UserLoadKbdFile(PUNICODE_STRING pwszKLID)
                                  L"Control\\Keyboard Layouts\\";
 
     /* Create keyboard layout file object */
-    pkf = UserCreateObject(gHandleTable, NULL, NULL, otKBDfile, sizeof(KBDFILE));
+    pkf = UserCreateObject(gHandleTable, NULL, NULL, NULL, otKBDfile, sizeof(KBDFILE));
     if (!pkf)
     {
         ERR("Failed to create object!\n");
@@ -206,7 +206,7 @@ UserLoadKbdLayout(PUNICODE_STRING pwszKLID, HKL hKL)
     PKL pKl;
 
     /* Create keyboard layout object */
-    pKl = UserCreateObject(gHandleTable, NULL, NULL, otKBDlayout, sizeof(KL));
+    pKl = UserCreateObject(gHandleTable, NULL, NULL, NULL, otKBDlayout, sizeof(KL));
     if (!pKl)
     {
         ERR("Failed to create object!\n");
index 92217d6..27404c4 100644 (file)
@@ -304,6 +304,7 @@ UserCreateThreadInfo(struct _ETHREAD *Thread)
     if (ptiCurrent->KeyboardLayout)
         UserReferenceObject(ptiCurrent->KeyboardLayout);
     ptiCurrent->TIF_flags &= ~TIF_INCLEANUP;
+    ptiCurrent->pcti = &ptiCurrent->cti;
 
     /* Initialize the CLIENTINFO */
     pci = (PCLIENTINFO)pTeb->Win32ClientInfo;
@@ -624,14 +625,16 @@ DriverEntry(
     DPRINT("Win32k hInstance 0x%p!\n",hModuleWin);
 
     /* Register Object Manager Callbacks */
+    CalloutData.ProcessCallout = Win32kProcessCallback;
+    CalloutData.ThreadCallout = Win32kThreadCallback;
     CalloutData.WindowStationParseProcedure = IntWinStaObjectParse;
     CalloutData.WindowStationDeleteProcedure = IntWinStaObjectDelete;
+    CalloutData.WindowStationOkToCloseProcedure = IntWinstaOkToClose;
+    CalloutData.DesktopOkToCloseProcedure = IntDesktopOkToClose;
     CalloutData.DesktopDeleteProcedure = IntDesktopObjectDelete;
-    CalloutData.ProcessCallout = Win32kProcessCallback;
-    CalloutData.ThreadCallout = Win32kThreadCallback;
+    CalloutData.DesktopCloseProcedure = IntDesktopObjectClose;
+    CalloutData.DesktopOpenProcedure = IntDesktopObjectOpen;
     CalloutData.BatchFlushRoutine = NtGdiFlushUserBatch;
-    CalloutData.DesktopOkToCloseProcedure = IntDesktopOkToClose;
-    CalloutData.WindowStationOkToCloseProcedure = IntWinstaOkToClose;
 
     /* Register our per-process and per-thread structures. */
     PsEstablishWin32Callouts((PWIN32_CALLOUTS_FPNS)&CalloutData);
index aae4f7d..fe870b8 100644 (file)
@@ -249,7 +249,8 @@ IntCreateMenu(PHANDLE Handle, BOOL IsMenuBar)
    PPROCESSINFO CurrentWin32Process;
 
    Menu = (PMENU_OBJECT)UserCreateObject( gHandleTable,
-                                          NULL,
+                                          NULL, 
+                                          NULL, 
                                           Handle,
                                           otMenu,
                                           sizeof(MENU_OBJECT));
@@ -360,8 +361,9 @@ IntCloneMenu(PMENU_OBJECT Source)
       return NULL;
 
    Menu = (PMENU_OBJECT)UserCreateObject( gHandleTable,
-                                          NULL,
-                                         &hMenu,
+                                          NULL, 
+                                          NULL, 
+                                          &hMenu,
                                           otMenu,
                                           sizeof(MENU_OBJECT));
    if(!Menu)
index 23cb63c..e39057f 100644 (file)
@@ -714,6 +714,13 @@ IntDispatchMessage(PMSG pMsg)
                                              pMsg->lParam,
                                             &retval);
             break;
+          case FNID_MESSAGEWND:
+            DoCallBack = !UserMessageWindowProc( Window,
+                                                 pMsg->message,
+                                                 pMsg->wParam,
+                                                 pMsg->lParam,
+                                                 &retval);
+            break;
        }
     }
 
@@ -1307,6 +1314,9 @@ co_IntSendMessageTimeoutSingle( HWND hWnd,
               case FNID_DESKTOP:
                 DoCallBack = !DesktopWindowProc(Window, Msg, wParam, lParam,(LRESULT*)&Result);
                 break;
+              case FNID_MESSAGEWND:
+                DoCallBack = !UserMessageWindowProc(Window, Msg, wParam, lParam,(LRESULT*)&Result);
+                break;
            }
            if (!DoCallBack)
            {
@@ -1590,6 +1600,9 @@ co_IntSendMessageWithCallBack( HWND hWnd,
               case FNID_DESKTOP:
                 DoCallBack = !DesktopWindowProc(Window, Msg, wParam, lParamPacked, (LRESULT*)&Result);
                 break;
+              case FNID_MESSAGEWND:
+                DoCallBack = !UserMessageWindowProc(Window, Msg, wParam, lParam,(LRESULT*)&Result);
+                break;
            }
         }
 
@@ -2233,6 +2246,16 @@ NtUserMessageCall( HWND hWnd,
            }
            break;
         }
+
+   case FNID_MESSAGEWND:
+       {
+           Window = UserGetWindowObject(hWnd);
+           if (Window)
+           {
+                Ret = !UserMessageWindowProc(Window, Msg, wParam, lParam,&lResult);
+           }
+           break;
+       }
     case FNID_DEFWINDOWPROC:
         /* Validate input */
         if (hWnd)
index c6e0d61..03a4d65 100644 (file)
@@ -32,7 +32,7 @@ static
 PMONITOR
 IntCreateMonitorObject()
 {
-    return UserCreateObject(gHandleTable, NULL, NULL, otMonitor, sizeof(MONITOR));
+    return UserCreateObject(gHandleTable, NULL, NULL, NULL, otMonitor, sizeof(MONITOR));
 }
 
 /* IntDestroyMonitorObject
index 6188a19..084f04d 100644 (file)
@@ -101,7 +101,7 @@ IntTopLevelWindowFromPoint(INT x, INT y)
     }
 
     /* Window has not been found */
-    return NULL;
+    return pwndDesktop;
 }
 
 PCURICON_OBJECT
index 8cac101..e20d102 100644 (file)
@@ -298,4 +298,13 @@ UserSetCursor(PCURICON_OBJECT NewCursor,
 DWORD APIENTRY IntGetQueueStatus(DWORD);
 
 UINT lParamMemorySize(UINT Msg, WPARAM wParam, LPARAM lParam);
+
+BOOL FASTCALL
+co_IntGetPeekMessage( PMSG pMsg,
+                      HWND hWnd,
+                      UINT MsgFilterMin,
+                      UINT MsgFilterMax,
+                      UINT RemoveMsg,
+                      BOOL bGMSG );
+
 /* EOF */
index 375e3bf..94242ef 100644 (file)
@@ -315,20 +315,24 @@ PVOID
 FASTCALL
 UserCreateObject( PUSER_HANDLE_TABLE ht,
                   PDESKTOP pDesktop,
+                  PTHREADINFO pti,
                   HANDLE* h,
                   USER_OBJECT_TYPE type,
                   ULONG size)
 {
    HANDLE hi;
    PVOID Object;
-   PTHREADINFO pti;
    PPROCESSINFO ppi;
    BOOL dt;
    PDESKTOP rpdesk = pDesktop;
 
-   pti = GetW32ThreadInfo();
-   ppi = pti->ppi;
+   /* We could get the desktop for the new object from the pti however this is 
+    * not always the case for example when creating a new desktop window for 
+    * the desktop thread*/
+
+   if (!pti) pti = GetW32ThreadInfo();
    if (!pDesktop) rpdesk = pti->rpdesk;
+   ppi = pti->ppi;
 
    switch (type)
    {
index cad7ce2..976fd46 100644 (file)
@@ -33,7 +33,7 @@ extern PUSER_HANDLE_TABLE gHandleTable;
 VOID FASTCALL UserReferenceObject(PVOID obj);
 PVOID FASTCALL UserReferenceObjectByHandle(HANDLE handle, USER_OBJECT_TYPE type);
 BOOL FASTCALL UserDereferenceObject(PVOID obj);
-PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, struct _DESKTOP* pDesktop, HANDLE* h,USER_OBJECT_TYPE type , ULONG size);
+PVOID FASTCALL UserCreateObject(PUSER_HANDLE_TABLE ht, struct _DESKTOP* pDesktop, PTHREADINFO pti, HANDLE* h,USER_OBJECT_TYPE type , ULONG size);
 BOOL FASTCALL UserDeleteObject(HANDLE h, USER_OBJECT_TYPE type );
 PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, USER_OBJECT_TYPE type );
 PVOID UserGetObjectNoErr(PUSER_HANDLE_TABLE, HANDLE, USER_OBJECT_TYPE);
index 7b3d77b..3d5a542 100644 (file)
@@ -184,7 +184,8 @@ NtUserCallOneParam(
              if (count == 0) count = 8;
 
              psmwp = (PSMWP) UserCreateObject( gHandleTable,
-                                               NULL,
+                                               NULL, 
+                                               NULL, 
                                               (PHANDLE)&hDwp,
                                                otSMWP,
                                                sizeof(SMWP));
index 33ac061..8e679d3 100644 (file)
@@ -56,7 +56,7 @@ CreateTimer(VOID)
   HANDLE Handle;
   PTIMER Ret = NULL;
 
-  Ret = UserCreateObject(gHandleTable, NULL, &Handle, otTimer, sizeof(TIMER));
+  Ret = UserCreateObject(gHandleTable, NULL, NULL, &Handle, otTimer, sizeof(TIMER));
   if (Ret)
   {
      Ret->head.h = Handle;
index 0aeb744..af76bc5 100644 (file)
@@ -1661,7 +1661,8 @@ PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs,
                                         PCLS Class,
                                         PWND ParentWindow,
                                         PWND OwnerWindow,
-                                        PVOID acbiBuffer)
+                                        PVOID acbiBuffer,
+                                        PDESKTOP pdeskCreated)
 {
    PWND pWnd = NULL;
    HWND hWnd;
@@ -1670,7 +1671,7 @@ PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs,
    BOOL MenuChanged;
    BOOL bUnicodeWindow;
 
-   pti = PsGetCurrentThreadWin32Thread();
+   pti = pdeskCreated ? gptiDesktopThread : GetW32ThreadInfo();
 
    if (!(Cs->dwExStyle & WS_EX_LAYOUTRTL))
    {
@@ -1690,8 +1691,7 @@ PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs,
          */
          if ( Class->fnid != FNID_DIALOG )
          {
-            PPROCESSINFO ppi = PsGetCurrentProcessWin32Process();
-            if (ppi->dwLayout & LAYOUT_RTL)
+            if (pti->ppi->dwLayout & LAYOUT_RTL)
             {
                Cs->dwExStyle |= WS_EX_LAYOUTRTL;
             }
@@ -1713,7 +1713,8 @@ PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs,
 
    /* Allocate the new window */
    pWnd = (PWND) UserCreateObject( gHandleTable,
-                                   pti->rpdesk,
+                                   pdeskCreated ? pdeskCreated : pti->rpdesk,
+                                   pti,
                                   (PHANDLE)&hWnd,
                                    otWindow,
                                    sizeof(WND) + Class->cbwndExtra);
@@ -1723,14 +1724,14 @@ PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs,
       goto AllocError;
    }
 
-   TRACE("Created object with handle %X\n", hWnd);
+   TRACE("Created window object with handle %X\n", hWnd);
 
-   if (NULL == pti->rpdesk->DesktopWindow)
+   if (pdeskCreated && pdeskCreated->DesktopWindow == NULL )
    {  /* HACK: Helper for win32csr/desktopbg.c */
       /* If there is no desktop window yet, we must be creating it */
       TRACE("CreateWindow setting desktop.\n");
-      pti->rpdesk->DesktopWindow = hWnd;
-      pti->rpdesk->pDeskInfo->spwnd = pWnd;
+      pdeskCreated->DesktopWindow = hWnd;
+      pdeskCreated->pDeskInfo->spwnd = pWnd;
    }
 
    /*
@@ -2010,7 +2011,7 @@ co_UserCreateWindowEx(CREATESTRUCTW* Cs,
    pCbtCreate = NULL;
 
    /* Get the class and reference it */
-   Class = IntGetAndReferenceClass(ClassName, Cs->hInstance);
+   Class = IntGetAndReferenceClass(ClassName, Cs->hInstance, FALSE);
    if(!Class)
    {
        ERR("Failed to find class %wZ\n", ClassName);
@@ -2059,7 +2060,8 @@ co_UserCreateWindowEx(CREATESTRUCTW* Cs,
                             Class,
                             ParentWindow,
                             OwnerWindow,
-                            acbiBuffer);
+                            acbiBuffer,
+                            NULL);
    if(!Window)
    {
        ERR("IntCreateWindow failed!\n");
@@ -2540,12 +2542,15 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWND Window)
 
    TRACE("co_UserDestroyWindow \n");
 
-   /* Check for owner thread */
-   if ( (Window->head.pti->pEThread != PsGetCurrentThread()) ||
-        Window->head.pti != PsGetCurrentThreadWin32Thread() )
+   /* Check for owner thread */  
+   if ( Window->head.pti != PsGetCurrentThreadWin32Thread())
    {
-      EngSetLastError(ERROR_ACCESS_DENIED);
-      return FALSE;
+       /* Check if we are destroying the desktop window */
+       if (! ((Window->head.rpdesk->dwDTFlags & DF_DESTROYED) && Window == Window->head.rpdesk->pDeskInfo->spwnd))
+       {
+           EngSetLastError(ERROR_ACCESS_DENIED);
+           return FALSE;
+       }
    }
 
    /* If window was created successfully and it is hooked */
index d693164..e9c1030 100644 (file)
@@ -47,7 +47,13 @@ VOID FASTCALL IntGetWindowBorderMeasures(PWND WindowObject, UINT *cx, UINT *cy);
 BOOL FASTCALL IntShowOwnedPopups( PWND owner, BOOL fShow );
 LRESULT FASTCALL IntDefWindowProc( PWND Window, UINT Msg, WPARAM wParam, LPARAM lParam, BOOL Ansi);
 VOID FASTCALL IntNotifyWinEvent(DWORD, PWND, LONG, LONG, DWORD);
-PWND FASTCALL co_UserCreateWindowEx(CREATESTRUCTW*, PUNICODE_STRING, PLARGE_STRING, PVOID);
+PWND FASTCALL IntCreateWindow(CREATESTRUCTW* Cs,
+                                        PLARGE_STRING WindowName,
+                                        PCLS Class,
+                                        PWND ParentWindow,
+                                        PWND OwnerWindow,
+                                        PVOID acbiBuffer,
+                                        PDESKTOP pdeskCreated);
 BOOL FASTCALL IntEnableWindow(HWND,BOOL);
 BOOL FASTCALL IntIsWindowVisible(PWND);
 DWORD FASTCALL GetNCHitEx(PWND,POINT);
index c9a8178..64039cb 100644 (file)
@@ -229,10 +229,7 @@ co_IntInitializeDesktopGraphics(VOID)
 {
    TEXTMETRICW tmw;
    UNICODE_STRING DriverName = RTL_CONSTANT_STRING(L"DISPLAY");
-   if (! IntCreatePrimarySurface())
-   {
-      return FALSE;
-   }
+
    ScreenDeviceContext = IntGdiCreateDC(&DriverName, NULL, NULL, NULL, FALSE);
    if (NULL == ScreenDeviceContext)
    {
@@ -241,6 +238,11 @@ co_IntInitializeDesktopGraphics(VOID)
    }
    GreSetDCOwner(ScreenDeviceContext, GDI_OBJ_HMGR_PUBLIC);
 
+   if (! IntCreatePrimarySurface())
+   {
+      return FALSE;
+   }
+
    /* Setup the cursor */
    co_IntLoadDefaultCursors();
 
index 45d30f8..7270e82 100644 (file)
@@ -2137,21 +2137,23 @@ User32SetupDefaultCursors(PVOID Arguments,
                           ULONG ArgumentLength)
 {
     BOOL *DefaultCursor = (BOOL*)Arguments;
-    LRESULT Result = TRUE;
+    HCURSOR hCursor; 
 
     if(*DefaultCursor)
     {
         /* set default cursor */
-        SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW));
+        hCursor = LoadCursorW(0, (LPCWSTR)IDC_ARROW);
+        SetCursor(hCursor);
     }
     else
     {
         /* FIXME load system cursor scheme */
         SetCursor(0);
-        SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW));
+        hCursor = LoadCursorW(0, (LPCWSTR)IDC_ARROW);
+        SetCursor(hCursor);
     }
 
-    return(ZwCallbackReturn(&Result, sizeof(LRESULT), STATUS_SUCCESS));
+    return(ZwCallbackReturn(&hCursor, sizeof(HCURSOR), STATUS_SUCCESS));
 }
 
 BOOL get_icon_size(HICON hIcon, SIZE *size)
diff --git a/win32ss/user/win32csr/CMakeLists.txt b/win32ss/user/win32csr/CMakeLists.txt
deleted file mode 100644 (file)
index b0947cb..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-
-include_directories(
-    BEFORE .
-    ${REACTOS_SOURCE_DIR}/subsystems/win32/csrsrv/include
-    ${REACTOS_SOURCE_DIR}/include/reactos/subsys
-    ${REACTOS_SOURCE_DIR}/include/reactos/drivers
-    ${REACTOS_SOURCE_DIR}/win32ss/include)
-
-spec2def(win32csr.dll win32csr.spec)
-
-list(APPEND SOURCE
-    desktopbg.c
-    dllmain.c
-    win32csr.rc
-    ${CMAKE_CURRENT_BINARY_DIR}/win32csr.def)
-
-add_library(win32csr SHARED ${SOURCE})
-
-target_link_libraries(win32csr
-    win32ksys
-    ${PSEH_LIB})
-
-set_module_type(win32csr win32dll)
-
-add_importlibs(win32csr psapi msvcrt kernel32 ntdll csrsrv)
-add_delay_importlibs(win32csr user32 gdi32 advapi32)
-
-add_pch(win32csr w32csr.h)
-
-add_dependencies(win32csr bugcodes)
-add_cd_file(TARGET win32csr DESTINATION reactos/system32 FOR all)
diff --git a/win32ss/user/win32csr/desktopbg.c b/win32ss/user/win32csr/desktopbg.c
deleted file mode 100644 (file)
index bc4b063..0000000
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * win32ss/user/win32csr/desktopbg.c
- *
- * Desktop background window functions
- *
- * ReactOS Operating System
- *
- * Looks as a hax fix to a problem of not having a proper class window proc support
- * which ReactOS has now.
- *
- * Notes on reason why this is here:
- * http://www.reactos.org/archives/public/ros-kernel/2003-November/000538.html
- * http://www.reactos.org/archives/public/ros-kernel/2003-November/000545.html
- * http://www.reactos.org/archives/public/ros-kernel/2003-November/000586.html
- * http://www.reactos.org/archives/public/ros-kernel/2003-November/000674.html
- * Revision 6908 Move desktop window proc from WIN32K to CSRSS
- * Bugs 42, 48 and 57.
- *
- * http://www.reactos.org/archives/public/ros-kernel/2003-December/001186.html
- *
-   Now this is used to start Desktops Threads with TEB support.
-   These first three are Application, Winlogon and ScreenSaver desktops. 
- */
-
-#include "win32csr.h"
-
-#define NDEBUG
-#include <debug.h>
-
-#define DESKTOP_WINDOW_ATOM 32769
-
-#define PM_SHOW_DESKTOP 1
-#define PM_HIDE_DESKTOP 2
-
-typedef struct tagDTBG_THREAD_DATA
-{
-    HDESK Desktop;
-    HANDLE Event;
-    NTSTATUS Status;
-} DTBG_THREAD_DATA, *PDTBG_THREAD_DATA;
-
-typedef struct tagPRIVATE_NOTIFY_DESKTOP
-{
-    NMHDR hdr;
-    struct /* PM_SHOW_DESKTOP */
-    {
-        int Width;
-        int Height;
-    } ShowDesktop;
-} PRIVATE_NOTIFY_DESKTOP, *PPRIVATE_NOTIFY_DESKTOP;
-
-static BOOL BgInitialized = FALSE;
-static HWND VisibleDesktopWindow = NULL;
-#if 0
-static
-LRESULT
-CALLBACK
-DtbgWindowProc(HWND Wnd,
-               UINT Msg,
-               WPARAM wParam,
-               LPARAM lParam)
-{
-    PAINTSTRUCT PS;
-
-    switch (Msg)
-    {
-    case WM_ERASEBKGND:
-        PaintDesktop((HDC)wParam);
-        return 1;
-
-    case WM_PAINT:
-        if (BeginPaint(Wnd, &PS))
-            EndPaint(Wnd, &PS);
-        return 0;
-
-    case WM_SETCURSOR:
-        return (LRESULT)SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW));
-
-    case WM_NCCREATE:
-        return (LRESULT)TRUE;
-
-    case WM_CREATE:
-        NtUserSetWindowFNID(Wnd, FNID_DESKTOP); // Anti-ReactOS hack!
-    case WM_CLOSE:
-        return 0;
-
-    case WM_DISPLAYCHANGE:
-        MoveWindow(Wnd, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
-        break;
-
-    case WM_NOTIFY:
-    {
-        PPRIVATE_NOTIFY_DESKTOP nmh = (PPRIVATE_NOTIFY_DESKTOP)lParam;
-
-        /* Use WM_NOTIFY for private messages since
-         * it can't be sent between processes!
-         */
-        switch (nmh->hdr.code)
-        {
-        case PM_SHOW_DESKTOP:
-        {
-            LRESULT Result;
-
-            Result = !SetWindowPos(Wnd, NULL, 0, 0,
-                                   nmh->ShowDesktop.Width,
-                                   nmh->ShowDesktop.Height,
-                                   SWP_NOACTIVATE | SWP_NOZORDER |
-                                   SWP_SHOWWINDOW);
-
-            UpdateWindow(Wnd);
-            VisibleDesktopWindow = Wnd;
-            return Result;
-        }
-
-        case PM_HIDE_DESKTOP:
-        {
-            LRESULT Result;
-
-            Result = !SetWindowPos(Wnd, NULL, 0, 0, 0, 0,
-                                   SWP_NOACTIVATE | SWP_NOZORDER |
-                                   SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW);
-
-            UpdateWindow(Wnd);
-            VisibleDesktopWindow = NULL;
-            return Result;
-        }
-
-        default:
-            DPRINT("Unknown notification code 0x%x sent to the desktop window!\n",
-                   nmh->hdr.code);
-            return 0;
-        }
-    }
-
-    default:
-        return DefWindowProcW(Wnd, Msg, wParam, lParam);
-    }
-
-    return 0;
-}
-
-static
-BOOL
-FASTCALL
-DtbgInit(VOID)
-{
-    WNDCLASSEXW Class;
-    ATOM ClassAtom;
-
-    /*
-     * Create the desktop window class
-     */
-    Class.cbSize = sizeof(WNDCLASSEXW);
-    Class.style = 0; // Local Class
-    Class.lpfnWndProc = DtbgWindowProc;
-    Class.cbClsExtra = 0;
-    Class.cbWndExtra = 0;
-    Class.hInstance = (HINSTANCE)GetModuleHandleW(NULL);
-    Class.hIcon = NULL;
-    Class.hCursor = NULL;
-    Class.hbrBackground = GetSysColorBrush(COLOR_BACKGROUND);
-    Class.lpszMenuName = NULL;
-    Class.lpszClassName = (LPCWSTR)DESKTOP_WINDOW_ATOM;
-    ClassAtom = RegisterClassExW(&Class);
-
-    if (ClassAtom == INVALID_ATOM)
-    {
-        DPRINT1("Unable to register desktop background class (error %d)\n",
-                GetLastError());
-
-        return FALSE;
-    }
-
-    VisibleDesktopWindow = NULL;
-
-    return TRUE;
-}
-#endif
-static
-DWORD
-WINAPI
-DtbgDesktopThread(PVOID Data)
-{
-    HWND BackgroundWnd;
-    MSG msg;
-    PDTBG_THREAD_DATA ThreadData = (PDTBG_THREAD_DATA)Data;
-
-    DPRINT("DtbgDesktopThread\n");
-
-    if (!SetThreadDesktop(ThreadData->Desktop))
-    {
-        DPRINT1("Failed to set thread desktop\n");
-        ThreadData->Status = STATUS_UNSUCCESSFUL;
-        SetEvent(ThreadData->Event);
-        return 1;
-    }
-
-    BackgroundWnd = CreateWindowW((LPCWSTR)DESKTOP_WINDOW_ATOM,
-                                  L"",
-                                  WS_POPUP | WS_CLIPCHILDREN,
-                                  GetSystemMetrics(SM_XVIRTUALSCREEN),
-                                  GetSystemMetrics(SM_YVIRTUALSCREEN),
-                                  GetSystemMetrics(SM_CXVIRTUALSCREEN),
-                                  GetSystemMetrics(SM_CYVIRTUALSCREEN),
-                                  NULL, NULL,
-                                  (HINSTANCE)GetModuleHandleW(L"user32.dll"), // Run in win32k/user32.
-                                  NULL);
-
-    if (NULL == BackgroundWnd)
-    {
-        DPRINT1("Failed to create desktop background window\n");
-        ThreadData->Status = STATUS_UNSUCCESSFUL;
-        SetEvent(ThreadData->Event);
-        return 1;
-    }
-
-    DPRINT("BackgroundWnd 0x%p\n",BackgroundWnd);
-
-    ThreadData->Status = STATUS_SUCCESS;
-    SetEvent(ThreadData->Event);
-
-    while (GetMessageW(&msg, NULL, 0, 0))
-    {
-        if (msg.message == WM_QUIT)
-        {
-           DPRINT1("DtbgDesktopThread WM_QUIT\n");
-        }
-        TranslateMessage(&msg);
-        DispatchMessageW(&msg);
-    }
-
-    DPRINT1("DtbgDesktopThread Exit\n");
-    return 1;
-}
-
-CSR_API(CsrCreateDesktop)
-{
-    DTBG_THREAD_DATA ThreadData;
-    HANDLE ThreadHandle;
-
-    DPRINT("CsrCreateDesktop\n");
-
-    if (!BgInitialized)
-    {
-        BgInitialized = TRUE;
-
-       // if (!DtbgInit())
-       //     return STATUS_UNSUCCESSFUL;
-    }
-
-    /*
-     * The desktop handle we got from win32k is in
-     * the scope of CSRSS so we can just use it.
-     */
-    ThreadData.Desktop = ApiMessage->Data.CreateDesktopRequest.DesktopHandle;
-
-    ThreadData.Event = CreateEventW(NULL, FALSE, FALSE, NULL);
-
-    if (NULL == ThreadData.Event)
-    {
-        DPRINT1("Failed to create event (error %d)\n", GetLastError());
-        return STATUS_UNSUCCESSFUL;
-    }
-
-    ThreadHandle = CreateThread(NULL,
-                                0,
-                                DtbgDesktopThread,
-                                (PVOID)&ThreadData,
-                                0,
-                                NULL);
-
-    if (NULL == ThreadHandle)
-    {
-        CloseHandle(ThreadData.Event);
-        DPRINT1("Failed to create desktop window thread.\n");
-        return STATUS_UNSUCCESSFUL;
-    }
-
-    CloseHandle(ThreadHandle);
-
-    WaitForSingleObject(ThreadData.Event, INFINITE);
-    CloseHandle(ThreadData.Event);
-
-    return ThreadData.Status;
-}
-
-CSR_API(CsrShowDesktop)
-{
-#if 0
-    PRIVATE_NOTIFY_DESKTOP nmh;
-    DPRINT("CsrShowDesktop\n");
-
-    nmh.hdr.hwndFrom = ApiMessage->Data.ShowDesktopRequest.DesktopWindow;
-    nmh.hdr.idFrom = 0;
-    nmh.hdr.code = PM_SHOW_DESKTOP;
-
-    nmh.ShowDesktop.Width = (int)ApiMessage->Data.ShowDesktopRequest.Width;
-    nmh.ShowDesktop.Height = (int)ApiMessage->Data.ShowDesktopRequest.Height;
-
-    if (SendMessageW(ApiMessage->Data.ShowDesktopRequest.DesktopWindow,
-                     WM_NOTIFY,
-                     (WPARAM)nmh.hdr.hwndFrom,
-                     (LPARAM)&nmh))
-    {
-        return STATUS_UNSUCCESSFUL;
-    }
-#endif
-    return STATUS_SUCCESS;
-}
-
-CSR_API(CsrHideDesktop)
-{
-#if 0
-    PRIVATE_NOTIFY_DESKTOP nmh;
-    DPRINT("CsrHideDesktop\n");
-
-    nmh.hdr.hwndFrom = ApiMessage->Data.ShowDesktopRequest.DesktopWindow;
-    nmh.hdr.idFrom = 0;
-    nmh.hdr.code = PM_HIDE_DESKTOP;
-
-    if (SendMessageW(ApiMessage->Data.ShowDesktopRequest.DesktopWindow,
-                     WM_NOTIFY,
-                     (WPARAM)nmh.hdr.hwndFrom,
-                     (LPARAM)&nmh))
-    {
-        return STATUS_UNSUCCESSFUL;
-    }
-#endif
-    return STATUS_SUCCESS;
-}
-
-BOOL
-FASTCALL
-DtbgIsDesktopVisible(VOID)
-{
-    VisibleDesktopWindow = GetDesktopWindow(); // DESKTOPWNDPROC
-
-    if (VisibleDesktopWindow != NULL &&
-            !IsWindowVisible(VisibleDesktopWindow))
-    {
-        VisibleDesktopWindow = NULL;
-    }
-
-    return VisibleDesktopWindow != NULL;
-}
-
-/* EOF */
diff --git a/win32ss/user/win32csr/desktopbg.h b/win32ss/user/win32csr/desktopbg.h
deleted file mode 100644 (file)
index c072e88..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/* $Id: desktopbg.h 47315 2010-05-23 00:51:29Z jmorlan $
- *
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS system libraries
- * FILE:            subsys/csrss/include/destkopbg.h
- * PURPOSE:         CSRSS internal desktop background window interface
- */
-
-#pragma once
-
-BOOL FASTCALL DtbgIsDesktopVisible(VOID);
-
-/* EOF */
diff --git a/win32ss/user/win32csr/dllmain.c b/win32ss/user/win32csr/dllmain.c
deleted file mode 100644 (file)
index be11a29..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS system libraries
- * FILE:            subsys/csrss/win32csr/dllmain.c
- * PURPOSE:         Initialization
- * PROGRAMMERS:     Dmitry Philippov (shedon@mail.ru)
- */
-
-/* INCLUDES ******************************************************************/
-
-#include "win32csr.h"
-
-#define NDEBUG
-#include <debug.h>
-
-/* GLOBALS *******************************************************************/
-
-HANDLE Win32CsrApiHeap;
-HINSTANCE Win32CsrDllHandle = NULL;
-
-PCSR_API_ROUTINE Win32CsrApiDefinitions[3] =
-{
-    CsrCreateDesktop,
-    CsrShowDesktop,
-    CsrHideDesktop,
-};
-
-BOOLEAN Win32CsrApiServerValidTable[3] =
-{
-    FALSE,
-    FALSE,
-    FALSE
-};
-
-PCHAR Win32CsrApiNameTable[3] =
-{
-    "CsrCreateDesktop",
-    "CsrShowDesktop",
-    "CsrHideDesktop",
-};
-
-static HHOOK hhk = NULL;
-
-/* FUNCTIONS *****************************************************************/
-
-LRESULT
-CALLBACK
-KeyboardHookProc(
-    int nCode,
-    WPARAM wParam,
-    LPARAM lParam)
-{
-   return CallNextHookEx(hhk, nCode, wParam, lParam);
-}
-
-BOOL WINAPI
-DllMain(HANDLE hDll,
-        DWORD dwReason,
-        LPVOID lpReserved)
-{
-    if (DLL_PROCESS_ATTACH == dwReason)
-    {
-        Win32CsrDllHandle = hDll;
-//
-// HACK HACK HACK ReactOS to BOOT! Initialization BUG ALERT! See bug 5655.
-//
-        hhk = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProc, NULL, 0);
-// BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
-//  BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
-//   BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
-    }
-
-    return TRUE;
-}
-
-VOID
-WINAPI
-PrivateCsrssManualGuiCheck(LONG Check)
-{
-    NtUserCallOneParam(Check, ONEPARAM_ROUTINE_CSRSS_GUICHECK);
-}
-
-DWORD
-WINAPI
-CreateSystemThreads(PVOID pParam)
-{
-    NtUserCallOneParam((DWORD)pParam, ONEPARAM_ROUTINE_CREATESYSTEMTHREADS);
-    DPRINT1("This thread should not terminate!\n");
-    return 0;
-}
-
-CSR_SERVER_DLL_INIT(Win32CsrInitialization)
-{
-    HANDLE ServerThread;
-    CLIENT_ID ClientId;
-    NTSTATUS Status;
-
-    Win32CsrApiHeap = RtlGetProcessHeap();
-
-    NtUserInitialize(0, NULL, NULL);
-
-    PrivateCsrssManualGuiCheck(0);
-
-    /* Setup the DLL Object */
-    LoadedServerDll->ApiBase = 4;
-    LoadedServerDll->HighestApiSupported = 3;
-    LoadedServerDll->DispatchTable = Win32CsrApiDefinitions;
-    LoadedServerDll->ValidTable = Win32CsrApiServerValidTable;
-    LoadedServerDll->NameTable = Win32CsrApiNameTable;
-    // LoadedServerDll->SizeOfProcessData = 0;
-    // LoadedServerDll->ConnectCallback = NULL;
-    // LoadedServerDll->DisconnectCallback = NULL;
-    // LoadedServerDll->HardErrorCallback = Win32CsrHardError;
-    // LoadedServerDll->NewProcessCallback = NULL;
-    // LoadedServerDll->DisconnectCallback = NULL;
-
-    /* Start Raw Input Threads */
-    Status = RtlCreateUserThread(NtCurrentProcess(), NULL, TRUE, 0, 0, 0, (PTHREAD_START_ROUTINE)CreateSystemThreads, (PVOID)0, &ServerThread, &ClientId);
-    if (NT_SUCCESS(Status))
-    {
-        NtResumeThread(ServerThread, NULL);
-        NtClose(ServerThread);
-    }
-    else
-        DPRINT1("Cannot start Raw Input Thread!\n");
-
-    return STATUS_SUCCESS;
-}
-
-/* EOF */
diff --git a/win32ss/user/win32csr/win32csr.h b/win32ss/user/win32csr/win32csr.h
deleted file mode 100644 (file)
index 1d05c50..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/* $Id: win32csr.h 55699 2012-02-19 06:44:09Z ion $
- *
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS system libraries
- * FILE:            subsys/csrss/win32csr/win32csr.h
- * PURPOSE:         Interface to win32csr.dll
- */
-
-#pragma once
-
-/* PSDK/NDK Headers */
-#define WIN32_NO_STATUS
-#include <windows.h>
-#define NTOS_MODE_USER
-#include <ndk/ntndk.h>
-
-/* External Winlogon Header */
-#include <winlogon.h>
-
-/* CSRSS Header */
-#include <csr/csrsrv.h>
-
-/* Internal CSRSS Headers */
-#include <win/winmsg.h>
-#include <desktopbg.h>
-
-/* Public Win32K Headers */
-#include <ntuser.h>
-
-#include <commctrl.h>
-
-extern HANDLE Win32CsrApiHeap;
-extern HINSTANCE Win32CsrDllHandle;
-
-/* desktopbg.c */
-CSR_API(CsrCreateDesktop);
-CSR_API(CsrShowDesktop);
-CSR_API(CsrHideDesktop);
-
-/* EOF */
diff --git a/win32ss/user/win32csr/win32csr.rc b/win32ss/user/win32csr/win32csr.rc
deleted file mode 100644 (file)
index 4a8e412..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#define REACTOS_VERSION_DLL
-#define REACTOS_STR_FILE_DESCRIPTION   "CSRSS subsystem usermode code\0"
-#define REACTOS_STR_INTERNAL_NAME      "win32csr\0"
-#define REACTOS_STR_ORIGINAL_FILENAME  "win32csr.dll\0"
-#include <reactos/version.rc>
diff --git a/win32ss/user/win32csr/win32csr.spec b/win32ss/user/win32csr/win32csr.spec
deleted file mode 100644 (file)
index 0251712..0000000
+++ /dev/null
@@ -1 +0,0 @@
-@ stdcall Win32CsrInitialization(ptr)
index bfb391b..c295698 100644 (file)
@@ -141,6 +141,9 @@ CsrpCaptureStringParameters(
     UNICODE_STRING TempStringU, ParamStringU;
     ANSI_STRING TempStringA;
 
+    if (SizeOfAllUnicodeStrings)
+        *SizeOfAllUnicodeStrings = 0;
+
     /* Read all strings from client space */
     for (nParam = 0; nParam < HardErrorMessage->NumberOfParameters; nParam++)
     {
@@ -227,7 +230,9 @@ CsrpCaptureStringParameters(
         return Status;
     }
 
-    *SizeOfAllUnicodeStrings = Size;
+    if (SizeOfAllUnicodeStrings)
+        *SizeOfAllUnicodeStrings = Size;
+
     return Status;
 }
 
index 4527929..7d0f3ae 100644 (file)
@@ -356,6 +356,28 @@ PrivateCsrssManualGuiCheck(LONG Check)
     NtUserCallOneParam(Check, ONEPARAM_ROUTINE_CSRSS_GUICHECK);
 }
 
+static HHOOK hhk = NULL;
+
+/*** HACK from win32csr... ***/
+LRESULT
+CALLBACK
+KeyboardHookProc(int nCode,
+                 WPARAM wParam,
+                 LPARAM lParam)
+{
+    return CallNextHookEx(hhk, nCode, wParam, lParam);
+}
+/*** END - HACK from win32csr... ***/
+
+DWORD
+WINAPI
+CreateSystemThreads(PVOID pParam)
+{
+    NtUserCallOneParam((DWORD)pParam, ONEPARAM_ROUTINE_CREATESYSTEMTHREADS);
+    DPRINT1("This thread should not terminate!\n");
+    return 0;
+}
+
 CSR_SERVER_DLL_INIT(UserServerDllInitialization)
 {
 /*
@@ -378,6 +400,13 @@ CSR_SERVER_DLL_INIT(UserServerDllInitialization)
     return Status;
 */
 
+/*** From win32csr... ***/
+    HANDLE ServerThread;
+    CLIENT_ID ClientId;
+    NTSTATUS Status;
+    UINT i;
+/*** END - From win32csr... ***/
+
     /* Initialize memory */
     UserSrvHeap = RtlGetProcessHeap();  // Initialize our own heap.
     // BaseSrvSharedHeap = LoadedServerDll->SharedSection; // Get the CSR shared heap.
@@ -399,6 +428,21 @@ CSR_SERVER_DLL_INIT(UserServerDllInitialization)
     // LoadedServerDll->NewProcessCallback = Win32CsrDuplicateHandleTable;
     LoadedServerDll->HardErrorCallback = Win32CsrHardError;
 
+/*** From win32csr... ***/
+    /* Start the Raw Input Thread and the Desktop Thread */
+    for (i = 0; i < 2; ++i)
+    {
+        Status = RtlCreateUserThread(NtCurrentProcess(), NULL, TRUE, 0, 0, 0, (PTHREAD_START_ROUTINE)CreateSystemThreads, (PVOID)i, &ServerThread, &ClientId);
+        if (NT_SUCCESS(Status))
+        {
+            NtResumeThread(ServerThread, NULL);
+            NtClose(ServerThread);
+        }
+        else
+            DPRINT1("Cannot start Raw Input Thread!\n");
+    }
+/*** END - From win32csr... ***/
+
     /* All done */
     return STATUS_SUCCESS;
 }
@@ -422,6 +466,18 @@ DllMain(IN HANDLE hDll,
     if (DLL_PROCESS_ATTACH == dwReason)
     {
         DllHandle = hDll;
+
+/*** HACK from win32csr... ***/
+
+//
+// HACK HACK HACK ReactOS to BOOT! Initialization BUG ALERT! See bug 5655.
+//
+        hhk = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProc, NULL, 0);
+// BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
+//  BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
+//   BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT! BUG ALERT!
+
+/*** END - HACK from win32csr... ***/
     }
 
     return TRUE;
index 9695548..8416a78 100644 (file)
@@ -471,7 +471,7 @@ NotifyTopLevelWindows(PNOTIFY_CONTEXT Context)
     return TRUE;
 }
 
-/*** Taken from win32ss/user/win32csr/desktopbg.c ***/
+/*** Taken from win32ss/user/consrv/console.c ***/
 BOOL FASTCALL
 DtbgIsDesktopVisible(VOID)
 {
@@ -485,9 +485,7 @@ DtbgIsDesktopVisible(VOID)
 
     return VisibleDesktopWindow != NULL;
 }
-/****************************************************/
 
-/*** Taken from win32ss/user/consrv/console.c ***/
 /* TODO: Find another way to do it. */
 VOID FASTCALL
 ConioConsoleCtrlEventTimeout(DWORD Event, PCSR_PROCESS ProcessData, DWORD Timeout)