NTSTATUS NTAPI IKsFilterFactory_Create( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PKSOBJECT_CREATE_ITEM CreateItem; IKsFilterFactoryImpl * Factory; IKsFilterFactory * iface; NTSTATUS Status; /* access the create item */ CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp); if (!CreateItem) { DPRINT1("IKsFilterFactory_Create no CreateItem\n"); return STATUS_UNSUCCESSFUL; } /* get filter factory interface */ Factory = (IKsFilterFactoryImpl*)CONTAINING_RECORD(CreateItem->Context, IKsFilterFactoryImpl, FilterFactory); /* get interface */ iface = (IKsFilterFactory*)&Factory->Header.OuterUnknown; /* create a filter instance */ Status = KspCreateFilter(DeviceObject, Irp, iface); DPRINT("KspCreateFilter Status %x\n", Status); if (Status != STATUS_PENDING) { Irp->IoStatus.Information = 0; Irp->IoStatus.Status = Status; CompleteRequest(Irp, IO_NO_INCREMENT); } return Status; }
NTSTATUS NTAPI PcCreateItemDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { NTSTATUS Status; ISubdevice * SubDevice; IIrpTarget *Filter; PKSOBJECT_CREATE_ITEM CreateItem, PinCreateItem; // access the create item CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp); DPRINT("PcCreateItemDispatch called DeviceObject %p %S Name\n", DeviceObject, CreateItem->ObjectClass.Buffer); // get the subdevice SubDevice = (ISubdevice*)CreateItem->Context; // sanity checks PC_ASSERT(SubDevice != NULL); #if KS_IMPLEMENTED Status = KsReferenceSoftwareBusObject(DeviceExt->KsDeviceHeader); if (!NT_SUCCESS(Status) && Status != STATUS_NOT_IMPLEMENTED) { DPRINT("PcCreateItemDispatch failed to reference device header\n"); FreeItem(Entry, TAG_PORTCLASS); goto cleanup; } #endif // get filter object Status = SubDevice->NewIrpTarget(&Filter, NULL, NULL, NonPagedPool, DeviceObject, Irp, NULL); if (!NT_SUCCESS(Status)) { DPRINT("Failed to get filter object\n"); Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; } // allocate pin create item PinCreateItem = (PKSOBJECT_CREATE_ITEM)AllocateItem(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM), TAG_PORTCLASS); if (!PinCreateItem) { // not enough memory Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_INSUFFICIENT_RESOURCES; } // initialize pin create item PinCreateItem->Context = (PVOID)Filter; PinCreateItem->Create = PcCreatePinDispatch; RtlInitUnicodeString(&PinCreateItem->ObjectClass, KSSTRING_Pin); // FIXME copy security descriptor // now allocate a dispatch object Status = NewDispatchObject(Irp, Filter, 1, PinCreateItem); // complete request Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; }
NTSTATUS NTAPI PcCreatePinDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { NTSTATUS Status; IIrpTarget *Filter; IIrpTarget *Pin; PKSOBJECT_CREATE_ITEM CreateItem; // access the create item CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp); // sanity check PC_ASSERT(CreateItem); DPRINT("PcCreatePinDispatch called DeviceObject %p %S Name\n", DeviceObject, CreateItem->ObjectClass.Buffer); Filter = (IIrpTarget*)CreateItem->Context; // sanity checks PC_ASSERT(Filter != NULL); PC_ASSERT_IRQL(PASSIVE_LEVEL); #if KS_IMPLEMENTED Status = KsReferenceSoftwareBusObject(DeviceExt->KsDeviceHeader); if (!NT_SUCCESS(Status) && Status != STATUS_NOT_IMPLEMENTED) { DPRINT("PcCreatePinDispatch failed to reference device header\n"); FreeItem(Entry, TAG_PORTCLASS); goto cleanup; } #endif Status = Filter->NewIrpTarget(&Pin, KSSTRING_Pin, NULL, NonPagedPool, DeviceObject, Irp, NULL); DPRINT("PcCreatePinDispatch Status %x\n", Status); if (NT_SUCCESS(Status)) { // create the dispatch object // FIXME need create item for clock Status = NewDispatchObject(Irp, Pin, 0, NULL); DPRINT("Pin %p\n", Pin); } DPRINT("CreatePinWorkerRoutine completing irp %p\n", Irp); // save status in irp Irp->IoStatus.Status = Status; Irp->IoStatus.Information = 0; // complete the request IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; }