https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c51df789e869379a515d94c66da152c5b26660ff

commit c51df789e869379a515d94c66da152c5b26660ff
Author: Sylvain Deverre <deverre.s...@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,

Reply via email to