[NTOSKRNL] Implement IopVerifyDeviceObjectOnStack()
authorPierre Schweitzer <pierre@reactos.org>
Fri, 5 Oct 2018 08:36:52 +0000 (10:36 +0200)
committerPierre Schweitzer <pierre@reactos.org>
Fri, 5 Oct 2018 08:49:59 +0000 (10:49 +0200)
ntoskrnl/io/iomgr/device.c

index 04f7d5d..189e47b 100644 (file)
@@ -687,6 +687,40 @@ IopGetRelatedTargetDevice(IN PFILE_OBJECT FileObject,
     return Status;
 }
 
     return Status;
 }
 
+BOOLEAN
+NTAPI
+IopVerifyDeviceObjectOnStack(IN PDEVICE_OBJECT BaseDeviceObject,
+                             IN PDEVICE_OBJECT TopDeviceObjectHint)
+{
+    KIRQL OldIrql;
+    BOOLEAN Result;
+    PDEVICE_OBJECT LoopObject;
+
+    ASSERT(BaseDeviceObject != NULL);
+
+    Result = FALSE;
+    /* Simply loop on the device stack and try to find our hint */
+    OldIrql = KeAcquireQueuedSpinLock(LockQueueIoDatabaseLock);
+    for (LoopObject = BaseDeviceObject; ; LoopObject = LoopObject->AttachedDevice)
+    {
+        /* It was found, it's a success */
+        if (LoopObject == TopDeviceObjectHint)
+        {
+            Result = TRUE;
+            break;
+        }
+
+        /* End of the stack, that's a failure - default */
+        if (LoopObject == NULL)
+        {
+            break;
+        }
+    }
+    KeReleaseQueuedSpinLock(LockQueueIoDatabaseLock, OldIrql);
+
+    return Result;
+}
+
 /* PUBLIC FUNCTIONS ***********************************************************/
 
 /*
 /* PUBLIC FUNCTIONS ***********************************************************/
 
 /*