enter a critical region before looking up a CID handle
Modified: trunk/reactos/ntoskrnl/ps/process.c
Modified: trunk/reactos/ntoskrnl/ps/thread.c
Modified: trunk/reactos/ntoskrnl/rtl/libsupp.c

Modified: trunk/reactos/ntoskrnl/ps/process.c
--- trunk/reactos/ntoskrnl/ps/process.c	2005-08-08 10:41:34 UTC (rev 17197)
+++ trunk/reactos/ntoskrnl/ps/process.c	2005-08-08 10:54:32 UTC (rev 17198)
@@ -477,6 +477,8 @@
     PEPROCESS FoundProcess;
     NTSTATUS Status = STATUS_INVALID_PARAMETER;
     PAGED_CODE();
+    
+    KeEnterCriticalRegion();
 
     /* Get the CID Handle Entry */
     if ((CidEntry = ExMapHandleToPointer(PspCidTable,
@@ -497,6 +499,8 @@
         /* Unlock the Entry */
         ExUnlockHandleTableEntry(PspCidTable, CidEntry);
     }
+    
+    KeLeaveCriticalRegion();
 
     /* Return to caller */
     return Status;
@@ -515,6 +519,8 @@
     PETHREAD FoundThread;
     NTSTATUS Status = STATUS_INVALID_CID;
     PAGED_CODE();
+    
+    KeEnterCriticalRegion();
 
     /* Get the CID Handle Entry */
     if ((CidEntry = ExMapHandleToPointer(PspCidTable,
@@ -544,6 +550,8 @@
         /* Unlock the Entry */
         ExUnlockHandleTableEntry(PspCidTable, CidEntry);
     }
+    
+    KeLeaveCriticalRegion();
 
     /* Return to caller */
     return Status;

Modified: trunk/reactos/ntoskrnl/ps/thread.c
--- trunk/reactos/ntoskrnl/ps/thread.c	2005-08-08 10:41:34 UTC (rev 17197)
+++ trunk/reactos/ntoskrnl/ps/thread.c	2005-08-08 10:54:32 UTC (rev 17198)
@@ -374,6 +374,8 @@
     PETHREAD FoundThread;
     NTSTATUS Status = STATUS_INVALID_PARAMETER;
     PAGED_CODE();
+    
+    KeEnterCriticalRegion();
 
     /* Get the CID Handle Entry */
     if ((CidEntry = ExMapHandleToPointer(PspCidTable,
@@ -394,6 +396,8 @@
         /* Unlock the Entry */
         ExUnlockHandleTableEntry(PspCidTable, CidEntry);
     }
+    
+    KeLeaveCriticalRegion();
 
     /* Return to caller */
     return Status;

Modified: trunk/reactos/ntoskrnl/rtl/libsupp.c
--- trunk/reactos/ntoskrnl/rtl/libsupp.c	2005-08-08 10:41:34 UTC (rev 17197)
+++ trunk/reactos/ntoskrnl/rtl/libsupp.c	2005-08-08 10:54:32 UTC (rev 17198)
@@ -261,11 +261,11 @@
    
    Handle = ExCreateHandle(AtomTable->ExHandleTable,
                                 &ExEntry);
-   HandleIndex = (USHORT)((ULONG_PTR)Handle >> 2);
    if (Handle != NULL)
    {
+      HandleIndex = (USHORT)((ULONG_PTR)Handle >> 2);
       /* FIXME - Handle Indexes >= 0xC000 ?! */
-      if (HandleIndex < 0xC000)
+      if ((ULONG_PTR)HandleIndex >> 2 < 0xC000)
       {
          Entry->HandleIndex = HandleIndex;
          Entry->Atom = 0xC000 + HandleIndex;
@@ -284,21 +284,23 @@
 RtlpGetAtomEntry(PRTL_ATOM_TABLE AtomTable, ULONG Index)
 {
    PHANDLE_TABLE_ENTRY ExEntry;
+   PRTL_ATOM_TABLE_ENTRY Entry = NULL;
    
+   /* NOTE: There's no need to explicitly enter a critical region because it's
+            guaranteed that we're in a critical region right now (as we hold
+            the atom table lock) */
+   
    ExEntry = ExMapHandleToPointer(AtomTable->ExHandleTable,
                                   (HANDLE)((ULONG_PTR)Index << 2));
    if (ExEntry != NULL)
    {
-      PRTL_ATOM_TABLE_ENTRY Entry;
-      
       Entry = ExEntry->u1.Object;
       
       ExUnlockHandleTableEntry(AtomTable->ExHandleTable,
                                ExEntry);
-      return Entry;
    }
    
-   return NULL;
+   return Entry;
 }
 
 /* FIXME - RtlpCreateUnicodeString is obsolete and should be removed ASAP! */