diff --git a/drivers/network/ndis/ndis/miniport.c b/drivers/network/ndis/ndis/miniport.c index a890af418c2..38e7f9d5ad8 100644 --- a/drivers/network/ndis/ndis/miniport.c +++ b/drivers/network/ndis/ndis/miniport.c @@ -2335,6 +2335,71 @@ NdisIDeviceIoControl( return Status; } +static +NTSTATUS +NdisIPnPRemoveDevice( + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp) +{ + NTSTATUS Status; + PLOGICAL_ADAPTER Adapter = DeviceObject->DeviceExtension; + + if (Adapter->NdisMiniportBlock.SymbolicLinkName.Buffer) + { + IoSetDeviceInterfaceState(&Adapter->NdisMiniportBlock.SymbolicLinkName, FALSE); + RtlFreeUnicodeString(&Adapter->NdisMiniportBlock.SymbolicLinkName); + } + + Irp->IoStatus.Status = STATUS_SUCCESS; + IoSkipCurrentIrpStackLocation(Irp); + Status = IoCallDriver(Adapter->NdisMiniportBlock.NextDeviceObject, Irp); + + IoDetachDevice(Adapter->NdisMiniportBlock.NextDeviceObject); + + RtlFreeUnicodeString(&Adapter->NdisMiniportBlock.MiniportName); + + if (Adapter->NdisMiniportBlock.PnPDeviceState == NdisPnPDeviceStarted) + { + /* Remove adapter from adapter list for this miniport */ + ExInterlockedRemoveEntryList(&Adapter->MiniportListEntry, &Adapter->NdisMiniportBlock.DriverHandle->Lock); + + /* Remove adapter from global adapter list */ + ExInterlockedRemoveEntryList(&Adapter->ListEntry, &AdapterListLock); + + KeCancelTimer(&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Timer); + + Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.HaltHandler(Adapter); + } + + if (Adapter->NdisMiniportBlock.EthDB) + { + EthDeleteFilter(Adapter->NdisMiniportBlock.EthDB); + Adapter->NdisMiniportBlock.EthDB = NULL; + } + + if (Adapter->NdisMiniportBlock.Resources) + { + ExFreePool(Adapter->NdisMiniportBlock.Resources); + Adapter->NdisMiniportBlock.Resources = NULL; + } + + if (Adapter->NdisMiniportBlock.AllocatedResources) + { + ExFreePool(Adapter->NdisMiniportBlock.AllocatedResources); + Adapter->NdisMiniportBlock.AllocatedResources = NULL; + } + + if (Adapter->NdisMiniportBlock.AllocatedResourcesTranslated) + { + ExFreePool(Adapter->NdisMiniportBlock.AllocatedResourcesTranslated); + Adapter->NdisMiniportBlock.AllocatedResourcesTranslated = NULL; + } + + IoDeleteDevice(DeviceObject); + + return Status; +} + NTSTATUS NTAPI NdisIDispatchPnp( @@ -2399,7 +2464,11 @@ NdisIDispatchPnp( Irp->IoStatus.Information |= Adapter->NdisMiniportBlock.PnPFlags; break; + case IRP_MN_REMOVE_DEVICE: + return NdisIPnPRemoveDevice(DeviceObject, Irp); + default: + NDIS_DbgPrint(MIN_TRACE, ("Unhandled minor function: 0x%X\n", Stack->MinorFunction)); break; }