1. remove obsolete buffer size checks from NtQueryInformationProcess()
2. fixed some buffer checks
Modified: trunk/reactos/ntoskrnl/ex/event.c
Modified: trunk/reactos/ntoskrnl/ex/evtpair.c
Modified: trunk/reactos/ntoskrnl/ex/mutant.c
Modified: trunk/reactos/ntoskrnl/ex/profile.c
Modified: trunk/reactos/ntoskrnl/ex/sysinfo.c
Modified: trunk/reactos/ntoskrnl/io/event.c
Modified: trunk/reactos/ntoskrnl/ps/process.c

Modified: trunk/reactos/ntoskrnl/ex/event.c
--- trunk/reactos/ntoskrnl/ex/event.c	2005-01-22 12:45:03 UTC (rev 13209)
+++ trunk/reactos/ntoskrnl/ex/event.c	2005-01-22 13:34:27 UTC (rev 13210)
@@ -151,6 +151,11 @@
        Status = _SEH_GetExceptionCode();
      }
      _SEH_END;
+     
+     if(!NT_SUCCESS(Status))
+     {
+       return Status;
+     }
    }
  
    Status = ObCreateObject(PreviousMode,
@@ -285,6 +290,11 @@
        Status = _SEH_GetExceptionCode();
      }
      _SEH_END;
+     
+     if(!NT_SUCCESS(Status))
+     {
+       return Status;
+     }
    }
 
    Status = ObReferenceObjectByHandle(EventHandle,
@@ -421,6 +431,11 @@
        Status = _SEH_GetExceptionCode();
      }
      _SEH_END;
+     
+     if(!NT_SUCCESS(Status))
+     {
+       return Status;
+     }
    }
 
    Status = ObReferenceObjectByHandle(EventHandle,
@@ -481,6 +496,11 @@
        Status = _SEH_GetExceptionCode();
      }
      _SEH_END;
+     
+     if(!NT_SUCCESS(Status))
+     {
+       return Status;
+     }
    }
 
    Status = ObReferenceObjectByHandle(EventHandle,

Modified: trunk/reactos/ntoskrnl/ex/evtpair.c
--- trunk/reactos/ntoskrnl/ex/evtpair.c	2005-01-22 12:45:03 UTC (rev 13209)
+++ trunk/reactos/ntoskrnl/ex/evtpair.c	2005-01-22 13:34:27 UTC (rev 13210)
@@ -114,6 +114,11 @@
        Status = _SEH_GetExceptionCode();
      }
      _SEH_END;
+     
+     if(!NT_SUCCESS(Status))
+     {
+       return Status;
+     }
    }
 
    Status = ObCreateObject(ExGetPreviousMode(),
@@ -183,6 +188,11 @@
        Status = _SEH_GetExceptionCode();
      }
      _SEH_END;
+     
+     if(!NT_SUCCESS(Status))
+     {
+       return Status;
+     }
    }
 
    Status = ObOpenObjectByName(ObjectAttributes,

Modified: trunk/reactos/ntoskrnl/ex/mutant.c
--- trunk/reactos/ntoskrnl/ex/mutant.c	2005-01-22 12:45:03 UTC (rev 13209)
+++ trunk/reactos/ntoskrnl/ex/mutant.c	2005-01-22 13:34:27 UTC (rev 13210)
@@ -137,6 +137,11 @@
        Status = _SEH_GetExceptionCode();
      }
      _SEH_END;
+     
+     if(!NT_SUCCESS(Status))
+     {
+       return Status;
+     }
    }
 
   Status = ObCreateObject(PreviousMode,
@@ -343,6 +348,11 @@
        Status = _SEH_GetExceptionCode();
      }
      _SEH_END;
+     
+     if(!NT_SUCCESS(Status))
+     {
+       return Status;
+     }
    }
 
    Status = ObReferenceObjectByHandle(MutantHandle,

Modified: trunk/reactos/ntoskrnl/ex/profile.c
--- trunk/reactos/ntoskrnl/ex/profile.c	2005-01-22 12:45:03 UTC (rev 13209)
+++ trunk/reactos/ntoskrnl/ex/profile.c	2005-01-22 13:34:27 UTC (rev 13210)
@@ -119,10 +119,42 @@
 		IN KPROFILE_SOURCE ProfileSource,
 		IN KAFFINITY Affinity)
 {
-  HANDLE SafeProfileHandle;
-  NTSTATUS Status;
+  HANDLE hProfile;
   PKPROFILE Profile;
   PEPROCESS pProcess;
+  KPROCESSOR_MODE PreviousMode;
+  OBJECT_ATTRIBUTES ObjectAttributes;
+  NTSTATUS Status = STATUS_SUCCESS;
+  
+  PreviousMode = ExGetPreviousMode();
+  
+  if(BufferSize == 0)
+  {
+    return STATUS_INVALID_PARAMETER_7;
+  }
+  
+  if(PreviousMode != KernelMode)
+  {
+    _SEH_TRY
+    {
+      ProbeForWrite(ProfileHandle,
+                    sizeof(HANDLE),
+                    sizeof(ULONG));
+      ProbeForWrite(Buffer,
+                    BufferSize,
+                    sizeof(ULONG));
+    }
+    _SEH_HANDLE
+    {
+      Status = _SEH_GetExceptionCode();
+    }
+    _SEH_END;
+    
+    if(!NT_SUCCESS(Status))
+    {
+      return Status;
+    }
+  }
 
   /*
    * Reference the associated process
@@ -132,7 +164,7 @@
       Status = ObReferenceObjectByHandle(Process,
 					 PROCESS_QUERY_INFORMATION,
 					 PsProcessType,
-					 UserMode,
+					 PreviousMode,
 					 (PVOID*)&pProcess,
 					 NULL);
       if (!NT_SUCCESS(Status))
@@ -143,7 +175,11 @@
   else
     {
       pProcess = NULL;
-      /* FIXME: Check privilege. */
+      if(!SeSinglePrivilegeCheck(SeSystemProfilePrivilege,
+                                 PreviousMode))
+      {
+        return STATUS_PRIVILEGE_NOT_HELD;
+      }
     }
 
   /*
@@ -170,11 +206,17 @@
   /*
    * Create the object
    */
-  Status = ObCreateObject(ExGetPreviousMode(),
+  InitializeObjectAttributes(&ObjectAttributes,
+                             NULL,
+                             0,
+                             NULL,
+                             NULL);
+
+  Status = ObCreateObject(KernelMode,
 			  ExProfileObjectType,
+			  &ObjectAttributes,
+			  PreviousMode,
 			  NULL,
-			  ExGetPreviousMode(),
-			  NULL,
 			  sizeof(KPROFILE),
 			  0,
 			  0,
@@ -193,6 +235,7 @@
   Profile->BufferMdl = MmCreateMdl(NULL, Buffer, BufferSize);
   if(Profile->BufferMdl == NULL) {
 	DPRINT("MmCreateMdl: Out of memory!");
+	ObDereferenceObject (Profile);
 	return(STATUS_NO_MEMORY);
   }  
   MmProbeAndLockPages(Profile->BufferMdl, UserMode, IoWriteAccess);
@@ -212,7 +255,7 @@
 			   STANDARD_RIGHTS_ALL,
 			   0,
 			   NULL,
-			   &SafeProfileHandle);
+			   &hProfile);
   if (!NT_SUCCESS(Status))
     {
       ObDereferenceObject (Profile);
@@ -222,39 +265,70 @@
   /*
    * Copy the created handle back to the caller
    */
-  Status = MmCopyToCaller(ProfileHandle, &SafeProfileHandle, sizeof(HANDLE));
-  if (!NT_SUCCESS(Status))
-     {
-       ObDereferenceObject(Profile);
-       ZwClose(ProfileHandle);
-       return(Status);
-     }
+  _SEH_TRY
+  {
+    *ProfileHandle = hProfile;
+  }
+  _SEH_HANDLE
+  {
+    Status = _SEH_GetExceptionCode();
+  }
+  _SEH_END;
 
   ObDereferenceObject(Profile);
 
-  return(STATUS_SUCCESS);
+  return Status;
 }
 
 NTSTATUS STDCALL 
 NtQueryIntervalProfile(IN  KPROFILE_SOURCE ProfileSource,
 		       OUT PULONG Interval)
 {
-  NTSTATUS Status;
+  KPROCESSOR_MODE PreviousMode;
+  NTSTATUS Status = STATUS_SUCCESS;
+  
+  PreviousMode = ExGetPreviousMode();
+  
+  if(PreviousMode != KernelMode)
+  {
+    _SEH_TRY
+    {
+      ProbeForWrite(Interval,
+                    sizeof(ULONG),
+                    sizeof(ULONG));
+    }
+    _SEH_HANDLE
+    {
+      Status = _SEH_GetExceptionCode();
+    }
+    _SEH_END;
+    
+    if(!NT_SUCCESS(Status))
+    {
+      return Status;
+    }
+  }
 
   if (ProfileSource == ProfileTime)
     {
-      ULONG SafeInterval;
+      ULONG ReturnInterval;
 
       /* FIXME: What units does this use, for now nanoseconds */
-      SafeInterval = 100;
-      Status = MmCopyToCaller(Interval, &SafeInterval, sizeof(ULONG));
-      if (!NT_SUCCESS(Status))
-	{
-	  return(Status);
-	}
-      return(STATUS_SUCCESS);
+      ReturnInterval = 100;
+
+      _SEH_TRY
+      {
+        *Interval = ReturnInterval;
+      }
+      _SEH_HANDLE
+      {
+        Status = _SEH_GetExceptionCode();
+      }
+      _SEH_END;
+      
+      return Status;
     }
-  return(STATUS_INVALID_PARAMETER_2);
+  return STATUS_INVALID_PARAMETER_2;
 }
 
 NTSTATUS STDCALL 
@@ -267,13 +341,16 @@
 NTSTATUS STDCALL 
 NtStartProfile(IN HANDLE ProfileHandle)
 {
+  PKPROFILE Profile;
+  KPROCESSOR_MODE PreviousMode;
   NTSTATUS Status;
-  PKPROFILE Profile;
+  
+  PreviousMode = ExGetPreviousMode();
 
   Status = ObReferenceObjectByHandle(ProfileHandle,
 				     STANDARD_RIGHTS_ALL,
 				     ExProfileObjectType,
-				     UserMode,
+				     PreviousMode,
 				     (PVOID*)&Profile,
 				     NULL);
   if (!NT_SUCCESS(Status))
@@ -288,13 +365,16 @@
 NTSTATUS STDCALL 
 NtStopProfile(IN HANDLE ProfileHandle)
 {
+  PKPROFILE Profile;
+  KPROCESSOR_MODE PreviousMode;
   NTSTATUS Status;
-  PKPROFILE Profile;
+  
+  PreviousMode = ExGetPreviousMode();
 
   Status = ObReferenceObjectByHandle(ProfileHandle,
 				     STANDARD_RIGHTS_ALL,
 				     ExProfileObjectType,
-				     UserMode,
+				     PreviousMode,
 				     (PVOID*)&Profile,
 				     NULL);
   if (!NT_SUCCESS(Status))

Modified: trunk/reactos/ntoskrnl/ex/sysinfo.c
--- trunk/reactos/ntoskrnl/ex/sysinfo.c	2005-01-22 12:45:03 UTC (rev 13209)
+++ trunk/reactos/ntoskrnl/ex/sysinfo.c	2005-01-22 13:34:27 UTC (rev 13210)
@@ -95,7 +95,6 @@
 			       IN	ULONG		ValueBufferLength,
 			       IN OUT	PULONG		ReturnLength  OPTIONAL)
 {
-  NTSTATUS Status;
   ANSI_STRING AName;
   UNICODE_STRING WName;
   BOOLEAN Result;
@@ -103,21 +102,17 @@
   ANSI_STRING AValue;
   UNICODE_STRING WValue;
   KPROCESSOR_MODE PreviousMode;
+  NTSTATUS Status = STATUS_SUCCESS;
   
   PreviousMode = ExGetPreviousMode();
-
-  /*
-   * Copy the name to kernel space if necessary and convert it to ANSI.
-   */
-  Status = RtlCaptureUnicodeString(&WName,
-                                   PreviousMode,
-                                   NonPagedPool,
-                                   FALSE,
-                                   VariableName);
-  if(NT_SUCCESS(Status))
+  
+  if(PreviousMode != KernelMode)
   {
-    if(PreviousMode != KernelMode)
+    _SEH_TRY
     {
+      ProbeForRead(VariableName,
+                   sizeof(UNICODE_STRING),
+                   sizeof(ULONG));
       ProbeForWrite(ValueBuffer,
                     ValueBufferLength,
                     sizeof(WCHAR));
@@ -128,7 +123,28 @@
                       sizeof(ULONG));
       }
     }
+    _SEH_HANDLE
+    {
+      Status = _SEH_GetExceptionCode();
+    }
+    _SEH_END;
     
+    if(!NT_SUCCESS(Status))
+    {
+      return Status;
+    }
+  }
+
+  /*
+   * Copy the name to kernel space if necessary and convert it to ANSI.
+   */
+  Status = RtlCaptureUnicodeString(&WName,
+                                   PreviousMode,
+                                   NonPagedPool,
+                                   FALSE,
+                                   VariableName);
+  if(NT_SUCCESS(Status))
+  {
     /*
      * according to ntinternals the SeSystemEnvironmentName privilege is required!
      */

Modified: trunk/reactos/ntoskrnl/io/event.c
--- trunk/reactos/ntoskrnl/io/event.c	2005-01-22 12:45:03 UTC (rev 13209)
+++ trunk/reactos/ntoskrnl/io/event.c	2005-01-22 13:34:27 UTC (rev 13210)
@@ -65,26 +65,15 @@
 			     PHANDLE EventHandle)
 {
    OBJECT_ATTRIBUTES ObjectAttributes;
-   UNICODE_STRING CapturedEventName;
    KPROCESSOR_MODE PreviousMode;
    PKEVENT Event;
    HANDLE Handle;
    NTSTATUS Status;
    
    PreviousMode = ExGetPreviousMode();
-   
-   Status = RtlCaptureUnicodeString(&CapturedEventName,
-                                    PreviousMode,
-                                    NonPagedPool,
-                                    FALSE,
-                                    EventName);
-   if (!NT_SUCCESS(Status))
-     {
-	return NULL;
-     }
 
    InitializeObjectAttributes(&ObjectAttributes,
-			      &CapturedEventName,
+			      EventName,
 			      OBJ_OPENIF,
 			      NULL,
 			      NULL);
@@ -95,10 +84,6 @@
 			  SynchronizationEvent,
 			  TRUE);
 
-   RtlRelaseCapturedUnicodeString(&CapturedEventName,
-                                  PreviousMode,
-                                  FALSE);
-
    if (!NT_SUCCESS(Status))
      {
 	return NULL;

Modified: trunk/reactos/ntoskrnl/ps/process.c
--- trunk/reactos/ntoskrnl/ps/process.c	2005-01-22 12:45:03 UTC (rev 13209)
+++ trunk/reactos/ntoskrnl/ps/process.c	2005-01-22 13:34:27 UTC (rev 13210)
@@ -1208,39 +1208,34 @@
    switch (ProcessInformationClass)
      {
       case ProcessBasicInformation:
-	if (ProcessInformationLength != sizeof(PROCESS_BASIC_INFORMATION))
-	{
-	  Status = STATUS_INFO_LENGTH_MISMATCH;
-	}
-	else
-	{
-          PPROCESS_BASIC_INFORMATION ProcessBasicInformationP =
-	    (PPROCESS_BASIC_INFORMATION)ProcessInformation;
+      {
+        PPROCESS_BASIC_INFORMATION ProcessBasicInformationP =
+	  (PPROCESS_BASIC_INFORMATION)ProcessInformation;
 
-          _SEH_TRY
-          {
-	    ProcessBasicInformationP->ExitStatus = Process->ExitStatus;
-	    ProcessBasicInformationP->PebBaseAddress = Process->Peb;
-	    ProcessBasicInformationP->AffinityMask = Process->Pcb.Affinity;
-	    ProcessBasicInformationP->UniqueProcessId =
-	      Process->UniqueProcessId;
-	    ProcessBasicInformationP->InheritedFromUniqueProcessId =
-	      (ULONG)Process->InheritedFromUniqueProcessId;
-	    ProcessBasicInformationP->BasePriority =
-	      Process->Pcb.BasePriority;
+        _SEH_TRY
+        {
+	  ProcessBasicInformationP->ExitStatus = Process->ExitStatus;
+	  ProcessBasicInformationP->PebBaseAddress = Process->Peb;
+	  ProcessBasicInformationP->AffinityMask = Process->Pcb.Affinity;
+	  ProcessBasicInformationP->UniqueProcessId =
+	    Process->UniqueProcessId;
+	  ProcessBasicInformationP->InheritedFromUniqueProcessId =
+	    (ULONG)Process->InheritedFromUniqueProcessId;
+	  ProcessBasicInformationP->BasePriority =
+	    Process->Pcb.BasePriority;
 
-	    if (ReturnLength)
-	    {
-	      *ReturnLength = sizeof(PROCESS_BASIC_INFORMATION);
-	    }
-          }
-          _SEH_HANDLE
-          {
-            Status = _SEH_GetExceptionCode();
-          }
-          _SEH_END;
-	}
+	  if (ReturnLength)
+	  {
+	    *ReturnLength = sizeof(PROCESS_BASIC_INFORMATION);
+	  }
+        }
+        _SEH_HANDLE
+        {
+          Status = _SEH_GetExceptionCode();
+        }
+        _SEH_END;
 	break;
+      }
 
       case ProcessQuotaLimits:
       case ProcessIoCounters:
@@ -1248,56 +1243,43 @@
 	break;
 
       case ProcessTimes:
-	if (ProcessInformationLength != sizeof(KERNEL_USER_TIMES))
-	{
-	  Status = STATUS_INFO_LENGTH_MISMATCH;
-	}
-	else
-	{
-           PKERNEL_USER_TIMES ProcessTimeP = (PKERNEL_USER_TIMES)ProcessInformation;
-           _SEH_TRY
-           {
-	      ProcessTimeP->CreateTime = Process->CreateTime;
-              ProcessTimeP->UserTime.QuadPart = Process->Pcb.UserTime * 100000LL;
-              ProcessTimeP->KernelTime.QuadPart = Process->Pcb.KernelTime * 100000LL;
-	      ProcessTimeP->ExitTime = Process->ExitTime;
+      {
+         PKERNEL_USER_TIMES ProcessTimeP = (PKERNEL_USER_TIMES)ProcessInformation;
+         _SEH_TRY
+         {
+	    ProcessTimeP->CreateTime = Process->CreateTime;
+            ProcessTimeP->UserTime.QuadPart = Process->Pcb.UserTime * 100000LL;
+            ProcessTimeP->KernelTime.QuadPart = Process->Pcb.KernelTime * 100000LL;
+	    ProcessTimeP->ExitTime = Process->ExitTime;
 
-	     if (ReturnLength)
-	     {
-	       *ReturnLength = sizeof(KERNEL_USER_TIMES);
-	     }
-           }
-           _SEH_HANDLE
-           {
-             Status = _SEH_GetExceptionCode();
-           }
-           _SEH_END;
-	}
-	break;
+	   if (ReturnLength)
+	   {
+	     *ReturnLength = sizeof(KERNEL_USER_TIMES);
+	   }
+         }
+         _SEH_HANDLE
+         {
+           Status = _SEH_GetExceptionCode();
+         }
+         _SEH_END;
+	 break;
+      }
 
       case ProcessDebugPort:
       {
-      	if (ProcessInformationLength != sizeof(HANDLE))
-	{
-	  Status = STATUS_INFO_LENGTH_MISMATCH;
-	}
-	else
-	{
-          _SEH_TRY
-          {
-
-            *(PHANDLE)ProcessInformation = (Process->DebugPort != NULL ? (HANDLE)-1 : NULL);
-	    if (ReturnLength)
-	    {
-	      *ReturnLength = sizeof(HANDLE);
-	    }
-          }
-          _SEH_HANDLE
-          {
-            Status = _SEH_GetExceptionCode();
-          }
-          _SEH_END;
-	}
+        _SEH_TRY
+        {
+          *(PHANDLE)ProcessInformation = (Process->DebugPort != NULL ? (HANDLE)-1 : NULL);
+	  if (ReturnLength)
+	  {
+	    *ReturnLength = sizeof(HANDLE);
+	  }
+        }
+        _SEH_HANDLE
+        {
+          Status = _SEH_GetExceptionCode();
+        }
+        _SEH_END;
         break;
       }
       
@@ -1308,54 +1290,42 @@
 	break;
 
       case ProcessHandleCount:
-      	if (ProcessInformationLength != sizeof(ULONG))
-	{
-	  Status = STATUS_INFO_LENGTH_MISMATCH;
-	}
-	else
-	{
-	  ULONG HandleCount = ObpGetHandleCountByHandleTable(&Process->HandleTable);
+      {
+	ULONG HandleCount = ObpGetHandleCountByHandleTable(&Process->HandleTable);
 	  
-	  _SEH_TRY
+	_SEH_TRY
+	{
+          *(PULONG)ProcessInformation = HandleCount;
+	  if (ReturnLength)
 	  {
-            *(PULONG)ProcessInformation = HandleCount;
-	    if (ReturnLength)
-	    {
-	      *ReturnLength = sizeof(ULONG);
-	    }
+	    *ReturnLength = sizeof(ULONG);
 	  }
-	  _SEH_HANDLE
-	  {
-            Status = _SEH_GetExceptionCode();
-	  }
-	  _SEH_END;
 	}
+	_SEH_HANDLE
+	{
+          Status = _SEH_GetExceptionCode();
+	}
+	_SEH_END;
 	break;
+      }
 
       case ProcessSessionInformation:
       {
-        if (ProcessInformationLength != sizeof(PROCESS_SESSION_INFORMATION))
-        {
-          Status = STATUS_INFO_LENGTH_MISMATCH;
-        }
-        else
-        {
-          PPROCESS_SESSION_INFORMATION SessionInfo = (PPROCESS_SESSION_INFORMATION)ProcessInformation;
+        PPROCESS_SESSION_INFORMATION SessionInfo = (PPROCESS_SESSION_INFORMATION)ProcessInformation;
 
-          _SEH_TRY
+        _SEH_TRY
+        {
+          SessionInfo->SessionId = Process->SessionId;
+          if (ReturnLength)
           {
-            SessionInfo->SessionId = Process->SessionId;
-            if (ReturnLength)
-            {
-              *ReturnLength = sizeof(PROCESS_SESSION_INFORMATION);
-            }
+            *ReturnLength = sizeof(PROCESS_SESSION_INFORMATION);
           }
-          _SEH_HANDLE
-          {
-            Status = _SEH_GetExceptionCode();
-          }
-          _SEH_END;
         }
+        _SEH_HANDLE
+        {
+          Status = _SEH_GetExceptionCode();
+        }
+        _SEH_END;
         break;
       }
       
@@ -1365,148 +1335,123 @@
 	break;
 
       case ProcessVmCounters:
-	if (ProcessInformationLength != sizeof(VM_COUNTERS))
-	{
-	  Status = STATUS_INFO_LENGTH_MISMATCH;
-	}
-	else
-	{
-	  PVM_COUNTERS pOut = (PVM_COUNTERS)ProcessInformation;
+      {
+	PVM_COUNTERS pOut = (PVM_COUNTERS)ProcessInformation;
 	  
-	  _SEH_TRY
-	  {
-	    pOut->PeakVirtualSize            = Process->PeakVirtualSize;
-	    /*
-	     * Here we should probably use VirtualSize.LowPart, but due to
-	     * incompatibilities in current headers (no unnamed union),
-	     * I opted for cast.
-	     */
-	    pOut->VirtualSize                = (ULONG)Process->VirtualSize.QuadPart;
-	    pOut->PageFaultCount             = Process->Vm.PageFaultCount;
-	    pOut->PeakWorkingSetSize         = Process->Vm.PeakWorkingSetSize;
-	    pOut->WorkingSetSize             = Process->Vm.WorkingSetSize;
-	    pOut->QuotaPeakPagedPoolUsage    = Process->QuotaPeakPoolUsage[0]; // TODO: Verify!
-	    pOut->QuotaPagedPoolUsage        = Process->QuotaPoolUsage[0];     // TODO: Verify!
-	    pOut->QuotaPeakNonPagedPoolUsage = Process->QuotaPeakPoolUsage[1]; // TODO: Verify!
-	    pOut->QuotaNonPagedPoolUsage     = Process->QuotaPoolUsage[1];     // TODO: Verify!
-	    pOut->PagefileUsage              = Process->PagefileUsage;
-	    pOut->PeakPagefileUsage          = Process->PeakPagefileUsage;
+	_SEH_TRY
+	{
+	  pOut->PeakVirtualSize            = Process->PeakVirtualSize;
+	  /*
+	   * Here we should probably use VirtualSize.LowPart, but due to
+	   * incompatibilities in current headers (no unnamed union),
+	   * I opted for cast.
+	   */
+	  pOut->VirtualSize                = (ULONG)Process->VirtualSize.QuadPart;
+	  pOut->PageFaultCount             = Process->Vm.PageFaultCount;
+	  pOut->PeakWorkingSetSize         = Process->Vm.PeakWorkingSetSize;
+	  pOut->WorkingSetSize             = Process->Vm.WorkingSetSize;
+	  pOut->QuotaPeakPagedPoolUsage    = Process->QuotaPeakPoolUsage[0]; // TODO: Verify!
+	  pOut->QuotaPagedPoolUsage        = Process->QuotaPoolUsage[0];     // TODO: Verify!
+	  pOut->QuotaPeakNonPagedPoolUsage = Process->QuotaPeakPoolUsage[1]; // TODO: Verify!
+	  pOut->QuotaNonPagedPoolUsage     = Process->QuotaPoolUsage[1];     // TODO: Verify!
+	  pOut->PagefileUsage              = Process->PagefileUsage;
+	  pOut->PeakPagefileUsage          = Process->PeakPagefileUsage;
 
-	    if (ReturnLength)
-	    {
-	      *ReturnLength = sizeof(VM_COUNTERS);
-	    }
-          }
-          _SEH_HANDLE
-          {
-            Status = _SEH_GetExceptionCode();
-          }
-          _SEH_END;
-	}
+	  if (ReturnLength)
+	  {
+	    *ReturnLength = sizeof(VM_COUNTERS);
+	  }
+        }
+        _SEH_HANDLE
+        {
+          Status = _SEH_GetExceptionCode();
+        }
+        _SEH_END;
 	break;
+      }
 
       case ProcessDefaultHardErrorMode:
-	if (ProcessInformationLength != sizeof(ULONG))
+      {
+	PULONG HardErrMode = (PULONG)ProcessInformation;
+	_SEH_TRY
 	{
-	  Status = STATUS_INFO_LENGTH_MISMATCH;
-	}
-	else
-	{
-	  PULONG HardErrMode = (PULONG)ProcessInformation;
-	  _SEH_TRY
+	  *HardErrMode = Process->DefaultHardErrorProcessing;
+	  if (ReturnLength)
 	  {
-	    *HardErrMode = Process->DefaultHardErrorProcessing;
-	    if (ReturnLength)
-	    {
-	      *ReturnLength = sizeof(ULONG);
-	    }
+	    *ReturnLength = sizeof(ULONG);
 	  }
-	  _SEH_HANDLE
-	  {
-            Status = _SEH_GetExceptionCode();
-	  }
-	  _SEH_END;
 	}
+	_SEH_HANDLE
+	{
+          Status = _SEH_GetExceptionCode();
+	}
+	_SEH_END;
 	break;
+      }
 
       case ProcessPriorityBoost:
-	if (ProcessInformationLength != sizeof(ULONG))
-	{
-	  Status = STATUS_INFO_LENGTH_MISMATCH;
-	}
-	else
-	{
-	  PULONG BoostEnabled = (PULONG)ProcessInformation;
+      {
+	PULONG BoostEnabled = (PULONG)ProcessInformation;
 	  
-	  _SEH_TRY
-	  {
-	    *BoostEnabled = Process->Pcb.DisableBoost ? FALSE : TRUE;
+	_SEH_TRY
+	{
+	  *BoostEnabled = Process->Pcb.DisableBoost ? FALSE : TRUE;
 
-	    if (ReturnLength)
-	    {
-	      *ReturnLength = sizeof(ULONG);
-	    }
-          }
-          _SEH_HANDLE
-          {
-            Status = _SEH_GetExceptionCode();
-          }
-          _SEH_END;
-	}
+	  if (ReturnLength)
+	  {
+	    *ReturnLength = sizeof(ULONG);
+	  }
+        }
+        _SEH_HANDLE
+        {
+          Status = _SEH_GetExceptionCode();
+        }
+        _SEH_END;
 	break;
+      }
 
       case ProcessDeviceMap:
-	if (ProcessInformationLength != sizeof(PROCESS_DEVICEMAP_INFORMATION))
-        {
-	  Status = STATUS_INFO_LENGTH_MISMATCH;
-	}
-        else
-        {
-          PROCESS_DEVICEMAP_INFORMATION DeviceMap;
+      {
+        PROCESS_DEVICEMAP_INFORMATION DeviceMap;
           
-          ObQueryDeviceMapInformation(Process, &DeviceMap);
-          
-          _SEH_TRY
+        ObQueryDeviceMapInformation(Process, &DeviceMap);
+
+        _SEH_TRY
+        {
+          *(PPROCESS_DEVICEMAP_INFORMATION)ProcessInformation = DeviceMap;
+	  if (ReturnLength)
           {
-            *(PPROCESS_DEVICEMAP_INFORMATION)ProcessInformation = DeviceMap;
-	    if (ReturnLength)
-            {
-	      *ReturnLength = sizeof(PROCESS_DEVICEMAP_INFORMATION);
-	    }
-          }
-          _SEH_HANDLE
-          {
-            Status = _SEH_GetExceptionCode();
-          }
-          _SEH_END;
-	}
+	    *ReturnLength = sizeof(PROCESS_DEVICEMAP_INFORMATION);
+	  }
+        }
+        _SEH_HANDLE
+        {
+          Status = _SEH_GetExceptionCode();
+        }
+        _SEH_END;
 	break;
+      }
 
       case ProcessPriorityClass:
-	if (ProcessInformationLength != sizeof(USHORT))
+      {
+	PUSHORT Priority = (PUSHORT)ProcessInformation;
+
+	_SEH_TRY
 	{
-	  Status = STATUS_INFO_LENGTH_MISMATCH;
-	}
-	else
-	{
-	  PUSHORT Priority = (PUSHORT)ProcessInformation;
-	  
-	  _SEH_TRY
-	  {
-	    *Priority = Process->PriorityClass;
+	  *Priority = Process->PriorityClass;
 
-	    if (ReturnLength)
-	    {
-	      *ReturnLength = sizeof(USHORT);
-	    }
-          }
-          _SEH_HANDLE
-          {
-            Status = _SEH_GetExceptionCode();
-          }
-          _SEH_END;
-	}
+	  if (ReturnLength)
+	  {
+	    *ReturnLength = sizeof(USHORT);
+	  }
+        }
+        _SEH_HANDLE
+        {
+          Status = _SEH_GetExceptionCode();
+        }
+        _SEH_END;
 	break;
+      }
 
       case ProcessImageFileName:
       {
@@ -1620,6 +1565,7 @@
             }
           }
           
+          /* don't forget to detach from the process!!! */
           KeDetachProcess();
         }
         else