[WDMAUD] Close mixers on cleanup. Should fix CORE-10735 definitely (#21)
authorSylvain Deverre <deverre.sylv@gmail.com>
Sun, 8 Oct 2017 09:29:17 +0000 (11:29 +0200)
committerGitHub <noreply@github.com>
Sun, 8 Oct 2017 09:29:17 +0000 (11:29 +0200)
[WDMAUD] Close mixers on cleanup. CORE-10735

drivers/wdm/audio/legacy/wdmaud/entry.c
drivers/wdm/audio/legacy/wdmaud/mmixer.c
drivers/wdm/audio/legacy/wdmaud/wdmaud.h

index ee30484..eede791 100644 (file)
@@ -326,6 +326,7 @@ WdmAudCleanup(
            /* found an still open audio pin */
            ZwClose(pClient->hPins[Index].Handle);
        }
+       WdmAudCloseAllMixers(DeviceObject, pClient, Index);
     }
 
     /* free pin array */
index 9887d09..3016d24 100644 (file)
@@ -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(
index 04d8975..49f01f2 100644 (file)
@@ -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,