mirror of
https://github.com/reactos/reactos.git
synced 2025-07-03 16:31:22 +00:00
Additions and fix to NtQueryInformationProcess.
Patch by Mike Nordell. svn path=/trunk/; revision=5418
This commit is contained in:
parent
cc71b9ec7a
commit
c6f66985bf
1 changed files with 124 additions and 32 deletions
|
@ -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
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -928,12 +928,16 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
|
|||
IN CINT ProcessInformationClass,
|
||||
OUT PVOID ProcessInformation,
|
||||
IN ULONG ProcessInformationLength,
|
||||
OUT PULONG ReturnLength)
|
||||
OUT PULONG ReturnLength OPTIONAL)
|
||||
{
|
||||
PEPROCESS Process;
|
||||
NTSTATUS Status;
|
||||
PPROCESS_BASIC_INFORMATION ProcessBasicInformationP;
|
||||
|
||||
|
||||
/*
|
||||
* TODO: Here we should probably check that ProcessInformationLength
|
||||
* bytes indeed are writable at address ProcessInformation.
|
||||
*/
|
||||
|
||||
Status = ObReferenceObjectByHandle(ProcessHandle,
|
||||
PROCESS_SET_INFORMATION,
|
||||
PsProcessType,
|
||||
|
@ -944,48 +948,137 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
|
|||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
|
||||
switch (ProcessInformationClass)
|
||||
{
|
||||
case ProcessBasicInformation:
|
||||
ProcessBasicInformationP = (PPROCESS_BASIC_INFORMATION)
|
||||
ProcessInformation;
|
||||
ProcessBasicInformationP->ExitStatus = Process->ExitStatus;
|
||||
ProcessBasicInformationP->PebBaseAddress = Process->Peb;
|
||||
ProcessBasicInformationP->AffinityMask = Process->Pcb.Affinity;
|
||||
ProcessBasicInformationP->UniqueProcessId =
|
||||
Process->UniqueProcessId;
|
||||
ProcessBasicInformationP->InheritedFromUniqueProcessId =
|
||||
(ULONG)Process->InheritedFromUniqueProcessId;
|
||||
Status = STATUS_SUCCESS;
|
||||
if (ProcessInformationLength < sizeof(PROCESS_BASIC_INFORMATION))
|
||||
{
|
||||
Status = STATUS_INFO_LENGTH_MISMATCH;
|
||||
}
|
||||
else
|
||||
{
|
||||
PPROCESS_BASIC_INFORMATION ProcessBasicInformationP =
|
||||
(PPROCESS_BASIC_INFORMATION)ProcessInformation;
|
||||
ProcessBasicInformationP->ExitStatus = Process->ExitStatus;
|
||||
ProcessBasicInformationP->PebBaseAddress = Process->Peb;
|
||||
ProcessBasicInformationP->AffinityMask = Process->Pcb.Affinity;
|
||||
ProcessBasicInformationP->UniqueProcessId =
|
||||
Process->UniqueProcessId;
|
||||
ProcessBasicInformationP->InheritedFromUniqueProcessId =
|
||||
(ULONG)Process->InheritedFromUniqueProcessId;
|
||||
|
||||
if (ReturnLength)
|
||||
{
|
||||
*ReturnLength = sizeof(PROCESS_BASIC_INFORMATION);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case ProcessQuotaLimits:
|
||||
case ProcessIoCounters:
|
||||
case ProcessVmCounters:
|
||||
case ProcessTimes:
|
||||
case ProcessDebugPort:
|
||||
case ProcessLdtInformation:
|
||||
Status = STATUS_NOT_IMPLEMENTED;
|
||||
break;
|
||||
|
||||
case ProcessDefaultHardErrorMode:
|
||||
*((PULONG)ProcessInformation) = Process->DefaultHardErrorProcessing;
|
||||
break;
|
||||
|
||||
case ProcessWorkingSetWatch:
|
||||
Status = STATUS_NOT_IMPLEMENTED;
|
||||
break;
|
||||
|
||||
case ProcessWx86Information:
|
||||
case ProcessHandleCount:
|
||||
case ProcessPriorityBoost:
|
||||
case ProcessDeviceMap:
|
||||
case ProcessSessionInformation:
|
||||
case ProcessWow64Information:
|
||||
Status = STATUS_NOT_IMPLEMENTED;
|
||||
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 ProcessRaisePriority:
|
||||
case ProcessExceptionPort:
|
||||
|
@ -994,7 +1087,6 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
|
|||
case ProcessIoPortHandlers:
|
||||
case ProcessUserModeIOPL:
|
||||
case ProcessEnableAlignmentFaultFixup:
|
||||
case ProcessPriorityClass:
|
||||
case ProcessAffinityMask:
|
||||
case ProcessForegroundInformation:
|
||||
default:
|
||||
|
@ -1004,6 +1096,7 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle,
|
|||
return(Status);
|
||||
}
|
||||
|
||||
|
||||
NTSTATUS
|
||||
PspAssignPrimaryToken(PEPROCESS Process,
|
||||
HANDLE TokenHandle)
|
||||
|
@ -1089,7 +1182,6 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
|
|||
|
||||
case ProcessBasicInformation:
|
||||
case ProcessIoCounters:
|
||||
case ProcessVmCounters:
|
||||
case ProcessTimes:
|
||||
case ProcessPooledUsageAndLimits:
|
||||
case ProcessWx86Information:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue