From 11d957b125caf8f60cea843dca99ca27c23de412 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 5 May 2009 01:24:30 +0000 Subject: [PATCH] - Implement handling for IRP_MN_CANCEL_STOP_DEVICE svn path=/trunk/; revision=40791 --- .../drivers/network/ndis/include/protocol.h | 6 +++ reactos/drivers/network/ndis/ndis/miniport.c | 6 +++ reactos/drivers/network/ndis/ndis/protocol.c | 41 +++++++++++++++++++ 3 files changed, 53 insertions(+) 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; }