[ros-diffs] [ion] 55707: [CSRSRV]: Properly implement CsrSrvCreateThread now that the worker thread issue is fixed. CSR_THREAD's are now created for everyone, and CSRSS succesfully duplicates their thread hand...

ion at svn.reactos.org ion at svn.reactos.org
Sun Feb 19 10:12:15 UTC 2012


Author: ion
Date: Sun Feb 19 10:12:14 2012
New Revision: 55707

URL: http://svn.reactos.org/svn/reactos?rev=55707&view=rev
Log:
[CSRSRV]: Properly implement CsrSrvCreateThread now that the worker thread issue is fixed. CSR_THREAD's are now created for everyone, and CSRSS succesfully duplicates their thread handle! Also, while connections from unknown threads are still allowed (in case I missed something), we do warn on the console about these guys now.

Modified:
    trunk/reactos/subsystems/win32/csrss/csrsrv/api/process.c
    trunk/reactos/subsystems/win32/csrss/csrsrv/api/wapi.c

Modified: trunk/reactos/subsystems/win32/csrss/csrsrv/api/process.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/csrsrv/api/process.c?rev=55707&r1=55706&r2=55707&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/csrsrv/api/process.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/csrss/csrsrv/api/process.c [iso-8859-1] Sun Feb 19 10:12:14 2012
@@ -172,50 +172,46 @@
     NTSTATUS Status;
     PCSR_PROCESS CsrProcess;
     
+    /* Get the current CSR thread */
     CurrentThread = NtCurrentTeb()->CsrClientThread;
     if (!CurrentThread) return STATUS_SUCCESS; // server-to-server
+    
+    /* Get the CSR Process for this request */
     CsrProcess = CurrentThread->Process;
-
-    if (CsrProcess->ClientId.UniqueProcess != Request->Data.CreateThreadRequest.ClientId.UniqueProcess)
-    {
+    if (CsrProcess->ClientId.UniqueProcess !=
+        Request->Data.CreateThreadRequest.ClientId.UniqueProcess)
+    {
+        /* This is a remote thread request -- is it within the server itself? */
         if (Request->Data.CreateThreadRequest.ClientId.UniqueProcess == NtCurrentTeb()->ClientId.UniqueProcess)
         {
+            /* Accept this without any further work */
             return STATUS_SUCCESS;
         }
         
+        /* Get the real CSR Process for the remote thread's process */
         Status = CsrLockProcessByClientId(Request->Data.CreateThreadRequest.ClientId.UniqueProcess,
                                           &CsrProcess);
         if (!NT_SUCCESS(Status)) return Status;
     }
-    
-    Status = NtDuplicateObject(CsrProcess->ProcessHandle,
+
+    /* Duplicate the thread handle so we can own it */
+    Status = NtDuplicateObject(CurrentThread->Process->ProcessHandle,
                                Request->Data.CreateThreadRequest.ThreadHandle,
                                NtCurrentProcess(),
                                &ThreadHandle,
                                0,
                                0,
                                DUPLICATE_SAME_ACCESS);
-    if (!NT_SUCCESS(Status))
-    {
-        Status = NtDuplicateObject(CurrentThread->Process->ProcessHandle,
-                                   Request->Data.CreateThreadRequest.ThreadHandle,
-                                   NtCurrentProcess(),
-                                   &ThreadHandle,
-                                   0,
-                                   0,
-                                   DUPLICATE_SAME_ACCESS);
-    }
-
-    Status = STATUS_SUCCESS; // hack
     if (NT_SUCCESS(Status))
     {
+        /* Call CSRSRV to tell it about the new thread */
         Status = CsrCreateThread(CsrProcess,
-                                     ThreadHandle,
-                                     &Request->Data.CreateThreadRequest.ClientId);
-    }
-
-    if (CsrProcess != CurrentThread->Process) CsrReleaseProcessLock();
-    
+                                 ThreadHandle,
+                                 &Request->Data.CreateThreadRequest.ClientId);
+    }
+
+    /* Unlock the process and return */
+    if (CsrProcess != CurrentThread->Process) CsrUnlockProcess(CsrProcess);
     return Status;
 }
 

Modified: trunk/reactos/subsystems/win32/csrss/csrsrv/api/wapi.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/csrsrv/api/wapi.c?rev=55707&r1=55706&r2=55707&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/csrsrv/api/wapi.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/csrss/csrsrv/api/wapi.c [iso-8859-1] Sun Feb 19 10:12:14 2012
@@ -1183,7 +1183,7 @@
                 Thread = CsrLocateThreadByClientId(&Process, &Request->Header.ClientId);
                 if (!Thread)
                 {
-                    DPRINT("No thread found for request %lx and clientID %lx.%lx\n",
+                    DPRINT1("No thread found for request %lx and clientID %lx.%lx\n",
                             Request->Type & 0xFFFF,
                             Request->Header.ClientId.UniqueProcess,
                             Request->Header.ClientId.UniqueThread);




More information about the Ros-diffs mailing list