- Forward & wait IRP_MN_START_DEVICE to lower device objects before starting the device

- Fix several irp leaks and return correct status in PcForwardIrpSynchronous

svn path=/trunk/; revision=40598
This commit is contained in:
Johannes Anderwald
2009-04-19 22:57:21 +00:00
parent 93d9523069
commit e035665105
2 changed files with 33 additions and 7 deletions
@@ -76,24 +76,37 @@ PortClsPnp(
return Status;
}
/* Assign the resource list to our extension */
DeviceExt->resources = resource_list;
/* forward irp to lower device object */
Status = PcForwardIrpSynchronous(DeviceObject, Irp);
if (!NT_SUCCESS(Status))
{
/* lower device object failed to start */
resource_list->lpVtbl->Release(resource_list);
/* complete the request */
IoCompleteRequest(Irp, IO_NO_INCREMENT);
/* return result */
return Status;
}
/* sanity check */
ASSERT(DeviceExt->StartDevice);
/* Call the StartDevice routine */
DPRINT("Calling StartDevice at 0x%8p\n", DeviceExt->StartDevice);
Status = DeviceExt->StartDevice(DeviceObject, Irp, resource_list);
if (!NT_SUCCESS(Status))
{
DPRINT("StartDevice returned a failure code [0x%8x]\n", Status);
//resource_list->lpVtbl->Release(resource_list);
resource_list->lpVtbl->Release(resource_list);
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
}
/* Assign the resource list to our extension */
DeviceExt->resources = resource_list;
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
@@ -112,7 +125,10 @@ PortClsPnp(
case IRP_MN_QUERY_INTERFACE:
DPRINT("IRP_MN_QUERY_INTERFACE\n");
return PcForwardIrpSynchronous(DeviceObject, Irp);
Status = PcForwardIrpSynchronous(DeviceObject, Irp);
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
case IRP_MN_QUERY_DEVICE_RELATIONS:
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
@@ -124,7 +140,10 @@ PortClsPnp(
return STATUS_SUCCESS;
case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n");
return PcForwardIrpSynchronous(DeviceObject, Irp);
Status = PcForwardIrpSynchronous(DeviceObject, Irp);
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
}
DPRINT1("unhandled function %u\n", IoStack->MinorFunction);
@@ -282,7 +301,7 @@ PcForwardIrpSynchronous(
{
/* not yet, lets wait a bit */
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
Status = STATUS_SUCCESS;
Status = Irp->IoStatus.Status;
}
return Status;
}
@@ -691,6 +691,7 @@ CloseStreamRoutine(
This->CloseIrp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(This->CloseIrp, IO_NO_INCREMENT);
}
DPRINT1("Closing stream at Irql %u\n", KeGetCurrentIrql());
Stream->lpVtbl->Release(Stream);
/* this line is never reached */
}
@@ -970,7 +971,10 @@ IPortPinWaveCyclic_fnInit(
DPRINT1("Failed to add pin to service group\n");
return Status;
}
This->ServiceGroup->lpVtbl->AddRef(This->ServiceGroup);
This->ServiceGroup->lpVtbl->SupportDelayedService(This->ServiceGroup);
This->DmaChannel->lpVtbl->AddRef(This->DmaChannel);
This->State = KSSTATE_STOP;
This->CommonBufferOffset = 0;
@@ -980,6 +984,9 @@ IPortPinWaveCyclic_fnInit(
Status = This->Stream->lpVtbl->SetNotificationFreq(This->Stream, 10, &This->FrameSize);
This->Stream->lpVtbl->SetFormat(This->Stream, (PKSDATAFORMAT)This->Format);
return STATUS_SUCCESS;
}