Author: fireball Date: Fri Jul 24 23:00:17 2009 New Revision: 42181
URL: http://svn.reactos.org/svn/reactos?rev=42181&view=rev Log: - Implement desktop_close_handle. It is the second place in winstation.c which directly relies on ETHREAD's internal members for enumerating threads of a process. Should be reimplemented in a more compatible way, but so far it works in ReactOS and Windows 2003. - Sticked // FIXME where appropriate.
Modified: branches/arwinss/reactos/subsystems/win32/win32k/wine/winstation.c
Modified: branches/arwinss/reactos/subsystems/win32/win32k/wine/winstation.c URL: http://svn.reactos.org/svn/reactos/branches/arwinss/reactos/subsystems/win32... ============================================================================== --- branches/arwinss/reactos/subsystems/win32/win32k/wine/winstation.c [iso-8859-1] (original) +++ branches/arwinss/reactos/subsystems/win32/win32k/wine/winstation.c [iso-8859-1] Fri Jul 24 23:00:17 2009 @@ -249,18 +249,45 @@
static int desktop_close_handle( struct object *obj, PPROCESSINFO process, obj_handle_t handle ) { -#if 0 - struct thread *thread; + PLIST_ENTRY ListHead, Entry; + PETHREAD FoundThread = NULL; + PTHREADINFO ThreadInfo;
/* check if the handle is currently used by the process or one of its threads */ if (process->desktop == handle) return 0; - LIST_FOR_EACH_ENTRY( thread, &process->thread_list, struct thread, proc_entry ) - if (thread->desktop == handle) return 0; + + // FIXME: This code relies on ETHREAD internals! + + /* Lock the process */ + KeEnterCriticalRegion(); + ExfAcquirePushLockShared(&process->peProcess->ProcessLock); + + Entry = process->peProcess->ThreadListHead.Flink; + + ListHead = &process->peProcess->ThreadListHead; + while (ListHead != Entry) + { + /* Get the Thread */ + FoundThread = CONTAINING_RECORD(Entry, ETHREAD, ThreadListEntry); + ThreadInfo = PsGetThreadWin32Thread(FoundThread); + if (ThreadInfo && ThreadInfo->desktop == handle) + { + /* Unlock the process */ + ExfReleasePushLockShared(&process->peProcess->ProcessLock); + KeLeaveCriticalRegion(); + + return 0; + } + + /* Go to the next thread */ + Entry = Entry->Flink; + } + + /* Unlock the process */ + ExfReleasePushLockShared(&process->peProcess->ProcessLock); + KeLeaveCriticalRegion(); + return 1; -#else - UNIMPLEMENTED; - return 1; -#endif }
static void desktop_destroy( struct object *obj ) @@ -306,6 +333,8 @@
if (!(old_desktop = get_desktop_obj( process, process->desktop, 0 ))) clear_error(); process->desktop = handle; + + // FIXME: This code relies on ETHREAD internals!
/* Lock the process */ KeEnterCriticalRegion();