Check for a valid console handle.
Modified: trunk/reactos/subsys/csrss/api/handle.c

Modified: trunk/reactos/subsys/csrss/api/handle.c
--- trunk/reactos/subsys/csrss/api/handle.c	2005-05-30 20:11:44 UTC (rev 15687)
+++ trunk/reactos/subsys/csrss/api/handle.c	2005-05-30 20:13:35 UTC (rev 15688)
@@ -22,6 +22,13 @@
 static unsigned ObjectDefinitionsCount = 0;
 static PCSRSS_OBJECT_DEFINITION ObjectDefinitions = NULL;
 
+BOOL 
+CsrIsConsoleHandle(HANDLE Handle)
+{
+  return ((((ULONG)Handle) & 0x10000003) == 0x3) ? TRUE : FALSE;
+}
+
+
 NTSTATUS FASTCALL
 CsrRegisterObjectDefinitions(PCSRSS_OBJECT_DEFINITION NewDefinitions)
 {
@@ -66,7 +73,7 @@
     {
       return STATUS_INVALID_PARAMETER;
     }
-  if (ProcessData->HandleTableSize <= h)
+  if (!CsrIsConsoleHandle(Handle) || ProcessData->HandleTableSize <= h)
     {
       DPRINT1("CsrGetObject returning invalid handle\n");
       return STATUS_INVALID_HANDLE;
@@ -117,7 +124,7 @@
     {
       return STATUS_INVALID_PARAMETER;
     }
-  if (h >= ProcessData->HandleTableSize || ProcessData->HandleTable[h] == NULL)
+  if (!CsrIsConsoleHandle(Handle) || h >= ProcessData->HandleTableSize || ProcessData->HandleTable[h] == NULL)
     {
       return STATUS_INVALID_HANDLE;
     }
@@ -133,7 +140,7 @@
 NTSTATUS STDCALL CsrInsertObject( PCSRSS_PROCESS_DATA ProcessData, PHANDLE Handle, Object_t *Object )
 {
    ULONG i;
-   PVOID* NewBlock;
+   PVOID* Block;
 
    if (ProcessData == NULL)
    {
@@ -151,19 +158,19 @@
      }
    if (i >= ProcessData->HandleTableSize)
      {
-       NewBlock = RtlAllocateHeap(CsrssApiHeap,
-			          HEAP_ZERO_MEMORY,
-			          (ProcessData->HandleTableSize + 64) * sizeof(HANDLE));
-       if (NewBlock == NULL)
+       Block = RtlAllocateHeap(CsrssApiHeap,
+			       HEAP_ZERO_MEMORY,
+			       (ProcessData->HandleTableSize + 64) * sizeof(HANDLE));
+       if (Block == NULL)
          {
            RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
 	   return(STATUS_UNSUCCESSFUL);
          }
-       RtlCopyMemory(NewBlock,
+       RtlCopyMemory(Block,
 		     ProcessData->HandleTable,
 		     ProcessData->HandleTableSize * sizeof(HANDLE));
-       RtlFreeHeap( CsrssApiHeap, 0, ProcessData->HandleTable );
-       ProcessData->HandleTable = (Object_t **)NewBlock;
+       Block = InterlockedExchangePointer(&ProcessData->HandleTable, Block);
+       RtlFreeHeap( CsrssApiHeap, 0, Block );
        ProcessData->HandleTableSize += 64;
      }
    ProcessData->HandleTable[i] = Object;
@@ -178,10 +185,10 @@
   ULONG h = (((ULONG)Handle) >> 2) - 1;
 
   if (ProcessData == NULL)
-  {
+    {
       return STATUS_INVALID_PARAMETER;
-  }
-  if (h >= ProcessData->HandleTableSize)
+    }
+  if (!CsrIsConsoleHandle(Handle) || h >= ProcessData->HandleTableSize)
     {
       return STATUS_INVALID_HANDLE;
     }