mirror of
https://github.com/reactos/reactos.git
synced 2024-12-26 17:14:41 +00:00
[NTOS:PS] Add query support for QUOTA_LIMITS_EX
This commit is contained in:
parent
bf0dbdbd19
commit
1e06829961
2 changed files with 51 additions and 32 deletions
|
@ -27,7 +27,9 @@ static const INFORMATION_CLASS_INFO PsProcessInfoClass[] =
|
|||
(
|
||||
QUOTA_LIMITS,
|
||||
ULONG,
|
||||
ICIF_QUERY | ICIF_SET | ICIF_SET_SIZE_VARIABLE
|
||||
|
||||
/* NOTE: ICIF_SIZE_VARIABLE is for QUOTA_LIMITS_EX support */
|
||||
ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
|
||||
),
|
||||
|
||||
/* ProcessIoCounters */
|
||||
|
|
|
@ -153,15 +153,19 @@ NtQueryInformationProcess(
|
|||
/* Process quota limits */
|
||||
case ProcessQuotaLimits:
|
||||
{
|
||||
PQUOTA_LIMITS QuotaLimits = (PQUOTA_LIMITS)ProcessInformation;
|
||||
QUOTA_LIMITS_EX QuotaLimits;
|
||||
BOOLEAN Extended;
|
||||
|
||||
if (ProcessInformationLength != sizeof(QUOTA_LIMITS))
|
||||
if (ProcessInformationLength != sizeof(QUOTA_LIMITS) &&
|
||||
ProcessInformationLength != sizeof(QUOTA_LIMITS_EX))
|
||||
{
|
||||
Status = STATUS_INFO_LENGTH_MISMATCH;
|
||||
break;
|
||||
}
|
||||
|
||||
Length = sizeof(QUOTA_LIMITS);
|
||||
/* Set return length */
|
||||
Length = ProcessInformationLength;
|
||||
Extended = (Length == sizeof(QUOTA_LIMITS_EX));
|
||||
|
||||
/* Reference the process */
|
||||
Status = ObReferenceObjectByHandle(ProcessHandle,
|
||||
|
@ -175,36 +179,49 @@ NtQueryInformationProcess(
|
|||
/* Indicate success */
|
||||
Status = STATUS_SUCCESS;
|
||||
|
||||
_SEH2_TRY
|
||||
{
|
||||
/* Set max/min working set sizes */
|
||||
QuotaLimits->MaximumWorkingSetSize =
|
||||
RtlZeroMemory(&QuotaLimits, sizeof(QuotaLimits));
|
||||
|
||||
/* Get max/min working set sizes */
|
||||
QuotaLimits.MaximumWorkingSetSize =
|
||||
Process->Vm.MaximumWorkingSetSize << PAGE_SHIFT;
|
||||
QuotaLimits->MinimumWorkingSetSize =
|
||||
QuotaLimits.MinimumWorkingSetSize =
|
||||
Process->Vm.MinimumWorkingSetSize << PAGE_SHIFT;
|
||||
|
||||
/* Set default time limits */
|
||||
QuotaLimits->TimeLimit.LowPart = MAXULONG;
|
||||
QuotaLimits->TimeLimit.HighPart = MAXULONG;
|
||||
/* Get default time limits */
|
||||
QuotaLimits.TimeLimit.QuadPart = -1LL;
|
||||
|
||||
/* Is quota block a default one? */
|
||||
if (Process->QuotaBlock == &PspDefaultQuotaBlock)
|
||||
{
|
||||
/* Set default pools and pagefile limits */
|
||||
QuotaLimits->PagedPoolLimit = (SIZE_T)-1;
|
||||
QuotaLimits->NonPagedPoolLimit = (SIZE_T)-1;
|
||||
QuotaLimits->PagefileLimit = (SIZE_T)-1;
|
||||
/* Get default pools and pagefile limits */
|
||||
QuotaLimits.PagedPoolLimit = (SIZE_T)-1;
|
||||
QuotaLimits.NonPagedPoolLimit = (SIZE_T)-1;
|
||||
QuotaLimits.PagefileLimit = (SIZE_T)-1;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Get limits from non-default quota block */
|
||||
QuotaLimits->PagedPoolLimit =
|
||||
QuotaLimits.PagedPoolLimit =
|
||||
Process->QuotaBlock->QuotaEntry[PsPagedPool].Limit;
|
||||
QuotaLimits->NonPagedPoolLimit =
|
||||
QuotaLimits.NonPagedPoolLimit =
|
||||
Process->QuotaBlock->QuotaEntry[PsNonPagedPool].Limit;
|
||||
QuotaLimits->PagefileLimit =
|
||||
QuotaLimits.PagefileLimit =
|
||||
Process->QuotaBlock->QuotaEntry[PsPageFile].Limit;
|
||||
}
|
||||
|
||||
/* Get additional information, if needed */
|
||||
if (Extended)
|
||||
{
|
||||
/* FIXME: Get the correct information */
|
||||
//QuotaLimits.WorkingSetLimit = (SIZE_T)-1; // Not used on Win2k3, it is set to 0
|
||||
QuotaLimits.Flags = QUOTA_LIMITS_HARDWS_MIN_DISABLE | QUOTA_LIMITS_HARDWS_MAX_DISABLE;
|
||||
QuotaLimits.CpuRateLimit.RateData = 0;
|
||||
}
|
||||
|
||||
/* Protect writes with SEH */
|
||||
_SEH2_TRY
|
||||
{
|
||||
RtlCopyMemory(ProcessInformation, &QuotaLimits, Length);
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue