diff --git a/reactos/drivers/input/i8042prt/i8042prt.c b/reactos/drivers/input/i8042prt/i8042prt.c index d4fe6e80c9a..04625caa859 100644 --- a/reactos/drivers/input/i8042prt/i8042prt.c +++ b/reactos/drivers/input/i8042prt/i8042prt.c @@ -741,6 +741,7 @@ static NTSTATUS STDCALL I8042AddDevice(PDRIVER_OBJECT DriverObject, KeInitializeTimer(&DevExt->TimerMouseTimeout); Status = I8042Initialize(DevExt); + Fdo->Flags &= ~DO_DEVICE_INITIALIZING; if (!NT_SUCCESS(STATUS_SUCCESS)) { DPRINT1("Initialization failure: %x\n", Status); return Status; @@ -790,6 +791,7 @@ static NTSTATUS STDCALL I8042AddDevice(PDRIVER_OBJECT DriverObject, } InsertTailList(&DevExt->BusDevices, &FdoDevExt->BusDevices); + Fdo->Flags &= ~DO_DEVICE_INITIALIZING; } else DevExt->KeyboardExists = FALSE; @@ -838,6 +840,7 @@ static NTSTATUS STDCALL I8042AddDevice(PDRIVER_OBJECT DriverObject, } InsertTailList(&DevExt->BusDevices, &FdoDevExt->BusDevices); + Fdo->Flags &= ~DO_DEVICE_INITIALIZING; } else DevExt->MouseExists = FALSE; diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 63d5708df03..3db42fff0c5 100644 --- a/reactos/drivers/video/videoprt/videoprt.c +++ b/reactos/drivers/video/videoprt/videoprt.c @@ -362,6 +362,8 @@ IntVideoPortCreateAdapterDeviceObject( DeviceExtension->NextDeviceObject = IoAttachDeviceToDeviceStack( *DeviceObject, PhysicalDeviceObject); + /* Remove the initailizing flag */ + (*DeviceObject)->Flags &= ~DO_DEVICE_INITIALIZING; return STATUS_SUCCESS; } diff --git a/reactos/ntoskrnl/io/iomgr/device.c b/reactos/ntoskrnl/io/iomgr/device.c index 6432c04e77d..c588800be5e 100644 --- a/reactos/ntoskrnl/io/iomgr/device.c +++ b/reactos/ntoskrnl/io/iomgr/device.c @@ -342,6 +342,9 @@ IopReferenceDeviceObject(IN PDEVICE_OBJECT DeviceObject) (DeviceObject->Flags & DO_DEVICE_INITIALIZING)) { /* It's unloading or initializing, so fail */ + DPRINT1("You are seeing this because the following ROS driver: %wZ\n" + " sucks. Please fix it's AddDevice Routine\n", + &DeviceObject->DriverObject->DriverName); return STATUS_NO_SUCH_DEVICE; } else diff --git a/reactos/ntoskrnl/io/iomgr/driver.c b/reactos/ntoskrnl/io/iomgr/driver.c index 30c16b26752..243291567a6 100644 --- a/reactos/ntoskrnl/io/iomgr/driver.c +++ b/reactos/ntoskrnl/io/iomgr/driver.c @@ -622,8 +622,6 @@ IopInitializeDriverModule( return Status; } - IopReinitializeDrivers(); - /* Set the driver as initialized */ Driver->Flags |= DRVO_INITIALIZED; DeviceObject = Driver->DeviceObject; @@ -634,6 +632,8 @@ IopInitializeDriverModule( DeviceObject = DeviceObject->NextDevice; } + IopReinitializeDrivers(); + return STATUS_SUCCESS; } diff --git a/reactos/ntoskrnl/io/iomgr/file.c b/reactos/ntoskrnl/io/iomgr/file.c index b228bf21ffd..891c85511d5 100644 --- a/reactos/ntoskrnl/io/iomgr/file.c +++ b/reactos/ntoskrnl/io/iomgr/file.c @@ -67,9 +67,9 @@ IopParseDevice(IN PVOID ParseObject, OriginalDeviceObject = OpenPacket->RelatedFileObject->DeviceObject; } - /* Reference the DO FIXME: Don't allow failure */ - //Status = IopReferenceDeviceObject(OriginalDeviceObject); - OriginalDeviceObject->ReferenceCount++; + /* Reference the DO */ + Status = IopReferenceDeviceObject(OriginalDeviceObject); + if (!NT_SUCCESS(Status)) return Status; /* Map the generic mask and set the new mapping in the access state */ RtlMapGenericMask(&AccessState->RemainingDesiredAccess,