Author: ion
Date: Thu Feb 16 03:41:18 2012
New Revision: 55624
URL: 
http://svn.reactos.org/svn/reactos?rev=55624&view=rev
Log:
[CSRSRV]: Port the alloc/dealloc/insert/remove CsrProcess management functions from
CSRSRV2. There is no longer a hash table being used but instead a linked list just like in
real CSRSRV(2 for us). This brings us closer to the CSRSRV2 model and makes some of the
older ported code cleaner too.
Modified:
    trunk/reactos/subsystems/win32/csrss/csrsrv/api/process.c
    trunk/reactos/subsystems/win32/csrss/csrsrv/init.c
    trunk/reactos/subsystems/win32/csrss/csrsrv/procsup.c
    trunk/reactos/subsystems/win32/csrss/include/api.h
Modified: trunk/reactos/subsystems/win32/csrss/csrsrv/api/process.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/csr…
==============================================================================
--- 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] Thu Feb 16
03:41:18 2012
@@ -13,191 +13,428 @@
 #define NDEBUG
 #include <debug.h>
+#define CSR_SERVER_DLL_MAX 4
 #define LOCK   RtlEnterCriticalSection(&ProcessDataLock)
 #define UNLOCK RtlLeaveCriticalSection(&ProcessDataLock)
 #define CsrAcquireProcessLock() LOCK
 #define CsrReleaseProcessLock() UNLOCK
-
+#define ProcessStructureListLocked() \
+    (ProcessDataLock.OwningThread == NtCurrentTeb()->ClientId.UniqueThread)
+
 extern NTSTATUS CallProcessInherit(PCSR_PROCESS, PCSR_PROCESS);
 extern NTSTATUS CallProcessDeleted(PCSR_PROCESS);
 /* GLOBALS *******************************************************************/
-static ULONG NrProcess;
-PCSR_PROCESS ProcessData[256];
-RTL_CRITICAL_SECTION ProcessDataLock;
+RTL_CRITICAL_SECTION ProcessDataLock, CsrWaitListsLock;
 extern PCSR_PROCESS CsrRootProcess;
 extern LIST_ENTRY CsrThreadHashTable[256];
+extern ULONG CsrTotalPerProcessDataLength;
+LONG CsrProcessSequenceCount = 5;
 /* FUNCTIONS *****************************************************************/
-VOID WINAPI CsrInitProcessData(VOID)
-{
+/*++
+ * @name CsrAllocateProcess
+ * @implemented NT4
+ *
+ * The CsrAllocateProcess routine allocates a new CSR Process object.
+ *
+ * @return Pointer to the newly allocated CSR Process.
+ *
+ * @remarks None.
+ *
+ *--*/
+PCSR_PROCESS
+NTAPI
+CsrAllocateProcess(VOID)
+{
+    PCSR_PROCESS CsrProcess;
+    ULONG TotalSize;
+
+    /* Calculate the amount of memory this should take */
+    TotalSize = sizeof(CSR_PROCESS) +
+                (CSR_SERVER_DLL_MAX * sizeof(PVOID)) +
+                CsrTotalPerProcessDataLength;
+
+    /* Allocate a Process */
+    CsrProcess = RtlAllocateHeap(CsrHeap, HEAP_ZERO_MEMORY, TotalSize);
+    if (!CsrProcess) return NULL;
+
+    /* Handle the Sequence Number and protect against overflow */
+    CsrProcess->SequenceNumber = CsrProcessSequenceCount++;
+    if (CsrProcessSequenceCount < 5) CsrProcessSequenceCount = 5;
+
+    /* Increase the reference count */
+    CsrProcess->ReferenceCount++;
+
+    /* Initialize the Thread List */
+    InitializeListHead(&CsrProcess->ThreadList);
+
+    /* Return the Process */
+    return CsrProcess;
+}
+
+/*++
+ * @name CsrLockedReferenceProcess
+ *
+ * The CsrLockedReferenceProcess refences a CSR Process while the
+ * Process Lock is already being held.
+ *
+ * @param CsrProcess
+ *        Pointer to the CSR Process to be referenced.
+ *
+ * @return None.
+ *
+ * @remarks This routine will return with the Process Lock held.
+ *
+ *--*/
+VOID
+NTAPI
+CsrLockedReferenceProcess(IN PCSR_PROCESS CsrProcess)
+{
+    /* Increment the reference count */
+    ++CsrProcess->ReferenceCount;
+}
+
+/*++
+ * @name CsrServerInitialization
+ * @implemented NT4
+ *
+ * The CsrInitializeProcessStructure routine sets up support for CSR Processes
+ * and CSR Threads.
+ *
+ * @param None.
+ *
+ * @return STATUS_SUCCESS in case of success, STATUS_UNSUCCESSFUL
+ *         othwerwise.
+ *
+ * @remarks None.
+ *
+ *--*/
+NTSTATUS
+NTAPI
+CsrInitializeProcessStructure(VOID)
+{
+    NTSTATUS Status;
     ULONG i;
-   RtlZeroMemory (ProcessData, sizeof ProcessData);
-   NrProcess = sizeof ProcessData / sizeof ProcessData[0];
-   RtlInitializeCriticalSection( &ProcessDataLock );
+
+    /* Initialize the Lock */
+    Status = RtlInitializeCriticalSection(&ProcessDataLock);
+    if (!NT_SUCCESS(Status)) return Status;
+
+    /* Set up the Root Process */
+    CsrRootProcess = CsrAllocateProcess();
+    if (!CsrRootProcess) return STATUS_NO_MEMORY;
+
+    /* Set up the minimal information for it */
+    InitializeListHead(&CsrRootProcess->ListLink);
+    CsrRootProcess->ProcessHandle = (HANDLE)-1;
+    CsrRootProcess->ClientId = NtCurrentTeb()->ClientId;
+
+    /* Initialize the Thread Hash List */
+    for (i = 0; i < 256; i++) InitializeListHead(&CsrThreadHashTable[i]);
+
+    /* Initialize the Wait Lock */
+    return RtlInitializeCriticalSection(&CsrWaitListsLock);
+}
+
+/*++
+ * @name CsrDeallocateProcess
+ *
+ * The CsrDeallocateProcess frees the memory associated with a CSR Process.
+ *
+ * @param CsrProcess
+ *        Pointer to the CSR Process to be freed.
+ *
+ * @return None.
+ *
+ * @remarks Do not call this routine. It is reserved for the internal
+ *          thread management routines when a CSR Process has been cleanly
+ *          dereferenced and killed.
+ *
+ *--*/
+VOID
+NTAPI
+CsrDeallocateProcess(IN PCSR_PROCESS CsrProcess)
+{
+    /* Free the process object from the heap */
+    RtlFreeHeap(CsrHeap, 0, CsrProcess);
+}
+
+/*++
+ * @name CsrRemoveProcess
+ *
+ * The CsrRemoveProcess function undoes a CsrInsertProcess operation and
+ * removes the CSR Process from the Process List and notifies Server DLLs
+ * of this removal.
+ *
+ * @param CsrProcess
+ *        Pointer to the CSR Process to remove.
+ *
+ * @return None.
+ *
+ * @remarks None.
+ *
+ *--*/
+VOID
+NTAPI
+CsrRemoveProcess(IN PCSR_PROCESS CsrProcess)
+{
+#if 0
+    PCSR_SERVER_DLL ServerDll;
+    ULONG i;
+#endif
+    ASSERT(ProcessStructureListLocked());
+
+    /* Remove us from the Process List */
+    RemoveEntryList(&CsrProcess->ListLink);
+
+    /* Release the lock */
+    CsrReleaseProcessLock();
+#if 0
+    /* Loop every Server DLL */
+    for (i = 0; i < CSR_SERVER_DLL_MAX; i++)
+    {
+        /* Get the Server DLL */
+        ServerDll = CsrLoadedServerDll[i];
+
+        /* Check if it's valid and if it has a Disconnect Callback */
+        if (ServerDll && ServerDll->DisconnectCallback)
+        {
+            /* Call it */
+            (ServerDll->DisconnectCallback)(CsrProcess);
+        }
+    }
+#endif
+}
+
+/*++
+ * @name CsrInsertProcess
+ *
+ * The CsrInsertProcess routine inserts a CSR Process into the Process List
+ * and notifies Server DLLs of the creation of a new CSR Process.
+ *
+ * @param Parent
+ *        Optional pointer to the CSR Process creating this CSR Process.
+ *
+ * @param CurrentProcess
+ *        Optional pointer to the current CSR Process.
+ *
+ * @param CsrProcess
+ *        Pointer to the CSR Process which is to be inserted.
+ *
+ * @return None.
+ *
+ * @remarks None.
+ *
+ *--*/
+VOID
+NTAPI
+CsrInsertProcess(IN PCSR_PROCESS Parent OPTIONAL,
+                 IN PCSR_PROCESS CurrentProcess OPTIONAL,
+                 IN PCSR_PROCESS CsrProcess)
+{
+#if 0
+    PCSR_SERVER_DLL ServerDll;
+    ULONG i;
+#endif
+    ASSERT(ProcessStructureListLocked());
+
+    /* Set the parent */
+    CsrProcess->Parent = Parent;
+
+    /* Insert it into the Root List */
+    InsertTailList(&CsrRootProcess->ListLink, &CsrProcess->ListLink);
+#if 0
+    /* Notify the Server DLLs */
+    for (i = 0; i < CSR_SERVER_DLL_MAX; i++)
+    {
+        /* Get the current Server DLL */
+        ServerDll = CsrLoadedServerDll[i];
+
+        /* Make sure it's valid and that it has callback */
+        if ((ServerDll) && (ServerDll->NewProcessCallback))
+        {
+            ServerDll->NewProcessCallback(CurrentProcess, CsrProcess);
+        }
+    }
+#endif
+}
+
+/*++
+ * @name CsrLockProcessByClientId
+ * @implemented NT4
+ *
+ * The CsrLockProcessByClientId routine locks the CSR Process corresponding
+ * to the given Process ID and optionally returns it.
+ *
+ * @param Pid
+ *        Process ID corresponding to the CSR Process which will be locked.
+ *
+ * @param CsrProcess
+ *        Optional pointer to a CSR Process pointer which will hold the
+ *        CSR Process corresponding to the given Process ID.
+ *
+ * @return STATUS_SUCCESS in case of success, STATUS_UNSUCCESSFUL
+ *         othwerwise.
+ *
+ * @remarks Locking a CSR Process is defined as acquiring an extra
+ *          reference to it and returning with the Process Lock held.
+ *
+ *--*/
+NTSTATUS
+NTAPI
+CsrLockProcessByClientId(IN HANDLE Pid,
+                         OUT PCSR_PROCESS *CsrProcess)
+{
+    PLIST_ENTRY NextEntry;
+    PCSR_PROCESS CurrentProcess = NULL;
+
+    /* Acquire the lock */
+    CsrAcquireProcessLock();
+
+    /* Assume failure */
+    ASSERT(CsrProcess != NULL);
+    *CsrProcess = NULL;
+
+    /* Setup the List Pointers */
+    NextEntry = CsrRootProcess->ListLink.Flink;
+    while (NextEntry != &CsrRootProcess->ListLink)
+    {
+        /* Get the Process */
+        CurrentProcess = CONTAINING_RECORD(NextEntry, CSR_PROCESS, ListLink);
+
+        /* Check for PID Match */
+        if (CurrentProcess->ClientId.UniqueProcess == Pid) break;
+
+        /* Next entry */
+        NextEntry = NextEntry->Flink;
+    }
+
+    /* Check if we didn't find it in the list */
+    if (NextEntry == &CsrRootProcess->ListLink)
+    {
+        /* Nothing found, release the lock */
+        CsrReleaseProcessLock();
+        return STATUS_UNSUCCESSFUL;
+    }
+
+    /* Lock the found process and return it */
+    CsrLockedReferenceProcess(CurrentProcess);
+    *CsrProcess = CurrentProcess;
+    return STATUS_SUCCESS;
+}
+
+PCSR_PROCESS WINAPI CsrGetProcessData(HANDLE ProcessId)
+{
+    PCSR_PROCESS CsrProcess;
+    NTSTATUS Status;
+
+    Status = CsrLockProcessByClientId(ProcessId, &CsrProcess);
+    if (!NT_SUCCESS(Status)) return NULL;
+
+    UNLOCK;
+    return CsrProcess;
+}
+
+PCSR_PROCESS WINAPI CsrCreateProcessData(HANDLE ProcessId)
+{
+    PCSR_PROCESS pProcessData;
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    CLIENT_ID ClientId;
+    NTSTATUS Status;
+
+    LOCK;
-   CsrRootProcess = CsrCreateProcessData(NtCurrentTeb()->ClientId.UniqueProcess);
-
-   /* Initialize the Thread Hash List */
-   for (i = 0; i < 256; i++) InitializeListHead(&CsrThreadHashTable[i]);
-}
-
-PCSR_PROCESS WINAPI CsrGetProcessData(HANDLE ProcessId)
-{
-   ULONG hash;
-   PCSR_PROCESS pProcessData;
-
-   hash = ((ULONG_PTR)ProcessId >> 2) % (sizeof(ProcessData) /
sizeof(*ProcessData));
-
-   LOCK;
-
-   pProcessData = ProcessData[hash];
-
-   while (pProcessData && pProcessData->ClientId.UniqueProcess != ProcessId)
-   {
-      pProcessData = pProcessData->next;
-   }
-   UNLOCK;
-   return pProcessData;
-}
-
-PCSR_PROCESS WINAPI CsrCreateProcessData(HANDLE ProcessId)
-{
-   ULONG hash;
-   PCSR_PROCESS pProcessData;
-   OBJECT_ATTRIBUTES ObjectAttributes;
-   CLIENT_ID ClientId;
-   NTSTATUS Status;
-
-   hash = ((ULONG_PTR)ProcessId >> 2) % (sizeof(ProcessData) /
sizeof(*ProcessData));
-
-   LOCK;
-
-   pProcessData = ProcessData[hash];
-
-   while (pProcessData && pProcessData->ClientId.UniqueProcess != ProcessId)
-   {
-      pProcessData = pProcessData->next;
-   }
-   if (pProcessData == NULL)
-   {
-      pProcessData = RtlAllocateHeap(CsrHeap,
-                                    HEAP_ZERO_MEMORY,
-                                    sizeof(CSR_PROCESS));
-      if (pProcessData)
-      {
-        pProcessData->ClientId.UniqueProcess = ProcessId;
-        pProcessData->next = ProcessData[hash];
-        ProcessData[hash] = pProcessData;
-
-         ClientId.UniqueThread = NULL;
-         ClientId.UniqueProcess = pProcessData->ClientId.UniqueProcess;
-         InitializeObjectAttributes(&ObjectAttributes,
-                                    NULL,
-                                    0,
-                                    NULL,
-                                    NULL);
-
-         /* using OpenProcess is not optimal due to HANDLE vs. DWORD PIDs... */
-         Status = NtOpenProcess(&pProcessData->ProcessHandle,
-                                PROCESS_ALL_ACCESS,
-                                &ObjectAttributes,
-                                &ClientId);
-         DPRINT("CSR Process: %p Handle: %p\n", pProcessData,
pProcessData->ProcessHandle);
-         if (!NT_SUCCESS(Status))
-         {
-            ProcessData[hash] = pProcessData->next;
-           RtlFreeHeap(CsrHeap, 0, pProcessData);
-           pProcessData = NULL;
-         }
-         else
-         {
-            RtlInitializeCriticalSection(&pProcessData->HandleTableLock);
-         }
-      }
-   }
-   else
-   {
-      DPRINT1("Process data for pid %d already exist\n", ProcessId);
-   }
-   UNLOCK;
-   if (pProcessData == NULL)
-   {
-      DPRINT1("CsrCreateProcessData() failed\n");
-   }
-   else
-   {
-      pProcessData->Flags = ~CsrProcessTerminated;
-
-      /* Set default shutdown parameters */
-      pProcessData->ShutdownLevel = 0x280;
-      pProcessData->ShutdownFlags = 0;
-   }
-
-   pProcessData->ThreadCount = 0;
-   InitializeListHead(&pProcessData->ThreadList);
-   return pProcessData;
+    pProcessData = CsrAllocateProcess();
+    ASSERT(pProcessData != NULL);
+
+    pProcessData->ClientId.UniqueProcess = ProcessId;
+
+    ClientId.UniqueThread = NULL;
+    ClientId.UniqueProcess = pProcessData->ClientId.UniqueProcess;
+    InitializeObjectAttributes(&ObjectAttributes,
+                               NULL,
+                               0,
+                               NULL,
+                               NULL);
+
+    /* using OpenProcess is not optimal due to HANDLE vs. DWORD PIDs... */
+    Status = NtOpenProcess(&pProcessData->ProcessHandle,
+                           PROCESS_ALL_ACCESS,
+                           &ObjectAttributes,
+                           &ClientId);
+    DPRINT("CSR Process: %p Handle: %p\n", pProcessData,
pProcessData->ProcessHandle);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("Failed\n");
+        CsrDeallocateProcess(pProcessData);
+        CsrReleaseProcessLock();
+        return NULL;
+    }
+    else
+    {
+        RtlInitializeCriticalSection(&pProcessData->HandleTableLock);
+    }
+
+    /* Set default shutdown parameters */
+    pProcessData->ShutdownLevel = 0x280;
+    pProcessData->ShutdownFlags = 0;
+
+    /* Insert the Process */
+    CsrInsertProcess(NULL, NULL, pProcessData);
+
+    /* Release lock and return */
+    CsrReleaseProcessLock();
+    return pProcessData;
 }
 NTSTATUS WINAPI CsrFreeProcessData(HANDLE Pid)
 {
-  ULONG hash;
-  PCSR_PROCESS pProcessData, *pPrevLink;
-  HANDLE Process;
-  PLIST_ENTRY NextEntry;
-  PCSR_THREAD Thread;
-
-  hash = ((ULONG_PTR)Pid >> 2) % (sizeof(ProcessData) / sizeof(*ProcessData));
-  pPrevLink = &ProcessData[hash];
-
-  LOCK;
-
-  while ((pProcessData = *pPrevLink) && pProcessData->ClientId.UniqueProcess
!= Pid)
-    {
-      pPrevLink = &pProcessData->next;
-    }
-
-  if (pProcessData)
-    {
-      DPRINT("CsrFreeProcessData pid: %d\n", Pid);
-      Process = pProcessData->ProcessHandle;
-      CallProcessDeleted(pProcessData);
-
-      /* Dereference all process threads */
-      NextEntry = pProcessData->ThreadList.Flink;
-      while (NextEntry != &pProcessData->ThreadList)
-      {
+    PCSR_PROCESS pProcessData;
+    HANDLE Process;
+    PLIST_ENTRY NextEntry;
+    PCSR_THREAD Thread;
+
+    pProcessData = CsrGetProcessData(Pid);
+    if (!pProcessData) return STATUS_INVALID_PARAMETER;
+
+    LOCK;
+
+    Process = pProcessData->ProcessHandle;
+    CallProcessDeleted(pProcessData);
+
+    /* Dereference all process threads */
+    NextEntry = pProcessData->ThreadList.Flink;
+    while (NextEntry != &pProcessData->ThreadList)
+    {
         Thread = CONTAINING_RECORD(NextEntry, CSR_THREAD, Link);
         NextEntry = NextEntry->Flink;
         CsrThreadRefcountZero(Thread);
-      }
-
-      if (pProcessData->ClientViewBase)
-        {
-          NtUnmapViewOfSection(NtCurrentProcess(),
(PVOID)pProcessData->ClientViewBase);
-        }
-
-      if (pProcessData->ClientPort)
-        {
-          NtClose(pProcessData->ClientPort);
-        }
-
-      *pPrevLink = pProcessData->next;
-
-      RtlFreeHeap(CsrHeap, 0, pProcessData);
-      UNLOCK;
-      if (Process)
-        {
-          NtClose(Process);
-        }
-      return STATUS_SUCCESS;
-   }
-
-   UNLOCK;
-   return STATUS_INVALID_PARAMETER;
+    }
+
+    if (pProcessData->ClientViewBase)
+    {
+        NtUnmapViewOfSection(NtCurrentProcess(), (PVOID)pProcessData->ClientViewBase);
+    }
+
+    if (pProcessData->ClientPort)
+    {
+        NtClose(pProcessData->ClientPort);
+    }
+
+    CsrRemoveProcess(pProcessData);
+
+    CsrDeallocateProcess(pProcessData);
+
+    if (Process)
+    {
+      NtClose(Process);
+    }
+
+    return STATUS_SUCCESS;
 }
 /**********************************************************************
@@ -251,12 +488,7 @@
     CurrentThread = NtCurrentTeb()->CsrClientThread;
     CsrProcess = CurrentThread->Process;
-//    DPRINT1("Current thread: %p %p\n", CurrentThread, CsrProcess);
-//    DPRINT1("Request CID: %lx %lx %lx\n",
-//            CsrProcess->ClientId.UniqueProcess,
-//            NtCurrentTeb()->ClientId.UniqueProcess,
- //           Request->Data.CreateThreadRequest.ClientId.UniqueProcess);
-
+
     if (CsrProcess->ClientId.UniqueProcess !=
Request->Data.CreateThreadRequest.ClientId.UniqueProcess)
     {
         if (Request->Data.CreateThreadRequest.ClientId.UniqueProcess ==
NtCurrentTeb()->ClientId.UniqueProcess)
@@ -266,15 +498,9 @@
         Status =
CsrLockProcessByClientId(Request->Data.CreateThreadRequest.ClientId.UniqueProcess,
                                           &CsrProcess);
-  //      DPRINT1("Found matching process: %p\n", CsrProcess);
         if (!NT_SUCCESS(Status)) return Status;
     }
-//    DPRINT1("PIDs: %lx %lx\n",
CurrentThread->Process->ClientId.UniqueProcess,
CsrProcess->ClientId.UniqueProcess);
-//    DPRINT1("Thread handle is: %lx Process Handle is: %lx %lx\n",
-       //     Request->Data.CreateThreadRequest.ThreadHandle,
-     //       CurrentThread->Process->ProcessHandle,
-   //         CsrProcess->Process);
     Status = NtDuplicateObject(CsrProcess->ProcessHandle,
                                Request->Data.CreateThreadRequest.ThreadHandle,
                                NtCurrentProcess(),
@@ -282,7 +508,6 @@
                                0,
                                0,
                                DUPLICATE_SAME_ACCESS);
-    //DPRINT1("Duplicate status: %lx\n", Status);
     if (!NT_SUCCESS(Status))
     {
         Status = NtDuplicateObject(CurrentThread->Process->ProcessHandle,
@@ -292,7 +517,6 @@
                                    0,
                                    0,
                                    DUPLICATE_SAME_ACCESS);
-       // DPRINT1("Duplicate status: %lx\n", Status);
     }
     Status = STATUS_SUCCESS; // hack
@@ -301,7 +525,6 @@
         Status = CsrCreateThread(CsrProcess,
                                      ThreadHandle,
                                      &Request->Data.CreateThreadRequest.ClientId);
-       // DPRINT1("Create status: %lx\n", Status);
     }
     if (CsrProcess != CurrentThread->Process) CsrReleaseProcessLock();
Modified: trunk/reactos/subsystems/win32/csrss/csrsrv/init.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/csr…
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/csrsrv/init.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/csrss/csrsrv/init.c [iso-8859-1] Thu Feb 16 03:41:18
2012
@@ -1117,6 +1117,15 @@
         return Status;
     }
+    /* Set up Process Support */
+    Status = CsrInitializeProcessStructure();
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("CSRSRV:%s: CsrInitializeProcessStructure failed
(Status=%08lx)\n",
+                __FUNCTION__, Status);
+        return Status;
+    }
+
     /* Parse the command line */
     Status = CsrParseServerCommandLine(ArgumentCount, Arguments);
     if (!NT_SUCCESS(Status))
@@ -1125,8 +1134,6 @@
                 __FUNCTION__, Status);
         return Status;
     }
-
-    CsrInitProcessData();
     Status = CsrApiRegisterDefinitions(NativeDefinitions);
     if (!NT_SUCCESS(Status))
Modified: trunk/reactos/subsystems/win32/csrss/csrsrv/procsup.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/csr…
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/csrsrv/procsup.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/csrss/csrsrv/procsup.c [iso-8859-1] Thu Feb 16 03:41:18
2012
@@ -23,7 +23,6 @@
 /* GLOBALS ********************************************************************/
 extern RTL_CRITICAL_SECTION ProcessDataLock;
-extern PCSR_PROCESS ProcessData[256];
 PCSR_PROCESS CsrRootProcess;
 SECURITY_QUALITY_OF_SERVICE CsrSecurityQos =
 {
@@ -225,63 +224,63 @@
 NTAPI
 FindProcessForShutdown(IN PLUID CallerLuid)
 {
-    ULONG Hash;
     PCSR_PROCESS CsrProcess, ReturnCsrProcess = NULL;
     NTSTATUS Status;
     ULONG Level = 0;
     LUID ProcessLuid;
     LUID SystemLuid = SYSTEM_LUID;
     BOOLEAN IsSystemLuid = FALSE, IsOurLuid = FALSE;
-
-    for (Hash = 0; Hash < (sizeof(ProcessData) / sizeof(*ProcessData)); Hash++)
-    {
-        /* Get this process hash bucket */
-        CsrProcess = ProcessData[Hash];
-        while (CsrProcess)
-        {
-            /* Skip this process if it's already been processed*/
-            if (CsrProcess->Flags & CsrProcessSkipShutdown) goto Next;
+    PLIST_ENTRY NextEntry;
+
+    /* Set the List Pointers */
+    NextEntry = CsrRootProcess->ListLink.Flink;
+    while (NextEntry != &CsrRootProcess->ListLink)
+    {
+        /* Get the process */
+        CsrProcess = CONTAINING_RECORD(NextEntry, CSR_PROCESS, ListLink);
+
+        /* Move to the next entry */
+        NextEntry = NextEntry->Flink;
-            /* Get the LUID of this Process */
-            Status = CsrGetProcessLuid(CsrProcess->ProcessHandle, &ProcessLuid);
-
-            /* Check if we didn't get access to the LUID */
-            if (Status == STATUS_ACCESS_DENIED)
-            {
-                /* FIXME:Check if we have any threads */
-            }
-
-            if (!NT_SUCCESS(Status))
-            {
-                /* We didn't have access, so skip it */
-                CsrProcess->Flags |= CsrProcessSkipShutdown;
-                goto Next;
-            }
-
-            /* Check if this is the System LUID */
-            if ((IsSystemLuid = RtlEqualLuid(&ProcessLuid, &SystemLuid)))
-            {
-                /* Mark this process */
-                CsrProcess->ShutdownFlags |= CsrShutdownSystem;
-            }
-            else if (!(IsOurLuid = RtlEqualLuid(&ProcessLuid, CallerLuid)))
-            {
-                /* Our LUID doesn't match with the caller's */
-                CsrProcess->ShutdownFlags |= CsrShutdownOther;
-            }
-
-            /* Check if we're past the previous level */
-            if (CsrProcess->ShutdownLevel > Level)
-            {
-                /* Update the level */
-                Level = CsrProcess->ShutdownLevel;
-
-                /* Set the final process */
-                ReturnCsrProcess = CsrProcess;
-            }
-Next:
-            /* Next process */
-            CsrProcess = CsrProcess->next;
+        /* Skip this process if it's already been processed */
+        if (CsrProcess->Flags & CsrProcessSkipShutdown) continue;
+
+        /* Get the LUID of this Process */
+        Status = CsrGetProcessLuid(CsrProcess->ProcessHandle, &ProcessLuid);
+
+        /* Check if we didn't get access to the LUID */
+        if (Status == STATUS_ACCESS_DENIED)
+        {
+            /* FIXME:Check if we have any threads */
+        }
+
+        if (!NT_SUCCESS(Status))
+        {
+            /* We didn't have access, so skip it */
+            CsrProcess->Flags |= CsrProcessSkipShutdown;
+            continue;
+        }
+
+        /* Check if this is the System LUID */
+        if ((IsSystemLuid = RtlEqualLuid(&ProcessLuid, &SystemLuid)))
+        {
+            /* Mark this process */
+            CsrProcess->ShutdownFlags |= CsrShutdownSystem;
+        }
+        else if (!(IsOurLuid = RtlEqualLuid(&ProcessLuid, CallerLuid)))
+        {
+            /* Our LUID doesn't match with the caller's */
+            CsrProcess->ShutdownFlags |= CsrShutdownOther;
+        }
+
+        /* Check if we're past the previous level */
+        if (CsrProcess->ShutdownLevel > Level)
+        {
+            /* Update the level */
+            Level = CsrProcess->ShutdownLevel;
+
+            /* Set the final process */
+            ReturnCsrProcess = CsrProcess;
         }
     }
@@ -306,28 +305,27 @@
     PCSR_PROCESS CsrProcess = NULL;
     NTSTATUS Status = STATUS_UNSUCCESSFUL;
     BOOLEAN FirstTry;
+    PLIST_ENTRY NextEntry;
     ULONG Result = 0;
-    ULONG Hash;
     /* Acquire process lock */
     CsrAcquireProcessLock();
-
-    /* Start the loop */
-    for (Hash = 0; Hash < (sizeof(ProcessData) / sizeof(*ProcessData)); Hash++)
+
+    /* Get the list pointers */
+    NextEntry = CsrRootProcess->ListLink.Flink;
+    while (NextEntry != &CsrRootProcess->ListLink)
     {
         /* Get the Process */
-        CsrProcess = ProcessData[Hash];
-        while (CsrProcess)
-        {
-           /* Remove the skip flag, set shutdown flags to 0*/
-            CsrProcess->Flags &= ~CsrProcessSkipShutdown;
-            CsrProcess->ShutdownFlags = 0;
-
-            /* Move to the next */
-            CsrProcess = CsrProcess->next;
-        }
-    }
-
+        CsrProcess = CONTAINING_RECORD(NextEntry, CSR_PROCESS, ListLink);
+
+        /* Remove the skip flag, set shutdown flags to 0*/
+        CsrProcess->Flags &= ~CsrProcessSkipShutdown;
+        CsrProcess->ShutdownFlags = 0;
+
+        /* Move to the next */
+        NextEntry = NextEntry->Flink;
+    }
+
     /* Set shudown Priority */
     CsrSetToShutdownPriority();
@@ -390,48 +388,6 @@
 NTSTATUS
 NTAPI
-CsrLockProcessByClientId(IN HANDLE Pid,
-                         OUT PCSR_PROCESS *CsrProcess OPTIONAL)
-{
-    ULONG Hash;
-    PCSR_PROCESS CurrentProcess = NULL;
-    NTSTATUS Status = STATUS_UNSUCCESSFUL;
-
-    /* Acquire the lock */
-    CsrAcquireProcessLock();
-
-    /* Start the loop */
-    for (Hash = 0; Hash < (sizeof(ProcessData) / sizeof(*ProcessData)); Hash++)
-    {
-        /* Get the Process */
-        CurrentProcess = ProcessData[Hash];
-        while (CurrentProcess)
-        {
-            /* Check for PID match */
-            if (CurrentProcess->ClientId.UniqueProcess == Pid)
-            {
-                /* Get out of here with success */
-//                DPRINT1("Found %p for PID %lx\n", CurrentProcess, Pid);
-                Status = STATUS_SUCCESS;
-                goto Found;
-            }
-
-            /* Move to the next */
-            CurrentProcess = CurrentProcess->next;
-        }
-    }
-
-    /* Nothing found, release the lock */
-Found:
-    if (!CurrentProcess) CsrReleaseProcessLock();
-
-    /* Return the status and process */
-    if (CsrProcess) *CsrProcess = CurrentProcess;
-    return Status;
-}
-
-NTSTATUS
-NTAPI
 CsrUnlockProcess(IN PCSR_PROCESS CsrProcess)
 {
     /* Dereference the process */
Modified: trunk/reactos/subsystems/win32/csrss/include/api.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/csrss/inc…
==============================================================================
--- trunk/reactos/subsystems/win32/csrss/include/api.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/csrss/include/api.h [iso-8859-1] Thu Feb 16 03:41:18
2012
@@ -84,7 +84,6 @@
     ULONG ShutdownLevel;
     ULONG ShutdownFlags;
 //    PVOID ServerData[ANYSIZE_ARRAY];
-    struct _CSR_PROCESS* next;
     CSRSS_CON_PROCESS_DATA;
 } CSR_PROCESS, *PCSR_PROCESS;
@@ -154,7 +153,7 @@
 /* api/process.c */
 typedef NTSTATUS (WINAPI *CSRSS_ENUM_PROCESS_PROC)(PCSR_PROCESS ProcessData,
                                                     PVOID Context);
-VOID WINAPI CsrInitProcessData(VOID);
+NTSTATUS WINAPI CsrInitializeProcessStructure(VOID);
 PCSR_PROCESS WINAPI CsrGetProcessData(HANDLE ProcessId);
 PCSR_PROCESS WINAPI CsrCreateProcessData(HANDLE ProcessId);
 NTSTATUS WINAPI CsrFreeProcessData( HANDLE Pid );