Author: ion Date: Wed Apr 4 07:19:27 2007 New Revision: 26258
URL: http://svn.reactos.org/svn/reactos?rev=26258&view=rev Log: - Refactor device attachment into a private routine. - We shouldn't allow attaching to a device that's still initlizaing, but ROS currently does because of some device that tries to do this, in the PnP manager or early boot-phase drivers (it has an auto-generated name). Please fix this!
Modified: trunk/reactos/ntoskrnl/io/iomgr/device.c
Modified: trunk/reactos/ntoskrnl/io/iomgr/device.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/device.c?... ============================================================================== --- trunk/reactos/ntoskrnl/io/iomgr/device.c (original) +++ trunk/reactos/ntoskrnl/io/iomgr/device.c Wed Apr 4 07:19:27 2007 @@ -37,9 +37,18 @@ SourceDeviceExtension = IoGetDevObjExtension(SourceDevice); ASSERT(SourceDeviceExtension->AttachedTo == NULL);
+ /* FIXME: ROS HACK */ + if (AttachedDevice->Flags & DO_DEVICE_INITIALIZING) + { + DPRINT1("Io: CRITICAL: Allowing attach to device which hasn't " + "cleared its DO_DEVICE_INITIALIZING flag. Fix the damn " + "thing: %p %wZ\n", + AttachedDevice, + &AttachedDevice->DriverObject->DriverName); + } + /* Make sure that it's in a correct state */ - if ((AttachedDevice->Flags & DO_DEVICE_INITIALIZING) || - (IoGetDevObjExtension(AttachedDevice)->ExtensionFlags & + if ((IoGetDevObjExtension(AttachedDevice)->ExtensionFlags & (DOE_UNLOAD_PENDING | DOE_DELETE_PENDING | DOE_REMOVE_PENDING | @@ -629,16 +638,10 @@ IoAttachDeviceToDeviceStack(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice) { - NTSTATUS Status; - PDEVICE_OBJECT LocalAttach; - /* Attach it safely */ - Status = IoAttachDeviceToDeviceStackSafe(SourceDevice, - TargetDevice, - &LocalAttach); - - /* Return it */ - return LocalAttach; + return IopAttachDeviceToDeviceStackSafe(SourceDevice, + TargetDevice, + NULL); }
/* @@ -650,41 +653,16 @@ IN PDEVICE_OBJECT TargetDevice, IN OUT PDEVICE_OBJECT *AttachedToDeviceObject) { - PDEVICE_OBJECT AttachedDevice; - PEXTENDED_DEVOBJ_EXTENSION SourceDeviceExtension; - - /* Get the Attached Device and source extension */ - AttachedDevice = IoGetAttachedDevice(TargetDevice); - SourceDeviceExtension = IoGetDevObjExtension(SourceDevice); - - /* Make sure that it's in a correct state */ - if (!IoGetDevObjExtension(AttachedDevice)->ExtensionFlags & - (DOE_UNLOAD_PENDING | - DOE_DELETE_PENDING | - DOE_REMOVE_PENDING | - DOE_REMOVE_PROCESSED)) - { - /* Update atached device fields */ - AttachedDevice->AttachedDevice = SourceDevice; - AttachedDevice->Spare1++; - - /* Update the source with the attached data */ - SourceDevice->StackSize = AttachedDevice->StackSize + 1; - SourceDevice->AlignmentRequirement = AttachedDevice-> - AlignmentRequirement; - SourceDevice->SectorSize = AttachedDevice->SectorSize; - - /* Set the attachment in the device extension */ - SourceDeviceExtension->AttachedTo = AttachedDevice; - } - else - { - /* Device was unloading or being removed */ - AttachedDevice = NULL; - } - - /* Return the attached device */ - *AttachedToDeviceObject = AttachedDevice; + /* Call the internal function */ + if (!IopAttachDeviceToDeviceStackSafe(SourceDevice, + TargetDevice, + AttachedToDeviceObject)) + { + /* Nothing found */ + return STATUS_NO_SUCH_DEVICE; + } + + /* Success! */ return STATUS_SUCCESS; }