[NDIS] Add IRP_MN_REMOVE_DEVICE processing (#8365)

Fixes BSOD after installation of HotSpot Shield 3.42.

CORE-20150
This commit is contained in:
Max Korostil
2025-12-31 15:36:15 +03:00
committed by GitHub
parent 472cf2fd13
commit e04d05254a
+69
View File
@@ -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;
}