From 903edc501a09d38f3e8baed2efaa89cdaf0bbb16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Mon, 16 May 2005 18:08:55 +0000 Subject: [PATCH] Don't send multiple IRP_MJ_PNP/IRP_MN_START_DEVICE in case of a device with lower/upper filters svn path=/trunk/; revision=15347 --- reactos/ntoskrnl/include/internal/io.h | 4 ++ reactos/ntoskrnl/io/device.c | 69 +++++++++++++++----------- reactos/ntoskrnl/io/driver.c | 5 ++ reactos/ntoskrnl/io/iomgr.c | 8 +++ reactos/ntoskrnl/io/pnpmgr.c | 4 +- 5 files changed, 59 insertions(+), 31 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index b24d1ab29bf..c73ddcaf48d 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.h @@ -501,6 +501,10 @@ IopInitializeDevice( PDEVICE_NODE DeviceNode, PDRIVER_OBJECT DriverObject); +NTSTATUS +IopStartDevice( + PDEVICE_NODE DeviceNode); + /* driver.c */ VOID FASTCALL diff --git a/reactos/ntoskrnl/io/device.c b/reactos/ntoskrnl/io/device.c index 8625b3a4143..d5a8a72c9c2 100644 --- a/reactos/ntoskrnl/io/device.c +++ b/reactos/ntoskrnl/io/device.c @@ -80,8 +80,6 @@ FASTCALL IopInitializeDevice(PDEVICE_NODE DeviceNode, PDRIVER_OBJECT DriverObject) { - IO_STATUS_BLOCK IoStatusBlock; - IO_STACK_LOCATION Stack; PDEVICE_OBJECT Fdo; NTSTATUS Status; @@ -115,26 +113,6 @@ IopInitializeDevice(PDEVICE_NODE DeviceNode, IopDeviceNodeSetFlag(DeviceNode, DNF_ADDED); - DPRINT("Sending IRP_MN_START_DEVICE to driver\n"); - - /* FIXME: Should be DeviceNode->ResourceList */ - Stack.Parameters.StartDevice.AllocatedResources = DeviceNode->BootResources; - /* FIXME: Should be DeviceNode->ResourceListTranslated */ - Stack.Parameters.StartDevice.AllocatedResourcesTranslated = DeviceNode->BootResources; - - Status = IopInitiatePnpIrp( - Fdo, - &IoStatusBlock, - IRP_MN_START_DEVICE, - &Stack); - - if (!NT_SUCCESS(Status)) - { - DPRINT("IopInitiatePnpIrp() failed\n"); - ObDereferenceObject(Fdo); - return Status; - } - if (Fdo->DeviceType == FILE_DEVICE_ACPI) { static BOOLEAN SystemPowerDeviceNodeCreated = FALSE; @@ -147,23 +125,54 @@ IopInitializeDevice(PDEVICE_NODE DeviceNode, } } + ObDereferenceObject(Fdo); + } + + return STATUS_SUCCESS; +} + +NTSTATUS +IopStartDevice( + PDEVICE_NODE DeviceNode) +{ + + IO_STATUS_BLOCK IoStatusBlock; + IO_STACK_LOCATION Stack; + PDEVICE_OBJECT Fdo; + NTSTATUS Status; + + DPRINT("Sending IRP_MN_START_DEVICE to driver\n"); + + Fdo = IoGetAttachedDeviceReference(DeviceNode->PhysicalDeviceObject); + /* FIXME: Should be DeviceNode->ResourceList */ + Stack.Parameters.StartDevice.AllocatedResources = DeviceNode->BootResources; + /* FIXME: Should be DeviceNode->ResourceListTranslated */ + Stack.Parameters.StartDevice.AllocatedResourcesTranslated = DeviceNode->BootResources; + + Status = IopInitiatePnpIrp( + Fdo, + &IoStatusBlock, + IRP_MN_START_DEVICE, + &Stack); + + if (!NT_SUCCESS(Status)) + { + DPRINT("IopInitiatePnpIrp() failed\n"); + } + else + { if (Fdo->DeviceType == FILE_DEVICE_BUS_EXTENDER || Fdo->DeviceType == FILE_DEVICE_ACPI) { DPRINT("Bus extender found\n"); Status = IopInvalidateDeviceRelations(DeviceNode, BusRelations); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(Fdo); - return Status; - } } - - ObDereferenceObject(Fdo); } - return STATUS_SUCCESS; + ObDereferenceObject(Fdo); + + return Status; } NTSTATUS diff --git a/reactos/ntoskrnl/io/driver.c b/reactos/ntoskrnl/io/driver.c index f4f5941f4aa..700414946a5 100644 --- a/reactos/ntoskrnl/io/driver.c +++ b/reactos/ntoskrnl/io/driver.c @@ -1202,6 +1202,10 @@ IopInitializeBuiltinDriver( } Status = IopInitializeDevice(DeviceNode, DriverObject); + if (NT_SUCCESS(Status)) + { + Status = IopStartDevice(DeviceNode); + } return Status; } @@ -1938,6 +1942,7 @@ NtLoadDriver(IN PUNICODE_STRING DriverServiceName) } IopInitializeDevice(DeviceNode, DriverObject); + Status = IopStartDevice(DeviceNode); ReleaseCapturedString: RtlReleaseCapturedUnicodeString(&CapturedDriverServiceName, diff --git a/reactos/ntoskrnl/io/iomgr.c b/reactos/ntoskrnl/io/iomgr.c index 1198b11928e..e83ecc32916 100644 --- a/reactos/ntoskrnl/io/iomgr.c +++ b/reactos/ntoskrnl/io/iomgr.c @@ -378,6 +378,14 @@ IoInit2(BOOLEAN BootLog) return; } + Status = IopStartDevice(DeviceNode); + if (!NT_SUCCESS(Status)) + { + IopFreeDeviceNode(DeviceNode); + CPRINT("IopInitializeDevice() failed with status (%x)\n", Status); + return; + } + /* * Initialize PnP root releations */ diff --git a/reactos/ntoskrnl/io/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr.c index a8fcc3e4111..c0b10ce9237 100644 --- a/reactos/ntoskrnl/io/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr.c @@ -1523,9 +1523,11 @@ IopActionInitChildServices( Status = IopInitializeDevice(DeviceNode, DriverObject); if (NT_SUCCESS(Status)) { - IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); /* Attach upper level filter drivers. */ IopAttachFilterDrivers(DeviceNode, FALSE); + IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); + + Status = IopStartDevice(DeviceNode); } } }