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…
==============================================================================
--- 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);
+}