mirror of
https://github.com/reactos/reactos.git
synced 2024-07-29 23:58:44 +00:00
[AUDIO-BRINGUP]
- Fix several bugs in SwDispatchPnp routine - Routine did not complete requests, when KsServiceBusEnumPnpRequest successfully handled the request - Software bus driver did not handle resource lists irps - Software bus driver did not support querying pnp device state - Software bus driver leaked the irp for IOCTL_SWENUM_GET_BUS_ID requests in SwDispatchDeviceControl - Software bus driver is now successfully initializes in XP and audio devices are present svn path=/branches/audio-bringup/; revision=50035
This commit is contained in:
parent
fe9ca5c028
commit
7a85cb26a1
|
@ -43,6 +43,9 @@ SwDispatchPnp(
|
||||||
PIO_STACK_LOCATION IoStack;
|
PIO_STACK_LOCATION IoStack;
|
||||||
PDEVICE_OBJECT PnpDeviceObject = NULL;
|
PDEVICE_OBJECT PnpDeviceObject = NULL;
|
||||||
|
|
||||||
|
/* get current stack location */
|
||||||
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
|
|
||||||
/* check if the device object is a child device */
|
/* check if the device object is a child device */
|
||||||
Status = KsIsBusEnumChildDevice(DeviceObject, &ChildDevice);
|
Status = KsIsBusEnumChildDevice(DeviceObject, &ChildDevice);
|
||||||
|
|
||||||
|
@ -55,10 +58,30 @@ SwDispatchPnp(
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DPRINT1("SwDispatchPnp ChildDevice %u Request %x\n", ChildDevice, IoStack->MinorFunction);
|
||||||
|
|
||||||
/* let ks handle it */
|
/* let ks handle it */
|
||||||
Status = KsServiceBusEnumPnpRequest(DeviceObject, Irp);
|
Status = KsServiceBusEnumPnpRequest(DeviceObject, Irp);
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
/* check if the request was for a pdo */
|
||||||
|
if (!ChildDevice)
|
||||||
|
{
|
||||||
|
if (Status != STATUS_NOT_SUPPORTED)
|
||||||
|
{
|
||||||
|
/* store result */
|
||||||
|
Irp->IoStatus.Status = Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* complete request */
|
||||||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
|
/* done */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT1("SwDispatchPnp KsServiceBusEnumPnpRequest Status %x\n", Status);
|
||||||
|
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* invalid request or not supported */
|
/* invalid request or not supported */
|
||||||
Irp->IoStatus.Status = Status;
|
Irp->IoStatus.Status = Status;
|
||||||
|
@ -69,6 +92,8 @@ SwDispatchPnp(
|
||||||
/* get bus enum pnp object */
|
/* get bus enum pnp object */
|
||||||
Status = KsGetBusEnumPnpDeviceObject(DeviceObject, &PnpDeviceObject);
|
Status = KsGetBusEnumPnpDeviceObject(DeviceObject, &PnpDeviceObject);
|
||||||
|
|
||||||
|
DPRINT1("SwDispatchPnp KsGetBusEnumPnpDeviceObject Status %x\n", Status);
|
||||||
|
|
||||||
/* check for success */
|
/* check for success */
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
@ -89,11 +114,49 @@ SwDispatchPnp(
|
||||||
/* delete the device */
|
/* delete the device */
|
||||||
IoDeleteDevice(DeviceObject);
|
IoDeleteDevice(DeviceObject);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (IoStack->MinorFunction == IRP_MN_QUERY_RESOURCES || IoStack->MinorFunction == IRP_MN_QUERY_RESOURCE_REQUIREMENTS)
|
||||||
|
{
|
||||||
|
/* no resources required */
|
||||||
|
Irp->IoStatus.Information = 0;
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
/* skip current location */
|
/* skip current location */
|
||||||
IoSkipCurrentIrpStackLocation(Irp);
|
IoSkipCurrentIrpStackLocation(Irp);
|
||||||
/* call the pnp device object */
|
|
||||||
return IoCallDriver(PnpDeviceObject, Irp);
|
/* call the pnp device object */
|
||||||
|
return IoCallDriver(PnpDeviceObject, Irp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IoStack->MajorFunction == IRP_MN_QUERY_PNP_DEVICE_STATE)
|
||||||
|
{
|
||||||
|
/* device cannot be disabled */
|
||||||
|
Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE;
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
/* skip current location */
|
||||||
|
IoSkipCurrentIrpStackLocation(Irp);
|
||||||
|
|
||||||
|
/* call the pnp device object */
|
||||||
|
return IoCallDriver(PnpDeviceObject, Irp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Status == STATUS_NOT_SUPPORTED)
|
||||||
|
{
|
||||||
|
/* skip current location */
|
||||||
|
IoSkipCurrentIrpStackLocation(Irp);
|
||||||
|
|
||||||
|
/* call the pnp device object */
|
||||||
|
return IoCallDriver(PnpDeviceObject, Irp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* complete the request */
|
||||||
|
Irp->IoStatus.Status = Status;
|
||||||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
@ -149,7 +212,7 @@ SwDispatchDeviceControl(
|
||||||
IN PIRP Irp)
|
IN PIRP Irp)
|
||||||
{
|
{
|
||||||
PIO_STACK_LOCATION IoStack;
|
PIO_STACK_LOCATION IoStack;
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status;
|
||||||
|
|
||||||
/* get current stack location */
|
/* get current stack location */
|
||||||
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
|
@ -158,16 +221,25 @@ SwDispatchDeviceControl(
|
||||||
{
|
{
|
||||||
/* install interface */
|
/* install interface */
|
||||||
Status = KsInstallBusEnumInterface(Irp);
|
Status = KsInstallBusEnumInterface(Irp);
|
||||||
|
DPRINT1("SwDispatchDeviceControl IOCTL_SWENUM_INSTALL_INTERFACE %x\n", Status);
|
||||||
}
|
}
|
||||||
else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_SWENUM_REMOVE_INTERFACE)
|
else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_SWENUM_REMOVE_INTERFACE)
|
||||||
{
|
{
|
||||||
/* remove interface */
|
/* remove interface */
|
||||||
Status = KsRemoveBusEnumInterface(Irp);
|
Status = KsRemoveBusEnumInterface(Irp);
|
||||||
|
DPRINT1("SwDispatchDeviceControl IOCTL_SWENUM_REMOVE_INTERFACE %x\n", Status);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_SWENUM_GET_BUS_ID)
|
else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_SWENUM_GET_BUS_ID)
|
||||||
{
|
{
|
||||||
/* get bus id */
|
/* get bus id */
|
||||||
return KsGetBusEnumIdentifier(Irp);
|
Status = KsGetBusEnumIdentifier(Irp);
|
||||||
|
DPRINT1("SwDispatchDeviceControl IOCTL_SWENUM_GET_BUS_ID %x\n", Status);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DPRINT1("SwDispatchDeviceControl Unknown IOCTL %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode);
|
||||||
|
Status = STATUS_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* store result */
|
/* store result */
|
||||||
|
@ -193,6 +265,8 @@ SwDispatchCreate(
|
||||||
/* check if the device object is a child device */
|
/* check if the device object is a child device */
|
||||||
Status = KsIsBusEnumChildDevice(DeviceObject, &ChildDevice);
|
Status = KsIsBusEnumChildDevice(DeviceObject, &ChildDevice);
|
||||||
|
|
||||||
|
DPRINT1("SwDispatchCreate %x\n", Status);
|
||||||
|
|
||||||
/* check for success */
|
/* check for success */
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
@ -205,6 +279,7 @@ SwDispatchCreate(
|
||||||
}
|
}
|
||||||
/* perform the create request */
|
/* perform the create request */
|
||||||
Status = KsServiceBusEnumCreateRequest(DeviceObject, Irp);
|
Status = KsServiceBusEnumCreateRequest(DeviceObject, Irp);
|
||||||
|
DPRINT1("SwDispatchCreate %x\n", Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check the irp is pending */
|
/* check the irp is pending */
|
||||||
|
@ -246,7 +321,6 @@ SwAddDevice(
|
||||||
PDEVICE_OBJECT FunctionalDeviceObject;
|
PDEVICE_OBJECT FunctionalDeviceObject;
|
||||||
|
|
||||||
DPRINT1("SWENUM AddDevice\n");
|
DPRINT1("SWENUM AddDevice\n");
|
||||||
DbgBreakPoint();
|
|
||||||
|
|
||||||
/* create the device */
|
/* create the device */
|
||||||
Status = IoCreateDevice(DriverObject, sizeof(KSDEVICE_HEADER), NULL, FILE_DEVICE_BUS_EXTENDER, 0, FALSE, &FunctionalDeviceObject);
|
Status = IoCreateDevice(DriverObject, sizeof(KSDEVICE_HEADER), NULL, FILE_DEVICE_BUS_EXTENDER, 0, FALSE, &FunctionalDeviceObject);
|
||||||
|
@ -307,7 +381,6 @@ DriverEntry(
|
||||||
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = SwDispatchSystemControl;
|
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = SwDispatchSystemControl;
|
||||||
|
|
||||||
DPRINT1("SWENUM loaded\n");
|
DPRINT1("SWENUM loaded\n");
|
||||||
DbgBreakPoint();
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue