mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 19:33:16 +00:00
[NDIS]
- Fix handling of some PnP IRPs - Handle IRP_MN_STOP_DEVICE as it travels down the stack not up - Only complete the IRP_MN_QUERY_XXX_DEVICE IRPs if we fail them otherwise pass them down the device stack - Handle IRP_MN_CANCEL_XXX_DEVICE as it travels back up the stack not on its way down - Append our flags when handling IRP_MN_QUERY_PNP_DEVICE_STATE and pass it down the device stack svn path=/trunk/; revision=51927
This commit is contained in:
parent
562fcac277
commit
10959bf38e
1 changed files with 23 additions and 17 deletions
|
@ -2218,48 +2218,54 @@ NdisIDispatchPnp(
|
||||||
NDIS_DbgPrint(MIN_TRACE, ("Lower driver failed device start\n"));
|
NDIS_DbgPrint(MIN_TRACE, ("Lower driver failed device start\n"));
|
||||||
Irp->IoStatus.Status = Status;
|
Irp->IoStatus.Status = Status;
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
break;
|
return Status;
|
||||||
|
|
||||||
case IRP_MN_STOP_DEVICE:
|
case IRP_MN_STOP_DEVICE:
|
||||||
Status = NdisIForwardIrpAndWait(Adapter, Irp);
|
Status = NdisIPnPStopDevice(DeviceObject, Irp);
|
||||||
if (NT_SUCCESS(Status) && NT_SUCCESS(Irp->IoStatus.Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
NDIS_DbgPrint(MIN_TRACE, ("WARNING: Ignoring halt device failure! Passing the IRP down anyway\n"));
|
||||||
Status = NdisIPnPStopDevice(DeviceObject, Irp);
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
}
|
|
||||||
else
|
|
||||||
NDIS_DbgPrint(MIN_TRACE, ("Lower driver failed device stop\n"));
|
|
||||||
Irp->IoStatus.Status = Status;
|
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IRP_MN_QUERY_REMOVE_DEVICE:
|
case IRP_MN_QUERY_REMOVE_DEVICE:
|
||||||
case IRP_MN_QUERY_STOP_DEVICE:
|
case IRP_MN_QUERY_STOP_DEVICE:
|
||||||
Status = NdisIPnPQueryStopDevice(DeviceObject, Irp);
|
Status = NdisIPnPQueryStopDevice(DeviceObject, Irp);
|
||||||
Irp->IoStatus.Status = Status;
|
Irp->IoStatus.Status = Status;
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
if (Status != STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
NDIS_DbgPrint(MIN_TRACE, ("Failing miniport halt request\n"));
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IRP_MN_CANCEL_REMOVE_DEVICE:
|
case IRP_MN_CANCEL_REMOVE_DEVICE:
|
||||||
case IRP_MN_CANCEL_STOP_DEVICE:
|
case IRP_MN_CANCEL_STOP_DEVICE:
|
||||||
Status = NdisIPnPCancelStopDevice(DeviceObject, Irp);
|
Status = NdisIForwardIrpAndWait(Adapter, Irp);
|
||||||
|
if (NT_SUCCESS(Status) && NT_SUCCESS(Irp->IoStatus.Status))
|
||||||
|
{
|
||||||
|
Status = NdisIPnPCancelStopDevice(DeviceObject, Irp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NDIS_DbgPrint(MIN_TRACE, ("Lower driver failed cancel stop/remove request\n"));
|
||||||
|
}
|
||||||
Irp->IoStatus.Status = Status;
|
Irp->IoStatus.Status = Status;
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
break;
|
return Status;
|
||||||
|
|
||||||
case IRP_MN_QUERY_PNP_DEVICE_STATE:
|
case IRP_MN_QUERY_PNP_DEVICE_STATE:
|
||||||
Status = NDIS_STATUS_SUCCESS;
|
Status = NDIS_STATUS_SUCCESS;
|
||||||
Irp->IoStatus.Status = Status;
|
Irp->IoStatus.Status = Status;
|
||||||
Irp->IoStatus.Information |= Adapter->NdisMiniportBlock.PnPFlags;
|
Irp->IoStatus.Information |= Adapter->NdisMiniportBlock.PnPFlags;
|
||||||
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
IoSkipCurrentIrpStackLocation(Irp);
|
|
||||||
Status = IoCallDriver(Adapter->NdisMiniportBlock.NextDeviceObject, Irp);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
IoSkipCurrentIrpStackLocation(Irp);
|
||||||
|
return IoCallDriver(Adapter->NdisMiniportBlock.NextDeviceObject, Irp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue