diff --git a/reactos/drivers/network/ndis/include/protocol.h b/reactos/drivers/network/ndis/include/protocol.h index 2742f2975e8..4737f213226 100644 --- a/reactos/drivers/network/ndis/include/protocol.h +++ b/reactos/drivers/network/ndis/include/protocol.h @@ -61,6 +61,12 @@ NdisIPnPQueryStopDevice( IN PDEVICE_OBJECT DeviceObject, PIRP Irp); +NTSTATUS +NTAPI +NdisIPnPCancelStopDevice( + IN PDEVICE_OBJECT DeviceObject, + PIRP Irp); + #endif /* __PROTOCOL_H */ /* EOF */ diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index ab7decd03cb..b1798816609 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -2050,6 +2050,12 @@ NdisIDispatchPnp( IoCompleteRequest(Irp, IO_NO_INCREMENT); break; + case IRP_MN_CANCEL_STOP_DEVICE: + Status = NdisIPnPCancelStopDevice(DeviceObject, Irp); + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + break; + default: IoSkipCurrentIrpStackLocation(Irp); Status = IoCallDriver(Adapter->NdisMiniportBlock.NextDeviceObject, Irp); diff --git a/reactos/drivers/network/ndis/ndis/protocol.c b/reactos/drivers/network/ndis/ndis/protocol.c index 807fe3e159a..d0b88b075f1 100644 --- a/reactos/drivers/network/ndis/ndis/protocol.c +++ b/reactos/drivers/network/ndis/ndis/protocol.c @@ -77,12 +77,53 @@ NdisIPnPQueryStopDevice( else if (Status != NDIS_STATUS_SUCCESS) { /* One protocol failed so we can fail the query stop device IRP */ + ExFreePool(PnPEvent); return Status; } CurrentEntry = CurrentEntry->Flink; } + ExFreePool(PnPEvent); + + return NDIS_STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +NdisIPnPCancelStopDevice( + IN PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + PLIST_ENTRY CurrentEntry; + PADAPTER_BINDING AdapterBinding; + PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)DeviceObject->DeviceExtension; + PNET_PNP_EVENT PnPEvent; + NDIS_STATUS Status; + + PnPEvent = ProSetupPnPEvent(NetEventCancelRemoveDevice, NULL, 0); + if (!PnPEvent) + return NDIS_STATUS_RESOURCES; + + CurrentEntry = Adapter->ProtocolListHead.Flink; + + while (CurrentEntry != &Adapter->ProtocolListHead) + { + AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry); + + Status = (*AdapterBinding->ProtocolBinding->Chars.PnPEventHandler)( + AdapterBinding->NdisOpenBlock.ProtocolBindingContext, + PnPEvent); + + /* A protocol should always succeed NetEventCancelRemoveDevice */ + + ASSERT(Status == NDIS_STATUS_SUCCESS); + + CurrentEntry = CurrentEntry->Flink; + } + + ExFreePool(PnPEvent); + return NDIS_STATUS_SUCCESS; }