[ros-diffs] [fireball] 42181: - 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.

fireball at svn.reactos.org fireball at svn.reactos.org
Fri Jul 24 23:00:18 CEST 2009


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/win32k/wine/winstation.c?rev=42181&r1=42180&r2=42181&view=diff
==============================================================================
--- 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();




More information about the Ros-diffs mailing list