From: Thomas Faber Date: Sun, 24 Feb 2019 13:33:41 +0000 (+0100) Subject: [HDAUDBUS] Implement FDO removal. CORE-14617 X-Git-Tag: 0.4.13-dev~322 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=c8c0fc8d643bac8c0caa320c98d18a7160ec0ad4 [HDAUDBUS] Implement FDO removal. CORE-14617 --- diff --git a/drivers/wdm/audio/hdaudbus/fdo.cpp b/drivers/wdm/audio/hdaudbus/fdo.cpp index 3df33c907bb..44e41d22c13 100644 --- a/drivers/wdm/audio/hdaudbus/fdo.cpp +++ b/drivers/wdm/audio/hdaudbus/fdo.cpp @@ -563,6 +563,7 @@ HDA_FDOStartDevice( if (Descriptor->Type == CmResourceTypeMemory) { + DeviceExtension->RegLength = Descriptor->u.Memory.Length; DeviceExtension->RegBase = (PUCHAR)MmMapIoSpace(Descriptor->u.Memory.Start, Descriptor->u.Memory.Length, MmNonCached); if (DeviceExtension->RegBase == NULL) { @@ -635,6 +636,60 @@ HDA_FDOStartDevice( return Status; } +NTSTATUS +NTAPI +HDA_FDORemoveDevice( + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp) +{ + NTSTATUS Status; + PHDA_FDO_DEVICE_EXTENSION DeviceExtension; + ULONG CodecIndex, AFGIndex; + PHDA_CODEC_ENTRY CodecEntry; + + /* get device extension */ + DeviceExtension = static_cast(DeviceObject->DeviceExtension); + ASSERT(DeviceExtension->IsFDO == TRUE); + + Irp->IoStatus.Status = STATUS_SUCCESS; + IoSkipCurrentIrpStackLocation(Irp); + Status = IoCallDriver(DeviceExtension->LowerDevice, Irp); + + IoDetachDevice(DeviceExtension->LowerDevice); + + if (DeviceExtension->RegBase != NULL) + { + MmUnmapIoSpace(DeviceExtension->RegBase, + DeviceExtension->RegLength); + } + if (DeviceExtension->Interrupt != NULL) + { + IoDisconnectInterrupt(DeviceExtension->Interrupt); + } + if (DeviceExtension->CorbBase != NULL) + { + MmFreeContiguousMemory(DeviceExtension->CorbBase); + } + for (CodecIndex = 0; CodecIndex < HDA_MAX_CODECS; CodecIndex++) + { + CodecEntry = DeviceExtension->Codecs[CodecIndex]; + if (CodecEntry == NULL) + { + continue; + } + + for (AFGIndex = 0; AFGIndex < CodecEntry->AudioGroupCount; AFGIndex++) + { + FreeItem(CodecEntry->AudioGroups[AFGIndex]); + } + FreeItem(CodecEntry); + } + + IoDeleteDevice(DeviceObject); + + return Status; +} + NTSTATUS NTAPI HDA_FDOQueryBusRelations( diff --git a/drivers/wdm/audio/hdaudbus/hdaudbus.cpp b/drivers/wdm/audio/hdaudbus/hdaudbus.cpp index 440d75ae58e..79b07463b80 100644 --- a/drivers/wdm/audio/hdaudbus/hdaudbus.cpp +++ b/drivers/wdm/audio/hdaudbus/hdaudbus.cpp @@ -50,6 +50,12 @@ HDA_FdoPnp( Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; + case IRP_MN_REMOVE_DEVICE: + return HDA_FDORemoveDevice(DeviceObject, Irp); + case IRP_MN_QUERY_REMOVE_DEVICE: + case IRP_MN_CANCEL_REMOVE_DEVICE: + Irp->IoStatus.Status = STATUS_SUCCESS; + break; case IRP_MN_QUERY_DEVICE_RELATIONS: /* handle bus device relations */ if (IoStack->Parameters.QueryDeviceRelations.Type == BusRelations) diff --git a/drivers/wdm/audio/hdaudbus/hdaudbus.h b/drivers/wdm/audio/hdaudbus/hdaudbus.h index fa7f04a70a3..f29aae59195 100644 --- a/drivers/wdm/audio/hdaudbus/hdaudbus.h +++ b/drivers/wdm/audio/hdaudbus/hdaudbus.h @@ -64,8 +64,9 @@ typedef struct { BOOLEAN IsFDO; PDEVICE_OBJECT LowerDevice; - + PUCHAR RegBase; + SIZE_T RegLength; PKINTERRUPT Interrupt; ULONG CorbLength; @@ -126,6 +127,12 @@ HDA_FDOStartDevice( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); +NTSTATUS +NTAPI +HDA_FDORemoveDevice( + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp); + NTSTATUS NTAPI HDA_FDOQueryBusRelations(