[WDMAUD] Close mixers on cleanup. Should fix CORE-10735 definitely (#21)
[reactos.git] / drivers / wdm / audio / legacy / wdmaud / entry.c
index 810dae4..eede791 100644 (file)
@@ -31,6 +31,19 @@ WdmAudInitWorkerRoutine(
     /* get device extension */
     DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
 
+
+    if (DeviceExtension->FileObject == NULL)
+    {
+        /* find available sysaudio devices */
+        Status = WdmAudOpenSysAudioDevices(DeviceObject, DeviceExtension);
+        if (!NT_SUCCESS(Status))
+        {
+            DPRINT1("WdmAudOpenSysAudioDevices failed with %x\n", Status);
+            return;
+        }
+    }
+
+
     /* get device count */
     DeviceCount = GetSysAudioDeviceCount(DeviceObject);
 
@@ -74,20 +87,19 @@ WdmAudTimerRoutine(
 
 NTSTATUS
 NTAPI
-WdmAudInstallDevice(
-    IN  PDRIVER_OBJECT  DriverObject)
+WdmaudAddDevice(
+    IN PDRIVER_OBJECT DriverObject,
+    IN PDEVICE_OBJECT PhysicalDeviceObject)
 {
-    UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\wdmaud");
-    UNICODE_STRING SymlinkName = RTL_CONSTANT_STRING(L"\\DosDevices\\wdmaud");
     PDEVICE_OBJECT DeviceObject;
     NTSTATUS Status;
     PWDMAUD_DEVICE_EXTENSION DeviceExtension;
 
-    DPRINT("WdmAudInstallDevice called\n");
+    DPRINT("WdmaudAddDevice called\n");
 
     Status = IoCreateDevice(DriverObject,
                             sizeof(WDMAUD_DEVICE_EXTENSION),
-                            &DeviceName,
+                            NULL,
                             FILE_DEVICE_KS,
                             0,
                             FALSE,
@@ -113,7 +125,7 @@ WdmAudInstallDevice(
     }
 
     /* register device interfaces */
-    Status = WdmAudRegisterDeviceInterface(DeviceObject, DeviceExtension);
+    Status = WdmAudRegisterDeviceInterface(PhysicalDeviceObject, DeviceExtension);
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("WdmRegisterDeviceInterface failed with %x\n", Status);
@@ -136,26 +148,20 @@ WdmAudInstallDevice(
     /* initialize timer */
     IoInitializeTimer(DeviceObject, WdmAudTimerRoutine, (PVOID)WdmAudTimerRoutine);
 
-    /* find available sysaudio devices */
-    Status = WdmAudOpenSysAudioDevices(DeviceObject, DeviceExtension);
-    if (!NT_SUCCESS(Status))
-    {
-        DPRINT1("WdmAudOpenSysAudioDevices failed with %x\n", Status);
-        IoDeleteSymbolicLink(&SymlinkName);
-        IoDeleteDevice(DeviceObject);
-        return Status;
-    }
-
     /* allocate ks device header */
     Status = KsAllocateDeviceHeader(&DeviceExtension->DeviceHeader, 0, NULL);
     if (!NT_SUCCESS(Status))
     {
         DPRINT1("KsAllocateDeviceHeader failed with %x\n", Status);
-        IoDeleteSymbolicLink(&SymlinkName);
         IoDeleteDevice(DeviceObject);
         return Status;
     }
 
+    /* attach to device stack */
+    DeviceExtension->NextDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject, PhysicalDeviceObject);
+    KsSetDevicePnpAndBaseObject(DeviceExtension->DeviceHeader, DeviceExtension->NextDeviceObject, DeviceObject);
+
+
     /* start the timer */
     IoStartTimer(DeviceObject);
 
@@ -203,10 +209,10 @@ WdmAudCreate(
     NTSTATUS Status;
     PIO_STACK_LOCATION IoStack;
     PWDMAUD_CLIENT pClient;
-    //PWDMAUD_DEVICE_EXTENSION DeviceExtension;
+    PWDMAUD_DEVICE_EXTENSION DeviceExtension;
 
     /* get device extension */
-    //DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+    DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
 
 #if KS_IMPLEMENTED
     Status = KsReferenceSoftwareBusObject((KSDEVICE_HEADER)DeviceObject->DeviceExtension);
@@ -217,6 +223,13 @@ WdmAudCreate(
     }
 #endif
 
+    if (DeviceExtension->FileObject == NULL)
+    {
+        /* initialize */
+        WdmAudInitWorkerRoutine(DeviceObject, NULL);
+    }
+
+
     Status = WdmAudOpenSysaudio(DeviceObject, &pClient);
     if (!NT_SUCCESS(Status))
     {
@@ -313,6 +326,7 @@ WdmAudCleanup(
            /* found an still open audio pin */
            ZwClose(pClient->hPins[Index].Handle);
        }
+       WdmAudCloseAllMixers(DeviceObject, pClient, Index);
     }
 
     /* free pin array */
@@ -354,6 +368,7 @@ DriverEntry(
     Driver->MajorFunction[IRP_MJ_WRITE] = WdmAudReadWrite;
     Driver->MajorFunction[IRP_MJ_READ] = WdmAudReadWrite;
     Driver->MajorFunction[IRP_MJ_POWER] = KsDefaultDispatchPower;
+    Driver->DriverExtension->AddDevice = WdmaudAddDevice;
 
-    return WdmAudInstallDevice(Driver);
+    return STATUS_SUCCESS;
 }