mirror of
https://github.com/reactos/reactos.git
synced 2025-04-25 16:10:29 +00:00
- Implement enumerating available virtual audio devices and opening them
svn path=/trunk/; revision=39178
This commit is contained in:
parent
45041346e6
commit
3f066801c8
2 changed files with 124 additions and 0 deletions
|
@ -40,6 +40,8 @@ WdmAudAddDevice(
|
||||||
DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
||||||
RtlZeroMemory(DeviceExtension, sizeof(WDMAUD_DEVICE_EXTENSION));
|
RtlZeroMemory(DeviceExtension, sizeof(WDMAUD_DEVICE_EXTENSION));
|
||||||
|
|
||||||
|
InitializeListHead(&DeviceExtension->SysAudioDeviceList);
|
||||||
|
|
||||||
Status = KsAllocateDeviceHeader(&DeviceExtension->DeviceHeader, 0, NULL);
|
Status = KsAllocateDeviceHeader(&DeviceExtension->DeviceHeader, 0, NULL);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
@ -90,6 +92,37 @@ WdmAudPnp(
|
||||||
return KsDefaultDispatchPnp(DeviceObject, Irp);
|
return KsDefaultDispatchPnp(DeviceObject, Irp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
WdmAudOpenSysAudioDevice(
|
||||||
|
IN LPWSTR DeviceName,
|
||||||
|
OUT PHANDLE Handle)
|
||||||
|
{
|
||||||
|
UNICODE_STRING SymbolicLink;
|
||||||
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
RtlInitUnicodeString(&SymbolicLink, DeviceName);
|
||||||
|
InitializeObjectAttributes(&ObjectAttributes, &SymbolicLink, OBJ_OPENIF | OBJ_KERNEL_HANDLE, NULL, NULL);
|
||||||
|
|
||||||
|
Status = IoCreateFile(Handle,
|
||||||
|
SYNCHRONIZE | GENERIC_READ | GENERIC_WRITE,
|
||||||
|
&ObjectAttributes,
|
||||||
|
&IoStatusBlock,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
FILE_OPEN,
|
||||||
|
FILE_SYNCHRONOUS_IO_NONALERT,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
CreateFileTypeNone,
|
||||||
|
NULL,
|
||||||
|
IO_NO_PARAMETER_CHECKING | IO_FORCE_ACCESS_CHECK);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
DeviceInterfaceChangeCallback(
|
DeviceInterfaceChangeCallback(
|
||||||
|
@ -102,6 +135,72 @@ DeviceInterfaceChangeCallback(
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
WdmAudOpenSysAudioDeviceInterfaces(
|
||||||
|
IN PWDMAUD_DEVICE_EXTENSION DeviceExtension,
|
||||||
|
IN LPWSTR SymbolicLinkList)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
HANDLE Handle;
|
||||||
|
SYSAUDIO_ENTRY * Entry;
|
||||||
|
UINT Length;
|
||||||
|
PFILE_OBJECT FileObject;
|
||||||
|
ULONG Result;
|
||||||
|
ULONG BytesReturned;
|
||||||
|
KSPROPERTY KsPropset = {{STATIC_KSPROPSETID_Sysaudio}, KSPROPERTY_SYSAUDIO_DEVICE_DEFAULT, KSPROPERTY_TYPE_SET};
|
||||||
|
|
||||||
|
while(*SymbolicLinkList)
|
||||||
|
{
|
||||||
|
Length = wcslen(SymbolicLinkList) + 1;
|
||||||
|
Status = WdmAudOpenSysAudioDevice(SymbolicLinkList, &Handle);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
Status = ObReferenceObjectByHandle(Handle,
|
||||||
|
FILE_READ_DATA | FILE_WRITE_DATA,
|
||||||
|
IoFileObjectType,
|
||||||
|
KernelMode,
|
||||||
|
(PVOID*)&FileObject,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT1("ObReferenceObjectByHandle failed with %x\n", Status);
|
||||||
|
ZwClose(Handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
Entry = (SYSAUDIO_ENTRY*)ExAllocatePool(NonPagedPool, sizeof(SYSAUDIO_ENTRY) + Length * sizeof(WCHAR));
|
||||||
|
if (!Entry)
|
||||||
|
{
|
||||||
|
ZwClose(Handle);
|
||||||
|
ObDereferenceObject((PVOID)FileObject);
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
Entry->Handle = Handle;
|
||||||
|
Entry->SymbolicLink.Length = Length * sizeof(WCHAR);
|
||||||
|
Entry->SymbolicLink.MaximumLength = Length * sizeof(WCHAR);
|
||||||
|
Entry->SymbolicLink.Buffer = (LPWSTR) (Entry + 1);
|
||||||
|
Entry->FileObject = FileObject;
|
||||||
|
wcscpy(Entry->SymbolicLink.Buffer, SymbolicLinkList);
|
||||||
|
|
||||||
|
InsertTailList(&DeviceExtension->SysAudioDeviceList, &Entry->Entry);
|
||||||
|
|
||||||
|
/* set device as default device */
|
||||||
|
KsSynchronousIoControlDevice(FileObject,
|
||||||
|
KernelMode,
|
||||||
|
IOCTL_KS_PROPERTY,
|
||||||
|
(PVOID)&KsPropset,
|
||||||
|
sizeof(KSPROPERTY),
|
||||||
|
(PVOID)&Result,
|
||||||
|
sizeof(ULONG),
|
||||||
|
&BytesReturned);
|
||||||
|
|
||||||
|
DeviceExtension->NumSysAudioDevices++;
|
||||||
|
}
|
||||||
|
SymbolicLinkList += Length;
|
||||||
|
}
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
|
@ -110,6 +209,7 @@ WdmAudCreate(
|
||||||
IN PIRP Irp)
|
IN PIRP Irp)
|
||||||
{
|
{
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
LPWSTR SymbolicLinkList;
|
||||||
PWDMAUD_DEVICE_EXTENSION DeviceExtension;
|
PWDMAUD_DEVICE_EXTENSION DeviceExtension;
|
||||||
|
|
||||||
DPRINT1("WdmAudCreate\n");
|
DPRINT1("WdmAudCreate\n");
|
||||||
|
@ -126,6 +226,18 @@ WdmAudCreate(
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Status = IoGetDeviceInterfaces(&KSCATEGORY_SYSAUDIO,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
&SymbolicLinkList);
|
||||||
|
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
WdmAudOpenSysAudioDeviceInterfaces(DeviceExtension, SymbolicLinkList);
|
||||||
|
ExFreePool(SymbolicLinkList);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Status = IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange,
|
Status = IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange,
|
||||||
PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES,
|
PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES,
|
||||||
(PVOID)&KSCATEGORY_SYSAUDIO,
|
(PVOID)&KSCATEGORY_SYSAUDIO,
|
||||||
|
|
|
@ -7,11 +7,23 @@
|
||||||
#define YDEBUG
|
#define YDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
LIST_ENTRY Entry;
|
||||||
|
HANDLE Handle;
|
||||||
|
UNICODE_STRING SymbolicLink;
|
||||||
|
PFILE_OBJECT FileObject;
|
||||||
|
}SYSAUDIO_ENTRY;
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
KSDEVICE_HEADER DeviceHeader;
|
KSDEVICE_HEADER DeviceHeader;
|
||||||
PVOID SysAudioNotification;
|
PVOID SysAudioNotification;
|
||||||
|
|
||||||
|
ULONG NumSysAudioDevices;
|
||||||
|
LIST_ENTRY SysAudioDeviceList;
|
||||||
|
|
||||||
}WDMAUD_DEVICE_EXTENSION, *PWDMAUD_DEVICE_EXTENSION;
|
}WDMAUD_DEVICE_EXTENSION, *PWDMAUD_DEVICE_EXTENSION;
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue