mirror of
https://github.com/reactos/reactos.git
synced 2025-07-03 22: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
|
* 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:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue