[ros-diffs] [janderwald] 39603: - Directly create the device objects in its DriverEntry as AddDevice is never called - Remove the hack of hardcoding the symbolic device name object - Add registering of device interfaces (fails atm because no pdo is provided)

janderwald at svn.reactos.org janderwald at svn.reactos.org
Sat Feb 14 17:10:39 CET 2009


Author: janderwald
Date: Sat Feb 14 10:10:38 2009
New Revision: 39603

URL: http://svn.reactos.org/svn/reactos?rev=39603&view=rev
Log:
- Directly create the device objects in its DriverEntry as AddDevice is never called
- Remove the hack of hardcoding the symbolic device name object
- Add registering of device interfaces (fails atm because no pdo is provided)


Modified:
    trunk/reactos/drivers/wdm/audio/sysaudio/main.c

Modified: trunk/reactos/drivers/wdm/audio/sysaudio/main.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/sysaudio/main.c?rev=39603&r1=39602&r2=39603&view=diff
==============================================================================
--- trunk/reactos/drivers/wdm/audio/sysaudio/main.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/sysaudio/main.c [iso-8859-1] Sat Feb 14 10:10:38 2009
@@ -11,12 +11,15 @@
 
 #include <ntifs.h>
 #include <ntddk.h>
+#include <portcls.h>
 #include <ks.h>
 #define YDEBUG
 #include <debug.h>
 //#include <dxsdk/mediaobj.h>
 #include "sysaudio.h"
 
+const GUID DMOCATEGORY_ACOUSTIC_ECHO_CANCEL    = {0xBF963D80L, 0xC559, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
+const GUID KSCATEGORY_SYSAUDIO                 = {0xA7C7A5B1L, 0x5AF3, 0x11D1, {0x9C, 0xED, 0x00, 0xA0, 0x24, 0xBF, 0x04, 0x07}};
 const GUID KSCATEGORY_AUDIO_DEVICE             = {0xFBF6F530L, 0x07B9, 0x11D2, {0xA7, 0x1E, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88}};
 const GUID KSCATEGORY_PREFERRED_WAVEOUT_DEVICE = {0xD6C5066EL, 0x72C1, 0x11D2, {0x97, 0x55, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88}};
 const GUID KSCATEGORY_PREFERRED_WAVEIN_DEVICE  = {0xD6C50671L, 0x72C1, 0x11D2, {0x97, 0x55, 0x00, 0x00, 0xF8, 0x00, 0x47, 0x88}};
@@ -46,8 +49,19 @@
     IrpStack = IoGetCurrentIrpStackLocation(Irp);
 
     DPRINT1("SysAudio_Pnp called for func %x\n", IrpStack->MinorFunction);
+	DbgBreakPoint();
 
     DeviceExtension = (SYSAUDIODEVEXT*)DeviceObject->DeviceExtension;
+
+
+    if (IrpStack->MinorFunction == IRP_MN_START_DEVICE)
+	{
+    DPRINT1("SysAudio_Pnp called for func IRP_MN_START_DEVICE\n");
+    Irp->IoStatus.Status = STATUS_SUCCESS;
+    Irp->IoStatus.Information = 0;
+    IoCompleteRequest(Irp, IO_NO_INCREMENT);
+    return STATUS_SUCCESS;
+	}
 
     if (IrpStack->MinorFunction == IRP_MN_REMOVE_DEVICE)
     {
@@ -85,7 +99,6 @@
         /* a new device has arrived */
 
         PFILE_OBJECT FileObject = NULL;
-        UNICODE_STRING DeviceName;
         PKSAUDIO_DEVICE_ENTRY DeviceEntry;
         HANDLE NodeHandle;
         IO_STATUS_BLOCK IoStatusBlock;
@@ -95,19 +108,34 @@
         if (!DeviceEntry)
             return STATUS_INSUFFICIENT_RESOURCES;
 
-        if (!RtlCreateUnicodeString(&DeviceEntry->DeviceName, Event->SymbolicLinkName->Buffer))
+        DeviceEntry->DeviceName.Length = 0;
+        DeviceEntry->DeviceName.MaximumLength = Event->SymbolicLinkName->Length + 5 * sizeof(WCHAR);
+        DeviceEntry->DeviceName.Buffer = ExAllocatePool(NonPagedPool, DeviceEntry->DeviceName.MaximumLength);
+        if (!DeviceEntry->DeviceName.Buffer)
         {
             ExFreePool(DeviceEntry);
             return STATUS_INSUFFICIENT_RESOURCES;
         }
 
-#if 1   //HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK HACK
-        RtlInitUnicodeString(&DeviceName, L"\\Device\\00000017");
-#else
-        RtlInitUnicodeString(&DeviceName, Event->SymbolicLinkName->Buffer);
-#endif
-
-        InitializeObjectAttributes(&ObjectAttributes, &DeviceName, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL);
+        if (!NT_SUCCESS(RtlAppendUnicodeToString(&DeviceEntry->DeviceName, L"\\??\\")))
+        {
+
+            ExFreePool(DeviceEntry->DeviceName.Buffer);
+            ExFreePool(DeviceEntry);
+            return STATUS_INSUFFICIENT_RESOURCES;
+        }
+
+        if (!NT_SUCCESS(RtlAppendUnicodeStringToString(&DeviceEntry->DeviceName, Event->SymbolicLinkName)))
+        {
+
+            ExFreePool(DeviceEntry->DeviceName.Buffer);
+            ExFreePool(DeviceEntry);
+            return STATUS_INSUFFICIENT_RESOURCES;
+        }
+
+        DPRINT1("Sym %wZ\n", &DeviceEntry->DeviceName);
+
+        InitializeObjectAttributes(&ObjectAttributes, &DeviceEntry->DeviceName, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL);
 
         Status = ZwCreateFile(&NodeHandle,
                               GENERIC_READ | GENERIC_WRITE,
@@ -181,20 +209,19 @@
 
 NTSTATUS
 NTAPI
-SysAudio_AddDevice(
-    IN  PDRIVER_OBJECT  DriverObject,
-    IN  PDEVICE_OBJECT  PhysicalDeviceObject)
+SysAudio_InstallDevice(
+    IN  PDRIVER_OBJECT  DriverObject)
 {
     NTSTATUS Status;
     UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\sysaudio");
     UNICODE_STRING SymlinkName = RTL_CONSTANT_STRING(L"\\DosDevices\\sysaudio");
     PDEVICE_OBJECT DeviceObject;
-    PDEVICE_OBJECT NextDeviceObject;
+    //PDEVICE_OBJECT NextDeviceObject;
     KSOBJECT_CREATE_ITEM CreateItem;
     SYSAUDIODEVEXT *DeviceExtension;
     UNICODE_STRING SymbolicLink;
 
-    DPRINT1("SysAudio_AddDevice called\n");
+    DPRINT1("SysAudio_InstallDevice called\n");
 
     /* create the device */
     Status = IoCreateDevice(DriverObject,
@@ -227,7 +254,7 @@
     RtlZeroMemory(DeviceExtension, sizeof(SYSAUDIODEVEXT));
 
     KeInitializeMutex(&DeviceExtension->Mutex, 0);
-    DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
+    //DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
     InitializeListHead(&DeviceExtension->KsAudioDeviceList);
 
     /* initialize create item struct */
@@ -238,84 +265,114 @@
                                     1,
                                     &CreateItem);
 
-    if (NT_SUCCESS(Status))
-    {
-        NextDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject, PhysicalDeviceObject);
-        if (NextDeviceObject)
-        {
-            /// FIXME
-            /// KsSetDevicePnpAndBaseObject(DeviceExtension->KsDeviceHeader, NextDeviceObject, DeviceObject);
-            ///
-
-            DeviceExtension->NextDeviceObject = NextDeviceObject;
-
-            Status = IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange,
-                                                    PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES,
-                                                    (PVOID)&KS_CATEGORY_AUDIO,
-                                                    DriverObject,
-                                                    DeviceInterfaceChangeCallback,
-                                                    (PVOID)DeviceExtension,
-                                                    (PVOID*)&DeviceExtension->KsAudioNotificationEntry);
-            if (!NT_SUCCESS(Status))
-            {
-                DPRINT1("IoRegisterPlugPlayNotification failed with %x\n", Status);
-                return Status;
-            }
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("KsAllocateDeviceHeader failed with %x\n", Status);
+        goto cleanup;
+    }
+
 #if 0
-            Status = IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange,
-                                                    PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES,
-                                                    &DMOCATEGORY_ACOUSTIC_ECHO_CANCEL,
-                                                    DriverObject,
-                                                    DeviceInterfaceChangeCallback,
-                                                    (PVOID)DeviceExtension,
-                                                    &DeviceExtension->EchoCancelNotificationEntry);
-            if (!NT_SUCCESS(Status))
-            {
-                DPRINT1("IoRegisterPlugPlayNotification failed with %x\n", Status);
-                return Status;
-            }
+    //NextDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject, PhysicalDeviceObject);
+    /// FIXME
+    /// KsSetDevicePnpAndBaseObject(DeviceExtension->KsDeviceHeader, NextDeviceObject, DeviceObject);
+    ///
+    /// DeviceExtension->NextDeviceObject = NextDeviceObject;
 #endif
 
-            Status = IoRegisterDeviceInterface(PhysicalDeviceObject, &KSCATEGORY_PREFERRED_MIDIOUT_DEVICE, NULL, &SymbolicLink);
-            if (NT_SUCCESS(Status))
-            {
-                RtlFreeUnicodeString(&SymbolicLink);
-            }
-            else
-            {
-                DPRINT1("Failed to register KSCATEGORY_PREFERRED_MIDIOUT_DEVICE interface Status %x\n", Status);
-            }
-
-            Status = IoRegisterDeviceInterface(PhysicalDeviceObject, &KSCATEGORY_PREFERRED_WAVEIN_DEVICE, NULL, &SymbolicLink);
-            if (NT_SUCCESS(Status))
-            {
-                RtlFreeUnicodeString(&SymbolicLink);
-            }
-            else
-            {
-                DPRINT1("Failed to register KSCATEGORY_PREFERRED_WAVEIN_DEVICE interface Status %x\n", Status);
-            }
-
-            Status = IoRegisterDeviceInterface(PhysicalDeviceObject, &KSCATEGORY_PREFERRED_WAVEOUT_DEVICE, NULL, &SymbolicLink);
-            if (NT_SUCCESS(Status))
-            {
-                RtlFreeUnicodeString(&SymbolicLink);
-            }
-            else
-            {
-                DPRINT1("Failed to register KSCATEGORY_PREFERRED_WAVEOUT_DEVICE interface Status %x\n", Status);
-            }
-
-            /* set io flags */
-            DeviceObject->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE;
-            /* clear initializing flag */
-            DeviceObject->Flags &= ~ DO_DEVICE_INITIALIZING;
-        }
-    }
+    Status = IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange,
+                                            PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES,
+                                            (PVOID)&KS_CATEGORY_AUDIO,
+                                            DriverObject,
+                                            DeviceInterfaceChangeCallback,
+                                            (PVOID)DeviceExtension,
+                                            (PVOID*)&DeviceExtension->KsAudioNotificationEntry);
+
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("IoRegisterPlugPlayNotification failed with %x\n", Status);
+        goto cleanup;
+    }
+
+#if 0
+    Status = IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange,
+                                            PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES,
+                                            (PVOID)&DMOCATEGORY_ACOUSTIC_ECHO_CANCEL,
+                                            DriverObject,
+                                            DeviceInterfaceChangeCallback,
+                                            (PVOID)DeviceExtension,
+                                            (PVOID*)&DeviceExtension->EchoCancelNotificationEntry);
+
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("IoRegisterPlugPlayNotification failed with %x\n", Status);
+        goto cleanup;
+    }
+#endif
+
+     Status = IoRegisterDeviceInterface(DeviceObject, &KSCATEGORY_PREFERRED_MIDIOUT_DEVICE, NULL, &SymbolicLink);
+     if (NT_SUCCESS(Status))
+     {
+         IoSetDeviceInterfaceState(&SymbolicLink, TRUE);
+         RtlFreeUnicodeString(&SymbolicLink);
+     }
+     else
+     {
+         DPRINT1("Failed to register KSCATEGORY_PREFERRED_MIDIOUT_DEVICE interface Status %x\n", Status);
+     }
+
+     Status = IoRegisterDeviceInterface(DeviceObject, &KSCATEGORY_PREFERRED_WAVEIN_DEVICE, NULL, &SymbolicLink);
+     if (NT_SUCCESS(Status))
+     {
+         IoSetDeviceInterfaceState(&SymbolicLink, TRUE);
+         RtlFreeUnicodeString(&SymbolicLink);
+     }
+     else
+     {
+         DPRINT1("Failed to register KSCATEGORY_PREFERRED_WAVEIN_DEVICE interface Status %x\n", Status);
+     }
+
+     Status = IoRegisterDeviceInterface(DeviceObject, &KSCATEGORY_PREFERRED_WAVEOUT_DEVICE, NULL, &SymbolicLink);
+     if (NT_SUCCESS(Status))
+     {
+         IoSetDeviceInterfaceState(&SymbolicLink, TRUE);
+         RtlFreeUnicodeString(&SymbolicLink);
+     }
+     else
+     {
+         DPRINT1("Failed to register KSCATEGORY_PREFERRED_WAVEOUT_DEVICE interface Status %x\n", Status);
+     }
+
+     Status = IoRegisterDeviceInterface(DeviceObject, &KSCATEGORY_SYSAUDIO, NULL, &SymbolicLink);
+     if (NT_SUCCESS(Status))
+     {
+         IoSetDeviceInterfaceState(&SymbolicLink, TRUE);
+         RtlFreeUnicodeString(&SymbolicLink);
+     }
+     else
+     {
+         DPRINT1("Failed to register KSCATEGORY_SYSAUDIO interface Status %x\n", Status);
+     }
+
+
+     /* set io flags */
+     DeviceObject->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE;
+     /* clear initializing flag */
+     DeviceObject->Flags &= ~ DO_DEVICE_INITIALIZING;
 
     DPRINT("Device SysAudio_AddDevice result %x\n", Status);
-
     return STATUS_SUCCESS;
+
+cleanup:
+
+    if (DeviceExtension->KsAudioNotificationEntry)
+        IoUnregisterPlugPlayNotification(DeviceExtension->KsAudioNotificationEntry);
+
+    if (DeviceExtension->EchoCancelNotificationEntry)
+        IoUnregisterPlugPlayNotification(DeviceExtension->EchoCancelNotificationEntry);
+
+    IoDeleteSymbolicLink(&SymlinkName);
+    IoDeleteDevice(DeviceObject);
+    return Status;
 }
 
 NTSTATUS
@@ -334,7 +391,6 @@
 
     return STATUS_SUCCESS;
 }
-
 
 NTSTATUS NTAPI
 DriverEntry(
@@ -362,7 +418,6 @@
     DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = KsDefaultForwardIrp;
     DriverObject->MajorFunction[IRP_MJ_PNP] = SysAudio_Pnp;
     DriverObject->DriverUnload = SysAudio_Unload;
-    DriverObject->DriverExtension->AddDevice = SysAudio_AddDevice;
-
-    return STATUS_SUCCESS;
-}
+
+    return SysAudio_InstallDevice(DriverObject);
+}



More information about the Ros-diffs mailing list