Author: gadamopoulos Date: Fri Feb 24 15:22:11 2012 New Revision: 55841 URL: http://svn.reactos.org/svn/reactos?rev=55841&view=rev Log: [win32k] - Properly create the WindowStations directory in NtUserInitialize. Now we take into account the fact that if we are not in session 0, it should be created in \Sessions direcory - Clean up IntParseDesktopPath and make it use the correct WindowStations - Add some comments and cleanup - Remove the unused IntGetFullWindowStationName, IntGetWindowStationObject and IntGetWinStaObj
Modified: trunk/reactos/subsystems/win32/win32k/include/winsta.h trunk/reactos/subsystems/win32/win32k/main/dllmain.c trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c trunk/reactos/subsystems/win32/win32k/ntuser/sysparams.c trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c Modified: trunk/reactos/subsystems/win32/win32k/include/winsta.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/include/winsta.h?rev=55841&r1=55840&r2=55841&view=diff ============================================================================== --- trunk/reactos/subsystems/win32/win32k/include/winsta.h [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/include/winsta.h [iso-8859-1] Fri Feb 24 15:22:11 2012 @@ -1,7 +1,7 @@ #pragma once -#define WINSTA_ROOT_NAME L"\\Windows\\WindowStations" -#define WINSTA_ROOT_NAME_LENGTH 23 +#define WINSTA_OBJ_DIR L"\\Windows\\WindowStations" +#define SESSION_DIR L"\\Sessions" /* Window Station Status Flags */ #define WSS_LOCKED (1) @@ -68,6 +68,7 @@ extern WINSTATION_OBJECT *InputWindowStation; extern PPROCESSINFO LogonProcess; extern HWND hwndSAS; +extern UNICODE_STRING gustrWindowStationsDir; #define WINSTA_READ STANDARD_RIGHTS_READ | \ WINSTA_ENUMDESKTOPS | \ @@ -99,16 +100,11 @@ NTSTATUS NTAPI InitWindowStationImpl(VOID); +NTSTATUS NTAPI UserCreateWinstaDirectoy(); -VOID APIENTRY -IntWinStaObjectDelete(PWIN32_DELETEMETHOD_PARAMETERS Parameters); - -NTSTATUS -APIENTRY -IntWinStaObjectParse(PWIN32_PARSEMETHOD_PARAMETERS Parameters); - -NTSTATUS NTAPI -IntWinstaOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters); +VOID APIENTRY IntWinStaObjectDelete(PWIN32_DELETEMETHOD_PARAMETERS Parameters); +NTSTATUS APIENTRY IntWinStaObjectParse(PWIN32_PARSEMETHOD_PARAMETERS Parameters); +NTSTATUS NTAPI IntWinstaOkToClose(PWIN32_OKAYTOCLOSEMETHOD_PARAMETERS Parameters); NTSTATUS FASTCALL IntValidateWindowStationHandle( @@ -116,25 +112,8 @@ KPROCESSOR_MODE AccessMode, ACCESS_MASK DesiredAccess, PWINSTATION_OBJECT *Object); +BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation); -BOOL FASTCALL -IntGetWindowStationObject(PWINSTATION_OBJECT Object); - -BOOL FASTCALL -co_IntInitializeDesktopGraphics(VOID); - -VOID FASTCALL -IntEndDesktopGraphics(VOID); - -BOOL FASTCALL -IntGetFullWindowStationName( - OUT PUNICODE_STRING FullName, - IN PUNICODE_STRING WinStaName, - IN OPTIONAL PUNICODE_STRING DesktopName); - -PWINSTATION_OBJECT FASTCALL IntGetWinStaObj(VOID); - -BOOL FASTCALL -UserSetProcessWindowStation(HWINSTA hWindowStation); - +BOOL FASTCALL co_IntInitializeDesktopGraphics(VOID); +VOID FASTCALL IntEndDesktopGraphics(VOID); /* EOF */ Modified: trunk/reactos/subsystems/win32/win32k/main/dllmain.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/main/dllmain.c?rev=55841&r1=55840&r2=55841&view=diff ============================================================================== --- trunk/reactos/subsystems/win32/win32k/main/dllmain.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/main/dllmain.c [iso-8859-1] Fri Feb 24 15:22:11 2012 @@ -361,6 +361,7 @@ return STATUS_SUCCESS; error: + ERR_CH(UserThread,"UserCreateThreadInfo failed! Freeing pti 0x%x for TID %d\n", ptiCurrent, Thread->Cid.UniqueThread); UserDestroyThreadInfo(Thread); return Status; } Modified: trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c?rev=55841&r1=55840&r2=55841&view=diff ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/desktop.c [iso-8859-1] Fri Feb 24 15:22:11 2012 @@ -135,7 +135,7 @@ { PDESKTOP Desktop = (PDESKTOP)Parameters->Object; - TRACE("Deleting desktop (0x%X)\n", Desktop); + TRACE("Deleting desktop object 0x%x\n", Desktop); /* Remove the desktop from the window station's list of associcated desktops */ RemoveEntryList(&Desktop->ListEntry); @@ -216,112 +216,80 @@ HDESK *hDesktop) { OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING WinSta, Desktop, FullName; - BOOL DesktopPresent = FALSE; - BOOL WinStaPresent = FALSE; + UNICODE_STRING ObjectName; NTSTATUS Status; + WCHAR wstrWinstaFullName[MAX_PATH], *pwstrWinsta = NULL, *pwstrDesktop = NULL; ASSERT(hWinSta); + ASSERT(hDesktop); + ASSERT(DesktopPath); *hWinSta = NULL; - - if(hDesktop != NULL) - { - *hDesktop = NULL; - } - - RtlInitUnicodeString(&WinSta, NULL); - RtlInitUnicodeString(&Desktop, NULL); - - if(DesktopPath != NULL && DesktopPath->Buffer != NULL && DesktopPath->Length > sizeof(WCHAR)) - { - PWCHAR c = DesktopPath->Buffer; - USHORT wl = 0; - USHORT l = DesktopPath->Length; - + *hDesktop = NULL; + + if(DesktopPath->Buffer != NULL && DesktopPath->Length > sizeof(WCHAR)) + { /* * Parse the desktop path string which can be in the form "WinSta\Desktop" * or just "Desktop". In latter case WinSta0 will be used. */ - while(l > 0) + pwstrDesktop = wcschr(DesktopPath->Buffer, L'\\'); + if(pwstrDesktop != NULL) { - if(*c == L'\\') - { - wl = (ULONG_PTR)c - (ULONG_PTR)DesktopPath->Buffer; - break; - } - l -= sizeof(WCHAR); - c++; + *pwstrDesktop = 0; + pwstrDesktop++; + pwstrWinsta = DesktopPath->Buffer; } - - if(wl > 0) + else { - WinSta.Length = wl; - WinSta.MaximumLength = wl + sizeof(WCHAR); - WinSta.Buffer = DesktopPath->Buffer; - - WinStaPresent = TRUE; - c++; - } - - Desktop.Length = DesktopPath->Length - wl; - if(wl > 0) - { - Desktop.Length -= sizeof(WCHAR); - } - if(Desktop.Length > 0) - { - Desktop.MaximumLength = Desktop.Length + sizeof(WCHAR); - Desktop.Buffer = ((wl > 0) ? c : DesktopPath->Buffer); - DesktopPresent = TRUE; - } - } - - if(!WinStaPresent) - { + pwstrDesktop = DesktopPath->Buffer; + pwstrWinsta = NULL; + } + + TRACE("IntParseDesktopPath pwstrWinsta:%S pwstrDesktop:%S\n", pwstrWinsta, pwstrDesktop); + } + #if 0 - /* Search the process handle table for (inherited) window station - handles, use a more appropriate one than WinSta0 if possible. */ - if (!ObFindHandleForObject(Process, - NULL, - ExWindowStationObjectType, - NULL, - (PHANDLE)hWinSta)) + /* Search the process handle table for (inherited) window station + handles, use a more appropriate one than WinSta0 if possible. */ + if (!ObFindHandleForObject(Process, + NULL, + ExWindowStationObjectType, + NULL, + (PHANDLE)hWinSta)) #endif - { - /* We had no luck searching for opened handles, use WinSta0 now */ - RtlInitUnicodeString(&WinSta, L"WinSta0"); - } - } - - if(!DesktopPresent && hDesktop != NULL) - { + { + /* We had no luck searching for opened handles, use WinSta0 now */ + if(!pwstrWinsta) + pwstrWinsta = L"WinSta0"; + } + #if 0 - /* Search the process handle table for (inherited) desktop - handles, use a more appropriate one than Default if possible. */ - if (!ObFindHandleForObject(Process, - NULL, - ExDesktopObjectType, - NULL, - (PHANDLE)hDesktop)) + /* Search the process handle table for (inherited) desktop + handles, use a more appropriate one than Default if possible. */ + if (!ObFindHandleForObject(Process, + NULL, + ExDesktopObjectType, + NULL, + (PHANDLE)hDesktop)) #endif - { - /* We had no luck searching for opened handles, use Desktop now */ - RtlInitUnicodeString(&Desktop, L"Default"); - } - } - + { + /* We had no luck searching for opened handles, use Desktop now */ + if(!pwstrDesktop) + pwstrDesktop = L"Default"; + } + if(*hWinSta == NULL) { - if(!IntGetFullWindowStationName(&FullName, &WinSta, NULL)) - { - return STATUS_INSUFFICIENT_RESOURCES; - } + swprintf(wstrWinstaFullName, L"%wZ\\%ws", &gustrWindowStationsDir, pwstrWinsta); + RtlInitUnicodeString( &ObjectName, wstrWinstaFullName); + + TRACE("parsed initial winsta: %wZ\n", &ObjectName); /* Open the window station */ InitializeObjectAttributes(&ObjectAttributes, - &FullName, + &ObjectName, OBJ_CASE_INSENSITIVE, NULL, NULL); @@ -334,30 +302,25 @@ NULL, (HANDLE*)hWinSta); - ExFreePoolWithTag(FullName.Buffer, TAG_STRING); - if(!NT_SUCCESS(Status)) { SetLastNtError(Status); - TRACE("Failed to reference window station %wZ PID: %d!\n", &WinSta, PsGetCurrentProcessId()); + ERR("Failed to reference window station %wZ PID: %d!\n", &ObjectName ); return Status; } } - if(hDesktop != NULL && *hDesktop == NULL) - { - if(!IntGetFullWindowStationName(&FullName, &WinSta, &Desktop)) - { - NtClose(*hWinSta); - *hWinSta = NULL; - return STATUS_INSUFFICIENT_RESOURCES; - } + if(*hDesktop == NULL) + { + RtlInitUnicodeString(&ObjectName, pwstrDesktop); + + TRACE("parsed initial desktop: %wZ\n", &ObjectName); /* Open the desktop object */ InitializeObjectAttributes(&ObjectAttributes, - &FullName, + &ObjectName, OBJ_CASE_INSENSITIVE, - NULL, + *hWinSta, NULL); Status = ObOpenObjectByName(&ObjectAttributes, @@ -368,19 +331,16 @@ NULL, (HANDLE*)hDesktop); - ExFreePoolWithTag(FullName.Buffer, TAG_STRING); - if(!NT_SUCCESS(Status)) { *hDesktop = NULL; NtClose(*hWinSta); *hWinSta = NULL; SetLastNtError(Status); - TRACE("Failed to reference desktop %wZ PID: %d!\n", &Desktop, PsGetCurrentProcessId()); + ERR("Failed to reference desktop %wZ PID: %d!\n", &ObjectName); return Status; } } - return STATUS_SUCCESS; } @@ -410,6 +370,9 @@ AccessMode, (PVOID*)Object, NULL); + + TRACE("IntValidateDesktopHandle: handle:0x%x obj:0x%x access:0x%x Status:0x%x\n", + Desktop, *Object, DesiredAccess, Status); if (!NT_SUCCESS(Status)) SetLastNtError(Status); @@ -860,8 +823,6 @@ * Try to open already existing desktop */ - TRACE("Trying to open desktop (%wZ)\n", &DesktopName); - Status = ObOpenObjectByName( ObjectAttributes, ExDesktopObjectType, @@ -875,7 +836,8 @@ /* In case the object was not created (eg if it existed), return now */ if (Context == FALSE) { - RETURN( Desktop); + TRACE("NtUserCreateDesktop opened desktop %wZ\n", ObjectAttributes->ObjectName); + RETURN( Desktop); } /* Capture desktop name */ @@ -905,7 +867,13 @@ KernelMode, (PVOID)&DesktopObject, NULL); - if (!NT_SUCCESS(Status)) RETURN(NULL); + if (!NT_SUCCESS(Status)) + { + ERR("Failed to reference desktop object\n"); + RETURN(NULL); + } + + TRACE("NtUserCreateDesktop created desktop 0x%x with name %wZ\n", DesktopObject, &DesktopName); DesktopObject->hsectionDesktop = NULL; DesktopObject->pheapDesktop = UserCreateHeap(&DesktopObject->hsectionDesktop, @@ -949,24 +917,9 @@ InitializeListHead(&DesktopObject->pDeskInfo->aphkStart[i]); } -//// Why is this here? -#if 0 - if (! NT_SUCCESS(Status)) - { - ERR("Failed to create desktop handle\n"); - SetLastNtError(Status); - RETURN( NULL); - } -#endif -//// /* * Create a handle for CSRSS and notify CSRSS for Creating Desktop Window. - * - * Honestly, I believe this is a cleverly written hack that allowed ReactOS - * to function at the beginning of the project by ramroding the GUI into - * operation and making the desktop window work from user space. - * (jt) */ Request.Type = MAKE_CSR_API(CREATE_DESKTOP, CSR_GUI); Status = CsrInsertObject(Desktop, @@ -1112,9 +1065,12 @@ if (!NT_SUCCESS(Status)) { + ERR("Failed to open desktop\n"); SetLastNtError(Status); return 0; } + + TRACE("Opened desktop %S with handle 0x%x\n", ObjectAttributes->ObjectName->Buffer, Desktop); return Desktop; } @@ -1147,56 +1103,41 @@ BOOL fInherit, ACCESS_MASK dwDesiredAccess) { - PDESKTOP Object; + PDESKTOP pdesk; NTSTATUS Status; - HDESK Desktop; - DECLARE_RETURN(HDESK); + HDESK hdesk; TRACE("Enter NtUserOpenInputDesktop\n"); - UserEnterExclusive(); - - TRACE("About to open input desktop\n"); /* Get a pointer to the desktop object */ - - Status = IntValidateDesktopHandle( - InputDesktopHandle, - UserMode, - 0, - &Object); - + Status = IntValidateDesktopHandle(InputDesktopHandle, UserMode, 0, &pdesk); if (!NT_SUCCESS(Status)) { TRACE("Validation of input desktop handle (0x%X) failed\n", InputDesktop); - RETURN((HDESK)0); + return NULL; } /* Create a new handle to the object */ - Status = ObOpenObjectByPointer( - Object, + pdesk, 0, NULL, dwDesiredAccess, ExDesktopObjectType, UserMode, - (HANDLE*)&Desktop); - - ObDereferenceObject(Object); - - if (NT_SUCCESS(Status)) - { - TRACE("Successfully opened input desktop\n"); - RETURN((HDESK)Desktop); - } - - SetLastNtError(Status); - RETURN((HDESK)0); - -CLEANUP: - TRACE("Leave NtUserOpenInputDesktop, ret=%i\n",_ret_); - UserLeave(); - END_CLEANUP; + &hdesk); + + ObDereferenceObject(pdesk); + + if (!NT_SUCCESS(Status)) + { + ERR("Failed to open input desktop object\n"); + SetLastNtError(Status); + return NULL; + } + + TRACE("NtUserOpenInputDesktop returning 0x%x\n",hdesk); + return hdesk; } /* @@ -1224,14 +1165,14 @@ BOOL APIENTRY NtUserCloseDesktop(HDESK hDesktop) { - PDESKTOP Object; + PDESKTOP pdesk; NTSTATUS Status; PTHREADINFO pti; DECLARE_RETURN(BOOL); pti = PsGetCurrentThreadWin32Thread(); - TRACE("Enter NtUserCloseDesktop\n"); + TRACE("NtUserCloseDesktop called (0x%x)\n", hDesktop); UserEnterExclusive(); if( hDesktop == pti->hdesk || hDesktop == pti->ppi->hdeskStartup) @@ -1241,27 +1182,19 @@ RETURN(FALSE); } - TRACE("About to close desktop handle (0x%X)\n", hDesktop); - - Status = IntValidateDesktopHandle( - hDesktop, - UserMode, - 0, - &Object); - + Status = IntValidateDesktopHandle( hDesktop, UserMode, 0, &pdesk); if (!NT_SUCCESS(Status)) { - TRACE("Validation of desktop handle (0x%X) failed\n", hDesktop); + ERR("Validation of desktop handle (0x%X) failed\n", hDesktop); RETURN(FALSE); } - ObDereferenceObject(Object); - - TRACE("Closing desktop handle (0x%X)\n", hDesktop); + ObDereferenceObject(pdesk); Status = ZwClose(hDesktop); if (!NT_SUCCESS(Status)) { + ERR("Failed to close desktop handle 0x%x\n", hDesktop); SetLastNtError(Status); RETURN(FALSE); } @@ -1529,26 +1462,19 @@ */ BOOL APIENTRY -NtUserSwitchDesktop(HDESK hDesktop) -{ - PDESKTOP DesktopObject; +NtUserSwitchDesktop(HDESK hdesk) +{ + PDESKTOP pdesk; NTSTATUS Status; DECLARE_RETURN(BOOL); UserEnterExclusive(); - TRACE("Enter NtUserSwitchDesktop\n"); - - TRACE("About to switch desktop (0x%X)\n", hDesktop); - - Status = IntValidateDesktopHandle( - hDesktop, - UserMode, - 0, - &DesktopObject); - + TRACE("Enter NtUserSwitchDesktop(0x%x)\n", hdesk); + + Status = IntValidateDesktopHandle( hdesk, UserMode, 0, &pdesk); if (!NT_SUCCESS(Status)) { - TRACE("Validation of desktop handle (0x%X) failed\n", hDesktop); + ERR("Validation of desktop handle (0x%X) failed\n", hdesk); RETURN(FALSE); } @@ -1556,18 +1482,18 @@ * Don't allow applications switch the desktop if it's locked, unless the caller * is the logon application itself */ - if((DesktopObject->rpwinstaParent->Flags & WSS_LOCKED) && - LogonProcess != NULL && LogonProcess != PsGetCurrentProcessWin32Process()) - { - ObDereferenceObject(DesktopObject); - ERR("Switching desktop 0x%x denied because the work station is locked!\n", hDesktop); + if((pdesk->rpwinstaParent->Flags & WSS_LOCKED) && + LogonProcess != PsGetCurrentProcessWin32Process()) + { + ObDereferenceObject(pdesk); + ERR("Switching desktop 0x%x denied because the window station is locked!\n", hdesk); RETURN(FALSE); } - if(DesktopObject->rpwinstaParent != InputWindowStation) - { - ObDereferenceObject(DesktopObject); - ERR("Switching desktop 0x%x denied because desktop doesn't belong to the interactive winsta!\n", hDesktop); + if(pdesk->rpwinstaParent != InputWindowStation) + { + ObDereferenceObject(pdesk); + ERR("Switching desktop 0x%x denied because desktop doesn't belong to the interactive winsta!\n", hdesk); RETURN(FALSE); } @@ -1576,13 +1502,13 @@ /* FIXME: Connect to input device */ /* Set the active desktop in the desktop's window station. */ - InputWindowStation->ActiveDesktop = DesktopObject; + InputWindowStation->ActiveDesktop = pdesk; /* Set the global state. */ - InputDesktop = DesktopObject; - InputDesktopHandle = hDesktop; - - ObDereferenceObject(DesktopObject); + InputDesktop = pdesk; + InputDesktopHandle = hdesk; + + ObDereferenceObject(pdesk); RETURN(TRUE); @@ -1679,13 +1605,13 @@ } static NTSTATUS -IntUnmapDesktopView(IN PDESKTOP DesktopObject) +IntUnmapDesktopView(IN PDESKTOP pdesk) { PPROCESSINFO ppi; PW32HEAP_USER_MAPPING HeapMapping, *PrevLink; NTSTATUS Status = STATUS_SUCCESS; - TRACE("DO %p\n"); + TRACE("IntUnmapDesktopView called for desktop object %p\n", pdesk); ppi = PsGetCurrentProcessWin32Process(); PrevLink = &ppi->HeapMappings.Next; @@ -1694,16 +1620,17 @@ HeapMapping = *PrevLink; while (HeapMapping != NULL) { - if (HeapMapping->KernelMapping == (PVOID)DesktopObject->pheapDesktop) + if (HeapMapping->KernelMapping == (PVOID)pdesk->pheapDesktop) { if (--HeapMapping->Count == 0) { *PrevLink = HeapMapping->Next; + TRACE("ppi 0x%x unmapped heap of desktop 0x%x\n", ppi, pdesk); Status = MmUnmapViewOfSection(PsGetCurrentProcess(), HeapMapping->UserMapping); - ObDereferenceObject(DesktopObject); + ObDereferenceObject(pdesk); UserHeapFree(HeapMapping); break; @@ -1718,23 +1645,25 @@ } static NTSTATUS -IntMapDesktopView(IN PDESKTOP DesktopObject) -{ - PPROCESSINFO CurrentWin32Process; +IntMapDesktopView(IN PDESKTOP pdesk) +{ + PPROCESSINFO ppi; PW32HEAP_USER_MAPPING HeapMapping, *PrevLink; PVOID UserBase = NULL; SIZE_T ViewSize = 0; LARGE_INTEGER Offset; NTSTATUS Status; - CurrentWin32Process = PsGetCurrentProcessWin32Process(); - PrevLink = &CurrentWin32Process->HeapMappings.Next; + TRACE("IntMapDesktopView called for desktop object 0x%x\n", pdesk); + + ppi = PsGetCurrentProcessWin32Process(); + PrevLink = &ppi->HeapMappings.Next; /* Find out if another thread already mapped the desktop heap */ HeapMapping = *PrevLink; while (HeapMapping != NULL) { - if (HeapMapping->KernelMapping == (PVOID)DesktopObject->pheapDesktop) + if (HeapMapping->KernelMapping == (PVOID)pdesk->pheapDesktop) { HeapMapping->Count++; return STATUS_SUCCESS; @@ -1745,9 +1674,8 @@ } /* We're the first, map the heap */ - TRACE("Noone mapped the desktop heap %p yet, so - map it!\n", DesktopObject->pheapDesktop); Offset.QuadPart = 0; - Status = MmMapViewOfSection(DesktopObject->hsectionDesktop, + Status = MmMapViewOfSection(pdesk->hsectionDesktop, PsGetCurrentProcess(), &UserBase, 0, @@ -1763,24 +1691,25 @@ return Status; } + TRACE("ppi 0x%x mapped heap of desktop 0x%x\n", ppi, pdesk); + /* Add the mapping */ HeapMapping = UserHeapAlloc(sizeof(W32HEAP_USER_MAPPING)); if (HeapMapping == NULL) { - MmUnmapViewOfSection(PsGetCurrentProcess(), - UserBase); + MmUnmapViewOfSection(PsGetCurrentProcess(), UserBase); ERR("UserHeapAlloc() failed!\n"); return STATUS_NO_MEMORY; } HeapMapping->Next = NULL; - HeapMapping->KernelMapping = (PVOID)DesktopObject->pheapDesktop; + HeapMapping->KernelMapping = (PVOID)pdesk->pheapDesktop; HeapMapping->UserMapping = UserBase; HeapMapping->Limit = ViewSize; HeapMapping->Count = 1; *PrevLink = HeapMapping; - ObReferenceObject(DesktopObject); + ObReferenceObject(pdesk); return STATUS_SUCCESS; } @@ -1798,7 +1727,7 @@ ASSERT(NtCurrentTeb()); - TRACE("IntSetThreadDesktop() , FOF=%d\n", FreeOnFailure); + TRACE("IntSetThreadDesktop hDesktop:0x%x, FOF:%d\n",hDesktop, FreeOnFailure); pti = PsGetCurrentThreadWin32Thread(); pci = pti->pClientInfo; @@ -1807,12 +1736,7 @@ if(hDesktop != NULL) { /* Validate the new desktop. */ - Status = IntValidateDesktopHandle( - hDesktop, - UserMode, - 0, - &pdesk); - + Status = IntValidateDesktopHandle( hDesktop, UserMode, 0, &pdesk); if (!NT_SUCCESS(Status)) { ERR("Validation of desktop handle (0x%X) failed\n", hDesktop); @@ -1875,7 +1799,7 @@ return FALSE; } } - + pdeskOld = pti->rpdesk; hdeskOld = pti->hdesk; pctiOld = pti->pcti; @@ -1928,6 +1852,8 @@ InsertTailList(&pdesk->PtiList, &pti->PtiLink); } + TRACE("IntSetThreadDesktop: pti 0x%x ppi 0x%x switched from object 0x%x to 0x%x\n", pti, pti->ppi, pdeskOld, pdesk); + return TRUE; } Modified: trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c?rev=55841&r1=55840&r2=55841&view=diff ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/ntuser.c [iso-8859-1] Fri Feb 24 15:22:11 2012 @@ -101,8 +101,10 @@ NTSTATUS Status; // Set W32PF_Flags |= (W32PF_READSCREENACCESSGRANTED | W32PF_IOWINSTA) -// Create Object Directory,,, Looks like create workstation. "\\Windows\\WindowStations" // Create Event for Diconnect Desktop. + + Status = UserCreateWinstaDirectoy(); + if (!NT_SUCCESS(Status)) return Status; /* Initialize Video. */ Status = InitVideo(); Modified: trunk/reactos/subsystems/win32/win32k/ntuser/sysparams.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/sysparams.c?rev=55841&r1=55840&r2=55841&view=diff ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/sysparams.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/sysparams.c [iso-8859-1] Fri Feb 24 15:22:11 2012 @@ -27,7 +27,7 @@ #define REQ_INTERACTIVE_WINSTA(err) \ if ( GetW32ProcessInfo()->prpwinsta != InputWindowStation) \ { \ - ERR("NtUserSystemParametersInfo requires interactive window station\n"); \ + ERR("NtUserSystemParametersInfo requires interactive window station (current is %wZ)\n", &GetW32ProcessInfo()->prpwinsta->Name); \ EngSetLastError(err); \ return 0; \ } Modified: trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c?rev=55841&r1=55840&r2=55841&view=diff ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/winsta.c [iso-8859-1] Fri Feb 24 15:22:11 2012 @@ -20,6 +20,9 @@ /* Winlogon SAS window */ HWND hwndSAS = NULL; +/* Full path to WindowStations directory */ +UNICODE_STRING gustrWindowStationsDir; + /* INITALIZATION FUNCTIONS ****************************************************/ INIT_FUNCTION @@ -27,36 +30,61 @@ NTAPI InitWindowStationImpl(VOID) { - OBJECT_ATTRIBUTES ObjectAttributes; - HANDLE WindowStationsDirectory; - UNICODE_STRING UnicodeString; - NTSTATUS Status; GENERIC_MAPPING IntWindowStationMapping = { WINSTA_READ, WINSTA_WRITE, WINSTA_EXECUTE, WINSTA_ACCESS_ALL}; - /* - * Create the '\Windows\WindowStations' directory - */ - - RtlInitUnicodeString(&UnicodeString, WINSTA_ROOT_NAME); - InitializeObjectAttributes(&ObjectAttributes, &UnicodeString, 0, NULL, NULL); - Status = ZwCreateDirectoryObject(&WindowStationsDirectory, 0, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - TRACE("Could not create \\Windows\\WindowStations directory " - "(Status 0x%X)\n", Status); - return Status; - } - /* Set Winsta Object Attributes */ ExWindowStationObjectType->TypeInfo.DefaultNonPagedPoolCharge = sizeof(WINSTATION_OBJECT); ExWindowStationObjectType->TypeInfo.GenericMapping = IntWindowStationMapping; ExWindowStationObjectType->TypeInfo.ValidAccessMask = WINSTA_ACCESS_ALL; return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +UserCreateWinstaDirectoy() +{ + PPEB Peb; + NTSTATUS Status; + WCHAR wstrWindowStationsDir[MAX_PATH]; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE hWinstaDir; + + /* Create the WindowStations directory and cache its path for later use */ + Peb = NtCurrentPeb(); + if(Peb->SessionId == 0) + { + RtlCreateUnicodeString(&gustrWindowStationsDir, WINSTA_OBJ_DIR); + } + else + { + swprintf(wstrWindowStationsDir, + L"%ws\\%ld%ws", + SESSION_DIR, + Peb->SessionId, + WINSTA_OBJ_DIR); + + RtlCreateUnicodeString( &gustrWindowStationsDir, wstrWindowStationsDir); + } + + InitializeObjectAttributes(&ObjectAttributes, + &gustrWindowStationsDir, + 0, + NULL, + NULL); + Status = ZwCreateDirectoryObject(&hWinstaDir, 0, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + ERR("Could not create %wZ directory (Status 0x%X)\n", &gustrWindowStationsDir, Status); + return Status; + } + + TRACE("Created directory %wZ for session %d\n", &gustrWindowStationsDir, Peb->SessionId); + + return Status; } /* OBJECT CALLBACKS **********************************************************/ @@ -157,58 +185,6 @@ /* PRIVATE FUNCTIONS **********************************************************/ /* - * IntGetFullWindowStationName - * - * Get a full window station object name from a name specified in - * NtUserCreateWindowStation, NtUserOpenWindowStation, NtUserCreateDesktop - * or NtUserOpenDesktop. - * - * Return Value - * TRUE on success, FALSE on failure. - */ - -BOOL FASTCALL -IntGetFullWindowStationName( - OUT PUNICODE_STRING FullName, - IN PUNICODE_STRING WinStaName, - IN OPTIONAL PUNICODE_STRING DesktopName) -{ - PWCHAR Buffer; - - FullName->Length = WINSTA_ROOT_NAME_LENGTH * sizeof(WCHAR); - if (WinStaName != NULL) - FullName->Length += WinStaName->Length + sizeof(WCHAR); - if (DesktopName != NULL) - FullName->Length += DesktopName->Length + sizeof(WCHAR); - FullName->MaximumLength = FullName->Length; - FullName->Buffer = ExAllocatePoolWithTag(PagedPool, FullName->Length, TAG_STRING); - if (FullName->Buffer == NULL) - { - return FALSE; - } - - Buffer = FullName->Buffer; - memcpy(Buffer, WINSTA_ROOT_NAME, WINSTA_ROOT_NAME_LENGTH * sizeof(WCHAR)); - Buffer += WINSTA_ROOT_NAME_LENGTH; - if (WinStaName != NULL) - { - *Buffer = L'\\'; - Buffer ++; - memcpy(Buffer, WinStaName->Buffer, WinStaName->Length); - - if (DesktopName != NULL) - { - Buffer += WinStaName->Length / sizeof(WCHAR); - *Buffer = L'\\'; - Buffer ++; - memcpy(Buffer, DesktopName->Buffer, DesktopName->Length); - } - } - - return TRUE; -} - -/* * IntValidateWindowStationHandle * * Validates the window station handle. @@ -229,7 +205,7 @@ if (WindowStation == NULL) { - WARN("Invalid window station handle\n"); + ERR("Invalid window station handle\n"); EngSetLastError(ERROR_INVALID_HANDLE); return STATUS_INVALID_HANDLE; } @@ -247,21 +223,6 @@ return Status; } - -BOOL FASTCALL -IntGetWindowStationObject(PWINSTATION_OBJECT Object) -{ - NTSTATUS Status; - - Status = ObReferenceObjectByPointer( - Object, - KernelMode, - ExWindowStationObjectType, - 0); - - return NT_SUCCESS(Status); -} - BOOL FASTCALL co_IntInitializeDesktopGraphics(VOID) @@ -378,6 +339,8 @@ HWINSTA WindowStation; NTSTATUS Status; + TRACE("NtUserCreateWindowStation called\n"); + Status = ObOpenObjectByName( ObjectAttributes, ExWindowStationObjectType, @@ -389,9 +352,9 @@ if (NT_SUCCESS(Status)) { - return (HWINSTA)WindowStation; - } - + TRACE("NtUserCreateWindowStation opened window station %wZ\n", ObjectAttributes->ObjectName); + return (HWINSTA)WindowStation; + } /* * No existing window station found, try to create new one @@ -430,6 +393,7 @@ if (!NT_SUCCESS(Status)) { + ERR("ObCreateObject failed for window station %wZ\n", &WindowStationName); ExFreePoolWithTag(WindowStationName.Buffer, TAG_STRING); SetLastNtError(STATUS_INSUFFICIENT_RESOURCES); return 0; @@ -438,13 +402,14 @@ Status = ObInsertObject( (PVOID)WindowStationObject, NULL, - STANDARD_RIGHTS_REQUIRED, + dwDesiredAccess, 0, NULL, (PVOID*)&WindowStation); if (!NT_SUCCESS(Status)) { + ERR("ObInsertObject failed for window station %wZ\n", &WindowStationName); ExFreePoolWithTag(WindowStationName.Buffer, TAG_STRING); SetLastNtError(STATUS_INSUFFICIENT_RESOURCES); ObDereferenceObject(WindowStationObject); @@ -464,11 +429,14 @@ if (InputWindowStation == NULL) { + TRACE("Initializeing input window station\n"); InputWindowStation = WindowStationObject; InitCursorImpl(); } + TRACE("NtUserCreateWindowStation created object 0x%x with name %wZ handle 0x%x\n", + WindowStation, &WindowStationObject->Name, WindowStation); return WindowStation; } @@ -501,7 +469,7 @@ POBJECT_ATTRIBUTES ObjectAttributes, ACCESS_MASK dwDesiredAccess) { - HWINSTA WindowStation; + HWINSTA hwinsta; NTSTATUS Status; Status = ObOpenObjectByName( @@ -511,15 +479,18 @@ NULL, dwDesiredAccess, NULL, - (PVOID*)&WindowStation); + (PVOID*)&hwinsta); if (!NT_SUCCESS(Status)) { + ERR("NtUserOpenWindowStation failed\n"); SetLastNtError(Status); return 0; } - return WindowStation; + TRACE("Opened window station %wZ with handle 0x%x\n", ObjectAttributes->ObjectName, hwinsta); + + return hwinsta; } /* @@ -551,10 +522,11 @@ PWINSTATION_OBJECT Object; NTSTATUS Status; - TRACE("About to close window station handle (0x%X)\n", hWinSta); + TRACE("NtUserCloseWindowStation called (0x%x)\n", hWinSta); if (hWinSta == UserGetProcessWindowStation()) { + ERR("Attempted to close process window station"); return FALSE; } @@ -566,13 +538,13 @@ if (!NT_SUCCESS(Status)) { - TRACE("Validation of window station handle (0x%X) failed\n", hWinSta); + ERR("Validation of window station handle (0x%x) failed\n", hWinSta); return FALSE; } ObDereferenceObject(Object); - TRACE("Closing window station handle (0x%X)\n", hWinSta); + TRACE("Closing window station handle (0x%x)\n", hWinSta); Status = ObCloseHandle(hWinSta, UserMode); if (!NT_SUCCESS(Status)) @@ -797,8 +769,6 @@ { PPROCESSINFO ppi = PsGetCurrentProcessWin32Process(); - //ASSERT(ppi->hwinsta); - return ppi->hwinsta; } @@ -821,26 +791,6 @@ NtUserGetProcessWindowStation(VOID) { return UserGetProcessWindowStation(); -} - -PWINSTATION_OBJECT FASTCALL -IntGetWinStaObj(VOID) -{ - PWINSTATION_OBJECT WinStaObj; - NTSTATUS Status; - - Status = IntValidateWindowStationHandle( - UserGetProcessWindowStation(), - KernelMode, - 0, - &WinStaObj); - if(!NT_SUCCESS(Status)) - { - SetLastNtError(Status); - return NULL; - } - - return WinStaObj; } BOOL FASTCALL @@ -1025,7 +975,6 @@ OBJECT_ATTRIBUTES ObjectAttributes; NTSTATUS Status; HANDLE DirectoryHandle; - UNICODE_STRING DirectoryName = RTL_CONSTANT_STRING(WINSTA_ROOT_NAME); char InitialBuffer[256], *Buffer; ULONG Context, ReturnLength, BufferSize; DWORD EntryCount; @@ -1037,7 +986,7 @@ */ InitializeObjectAttributes( &ObjectAttributes, - &DirectoryName, + &gustrWindowStationsDir, OBJ_CASE_INSENSITIVE, NULL, NULL);