From c51df789e869379a515d94c66da152c5b26660ff Mon Sep 17 00:00:00 2001 From: Sylvain Deverre Date: Sun, 8 Oct 2017 11:29:17 +0200 Subject: [PATCH] [WDMAUD] Close mixers on cleanup. Should fix CORE-10735 definitely (#21) [WDMAUD] Close mixers on cleanup. CORE-10735 --- drivers/wdm/audio/legacy/wdmaud/entry.c | 1 + drivers/wdm/audio/legacy/wdmaud/mmixer.c | 30 +++++++++++++++++++++++- drivers/wdm/audio/legacy/wdmaud/wdmaud.h | 6 +++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/drivers/wdm/audio/legacy/wdmaud/entry.c b/drivers/wdm/audio/legacy/wdmaud/entry.c index ee304845bb7..eede79172d3 100644 --- a/drivers/wdm/audio/legacy/wdmaud/entry.c +++ b/drivers/wdm/audio/legacy/wdmaud/entry.c @@ -326,6 +326,7 @@ WdmAudCleanup( /* found an still open audio pin */ ZwClose(pClient->hPins[Index].Handle); } + WdmAudCloseAllMixers(DeviceObject, pClient, Index); } /* free pin array */ diff --git a/drivers/wdm/audio/legacy/wdmaud/mmixer.c b/drivers/wdm/audio/legacy/wdmaud/mmixer.c index 9887d0974a2..3016d24c673 100644 --- a/drivers/wdm/audio/legacy/wdmaud/mmixer.c +++ b/drivers/wdm/audio/legacy/wdmaud/mmixer.c @@ -480,7 +480,7 @@ WdmAudControlCloseMixer( IN ULONG Index) { /* Remove event associated to this client */ - if (MMixerClose(&MixerContext, DeviceInfo->DeviceIndex, ClientInfo, EventCallback)) + if (MMixerClose(&MixerContext, DeviceInfo->DeviceIndex, ClientInfo, EventCallback) != MM_STATUS_SUCCESS) { DPRINT1("Failed to close mixer\n"); return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); @@ -497,6 +497,34 @@ WdmAudControlCloseMixer( return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); } +VOID +WdmAudCloseAllMixers( + IN PDEVICE_OBJECT DeviceObject, + IN PWDMAUD_CLIENT ClientInfo, + IN ULONG Index) +{ + ULONG DeviceCount, DeviceIndex; + + /* Get all mixers */ + DeviceCount = GetSysAudioDeviceCount(DeviceObject); + + /* Close every mixer attached to the device */ + for (DeviceIndex = 0; DeviceIndex < DeviceCount; DeviceIndex++) + { + if (MMixerClose(&MixerContext, DeviceIndex, ClientInfo, EventCallback) != MM_STATUS_SUCCESS) + { + DPRINT1("Failed to close mixer for device %lu\n", DeviceIndex); + } + } + + /* Dereference event */ + if (ClientInfo->hPins[Index].NotifyEvent) + { + ObDereferenceObject(ClientInfo->hPins[Index].NotifyEvent); + ClientInfo->hPins[Index].NotifyEvent = NULL; + } +} + NTSTATUS NTAPI WdmAudGetControlDetails( diff --git a/drivers/wdm/audio/legacy/wdmaud/wdmaud.h b/drivers/wdm/audio/legacy/wdmaud/wdmaud.h index 04d8975b9ad..49f01f2fbd1 100644 --- a/drivers/wdm/audio/legacy/wdmaud/wdmaud.h +++ b/drivers/wdm/audio/legacy/wdmaud/wdmaud.h @@ -136,6 +136,12 @@ WdmAudControlCloseMixer( IN PWDMAUD_CLIENT ClientInfo, IN ULONG Index); +VOID +WdmAudCloseAllMixers( + IN PDEVICE_OBJECT DeviceObject, + IN PWDMAUD_CLIENT ClientInfo, + IN ULONG Index); + NTSTATUS WdmAudControlOpenWave( IN PDEVICE_OBJECT DeviceObject,