- Use the parse context to store whether or not the desktop object was created. If the object was not created, NtUserCreateDesktop should return immediately (this can happen if it didn't exist)
- Before this , if the desktop already exited, we opened the existing desktop and initialized it again. We also created another desktop heap, desktop window, etc.. This fact confused threads using this desktop and caused problems like the assertion we see in the test suite

svn path=/trunk/; revision=55517
This commit is contained in:
Giannis Adamopoulos 2012-02-09 19:41:38 +00:00
parent 672c617e8c
commit 9cde5acdc8

View file

@ -67,6 +67,10 @@ IntDesktopObjectParse(IN PVOID ParseObject,
PLIST_ENTRY NextEntry, ListHead;
PWINSTATION_OBJECT WinStaObject = (PWINSTATION_OBJECT)ParseObject;
PUNICODE_STRING DesktopName;
PBOOLEAN pContext = (PBOOLEAN) Context;
if(pContext)
*pContext = FALSE;
/* Set the list pointers and loop the window station */
ListHead = &WinStaObject->DesktopListHead;
@ -144,6 +148,7 @@ IntDesktopObjectParse(IN PVOID ParseObject,
/* Set the desktop object and return success */
*Object = Desktop;
*pContext = TRUE;
return STATUS_SUCCESS;
}
@ -844,7 +849,7 @@ NtUserCreateDesktop(
CSR_API_MESSAGE Request;
PVOID DesktopHeapSystemBase = NULL;
SIZE_T DesktopInfoSize;
ULONG DummyContext;
BOOLEAN Context;
ULONG_PTR HeapSize = 4 * 1024 * 1024; /* FIXME */
UNICODE_STRING ClassName;
LARGE_STRING WindowName;
@ -880,10 +885,12 @@ NtUserCreateDesktop(
UserMode,
NULL,
dwDesiredAccess,
(PVOID)&DummyContext,
(PVOID)&Context,
(HANDLE*)&Desktop);
if (!NT_SUCCESS(Status)) RETURN(NULL);
if (Status == STATUS_OBJECT_NAME_EXISTS)
/* In case the object was not created (eg if it existed), return now */
if (Context == FALSE)
{
RETURN( Desktop);
}