NTAPI
FilterPinWorkerRoutine(
IN PDEVICE_OBJECT DeviceObject,
- IN PVOID Context)
+ IN PVOID Context)
{
KSPROPERTY PropertyRequest;
KSP_PIN PinRequest;
ULONG Count, Index;
NTSTATUS Status;
ULONG BytesReturned;
+ PSYSAUDIODEVEXT DeviceExtension;
PKSAUDIO_DEVICE_ENTRY DeviceEntry = (PKSAUDIO_DEVICE_ENTRY)Context;
Status = KsSynchronousIoControlDevice(DeviceEntry->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PropertyRequest, sizeof(KSPROPERTY), (PVOID)&Count, sizeof(ULONG), &BytesReturned);
if (!NT_SUCCESS(Status))
{
+ ExFreePool(DeviceEntry);
return;
}
if (!Count)
+ {
+ ExFreePool(DeviceEntry);
return;
+ }
/* allocate pin array */
DeviceEntry->Pins = ExAllocatePool(NonPagedPool, Count * sizeof(PIN_INFO));
if (!DeviceEntry->Pins)
{
/* no memory */
+ ExFreePool(DeviceEntry);
return;
}
/* clear array */
}
DPRINT1("Num Pins %u Num WaveIn Pins %u Name WaveOut Pins %u\n", DeviceEntry->NumberOfPins, DeviceEntry->NumWaveInPin, DeviceEntry->NumWaveOutPin);
+
+ DeviceExtension = (PSYSAUDIODEVEXT)DeviceObject->DeviceExtension;
+
+ InsertTailList(&DeviceExtension->KsAudioDeviceList, &DeviceEntry->Entry);
+ DeviceExtension->NumberOfKsAudioDevices++;
+
}
NTSTATUS
DEVICE_INTERFACE_CHANGE_NOTIFICATION * Event;
NTSTATUS Status = STATUS_SUCCESS;
PSYSAUDIODEVEXT DeviceExtension;
+ PKSAUDIO_DEVICE_ENTRY DeviceEntry;
PDEVICE_OBJECT DeviceObject = (PDEVICE_OBJECT)Context;
DeviceExtension = (PSYSAUDIODEVEXT)DeviceObject->DeviceExtension;
&GUID_DEVICE_INTERFACE_ARRIVAL))
{
/* a new device has arrived */
-
- PKSAUDIO_DEVICE_ENTRY DeviceEntry;
- PIO_WORKITEM WorkItem;
-
DeviceEntry = ExAllocatePool(NonPagedPool, sizeof(KSAUDIO_DEVICE_ENTRY));
if (!DeviceEntry)
{
return Status;
}
- DPRINT1("Successfully opened audio device %u handle %p file object %p device object %p\n", DeviceExtension->KsAudioDeviceList, DeviceEntry->Handle, DeviceEntry->FileObject, DeviceEntry->FileObject->DeviceObject);
- DeviceExtension->NumberOfKsAudioDevices++;
-
- WorkItem = IoAllocateWorkItem(DeviceObject);
- if (WorkItem)
- {
- IoQueueWorkItem(WorkItem, FilterPinWorkerRoutine, DelayedWorkQueue, (PVOID)DeviceEntry);
- }
- InsertTailList(&DeviceExtension->KsAudioDeviceList, &DeviceEntry->Entry);
+ DPRINT1("Successfully opened audio device %u handle %p file object %p device object %p\n", DeviceExtension->NumberOfKsAudioDevices, DeviceEntry->Handle, DeviceEntry->FileObject, DeviceEntry->FileObject->DeviceObject);
+ //FIXME
+ // mutal exclusion
+ IoQueueWorkItem(DeviceExtension->WorkItem, FilterPinWorkerRoutine, DelayedWorkQueue, (PVOID)DeviceEntry);
return Status;
}
else
goto cleanup;
}
- /* Register device notification hooks */
- Status = SysAudioRegisterNotifications(DriverObject,
- DeviceObject);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Failed to register device notifications\n");
- goto cleanup;
- }
-
/* allocate work item */
DeviceExtension->WorkItem = IoAllocateWorkItem(DeviceObject);
if (!DeviceExtension->WorkItem)
goto cleanup;
}
+ /* Register device notification hooks */
+ Status = SysAudioRegisterNotifications(DriverObject,
+ DeviceObject);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Failed to register device notifications\n");
+ goto cleanup;
+ }
/* Load kmixer */
Status = SysAudioOpenKMixer(DeviceExtension);