From 645acc270a0a442b194f8212bb7df1efc355b35a Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Wed, 23 Dec 2015 11:26:28 +0000 Subject: [PATCH] [NTOSKRNL] - Raise the IRQL when enumerating device lists so it doesn't get edited mid-listing - Don't hardcode the pointer size when checking the buffer size svn path=/trunk/; revision=70408 --- reactos/ntoskrnl/io/iomgr/device.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/device.c b/reactos/ntoskrnl/io/iomgr/device.c index 78b7c598fb1..13e21e4f58e 100644 --- a/reactos/ntoskrnl/io/iomgr/device.c +++ b/reactos/ntoskrnl/io/iomgr/device.c @@ -1088,6 +1088,10 @@ IoEnumerateDeviceObjectList(IN PDRIVER_OBJECT DriverObject, { ULONG ActualDevices = 1; PDEVICE_OBJECT CurrentDevice = DriverObject->DeviceObject; + KIRQL OldIrql; + + /* Raise to dispatch level */ + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); /* Find out how many devices we'll enumerate */ while ((CurrentDevice = CurrentDevice->NextDevice)) ActualDevices++; @@ -1099,13 +1103,14 @@ IoEnumerateDeviceObjectList(IN PDRIVER_OBJECT DriverObject, *ActualNumberDeviceObjects = ActualDevices; /* Check if we can support so many */ - if ((ActualDevices * 4) > DeviceObjectListSize) + if ((ActualDevices * sizeof(PDEVICE_OBJECT)) > DeviceObjectListSize) { /* Fail because the buffer was too small */ + KeLowerIrql(OldIrql); return STATUS_BUFFER_TOO_SMALL; } - /* Check if the caller only wanted the size */ + /* Check if the caller wanted the device list */ if (DeviceObjectList) { /* Loop through all the devices */ @@ -1124,6 +1129,9 @@ IoEnumerateDeviceObjectList(IN PDRIVER_OBJECT DriverObject, } } + /* Return back to previous IRQL */ + KeLowerIrql(OldIrql); + /* Return the status */ return STATUS_SUCCESS; }