mirror of
https://github.com/reactos/reactos.git
synced 2024-10-15 13:45:58 +00:00
[KS]
- Add sanity checks - Acquire device entry lock before dealing with device entries - Fix acquiring bus device extension for parent bus device object - Store result in irp io status block - get install interface from assoicated system buffer - Fixes install of new audio devices with ros ks in windows - Tested with VBOX 3.2.10+WINXP+SP3 svn path=/branches/audio-bringup/; revision=50104
This commit is contained in:
parent
3c6ed75839
commit
b546b6d0b2
|
@ -1858,7 +1858,6 @@ KsFilterAttemptProcessing(
|
||||||
if (!KsGateCaptureThreshold(Gate))
|
if (!KsGateCaptureThreshold(Gate))
|
||||||
{
|
{
|
||||||
/* filter control gate is closed */
|
/* filter control gate is closed */
|
||||||
DPRINT1("Gate %p Closed %x\n", Gate, Gate->Count);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
DPRINT1("processing\n");
|
DPRINT1("processing\n");
|
||||||
|
|
|
@ -973,6 +973,9 @@ KspInstallInterface(
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||||
|
|
||||||
|
/* sanity check */
|
||||||
|
ASSERT(InstallInterface);
|
||||||
|
|
||||||
/* calculate length */
|
/* calculate length */
|
||||||
Length = wcslen(InstallInterface->ReferenceString);
|
Length = wcslen(InstallInterface->ReferenceString);
|
||||||
|
|
||||||
|
@ -1059,13 +1062,18 @@ KspInstallBusEnumInterface(
|
||||||
PLIST_ENTRY Entry;
|
PLIST_ENTRY Entry;
|
||||||
PBUS_DEVICE_ENTRY DeviceEntry;
|
PBUS_DEVICE_ENTRY DeviceEntry;
|
||||||
PSWENUM_INSTALL_INTERFACE InstallInterface;
|
PSWENUM_INSTALL_INTERFACE InstallInterface;
|
||||||
|
KIRQL OldLevel;
|
||||||
PBUS_INSTALL_ENUM_CONTEXT Context = (PBUS_INSTALL_ENUM_CONTEXT)Ctx;
|
PBUS_INSTALL_ENUM_CONTEXT Context = (PBUS_INSTALL_ENUM_CONTEXT)Ctx;
|
||||||
|
|
||||||
/* get current irp stack location */
|
/* get current irp stack location */
|
||||||
IoStack = IoGetCurrentIrpStackLocation(Context->Irp);
|
IoStack = IoGetCurrentIrpStackLocation(Context->Irp);
|
||||||
|
|
||||||
/* get install request */
|
/* get install request */
|
||||||
InstallInterface = (PSWENUM_INSTALL_INTERFACE)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
|
InstallInterface = (PSWENUM_INSTALL_INTERFACE)Context->Irp->AssociatedIrp.SystemBuffer;
|
||||||
|
|
||||||
|
/* sanity check */
|
||||||
|
ASSERT(InstallInterface);
|
||||||
|
ASSERT(Context->BusDeviceExtension);
|
||||||
|
|
||||||
if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(SWENUM_INSTALL_INTERFACE))
|
if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(SWENUM_INSTALL_INTERFACE))
|
||||||
{
|
{
|
||||||
|
@ -1095,6 +1103,9 @@ KspInstallBusEnumInterface(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* acquire device entry lock */
|
||||||
|
KeAcquireSpinLock(&Context->BusDeviceExtension->Lock, &OldLevel);
|
||||||
|
|
||||||
/* now iterate all device entries */
|
/* now iterate all device entries */
|
||||||
Entry = Context->BusDeviceExtension->Common.Entry.Flink;
|
Entry = Context->BusDeviceExtension->Common.Entry.Flink;
|
||||||
while(Entry != &Context->BusDeviceExtension->Common.Entry)
|
while(Entry != &Context->BusDeviceExtension->Common.Entry)
|
||||||
|
@ -1114,8 +1125,14 @@ KspInstallBusEnumInterface(
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* move to next entry */
|
||||||
|
Entry = Entry->Flink;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* release device entry lock */
|
||||||
|
KeReleaseSpinLock(&Context->BusDeviceExtension->Lock, OldLevel);
|
||||||
|
|
||||||
/* signal that bus driver relations has changed */
|
/* signal that bus driver relations has changed */
|
||||||
IoInvalidateDeviceRelations(Context->BusDeviceExtension->PhysicalDeviceObject, BusRelations);
|
IoInvalidateDeviceRelations(Context->BusDeviceExtension->PhysicalDeviceObject, BusRelations);
|
||||||
|
|
||||||
|
@ -1364,7 +1381,7 @@ KsGetBusEnumIdentifier(
|
||||||
DeviceExtension = (PDEV_EXTENSION)IoStack->DeviceObject->DeviceExtension;
|
DeviceExtension = (PDEV_EXTENSION)IoStack->DeviceObject->DeviceExtension;
|
||||||
|
|
||||||
/* get bus device extension */
|
/* get bus device extension */
|
||||||
BusDeviceExtension = (PBUS_ENUM_DEVICE_EXTENSION)DeviceExtension->Ext->BusDeviceExtension;
|
BusDeviceExtension = (PBUS_ENUM_DEVICE_EXTENSION)DeviceExtension->Ext;
|
||||||
|
|
||||||
/* sanity checks */
|
/* sanity checks */
|
||||||
ASSERT(BusDeviceExtension);
|
ASSERT(BusDeviceExtension);
|
||||||
|
@ -1715,7 +1732,7 @@ KsInstallBusEnumInterface(
|
||||||
PDEV_EXTENSION DeviceExtension;
|
PDEV_EXTENSION DeviceExtension;
|
||||||
PBUS_ENUM_DEVICE_EXTENSION BusDeviceExtension;
|
PBUS_ENUM_DEVICE_EXTENSION BusDeviceExtension;
|
||||||
|
|
||||||
DPRINT1("KsGetBusEnumPnpDeviceObject\n");
|
DPRINT1("KsInstallBusEnumInterface\n");
|
||||||
|
|
||||||
/* get current irp stack location */
|
/* get current irp stack location */
|
||||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
|
@ -1737,7 +1754,7 @@ KsInstallBusEnumInterface(
|
||||||
DeviceExtension = (PDEV_EXTENSION)IoStack->DeviceObject->DeviceExtension;
|
DeviceExtension = (PDEV_EXTENSION)IoStack->DeviceObject->DeviceExtension;
|
||||||
|
|
||||||
/* get bus device extension */
|
/* get bus device extension */
|
||||||
BusDeviceExtension = DeviceExtension->Ext->BusDeviceExtension;
|
BusDeviceExtension = (PBUS_ENUM_DEVICE_EXTENSION)DeviceExtension->Ext;
|
||||||
|
|
||||||
|
|
||||||
/* initialize context */
|
/* initialize context */
|
||||||
|
@ -1748,10 +1765,12 @@ KsInstallBusEnumInterface(
|
||||||
|
|
||||||
/* queue the work item */
|
/* queue the work item */
|
||||||
ExQueueWorkItem(&Context.WorkItem, DelayedWorkQueue);
|
ExQueueWorkItem(&Context.WorkItem, DelayedWorkQueue);
|
||||||
|
|
||||||
/* wait for completion */
|
/* wait for completion */
|
||||||
KeWaitForSingleObject(&Context.Event, Executive, KernelMode, FALSE, NULL);
|
KeWaitForSingleObject(&Context.Event, Executive, KernelMode, FALSE, NULL);
|
||||||
|
|
||||||
|
/* store result */
|
||||||
|
Irp->IoStatus.Status = Context.Status;
|
||||||
|
|
||||||
/* done */
|
/* done */
|
||||||
return Context.Status;
|
return Context.Status;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue