NTSTATUS OpenDevice( IN LPWSTR Device, OUT PHANDLE DeviceHandle, OUT PFILE_OBJECT * FileObject) { NTSTATUS Status; HANDLE hDevice; /* now open the device */ Status = WdmAudOpenSysAudioDevice(Device, &hDevice); if (!NT_SUCCESS(Status)) { return Status; } *DeviceHandle = hDevice; if (FileObject) { Status = ObReferenceObjectByHandle(hDevice, FILE_READ_DATA | FILE_WRITE_DATA, *IoFileObjectType, KernelMode, (PVOID*)FileObject, NULL); if (!NT_SUCCESS(Status)) { ZwClose(hDevice); } } return Status; }
MIXER_STATUS Open( IN LPWSTR DevicePath, OUT PHANDLE hDevice) { if (WdmAudOpenSysAudioDevice(DevicePath, hDevice) == STATUS_SUCCESS) return MM_STATUS_SUCCESS; else return MM_STATUS_UNSUCCESSFUL; }
NTSTATUS WdmAudOpenSysAudioDevices( IN PDEVICE_OBJECT DeviceObject, IN PWDMAUD_DEVICE_EXTENSION DeviceExtension) { NTSTATUS Status = STATUS_SUCCESS; LPWSTR SymbolicLinkList; SYSAUDIO_ENTRY * Entry; ULONG Length; HANDLE hSysAudio; PFILE_OBJECT FileObject; UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\sysaudio\\GLOBAL"); if (DeviceExtension->DeviceInterfaceSupport) { Status = IoGetDeviceInterfaces(&KSCATEGORY_SYSAUDIO, NULL, 0, &SymbolicLinkList); if (NT_SUCCESS(Status)) { WdmAudOpenSysAudioDeviceInterfaces(DeviceExtension, SymbolicLinkList); FreeItem(SymbolicLinkList); } Status = IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange, PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES, (PVOID)&KSCATEGORY_SYSAUDIO, DeviceObject->DriverObject, DeviceInterfaceChangeCallback, (PVOID)DeviceExtension, &DeviceExtension->SysAudioNotification); } else { Entry = (SYSAUDIO_ENTRY*)AllocateItem(NonPagedPool, sizeof(SYSAUDIO_ENTRY)); if (!Entry) { return STATUS_INSUFFICIENT_RESOURCES; } Length = wcslen(DeviceName.Buffer) + 1; Entry->SymbolicLink.Length = 0; Entry->SymbolicLink.MaximumLength = Length * sizeof(WCHAR); Entry->SymbolicLink.Buffer = AllocateItem(NonPagedPool, Entry->SymbolicLink.MaximumLength); if (!Entry->SymbolicLink.Buffer) { FreeItem(Entry); return STATUS_INSUFFICIENT_RESOURCES; } Status = RtlAppendUnicodeStringToString(&Entry->SymbolicLink, &DeviceName); if (!NT_SUCCESS(Status)) { FreeItem(Entry->SymbolicLink.Buffer); FreeItem(Entry); return Status; } InsertTailList(&DeviceExtension->SysAudioDeviceList, &Entry->Entry); DeviceExtension->NumSysAudioDevices++; DPRINT("Opening device %S\n", Entry->SymbolicLink.Buffer); Status = WdmAudOpenSysAudioDevice(Entry->SymbolicLink.Buffer, &hSysAudio); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to open sysaudio %x\n", Status); return Status; } /* get the file object */ Status = ObReferenceObjectByHandle(hSysAudio, FILE_READ_DATA | FILE_WRITE_DATA, IoFileObjectType, KernelMode, (PVOID*)&FileObject, NULL); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to reference FileObject %x\n", Status); ZwClose(hSysAudio); return Status; } DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; DeviceExtension->hSysAudio = hSysAudio; DeviceExtension->FileObject = FileObject; } return Status; }