[NTOSKRNL] Add a raw implementation of !irpfind in kdbg
[reactos.git] / ntoskrnl / ps / quota.c
index 42899dd..b813190 100644 (file)
@@ -95,9 +95,9 @@ PspReturnProcessQuotaSpecifiedPool(IN PEPROCESS Process,
 
 /* FUNCTIONS ***************************************************************/
 
+INIT_FUNCTION
 VOID
 NTAPI
-INIT_FUNCTION
 PsInitializeQuotaSystem(VOID)
 {
     RtlZeroMemory(&PspDefaultQuotaBlock, sizeof(PspDefaultQuotaBlock));
@@ -132,9 +132,9 @@ PspInsertQuotaBlock(
 {
     KIRQL OldIrql;
 
-    OldIrql = KfAcquireSpinLock(&PspQuotaLock);
+    KeAcquireSpinLock(&PspQuotaLock, &OldIrql);
     InsertTailList(&PspQuotaBlockList, &QuotaBlock->QuotaList);
-    KfReleaseSpinLock(&PspQuotaLock, OldIrql);
+    KeReleaseSpinLock(&PspQuotaLock, OldIrql);
 }
 
 VOID
@@ -147,9 +147,9 @@ PspDestroyQuotaBlock(PEPROCESS Process)
     if (QuotaBlock != &PspDefaultQuotaBlock &&
         InterlockedDecrementUL(&QuotaBlock->ReferenceCount) == 0)
     {
-        OldIrql = KfAcquireSpinLock(&PspQuotaLock);
+        KeAcquireSpinLock(&PspQuotaLock, &OldIrql);
         RemoveEntryList(&QuotaBlock->QuotaList);
-        KfReleaseSpinLock(&PspQuotaLock, OldIrql);
+        KeReleaseSpinLock(&PspQuotaLock, OldIrql);
         ExFreePool(QuotaBlock);
     }
 }
@@ -292,14 +292,13 @@ PsReturnProcessPageFileQuota(IN PEPROCESS Process,
 NTSTATUS
 NTAPI
 PspSetQuotaLimits(
-    _In_ HANDLE ProcessHandle,
+    _In_ PEPROCESS Process,
     _In_ ULONG Unused,
     _In_ PVOID QuotaLimits,
     _In_ ULONG QuotaLimitsLength,
     _In_ KPROCESSOR_MODE PreviousMode)
 {
     QUOTA_LIMITS_EX CapturedQuotaLimits;
-    PEPROCESS Process;
     PEPROCESS_QUOTA_BLOCK QuotaBlock, OldQuotaBlock;
     BOOLEAN IncreaseOkay;
     KAPC_STATE SavedApcState;
@@ -336,7 +335,7 @@ PspSetQuotaLimits(
                  (CapturedQuotaLimits.Flags & QUOTA_LIMITS_HARDWS_MAX_DISABLE)))
             {
                 DPRINT1("Invalid quota flags: 0x%lx\n", CapturedQuotaLimits.Flags);
-                return STATUS_INVALID_PARAMETER;
+                _SEH2_YIELD(return STATUS_INVALID_PARAMETER);
             }
 
             /* Verify that the caller didn't pass reserved values */
@@ -352,35 +351,22 @@ PspSetQuotaLimits(
                         CapturedQuotaLimits.Reserved3,
                         CapturedQuotaLimits.Reserved4,
                         CapturedQuotaLimits.CpuRateLimit.RateData);
-                return STATUS_INVALID_PARAMETER;
+                _SEH2_YIELD(return STATUS_INVALID_PARAMETER);
             }
         }
         else
         {
             DPRINT1("Invalid quota size: 0x%lx\n", QuotaLimitsLength);
-            return STATUS_INFO_LENGTH_MISMATCH;
+            _SEH2_YIELD(return STATUS_INFO_LENGTH_MISMATCH);
         }
     }
     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
     {
         DPRINT1("Exception while copying data\n");
-        return _SEH2_GetExceptionCode();
+        _SEH2_YIELD(return _SEH2_GetExceptionCode());
     }
     _SEH2_END;
 
-    /* Reference the process */
-    Status = ObReferenceObjectByHandle(ProcessHandle,
-                                       PROCESS_SET_QUOTA,
-                                       PsProcessType,
-                                       PreviousMode,
-                                       (PVOID*)&Process,
-                                       NULL);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("Failed to reference process handle: 0x%lx\n", Status);
-        return Status;
-    }
-
     /* Check the caller changes the working set size limits */
     if ((CapturedQuotaLimits.MinimumWorkingSetSize != 0) &&
         (CapturedQuotaLimits.MaximumWorkingSetSize != 0))
@@ -418,7 +404,6 @@ PspSetQuotaLimits(
         /* Check if the caller has the required privilege */
         if (!SeSinglePrivilegeCheck(SeIncreaseQuotaPrivilege, PreviousMode))
         {
-            ObDereferenceObject(Process);
             return STATUS_PRIVILEGE_NOT_HELD;
         }
 
@@ -443,7 +428,7 @@ PspSetQuotaLimits(
         QuotaBlock->QuotaEntry[2].Limit = PspDefaultQuotaBlock.QuotaEntry[2].Limit;
 
         /* Try to exchange the quota block, if that failed, just drop it */
-        OldQuotaBlock = InterlockedCompareExchangePointer(&Process->QuotaBlock,
+        OldQuotaBlock = InterlockedCompareExchangePointer((PVOID*)&Process->QuotaBlock,
                                                           QuotaBlock,
                                                           &PspDefaultQuotaBlock);
         if (OldQuotaBlock == &PspDefaultQuotaBlock)
@@ -459,9 +444,11 @@ PspSetQuotaLimits(
 
         Status = STATUS_SUCCESS;
     }
+    else
+    {
+        Status = STATUS_SUCCESS;
+    }
 
-    /* Dereference the process and return the status */
-    ObDereferenceObject(Process);
     return Status;
 }