https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c51df789e869379a515d9…
commit c51df789e869379a515d94c66da152c5b26660ff
Author: Sylvain Deverre <deverre.sylv(a)gmail.com>
AuthorDate: Sun Oct 8 11:29:17 2017 +0200
[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 ee304845bb..eede79172d 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 9887d0974a..3016d24c67 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 04d8975b9a..49f01f2fbd 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,