mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 12:23:31 +00:00
- 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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user