- Filter dispatch is optional, handle it when creating new filters

svn path=/trunk/; revision=42622
This commit is contained in:
Johannes Anderwald 2009-08-11 15:22:06 +00:00
parent 15900e1f91
commit 555a242381

View file

@ -443,6 +443,13 @@ IKsFilter_DispatchClose(
/* free object header */ /* free object header */
KsFreeObjectHeader(This->ObjectHeader); KsFreeObjectHeader(This->ObjectHeader);
} }
else
{
/* complete and forget */
Irp->IoStatus.Status = Status;
/* complete irp */
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
/* done */ /* done */
return Status; return Status;
@ -1085,21 +1092,29 @@ KspCreateFilter(
return Status; return Status;
} }
/* now let driver initialize the filter instance */ /* does the filter have a filter dispatch */
Status = Factory->FilterDescriptor->Dispatch->Create(&This->Filter, Irp); if (Factory->FilterDescriptor->Dispatch)
if (!NT_SUCCESS(Status) && Status != STATUS_PENDING)
{ {
/* driver failed to initialize */ /* does it have a create routine */
DPRINT1("Driver: Status %x\n", Status); if (Factory->FilterDescriptor->Dispatch->Create)
{
/* now let driver initialize the filter instance */
Status = Factory->FilterDescriptor->Dispatch->Create(&This->Filter, Irp);
/* remove filter instance from filter factory */ if (!NT_SUCCESS(Status) && Status != STATUS_PENDING)
iface->lpVtbl->RemoveFilterInstance(iface, (IKsFilter*)&This->lpVtbl); {
/* driver failed to initialize */
DPRINT1("Driver: Status %x\n", Status);
/* free filter instance */ /* remove filter instance from filter factory */
FreeItem(This); iface->lpVtbl->RemoveFilterInstance(iface, (IKsFilter*)&This->lpVtbl);
FreeItem(CreateItem);
return Status; /* free filter instance */
FreeItem(This);
FreeItem(CreateItem);
return Status;
}
}
} }
/* now allocate the object header */ /* now allocate the object header */