diff --git a/reactos/drivers/network/ndis/ndis/50stubs.c b/reactos/drivers/network/ndis/ndis/50stubs.c index 6042ed5c623..4df78040654 100644 --- a/reactos/drivers/network/ndis/ndis/50stubs.c +++ b/reactos/drivers/network/ndis/ndis/50stubs.c @@ -165,26 +165,6 @@ NdisWriteEventLogEntry */ -/* - * @unimplemented - */ -VOID -EXPORT -NdisCompletePnPEvent( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisBindingHandle, - IN PNET_PNP_EVENT NetPnPEvent) -/* - * FUNCTION: - * ARGUMENTS: - * NOTES: - * NDIS 5.0 - */ -{ - UNIMPLEMENTED -} - - /* * @unimplemented */ diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index b1798816609..c128dcc54f9 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -2044,12 +2044,14 @@ NdisIDispatchPnp( IoCompleteRequest(Irp, IO_NO_INCREMENT); break; + case IRP_MN_QUERY_REMOVE_DEVICE: case IRP_MN_QUERY_STOP_DEVICE: Status = NdisIPnPQueryStopDevice(DeviceObject, Irp); Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); break; + case IRP_MN_CANCEL_REMOVE_DEVICE: case IRP_MN_CANCEL_STOP_DEVICE: Status = NdisIPnPCancelStopDevice(DeviceObject, Irp); Irp->IoStatus.Status = Status; @@ -2812,5 +2814,65 @@ NdisQueryAdapterInstanceName( Adapter); } +/* + * @implemented + */ +VOID +EXPORT +NdisCompletePnPEvent( + IN NDIS_STATUS Status, + IN NDIS_HANDLE NdisBindingHandle, + IN PNET_PNP_EVENT NetPnPEvent) +/* + * FUNCTION: + * ARGUMENTS: + * NOTES: + * NDIS 5.0 + */ +{ + PIRP Irp = (PIRP)NetPnPEvent->NdisReserved[0]; + PLIST_ENTRY CurrentEntry = (PLIST_ENTRY)NetPnPEvent->NdisReserved[1]; + PADAPTER_BINDING AdapterBinding = NdisBindingHandle; + PLOGICAL_ADAPTER Adapter = AdapterBinding->Adapter; + NDIS_STATUS NdisStatus; + + if (Status != NDIS_STATUS_SUCCESS) + { + ExFreePool(NetPnPEvent); + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return; + } + + while (CurrentEntry != &Adapter->ProtocolListHead) + { + AdapterBinding = CONTAINING_RECORD(CurrentEntry, ADAPTER_BINDING, AdapterListEntry); + + NdisStatus = (*AdapterBinding->ProtocolBinding->Chars.PnPEventHandler)( + AdapterBinding->NdisOpenBlock.ProtocolBindingContext, + NetPnPEvent); + + if (NdisStatus == NDIS_STATUS_PENDING) + { + NetPnPEvent->NdisReserved[1] = (ULONG_PTR)CurrentEntry->Flink; + return; + } + else if (NdisStatus != NDIS_STATUS_SUCCESS) + { + ExFreePool(NetPnPEvent); + Irp->IoStatus.Status = NdisStatus; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return; + } + + CurrentEntry = CurrentEntry->Flink; + } + + ExFreePool(NetPnPEvent); + + Irp->IoStatus.Status = NDIS_STATUS_SUCCESS; + IoCompleteRequest(Irp, IO_NO_INCREMENT); +} + /* EOF */ diff --git a/reactos/drivers/network/ndis/ndis/protocol.c b/reactos/drivers/network/ndis/ndis/protocol.c index d0b88b075f1..9bb69efb333 100644 --- a/reactos/drivers/network/ndis/ndis/protocol.c +++ b/reactos/drivers/network/ndis/ndis/protocol.c @@ -71,8 +71,11 @@ NdisIPnPQueryStopDevice( if (Status == NDIS_STATUS_PENDING) { - /* We don't handle this yet */ - ASSERT(FALSE); + IoMarkIrpPending(Irp); + /* Yes, I know this is stupid */ + PnPEvent->NdisReserved[0] = (ULONG_PTR)Irp; + PnPEvent->NdisReserved[1] = (ULONG_PTR)CurrentEntry->Flink; + return NDIS_STATUS_PENDING; } else if (Status != NDIS_STATUS_SUCCESS) { @@ -115,7 +118,13 @@ NdisIPnPCancelStopDevice( AdapterBinding->NdisOpenBlock.ProtocolBindingContext, PnPEvent); - /* A protocol should always succeed NetEventCancelRemoveDevice */ + if (Status == NDIS_STATUS_PENDING) + { + IoMarkIrpPending(Irp); + PnPEvent->NdisReserved[0] = (ULONG_PTR)Irp; + PnPEvent->NdisReserved[1] = (ULONG_PTR)CurrentEntry->Flink; + return NDIS_STATUS_PENDING; + } ASSERT(Status == NDIS_STATUS_SUCCESS);