mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-27 03:43:36 +00:00
[NDIS] Add IRP_MN_REMOVE_DEVICE processing (#8365)
Fixes BSOD after installation of HotSpot Shield 3.42. CORE-20150
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user