Additions and fix to NtQueryInformationProcess.

Patch by Mike Nordell.

svn path=/trunk/; revision=5418
This commit is contained in:
Eric Kohl 2003-08-04 20:44:54 +00:00
parent cc71b9ec7a
commit c6f66985bf

View file

@ -1,4 +1,4 @@
/* $Id: process.c,v 1.110 2003/07/21 21:53:53 royce Exp $ /* $Id: process.c,v 1.111 2003/08/04 20:44:54 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
@ -928,11 +928,15 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
IN CINT ProcessInformationClass, IN CINT ProcessInformationClass,
OUT PVOID ProcessInformation, OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength, IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength) OUT PULONG ReturnLength OPTIONAL)
{ {
PEPROCESS Process; PEPROCESS Process;
NTSTATUS Status; NTSTATUS Status;
PPROCESS_BASIC_INFORMATION ProcessBasicInformationP;
/*
* TODO: Here we should probably check that ProcessInformationLength
* bytes indeed are writable at address ProcessInformation.
*/
Status = ObReferenceObjectByHandle(ProcessHandle, Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_SET_INFORMATION, PROCESS_SET_INFORMATION,
@ -948,8 +952,14 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
switch (ProcessInformationClass) switch (ProcessInformationClass)
{ {
case ProcessBasicInformation: case ProcessBasicInformation:
ProcessBasicInformationP = (PPROCESS_BASIC_INFORMATION) if (ProcessInformationLength < sizeof(PROCESS_BASIC_INFORMATION))
ProcessInformation; {
Status = STATUS_INFO_LENGTH_MISMATCH;
}
else
{
PPROCESS_BASIC_INFORMATION ProcessBasicInformationP =
(PPROCESS_BASIC_INFORMATION)ProcessInformation;
ProcessBasicInformationP->ExitStatus = Process->ExitStatus; ProcessBasicInformationP->ExitStatus = Process->ExitStatus;
ProcessBasicInformationP->PebBaseAddress = Process->Peb; ProcessBasicInformationP->PebBaseAddress = Process->Peb;
ProcessBasicInformationP->AffinityMask = Process->Pcb.Affinity; ProcessBasicInformationP->AffinityMask = Process->Pcb.Affinity;
@ -957,35 +967,118 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
Process->UniqueProcessId; Process->UniqueProcessId;
ProcessBasicInformationP->InheritedFromUniqueProcessId = ProcessBasicInformationP->InheritedFromUniqueProcessId =
(ULONG)Process->InheritedFromUniqueProcessId; (ULONG)Process->InheritedFromUniqueProcessId;
Status = STATUS_SUCCESS;
if (ReturnLength)
{
*ReturnLength = sizeof(PROCESS_BASIC_INFORMATION);
}
}
break; break;
case ProcessQuotaLimits: case ProcessQuotaLimits:
case ProcessIoCounters: case ProcessIoCounters:
case ProcessVmCounters:
case ProcessTimes: case ProcessTimes:
case ProcessDebugPort: case ProcessDebugPort:
case ProcessLdtInformation: case ProcessLdtInformation:
Status = STATUS_NOT_IMPLEMENTED;
break;
case ProcessDefaultHardErrorMode:
*((PULONG)ProcessInformation) = Process->DefaultHardErrorProcessing;
break;
case ProcessWorkingSetWatch: case ProcessWorkingSetWatch:
Status = STATUS_NOT_IMPLEMENTED;
break;
case ProcessWx86Information: case ProcessWx86Information:
case ProcessHandleCount: case ProcessHandleCount:
case ProcessPriorityBoost:
case ProcessDeviceMap:
case ProcessSessionInformation: case ProcessSessionInformation:
case ProcessWow64Information: case ProcessWow64Information:
Status = STATUS_NOT_IMPLEMENTED; Status = STATUS_NOT_IMPLEMENTED;
break; break;
case ProcessVmCounters:
if (ProcessInformationLength < sizeof(VM_COUNTERS))
{
Status = STATUS_INFO_LENGTH_MISMATCH;
}
else
{
PVM_COUNTERS pOut = (PVM_COUNTERS)ProcessInformation;
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);
}
}
break;
case ProcessDefaultHardErrorMode:
if (ProcessInformationLength < sizeof(ULONG))
{
Status = STATUS_INFO_LENGTH_MISMATCH;
}
else
{
PULONG HardErrMode = (PULONG)ProcessInformation;
*HardErrMode = Process->DefaultHardErrorProcessing;
if (ReturnLength)
{
*ReturnLength = sizeof(ULONG);
}
}
break;
case ProcessPriorityBoost:
if (ProcessInformationLength < sizeof(ULONG))
{
Status = STATUS_INFO_LENGTH_MISMATCH;
}
else
{
PULONG BoostEnabled = (PULONG)ProcessInformation;
*BoostEnabled = Process->Pcb.DisableBoost ? FALSE : TRUE;
if (ReturnLength)
{
*ReturnLength = sizeof(ULONG);
}
}
break;
case ProcessDeviceMap:
Status = STATUS_NOT_IMPLEMENTED;
break;
case ProcessPriorityClass:
if (ProcessInformationLength < sizeof(USHORT))
{
Status = STATUS_INFO_LENGTH_MISMATCH;
}
else
{
PUSHORT Priority = (PUSHORT)ProcessInformation;
*Priority = Process->PriorityClass;
if (ReturnLength)
{
*ReturnLength = sizeof(USHORT);
}
}
break;
/*
* Note: The following 10 information classes are verified to not be
* implemented on NT, and do indeed return STATUS_INVALID_INFO_CLASS;
*/
case ProcessBasePriority: case ProcessBasePriority:
case ProcessRaisePriority: case ProcessRaisePriority:
case ProcessExceptionPort: case ProcessExceptionPort:
@ -994,7 +1087,6 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
case ProcessIoPortHandlers: case ProcessIoPortHandlers:
case ProcessUserModeIOPL: case ProcessUserModeIOPL:
case ProcessEnableAlignmentFaultFixup: case ProcessEnableAlignmentFaultFixup:
case ProcessPriorityClass:
case ProcessAffinityMask: case ProcessAffinityMask:
case ProcessForegroundInformation: case ProcessForegroundInformation:
default: default:
@ -1004,6 +1096,7 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
return(Status); return(Status);
} }
NTSTATUS NTSTATUS
PspAssignPrimaryToken(PEPROCESS Process, PspAssignPrimaryToken(PEPROCESS Process,
HANDLE TokenHandle) HANDLE TokenHandle)
@ -1089,7 +1182,6 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
case ProcessBasicInformation: case ProcessBasicInformation:
case ProcessIoCounters: case ProcessIoCounters:
case ProcessVmCounters:
case ProcessTimes: case ProcessTimes:
case ProcessPooledUsageAndLimits: case ProcessPooledUsageAndLimits:
case ProcessWx86Information: case ProcessWx86Information: