diff --git a/reactos/drivers/network/ndis/include/protocol.h b/reactos/drivers/network/ndis/include/protocol.h index be06efb1558..2742f2975e8 100644 --- a/reactos/drivers/network/ndis/include/protocol.h +++ b/reactos/drivers/network/ndis/include/protocol.h @@ -55,6 +55,12 @@ ProSendPackets( IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets); +NTSTATUS +NTAPI +NdisIPnPQueryStopDevice( + 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 ba2a0f4356d..ab7decd03cb 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -2044,6 +2044,12 @@ NdisIDispatchPnp( IoCompleteRequest(Irp, IO_NO_INCREMENT); break; + case IRP_MN_QUERY_STOP_DEVICE: + Status = NdisIPnPQueryStopDevice(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 e90ea65735c..807fe3e159a 100644 --- a/reactos/drivers/network/ndis/ndis/protocol.c +++ b/reactos/drivers/network/ndis/ndis/protocol.c @@ -22,6 +22,70 @@ KSPIN_LOCK ProtocolListLock; #define WORKER_TEST 0 +PNET_PNP_EVENT +ProSetupPnPEvent( + NET_PNP_EVENT_CODE EventCode, + PVOID EventBuffer, + ULONG EventBufferLength) +{ + PNET_PNP_EVENT PnPEvent; + + PnPEvent = ExAllocatePool(PagedPool, sizeof(NET_PNP_EVENT)); + if (!PnPEvent) + return NULL; + + RtlZeroMemory(PnPEvent, sizeof(NET_PNP_EVENT)); + + PnPEvent->NetEvent = EventCode; + PnPEvent->Buffer = EventBuffer; + PnPEvent->BufferLength = EventBufferLength; + + return PnPEvent; +} + +NTSTATUS +NTAPI +NdisIPnPQueryStopDevice( + 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(NetEventQueryRemoveDevice, 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); + + if (Status == NDIS_STATUS_PENDING) + { + /* We don't handle this yet */ + ASSERT(FALSE); + } + else if (Status != NDIS_STATUS_SUCCESS) + { + /* One protocol failed so we can fail the query stop device IRP */ + return Status; + } + + CurrentEntry = CurrentEntry->Flink; + } + + return NDIS_STATUS_SUCCESS; +} + /* * @implemented