[NTOSKRNL]

- Flag the device node if it fails post-start
- Remove the device's children when responding to PNP_DEVICE_REMOVED

svn path=/trunk/; revision=56240
This commit is contained in:
Cameron Gutman 2012-03-26 22:57:01 +00:00
parent 31597533ae
commit 05abf4495a

View file

@ -4044,8 +4044,13 @@ IoInvalidateDeviceState(IN PDEVICE_OBJECT PhysicalDeviceObject)
if ((PnPFlags & PNP_DEVICE_REMOVED) || if ((PnPFlags & PNP_DEVICE_REMOVED) ||
((PnPFlags & PNP_DEVICE_FAILED) && !(PnPFlags & PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED))) ((PnPFlags & PNP_DEVICE_FAILED) && !(PnPFlags & PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED)))
{ {
/* Surprise removal */ /* Flag it if it's failed */
if (PnPFlags & PNP_DEVICE_FAILED) DeviceNode->Problem = CM_PROB_FAILED_POST_START;
/* Send removal IRPs to all of its children */
IopPrepareDeviceForRemoval(PhysicalDeviceObject, TRUE);
/* Send surprise removal */
IopSendSurpriseRemoval(PhysicalDeviceObject); IopSendSurpriseRemoval(PhysicalDeviceObject);
/* Tell the user-mode PnP manager that a device was removed */ /* Tell the user-mode PnP manager that a device was removed */
@ -4057,7 +4062,6 @@ IoInvalidateDeviceState(IN PDEVICE_OBJECT PhysicalDeviceObject)
else if ((PnPFlags & PNP_DEVICE_FAILED) && (PnPFlags & PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED)) else if ((PnPFlags & PNP_DEVICE_FAILED) && (PnPFlags & PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED))
{ {
/* Stop for resource rebalance */ /* Stop for resource rebalance */
Status = IopStopDevice(DeviceNode); Status = IopStopDevice(DeviceNode);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {