From e035665105e138b8e4552b33db5d8b4b43970cf0 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 19 Apr 2009 22:57:21 +0000 Subject: [PATCH] - 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 --- .../drivers/wdm/audio/backpln/portcls/irp.c | 33 +++++++++++++++---- .../audio/backpln/portcls/pin_wavecyclic.c | 7 ++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/irp.c b/reactos/drivers/wdm/audio/backpln/portcls/irp.c index 9e6871652df..abe2a3c6193 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/irp.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/irp.c @@ -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; } diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c index d2d226695be..eba8bf080bf 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.c @@ -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; }