- Add sanity checks

- Fix memory leaks

svn path=/trunk/; revision=39784
This commit is contained in:
Johannes Anderwald 2009-02-27 13:19:10 +00:00
parent 49c8f850cd
commit f717c34ae1

View file

@ -155,15 +155,24 @@ CreatePinWorkerRoutine(
WorkerContext->PinConnect->PinToHandle = NULL;
DPRINT1("CreatePinWorkerRoutine entered\n");
ASSERT(WorkerContext->Entry);
ASSERT(WorkerContext->PinConnect);
ASSERT(WorkerContext->Entry->Pins);
ASSERT(WorkerContext->Entry->NumberOfPins > WorkerContext->PinConnect->PinId);
if (WorkerContext->CreateRealPin)
{
/* create the real pin */
DPRINT("Creating real pin\n");
Status = KsCreatePin(WorkerContext->Entry->Handle, WorkerContext->PinConnect, GENERIC_READ | GENERIC_WRITE, &RealPinHandle);
DPRINT1("Status %x\n", Status);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to create Pin with %x\n", Status);
SetIrpIoStatus(WorkerContext->Irp, STATUS_UNSUCCESSFUL, 0);
ExFreePool(WorkerContext->DispatchContext);
ExFreePool(WorkerContext);
return;
}
@ -173,6 +182,16 @@ CreatePinWorkerRoutine(
GENERIC_READ | GENERIC_WRITE,
IoFileObjectType, KernelMode, (PVOID*)&FileObject, NULL);
DPRINT1("Status %x\n", Status);
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to get file object with %x\n", Status);
SetIrpIoStatus(WorkerContext->Irp, STATUS_UNSUCCESSFUL, 0);
ExFreePool(WorkerContext->DispatchContext);
ExFreePool(WorkerContext);
return;
}
if (WorkerContext->Entry->Pins[WorkerContext->PinConnect->PinId].MaxPinInstanceCount == 1)
{
/* store the pin handle there is the pin can only be instantiated once*/
@ -183,11 +202,7 @@ CreatePinWorkerRoutine(
WorkerContext->DispatchContext->Handle = RealPinHandle;
WorkerContext->DispatchContext->PinId = WorkerContext->PinConnect->PinId;
WorkerContext->DispatchContext->AudioEntry = WorkerContext->Entry;
if (NT_SUCCESS(Status))
WorkerContext->DispatchContext->FileObject = FileObject;
else
WorkerContext->DispatchContext->FileObject = NULL;
WorkerContext->DispatchContext->FileObject = FileObject;
}
else
{
@ -204,6 +219,7 @@ CreatePinWorkerRoutine(
{
DPRINT1("Failed to get file object with %x\n", Status);
SetIrpIoStatus(WorkerContext->Irp, STATUS_UNSUCCESSFUL, 0);
ExFreePool(WorkerContext->DispatchContext);
ExFreePool(WorkerContext);
return;
}
@ -224,6 +240,7 @@ CreatePinWorkerRoutine(
}
SetIrpIoStatus(WorkerContext->Irp, STATUS_UNSUCCESSFUL, 0);
ExFreePool(WorkerContext->DispatchContext);
ExFreePool(WorkerContext);
return;
}
@ -236,14 +253,10 @@ CreatePinWorkerRoutine(
if (!NT_SUCCESS(Status))
{
DPRINT1("Failed to get file object with %x\n", Status);
if (WorkerContext->CreateRealPin)
{
/* mark pin as free to use */
WorkerContext->Entry->Pins[WorkerContext->PinConnect->PinId].References = 0;
}
ZwClose(VirtualPinHandle);
SetIrpIoStatus(WorkerContext->Irp, STATUS_UNSUCCESSFUL, 0);
ExFreePool(WorkerContext->DispatchContext);
ExFreePool(WorkerContext);
return;
}
@ -256,8 +269,6 @@ CreatePinWorkerRoutine(
ASSERT(WorkerContext->AudioClient->NumDevices > 0);
ASSERT(WorkerContext->AudioClient->Devs != NULL);
ASSERT(WorkerContext->Entry->Pins != NULL);
ASSERT(WorkerContext->Entry->NumberOfPins > WorkerContext->PinConnect->PinId);
AudioClient = WorkerContext->AudioClient;
NumHandels = AudioClient->Devs[AudioClient->NumDevices -1].ClientHandlesCount;