Author: janderwald Date: Fri Jan 28 10:37:27 2011 New Revision: 50531
URL: http://svn.reactos.org/svn/reactos?rev=50531&view=rev Log: [KS] - Merge from audio branch - Perform irp completion in dedicated function - Move Software Bus function into own file - Remove debugging code which caused crashes - Partly implement IKsProcessingObject interface for filter - Fix check in FindMatchingCreateItem function - Implement software bus enumerator functions [SWENUM] - Implement SwDispatchPower, SwDispatchPower
Added: trunk/reactos/drivers/ksfilter/ks/swenum.c - copied unchanged from r50529, branches/audio-bringup/drivers/ksfilter/ks/swenum.c Modified: trunk/reactos/drivers/ksfilter/directory.rbuild trunk/reactos/drivers/ksfilter/ks/allocators.c trunk/reactos/drivers/ksfilter/ks/api.c trunk/reactos/drivers/ksfilter/ks/clocks.c trunk/reactos/drivers/ksfilter/ks/device.c trunk/reactos/drivers/ksfilter/ks/filter.c trunk/reactos/drivers/ksfilter/ks/filterfactory.c trunk/reactos/drivers/ksfilter/ks/irp.c trunk/reactos/drivers/ksfilter/ks/ks.rbuild trunk/reactos/drivers/ksfilter/ks/ksfunc.h trunk/reactos/drivers/ksfilter/ks/ksiface.h trunk/reactos/drivers/ksfilter/ks/kstypes.h trunk/reactos/drivers/ksfilter/ks/misc.c trunk/reactos/drivers/ksfilter/ks/pin.c trunk/reactos/drivers/ksfilter/ks/priv.h trunk/reactos/drivers/ksfilter/swenum/swenum.c trunk/reactos/drivers/ksfilter/swenum/swenum.rbuild
Modified: trunk/reactos/drivers/ksfilter/directory.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/directory.... ============================================================================== --- trunk/reactos/drivers/ksfilter/directory.rbuild [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/directory.rbuild [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -4,8 +4,8 @@ <directory name="ks"> <xi:include href="ks/ks.rbuild" /> </directory> - <!--<directory name="swenum"> + <directory name="swenum"> <xi:include href="swenum/swenum.rbuild" /> - </directory>--> + </directory> </group>
Modified: trunk/reactos/drivers/ksfilter/ks/allocators.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/allocat... ============================================================================== --- trunk/reactos/drivers/ksfilter/ks/allocators.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/allocators.c [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -163,7 +163,7 @@
/* complete and forget irps */ Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_NOT_IMPLEMENTED; } @@ -172,7 +172,7 @@ { /* invalid request */ Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_INVALID_DEVICE_REQUEST; } @@ -190,7 +190,7 @@ Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; Irp->IoStatus.Information = sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE); /* complete and forget irp */ - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_BUFFER_TOO_SMALL; } if (!(Property->Flags & KSPROPERTY_TYPE_GET)) @@ -198,7 +198,7 @@ /* only support retrieving the property */ Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; /* complete and forget irp */ - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_UNSUCCESSFUL; }
@@ -212,7 +212,7 @@ Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = sizeof(KSSTREAMALLOCATOR_FUNCTIONTABLE); /* complete request */ - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } else if (Property->Id == KSPROPERTY_STREAMALLOCATOR_STATUS) @@ -223,7 +223,7 @@ Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; Irp->IoStatus.Information = sizeof(KSPROPERTY_STREAMALLOCATOR_STATUS); /* complete and forget irp */ - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_BUFFER_TOO_SMALL; } if (!(Property->Flags & KSPROPERTY_TYPE_GET)) @@ -231,7 +231,7 @@ /* only support retrieving the property */ Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; /* complete and forget irp */ - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_UNSUCCESSFUL; }
@@ -246,14 +246,14 @@ Irp->IoStatus.Information = sizeof(KSSTREAMALLOCATOR_STATUS);
/* complete request */ - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } }
/* unhandled request */ Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_NOT_SUPPORTED; } @@ -501,7 +501,7 @@
/* complete request */ Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
return Status; } @@ -523,7 +523,7 @@
/* complete request */ Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
return Status; }
Modified: trunk/reactos/drivers/ksfilter/ks/api.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/api.c?r... ============================================================================== --- trunk/reactos/drivers/ksfilter/ks/api.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/api.c [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -1332,7 +1332,7 @@
/* complete request */ Irp->IoStatus.Status = STATUS_SUCCESS; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS; } @@ -1416,7 +1416,7 @@ IoStack->FileObject->FsContext2 = (PVOID)Header;
Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
@@ -1429,7 +1429,7 @@ FreeItem(Header);
Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; }
@@ -1703,7 +1703,7 @@ if (IoStack->MajorFunction != IRP_MJ_CLOSE) { /* can be completed immediately */ - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return; }
@@ -1711,7 +1711,7 @@ if (!NT_SUCCESS(Irp->IoStatus.Status)) { /* closing failed, complete irp */ - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return; }
@@ -1723,135 +1723,7 @@
}
-/* - @implemented -*/ -KSDDKAPI -NTSTATUS -NTAPI -KsCreateBusEnumObject( - IN PWCHAR BusIdentifier, - IN PDEVICE_OBJECT BusDeviceObject, - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PDEVICE_OBJECT PnpDeviceObject OPTIONAL, - IN REFGUID InterfaceGuid OPTIONAL, - IN PWCHAR ServiceRelativePath OPTIONAL) -{ - ULONG Length; - NTSTATUS Status = STATUS_SUCCESS; - UNICODE_STRING ServiceKeyPath = RTL_CONSTANT_STRING(L"\REGISTRY\MACHINE\SYSTEM\CurrentControlSet\Services\"); - PBUS_ENUM_DEVICE_EXTENSION BusDeviceExtension; - PDEVICE_EXTENSION DeviceExtension; - - /* calculate sizeof bus enum device extension */ - Length = wcslen(BusIdentifier) * sizeof(WCHAR); - Length += sizeof(BUS_ENUM_DEVICE_EXTENSION); - - BusDeviceExtension = AllocateItem(NonPagedPool, Length); - if (!BusDeviceExtension) - { - /* not enough memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* zero device extension */ - RtlZeroMemory(BusDeviceExtension, sizeof(BUS_ENUM_DEVICE_EXTENSION)); - - /* initialize bus device extension */ - wcscpy(BusDeviceExtension->BusIdentifier, BusIdentifier); - - /* allocate service path string */ - Length = ServiceKeyPath.MaximumLength; - Length += BusDeviceObject->DriverObject->DriverExtension->ServiceKeyName.MaximumLength; - - if (ServiceRelativePath) - { - /* relative path for devices */ - Length += wcslen(ServiceRelativePath) + 2 * sizeof(WCHAR); - } - - BusDeviceExtension->ServicePath.Length = 0; - BusDeviceExtension->ServicePath.MaximumLength = Length; - BusDeviceExtension->ServicePath.Buffer = AllocateItem(NonPagedPool, Length); - - if (!BusDeviceExtension->ServicePath.Buffer) - { - /* not enough memory */ - FreeItem(BusDeviceExtension); - return STATUS_INSUFFICIENT_RESOURCES; - } - - RtlAppendUnicodeStringToString(&BusDeviceExtension->ServicePath, &ServiceKeyPath); - RtlAppendUnicodeStringToString(&BusDeviceExtension->ServicePath, &BusDeviceObject->DriverObject->DriverExtension->ServiceKeyName); - - if (ServiceRelativePath) - { - RtlAppendUnicodeToString(&BusDeviceExtension->ServicePath, L"\"); - RtlAppendUnicodeToString(&BusDeviceExtension->ServicePath, ServiceRelativePath); - } - - if (InterfaceGuid) - { - /* register an device interface */ - Status = IoRegisterDeviceInterface(PhysicalDeviceObject, InterfaceGuid, NULL, &BusDeviceExtension->SymbolicLinkName); - - /* check for success */ - if (!NT_SUCCESS(Status)) - { - FreeItem(BusDeviceExtension->ServicePath.Buffer); - FreeItem(BusDeviceExtension); - return Status; - } - - /* now enable device interface */ - Status = IoSetDeviceInterfaceState(&BusDeviceExtension->SymbolicLinkName, TRUE); - - if (!NT_SUCCESS(Status)) - { - FreeItem(BusDeviceExtension->ServicePath.Buffer); - FreeItem(BusDeviceExtension); - return Status; - } - - /* set state enabled */ - BusDeviceExtension->Enabled = TRUE; - } - - /* store device objects */ - BusDeviceExtension->BusDeviceObject = BusDeviceObject; - BusDeviceExtension->PnpDeviceObject = PnpDeviceObject; - BusDeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject; - - if (!PnpDeviceObject) - { - BusDeviceExtension->PnpDeviceObject = IoAttachDeviceToDeviceStack(BusDeviceObject, PhysicalDeviceObject); - - if (!BusDeviceExtension->PnpDeviceObject) - { - /* failed to attach device */ - if (BusDeviceExtension->Enabled) - { - IoSetDeviceInterfaceState(&BusDeviceExtension->SymbolicLinkName, FALSE); - RtlFreeUnicodeString(&BusDeviceExtension->SymbolicLinkName); - } - - /* free device extension */ - FreeItem(BusDeviceExtension->ServicePath.Buffer); - FreeItem(BusDeviceExtension); - - return STATUS_DEVICE_REMOVED; - } - } - - /* attach device extension */ - DeviceExtension = (PDEVICE_EXTENSION)BusDeviceObject->DeviceExtension; - DeviceExtension->DeviceHeader = (PKSIDEVICE_HEADER)BusDeviceExtension; - - /* FIXME scan bus and invalidate device relations */ - return Status; -} - - NTSTATUS +NTSTATUS NTAPI KspSetGetBusDataCompletion( IN PDEVICE_OBJECT DeviceObject, @@ -1979,47 +1851,6 @@
}
-/* - @unimplemented -*/ -KSDDKAPI -NTSTATUS -NTAPI -KsGetBusEnumIdentifier( - IN PIRP Irp) -{ - UNIMPLEMENTED - - return STATUS_UNSUCCESSFUL; -} - -/* - @unimplemented -*/ -KSDDKAPI -NTSTATUS -NTAPI -KsGetBusEnumParentFDOFromChildPDO( - IN PDEVICE_OBJECT DeviceObject, - OUT PDEVICE_OBJECT *FunctionalDeviceObject) -{ - UNIMPLEMENTED - return STATUS_UNSUCCESSFUL; -} - -/* - @unimplemented -*/ -KSDDKAPI -NTSTATUS -NTAPI -KsGetBusEnumPnpDeviceObject( - IN PDEVICE_OBJECT DeviceObject, - IN PDEVICE_OBJECT *PnpDeviceObject) -{ - UNIMPLEMENTED - return STATUS_UNSUCCESSFUL; -}
/* @implemented @@ -2059,33 +1890,6 @@ BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin);
return (PVOID)BasicHeader->Next.Pin; -} - -/* - @unimplemented -*/ -KSDDKAPI -NTSTATUS -NTAPI -KsInstallBusEnumInterface( - PIRP Irp) -{ - UNIMPLEMENTED - return STATUS_UNSUCCESSFUL; -} - -/* - @unimplemented -*/ -KSDDKAPI -NTSTATUS -NTAPI -KsIsBusEnumChildDevice( - IN PDEVICE_OBJECT DeviceObject, - OUT PBOOLEAN ChildDevice) -{ - UNIMPLEMENTED - return STATUS_UNSUCCESSFUL; }
ULONG @@ -2602,104 +2406,6 @@ @unimplemented */ KSDDKAPI -NTSTATUS -NTAPI -KsServiceBusEnumCreateRequest( - IN PDEVICE_OBJECT DeviceObject, - IN OUT PIRP Irp) -{ - UNIMPLEMENTED - return STATUS_UNSUCCESSFUL; -} - - -/* - @unimplemented -*/ -KSDDKAPI -NTSTATUS -NTAPI -KsServiceBusEnumPnpRequest( - IN PDEVICE_OBJECT DeviceObject, - IN OUT PIRP Irp) -{ - UNIMPLEMENTED - return STATUS_UNSUCCESSFUL; -} - -VOID -NTAPI -KspRemoveBusInterface( - PVOID Ctx) -{ - PKSREMOVE_BUS_INTERFACE_CTX Context =(PKSREMOVE_BUS_INTERFACE_CTX)Ctx; - - /* TODO - * get SWENUM_INSTALL_INTERFACE struct - * open device key and delete the keys - */ - - UNIMPLEMENTED - - /* set status */ - Context->Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; - - - /* signal completion */ - KeSetEvent(&Context->Event, IO_NO_INCREMENT, FALSE); -} - -/* - @unimplemented -*/ -KSDDKAPI -NTSTATUS -NTAPI -KsRemoveBusEnumInterface( - IN PIRP Irp) -{ - KPROCESSOR_MODE Mode; - LUID luid; - KSREMOVE_BUS_INTERFACE_CTX Ctx; - WORK_QUEUE_ITEM WorkItem; - - /* get previous mode */ - Mode = ExGetPreviousMode(); - - /* convert to luid */ - luid = RtlConvertUlongToLuid(SE_LOAD_DRIVER_PRIVILEGE); - - /* perform access check */ - if (!SeSinglePrivilegeCheck(luid, Mode)) - { - /* insufficient privileges */ - return STATUS_PRIVILEGE_NOT_HELD; - } - /* initialize event */ - KeInitializeEvent(&Ctx.Event, NotificationEvent, FALSE); - - /* store irp in ctx */ - Ctx.Irp = Irp; - - /* initialize work item */ - ExInitializeWorkItem(&WorkItem, KspRemoveBusInterface, (PVOID)&Ctx); - - /* now queue the work item */ - ExQueueWorkItem(&WorkItem, DelayedWorkQueue); - - /* wait for completion */ - KeWaitForSingleObject(&Ctx.Event, Executive, KernelMode, FALSE, NULL); - - /* return result */ - return Ctx.Irp->IoStatus.Status; - -} - - -/* - @unimplemented -*/ -KSDDKAPI PUNKNOWN NTAPI KsRegisterAggregatedClientUnknown(
Modified: trunk/reactos/drivers/ksfilter/ks/clocks.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/clocks.... ============================================================================== --- trunk/reactos/drivers/ksfilter/ks/clocks.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/clocks.c [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -339,7 +339,7 @@
Irp->IoStatus.Status = STATUS_SUCCESS; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS; } @@ -353,7 +353,7 @@ UNIMPLEMENTED
Irp->IoStatus.Status = STATUS_SUCCESS; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS; }
Modified: trunk/reactos/drivers/ksfilter/ks/device.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/device.... ============================================================================== --- trunk/reactos/drivers/ksfilter/ks/device.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/device.c [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -282,8 +282,6 @@ NTSTATUS Status; PCM_RESOURCE_LIST TranslatedResourceList; PCM_RESOURCE_LIST UntranslatedResourceList; - PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor, UnPartialDescriptor; - ULONG Index;
/* get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -302,42 +300,14 @@ { DPRINT1("NextDevice object failed to start with %x\n", Status); Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; }
TranslatedResourceList = IoStack->Parameters.StartDevice.AllocatedResourcesTranslated; UntranslatedResourceList = IoStack->Parameters.StartDevice.AllocatedResources;
- DPRINT("ResourceDescriptorCount %lu\n", TranslatedResourceList->List[0].PartialResourceList.Count); - for (Index = 0; Index < TranslatedResourceList->List[0].PartialResourceList.Count; Index ++ ) - { - PartialDescriptor = &TranslatedResourceList->List[0].PartialResourceList.PartialDescriptors[Index]; - UnPartialDescriptor = &UntranslatedResourceList->List[0].PartialResourceList.PartialDescriptors[Index]; - DPRINT("Descriptor Type %u\n", PartialDescriptor->Type); - - if (PartialDescriptor->Type == CmResourceTypeInterrupt) - { - DPRINT("CmResourceTypeInterrupt Index %u TRANS Interrupt Number Affinity %x Level %u Vector %u Flags %x Share %x\n", Index, PartialDescriptor->u.Interrupt.Affinity, PartialDescriptor->u.Interrupt.Level, PartialDescriptor->u.Interrupt.Vector, PartialDescriptor->Flags, PartialDescriptor->ShareDisposition); - DPRINT("CmResourceTypeInterrupt Index %u UNTRANS Interrupt Number Affinity %x Level %u Vector %u Flags %x Share %x\n", Index, UnPartialDescriptor->u.Interrupt.Affinity, UnPartialDescriptor->u.Interrupt.Level, UnPartialDescriptor->u.Interrupt.Vector, UnPartialDescriptor->Flags, UnPartialDescriptor->ShareDisposition); - - } - else if (PartialDescriptor->Type == CmResourceTypePort) - { - DPRINT("CmResourceTypePort Index %u TRANS Port Length %u Start %u %u Flags %x Share %x\n", Index, PartialDescriptor->u.Port.Length, PartialDescriptor->u.Port.Start.HighPart, PartialDescriptor->u.Port.Start.LowPart, PartialDescriptor->Flags, PartialDescriptor->ShareDisposition); - DPRINT("CmResourceTypePort Index %u UNTRANS Port Length %u Start %u %u Flags %x Share %x\n", Index, UnPartialDescriptor->u.Port.Length, UnPartialDescriptor->u.Port.Start.HighPart, UnPartialDescriptor->u.Port.Start.LowPart, UnPartialDescriptor->Flags, UnPartialDescriptor->ShareDisposition); - } - else if (PartialDescriptor->Type == CmResourceTypeMemory) - { - DPRINT("CmResourceTypeMemory Index %u TRANS Start %x Length %u Flags %x Share %x\n", Index, PartialDescriptor->u.Memory.Start.LowPart, PartialDescriptor->u.Memory.Length, PartialDescriptor->Flags, PartialDescriptor->ShareDisposition); - DPRINT("CmResourceTypeMemory Index %u TRANS Start %x Length %u Flags %x Share %x\n", Index, UnPartialDescriptor->u.Memory.Start.LowPart, UnPartialDescriptor->u.Memory.Length, UnPartialDescriptor->Flags, UnPartialDescriptor->ShareDisposition); - } - } - ASSERT(DeviceHeader->KsDevice.Descriptor); - ASSERT(DeviceHeader->KsDevice.Descriptor->Dispatch); - ASSERT(DeviceHeader->KsDevice.Descriptor->Dispatch->Start); -
/* do we have a device descriptor */ if (DeviceHeader->KsDevice.Descriptor) @@ -361,7 +331,7 @@ { DPRINT1("Driver: failed to start %x\n", Status); Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; }
@@ -406,12 +376,17 @@ Status = KspSetFilterFactoriesState(DeviceHeader, TRUE); } } + else + { + /* set state to run */ + DeviceHeader->KsDevice.Started = TRUE; + } }
/* store result */ Irp->IoStatus.Status = Status; /* complete request */ - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
if (Ctx) { @@ -420,7 +395,7 @@ }
/* return result */ - DPRINT1("IKsDevice_PnpStartDevice Status %x PostStartRoutine %p\n", Status, Ctx); + DPRINT("IKsDevice_PnpStartDevice Status %x PostStartRoutine %p\n", Status, Ctx); return Status; }
@@ -477,7 +452,7 @@ { DPRINT1("Driver: query stop failed %x\n", Status); Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; }
@@ -487,7 +462,7 @@ DPRINT("Next Device: Status %x\n", Status);
Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; }
@@ -513,7 +488,7 @@
Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; } case IRP_MN_QUERY_INTERFACE: @@ -536,7 +511,7 @@ /* driver supports a private interface */ DPRINT1("IRP_MN_QUERY_INTERFACE Device supports interface\n"); Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; }
@@ -545,7 +520,7 @@
DPRINT1("IRP_MN_QUERY_INTERFACE Next Device: Status %x\n", Status); Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; } case IRP_MN_QUERY_DEVICE_RELATIONS: @@ -556,7 +531,7 @@ DPRINT("IRP_MN_QUERY_DEVICE_RELATIONS Next Device: Status %x\n", Status);
//Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; } case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: @@ -567,7 +542,7 @@ DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS Next Device: Status %x\n", Status);
//Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; } case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: @@ -578,7 +553,7 @@ DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS Next Device: Status %x\n", Status);
Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; } default: @@ -587,7 +562,7 @@ Status = KspForwardIrpSynchronous(DeviceObject, Irp);
Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; } } @@ -604,7 +579,7 @@
Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS; } @@ -669,17 +644,10 @@ } }
- /* acquire list lock */ + /* release list lock */ IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown);
- if (Status != STATUS_PENDING) - { - Irp->IoStatus.Information = 0; - /* set return status */ - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - + /* done */ return Status;
@@ -703,7 +671,7 @@ PKSIOBJECT_BAG Bag; NTSTATUS Status = STATUS_SUCCESS;
- DPRINT("KsInitializeDevice Descriptor %p\n", Descriptor); + DPRINT1("KsInitializeDevice Descriptor %p\n", Descriptor);
/* get device extension */ DeviceExtension = (PDEVICE_EXTENSION)FunctionalDeviceObject->DeviceExtension; @@ -714,7 +682,7 @@ /* point to allocated header */ Header = DeviceExtension->DeviceHeader;
- DPRINT("DeviceHeader %p\n", DeviceExtension->DeviceHeader); + DPRINT1("DeviceHeader %p\n", DeviceExtension->DeviceHeader);
if (Descriptor && Descriptor->Dispatch) { @@ -896,7 +864,7 @@ IKsDevice * Device; PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header;
- DPRINT1("KsDereferenceSoftwareBusObject DeviceHeader %p\n", Header); + DPRINT("KsDereferenceSoftwareBusObject DeviceHeader %p\n", Header);
/* get device interface */ Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown;
Modified: trunk/reactos/drivers/ksfilter/ks/filter.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/filter.... ============================================================================== --- trunk/reactos/drivers/ksfilter/ks/filter.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/filter.c [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -16,6 +16,7 @@
IKsControlVtbl *lpVtblKsControl; IKsFilterFactory * FilterFactory; + IKsProcessingObjectVtbl * lpVtblKsProcessingObject; LONG ref;
PKSIOBJECT_HEADER ObjectHeader; @@ -25,6 +26,9 @@ KMUTEX ControlMutex; KMUTEX ProcessingMutex;
+ PKSWORKER Worker; + WORK_QUEUE_ITEM WorkItem; + KSGATE Gate;
PFNKSFILTERPOWER Sleep; PFNKSFILTERPOWER Wake; @@ -70,6 +74,196 @@ } };
+NTSTATUS +NTAPI +IKsProcessingObject_fnQueryInterface( + IKsProcessingObject * iface, + IN REFIID refiid, + OUT PVOID* Output) +{ + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtblKsProcessingObject); + + if (IsEqualGUIDAligned(refiid, &IID_IUnknown)) + { + *Output = &This->Header.OuterUnknown; + _InterlockedIncrement(&This->ref); + return STATUS_SUCCESS; + } + return STATUS_UNSUCCESSFUL; +} + +ULONG +NTAPI +IKsProcessingObject_fnAddRef( + IKsProcessingObject * iface) +{ + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtblKsProcessingObject); + + return InterlockedIncrement(&This->ref); +} + +ULONG +NTAPI +IKsProcessingObject_fnRelease( + IKsProcessingObject * iface) +{ + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtblKsProcessingObject); + + InterlockedDecrement(&This->ref); + + /* Return new reference count */ + return This->ref; +} + +VOID +NTAPI +IKsProcessingObject_fnProcessingObjectWork( + IKsProcessingObject * iface) +{ + NTSTATUS Status; + LARGE_INTEGER TimeOut; + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtblKsProcessingObject); + + DPRINT1("processing object\n"); + /* first check if running at passive level */ + if (KeGetCurrentIrql() == PASSIVE_LEVEL) + { + /* acquire processing mutex */ + KeWaitForSingleObject(&This->ControlMutex, Executive, KernelMode, FALSE, NULL); + } + else + { + /* dispatch level processing */ + if (KeReadStateMutex(&This->ControlMutex) == 0) + { + /* some thread was faster */ + DPRINT1("processing object too slow\n"); + return; + } + + /* acquire processing mutex */ + TimeOut.QuadPart = 0LL; + Status = KeWaitForSingleObject(&This->ControlMutex, Executive, KernelMode, FALSE, &TimeOut); + + if (Status == STATUS_TIMEOUT) + { + /* some thread was faster */ + DPRINT1("processing object too slow\n"); + return; + } + } + + do + { + + /* check if the and-gate has been enabled again */ + if (&This->Gate.Count != 0) + { + /* gate is open */ + DPRINT1("processing object gate open\n"); + break; + } + + DPRINT1("IKsProcessingObject_fnProcessingObjectWork not implemented\n"); + ASSERT(0); + + }while(TRUE); + + /* release process mutex */ + KeReleaseMutex(&This->ProcessingMutex, FALSE); +} + +PKSGATE +NTAPI +IKsProcessingObject_fnGetAndGate( + IKsProcessingObject * iface) +{ + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtblKsProcessingObject); + + /* return and gate */ + return &This->Gate; +} + +VOID +NTAPI +IKsProcessingObject_fnProcess( + IKsProcessingObject * iface, + IN BOOLEAN Asynchronous) +{ + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtblKsProcessingObject); + + /* should the action be asynchronous */ + if (Asynchronous) + { + /* queue work item */ + KsQueueWorkItem(This->Worker, &This->WorkItem); +DPRINT1("queueing\n"); + /* done */ + return; + } + + /* does the filter require explicit deferred processing */ + if ((This->Filter.Descriptor->Flags & (KSFILTER_FLAG_DISPATCH_LEVEL_PROCESSING | KSFILTER_FLAG_CRITICAL_PROCESSING | KSFILTER_FLAG_HYPERCRITICAL_PROCESSING)) && + KeGetCurrentIrql() > PASSIVE_LEVEL) + { + /* queue work item */ + KsQueueWorkItem(This->Worker, &This->WorkItem); +DPRINT1("queueing\n"); + /* done */ + return; + } +DPRINT1("invoke\n"); + /* call worker routine directly */ + iface->lpVtbl->ProcessingObjectWork(iface); +} + +VOID +NTAPI +IKsProcessingObject_fnReset( + IKsProcessingObject * iface) +{ + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtblKsProcessingObject); + + /* acquire processing mutex */ + KeWaitForSingleObject(&This->ProcessingMutex, Executive, KernelMode, FALSE, NULL); + + /* check if the filter supports dispatch routines */ + if (This->Filter.Descriptor->Dispatch) + { + /* has the filter a reset routine */ + if (This->Filter.Descriptor->Dispatch->Reset) + { + /* reset filter */ + This->Filter.Descriptor->Dispatch->Reset(&This->Filter); + } + } + + /* release process mutex */ + KeReleaseMutex(&This->ProcessingMutex, FALSE); +} + +VOID +NTAPI +IKsProcessingObject_fnTriggerNotification( + IKsProcessingObject * iface) +{ + +} + +static IKsProcessingObjectVtbl vt_IKsProcessingObject = +{ + IKsProcessingObject_fnQueryInterface, + IKsProcessingObject_fnAddRef, + IKsProcessingObject_fnRelease, + IKsProcessingObject_fnProcessingObjectWork, + IKsProcessingObject_fnGetAndGate, + IKsProcessingObject_fnProcess, + IKsProcessingObject_fnReset, + IKsProcessingObject_fnTriggerNotification +}; + + +//--------------------------------------------------------------------------------------------------------- NTSTATUS NTAPI IKsControl_fnQueryInterface( @@ -485,7 +679,7 @@ Irp->IoStatus.Status = Status;
/* complete and forget irp */ - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; } return Status; @@ -522,7 +716,7 @@ /* save the result */ Irp->IoStatus.Status = Status; /* complete irp */ - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
/* remove our instance from the filter factory */ IKsFilter_RemoveFilterFromFilterFactory(This, This->Factory); @@ -535,7 +729,7 @@ /* complete and forget */ Irp->IoStatus.Status = Status; /* complete irp */ - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); }
/* done */ @@ -881,7 +1075,7 @@ if (Status != STATUS_PENDING) { Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); }
/* done */ @@ -1227,7 +1421,7 @@ { /* complete request */ Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); }
/* done */ @@ -1243,7 +1437,7 @@ { UNIMPLEMENTED Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_UNSUCCESSFUL; }
@@ -1356,6 +1550,20 @@ }while(TRUE); }
+VOID +NTAPI +IKsFilter_FilterCentricWorker( + IN PVOID Ctx) +{ + IKsProcessingObject * Object = (IKsProcessingObject*)Ctx; + + /* sanity check */ + ASSERT(Object); + + /* perform work */ + Object->lpVtbl->ProcessingObjectWork(Object); +} + NTSTATUS NTAPI KspCreateFilter( @@ -1377,17 +1585,27 @@ /* get the filter factory */ Factory = iface->lpVtbl->GetStruct(iface);
- if (!Factory || !Factory->FilterDescriptor || !Factory->FilterDescriptor->Dispatch || !Factory->FilterDescriptor->Dispatch->Create) + if (!Factory || !Factory->FilterDescriptor) { /* Sorry it just will not work */ return STATUS_UNSUCCESSFUL; + } + + if (Factory->FilterDescriptor->Flags & KSFILTER_FLAG_DENY_USERMODE_ACCESS) + { + if (Irp->RequestorMode == UserMode) + { + /* filter not accessible from user mode */ + DPRINT1("Access denied\n"); + return STATUS_UNSUCCESSFUL; + } }
/* allocate filter instance */ This = AllocateItem(NonPagedPool, sizeof(IKsFilterImpl)); if (!This) { - DPRINT("KspCreateFilter OutOfMemory\n"); + DPRINT1("KspCreateFilter OutOfMemory\n"); return STATUS_INSUFFICIENT_RESOURCES; }
@@ -1397,7 +1615,7 @@ { /* no memory */ FreeItem(This); - DPRINT("KspCreateFilter OutOfMemory\n"); + DPRINT1("KspCreateFilter OutOfMemory\n"); return STATUS_INSUFFICIENT_RESOURCES; } KsDevice = (IKsDevice*)&DeviceExtension->DeviceHeader->BasicHeader.OuterUnknown; @@ -1424,11 +1642,9 @@ /* no memory */ FreeItem(This->Filter.Bag); FreeItem(This); - DPRINT("KspCreateFilter OutOfMemory\n"); + DPRINT1("KspCreateFilter OutOfMemory\n"); return STATUS_INSUFFICIENT_RESOURCES; } - - DPRINT("KspCreateFilter Flags %lx\n", Factory->FilterDescriptor->Flags);
/* initialize pin create item */ CreateItem[0].Create = IKsFilter_DispatchCreatePin; @@ -1446,11 +1662,13 @@ This->ref = 1; This->Header.OuterUnknown = (PUNKNOWN)&vt_IKsFilter; This->lpVtblKsControl = &vt_IKsControl; + This->lpVtblKsProcessingObject = &vt_IKsProcessingObject;
This->Factory = Factory; This->FilterFactory = iface; This->FileObject = IoStack->FileObject; KeInitializeMutex(&This->ProcessingMutex, 0); + /* initialize basic header */ This->Header.KsDevice = &DeviceExtension->DeviceHeader->KsDevice; This->Header.Parent.KsFilterFactory = iface->lpVtbl->GetStruct(iface); @@ -1460,16 +1678,38 @@ InitializeListHead(&This->Header.EventList); KeInitializeSpinLock(&This->Header.EventListLock);
+ /* initialize and gate */ + KsGateInitializeAnd(&This->Gate, NULL); + + /* FIXME initialize and gate based on pin flags */ + + /* initialize work item */ + ExInitializeWorkItem(&This->WorkItem, IKsFilter_FilterCentricWorker, (PVOID)This->lpVtblKsProcessingObject); + + /* allocate counted work item */ + Status = KsRegisterCountedWorker(HyperCriticalWorkQueue, &This->WorkItem, &This->Worker); + if (!NT_SUCCESS(Status)) + { + /* what can go wrong, goes wrong */ + DPRINT1("KsRegisterCountedWorker failed with %lx\n", Status); + FreeItem(This); + FreeItem(CreateItem); + return Status; + } + /* allocate the stream descriptors */ Status = IKsFilter_CreateDescriptors(This, (PKSFILTER_DESCRIPTOR)Factory->FilterDescriptor); if (!NT_SUCCESS(Status)) { /* what can go wrong, goes wrong */ + DPRINT1("IKsFilter_CreateDescriptors failed with %lx\n", Status); + KsUnregisterWorker(This->Worker); FreeItem(This); FreeItem(CreateItem); - DPRINT("IKsFilter_CreateDescriptors failed with %lx\n", Status); return Status; } + +
/* does the filter have a filter dispatch */ if (Factory->FilterDescriptor->Dispatch) @@ -1489,6 +1729,7 @@ DPRINT1("Driver: Status %x\n", Status);
/* free filter instance */ + KsUnregisterWorker(This->Worker); FreeItem(This); FreeItem(CreateItem); return Status; @@ -1515,7 +1756,7 @@ IKsFilter_AttachFilterToFilterFactory(This, This->Header.Parent.KsFilterFactory);
/* completed initialization */ - DPRINT("KspCreateFilter done %lx KsDevice %p\n", Status, This->Header.KsDevice); + DPRINT1("KspCreateFilter done %lx KsDevice %p\n", Status, This->Header.KsDevice); return Status; }
@@ -1599,7 +1840,7 @@ }
/* - @unimplemented + @implemented */ KSDDKAPI VOID @@ -1608,7 +1849,20 @@ IN PKSFILTER Filter, IN BOOLEAN Asynchronous) { - UNIMPLEMENTED + PKSGATE Gate; + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter); + + /* get gate */ + Gate = This->lpVtblKsProcessingObject->GetAndGate((IKsProcessingObject*)This->lpVtblKsProcessingObject); + + if (!KsGateCaptureThreshold(Gate)) + { + /* filter control gate is closed */ + return; + } +DPRINT1("processing\n"); + /* try initiate processing */ + This->lpVtblKsProcessingObject->Process((IKsProcessingObject*)This->lpVtblKsProcessingObject, Asynchronous); }
/* @@ -1710,8 +1964,10 @@ KsFilterGetAndGate( IN PKSFILTER Filter) { - UNIMPLEMENTED - return NULL; + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter); + + /* return and-gate */ + return &This->Gate; }
/*
Modified: trunk/reactos/drivers/ksfilter/ks/filterfactory.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/filterf... ============================================================================== --- trunk/reactos/drivers/ksfilter/ks/filterfactory.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/filterfactory.c [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -69,7 +69,7 @@ { Irp->IoStatus.Information = 0; Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); }
return Status;
Modified: trunk/reactos/drivers/ksfilter/ks/irp.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/irp.c?r... ============================================================================== --- trunk/reactos/drivers/ksfilter/ks/irp.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/irp.c [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -34,7 +34,7 @@ { /* no create item */ Irp->IoStatus.Status = STATUS_NO_SECURITY_ON_OBJECT; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_NO_SECURITY_ON_OBJECT; }
@@ -50,7 +50,7 @@ Irp->IoStatus.Status = Status; Irp->IoStatus.Information = Length;
- IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; }
@@ -80,7 +80,7 @@ { /* no create item */ Irp->IoStatus.Status = STATUS_NO_SECURITY_ON_OBJECT; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_NO_SECURITY_ON_OBJECT; }
@@ -109,7 +109,7 @@
/* store result */ Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
return Status; } @@ -1154,7 +1154,7 @@ IN PIRP Irp) { Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_INVALID_DEVICE_REQUEST; } @@ -1198,7 +1198,7 @@
/* complete request */ Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
return Status; @@ -1643,14 +1643,15 @@ /* get current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp);
- DPRINT("KsAddIrpToCancelableQueue QueueHead %p SpinLock %p Irp %p ListLocation %x DriverCancel %p\n", QueueHead, SpinLock, Irp, ListLocation, DriverCancel); + DPRINT1("KsAddIrpToCancelableQueue QueueHead %p SpinLock %p Irp %p ListLocation %x DriverCancel %p\n", QueueHead, SpinLock, Irp, ListLocation, DriverCancel);
// HACK for ms portcls if (IoStack->MajorFunction == IRP_MJ_CREATE) { // complete the request + DPRINT1("MS HACK\n"); Irp->IoStatus.Status = STATUS_SUCCESS; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT);
return; } @@ -1736,7 +1737,7 @@ { /* let's complete it */ Irp->IoStatus.Status = STATUS_CANCELLED; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); } }
@@ -1795,14 +1796,12 @@ continue; }
- ASSERT(CreateItemEntry->CreateItem->ObjectClass.Buffer); - DPRINT("CreateItem %S Length %u Request %wZ %u\n", CreateItemEntry->CreateItem->ObjectClass.Buffer, CreateItemEntry->CreateItem->ObjectClass.Length, &RefString, - BufferSize); - - if (CreateItemEntry->CreateItem->ObjectClass.Length > BufferSize) + RefString.Length); + + if (CreateItemEntry->CreateItem->ObjectClass.Length > RefString.Length) { /* create item doesnt match in length */ Entry = Entry->Flink; @@ -1853,7 +1852,7 @@ Irp->IoStatus.Information = 0; /* set return status */ Irp->IoStatus.Status = STATUS_SUCCESS; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; }
@@ -1893,7 +1892,7 @@ Irp->IoStatus.Information = 0; /* set return status */ Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_UNSUCCESSFUL; }
@@ -1929,7 +1928,7 @@ Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; /* complete and forget */ - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; }
@@ -2036,6 +2035,7 @@
/* get device extension */ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; + /* get device header */ DeviceHeader = DeviceExtension->DeviceHeader;
Modified: trunk/reactos/drivers/ksfilter/ks/ks.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/ks.rbui... ============================================================================== --- trunk/reactos/drivers/ksfilter/ks/ks.rbuild [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/ks.rbuild [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -32,4 +32,5 @@ <file>unknown.c</file> <file>worker.c</file> <file>kcom.c</file> + <file>swenum.c</file> </module>
Modified: trunk/reactos/drivers/ksfilter/ks/ksfunc.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/ksfunc.... ============================================================================== --- trunk/reactos/drivers/ksfilter/ks/ksfunc.h [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/ksfunc.h [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -5,6 +5,13 @@
#define TAG_KSDEVICE 'DESK' #define TAG_KSOBJECT_TAG 'HOSK' + +VOID +CompleteRequest( + PIRP Irp, + CCHAR PriorityBoost); + +
NTSTATUS NTAPI
Modified: trunk/reactos/drivers/ksfilter/ks/ksiface.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/ksiface... ============================================================================== --- trunk/reactos/drivers/ksfilter/ks/ksiface.h [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/ksiface.h [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -307,3 +307,34 @@ STDMETHOD_(NTSTATUS, CheckIoCapability)(THIS_ IN ULONG Unknown)PURE; }; + +#undef INTERFACE + + +/***************************************************************************** + * IKsProcessingObject + ***************************************************************************** + */ + +#undef INTERFACE +#define INTERFACE IKsProcessingObject + +DECLARE_INTERFACE_(IKsProcessingObject, IUnknown) +{ + DEFINE_ABSTRACT_UNKNOWN() + + STDMETHOD_(VOID, ProcessingObjectWork)(THIS) PURE; + + STDMETHOD_(PKSGATE, GetAndGate)(THIS) PURE; + + STDMETHOD_(VOID, Process)(THIS_ + IN BOOLEAN Asynchronous)PURE; + + STDMETHOD_(VOID, Reset)(THIS) PURE; + + STDMETHOD_(VOID, TriggerNotification)(THIS) PURE; + +}; + +#undef INTERFACE +
Modified: trunk/reactos/drivers/ksfilter/ks/kstypes.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/kstypes... ============================================================================== --- trunk/reactos/drivers/ksfilter/ks/kstypes.h [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/kstypes.h [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -136,12 +136,6 @@
typedef struct { - PIRP Irp; - KEVENT Event; -}KSREMOVE_BUS_INTERFACE_CTX, *PKSREMOVE_BUS_INTERFACE_CTX; - -typedef struct -{ PLIST_ENTRY List; PFILE_OBJECT FileObject; PKSEVENT_ENTRY EventEntry; @@ -150,19 +144,96 @@
typedef BOOLEAN (NTAPI *PKSEVENT_SYNCHRONIZED_ROUTINE)(PKSEVENT_CTX Context);
-typedef struct -{ - BOOLEAN Enabled; - +struct __BUS_ENUM_DEVICE_EXTENSION__; +struct __BUS_DEVICE_ENTRY__; + +typedef struct +{ + LIST_ENTRY Entry; + ULONG IsBus; + union + { + PDEVICE_OBJECT DeviceObject; + ULONG DeviceReferenceCount; + }; + union + { + struct __BUS_DEVICE_ENTRY__* DeviceEntry; + ULONG Dummy1; + }; + struct __BUS_ENUM_DEVICE_EXTENSION__ *BusDeviceExtension; + ULONG DeviceObjectReferenceCount; +}COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION; + +typedef struct +{ + PCOMMON_DEVICE_EXTENSION Ext; +}DEV_EXTENSION, *PDEV_EXTENSION; + +typedef struct +{ + LIST_ENTRY Entry; + GUID InterfaceGuid; + UNICODE_STRING SymbolicLink; +}BUS_INSTANCE_ENTRY, *PBUS_INSTANCE_ENTRY; + + + +typedef enum +{ + NotStarted = 0, // Not started yet + Started, // Device has received the START_DEVICE IRP + StopPending, // Device has received the QUERY_STOP IRP + Stopped, // Device has received the STOP_DEVICE IRP + RemovePending, // Device has received the QUERY_REMOVE IRP + SurpriseRemovePending, // Device has received the SURPRISE_REMOVE IRP + Deleted +}DEVICE_STATE; + + +typedef struct __BUS_DEVICE_ENTRY__ +{ + LIST_ENTRY Entry; + LIST_ENTRY DeviceInterfaceList; + LIST_ENTRY IrpPendingList; + PDEVICE_OBJECT PDO; + DEVICE_STATE DeviceState; + GUID DeviceGuid; + LPWSTR PDODeviceName; + LPWSTR DeviceName; + LPWSTR BusId; + LARGE_INTEGER TimeCreated; + LARGE_INTEGER TimeExpired; + LPWSTR Instance; +}BUS_DEVICE_ENTRY, *PBUS_DEVICE_ENTRY; + +typedef struct __BUS_ENUM_DEVICE_EXTENSION__ +{ + COMMON_DEVICE_EXTENSION Common; + KSPIN_LOCK Lock; + KEVENT Event; + UNICODE_STRING DeviceInterfaceLink; + PDEVICE_OBJECT PhysicalDeviceObject; PDEVICE_OBJECT PnpDeviceObject; - PDEVICE_OBJECT PhysicalDeviceObject; PDEVICE_OBJECT BusDeviceObject; - + ULONG PdoCreated; + KTIMER Timer; + KDPC Dpc; + WORK_QUEUE_ITEM WorkItem; + ULONG DeviceAttached; UNICODE_STRING ServicePath; - UNICODE_STRING SymbolicLinkName;
WCHAR BusIdentifier[1]; }BUS_ENUM_DEVICE_EXTENSION, *PBUS_ENUM_DEVICE_EXTENSION; + +typedef struct +{ + PIRP Irp; + PBUS_ENUM_DEVICE_EXTENSION BusDeviceExtension; + KEVENT Event; + NTSTATUS Status; + WORK_QUEUE_ITEM WorkItem; +}BUS_INSTALL_ENUM_CONTEXT, *PBUS_INSTALL_ENUM_CONTEXT;
typedef struct {
Modified: trunk/reactos/drivers/ksfilter/ks/misc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/misc.c?... ============================================================================== --- trunk/reactos/drivers/ksfilter/ks/misc.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/misc.c [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -8,6 +8,19 @@
#include "priv.h" + +VOID +CompleteRequest( + PIRP Irp, + CCHAR PriorityBoost) +{ + DPRINT("Completing IRP %p Status %x\n", Irp, Irp->IoStatus.Status); + + ASSERT(Irp->IoStatus.Status != STATUS_PENDING); + + + IoCompleteRequest(Irp, PriorityBoost); +}
PVOID AllocateItem(
Modified: trunk/reactos/drivers/ksfilter/ks/pin.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/pin.c?r... ============================================================================== --- trunk/reactos/drivers/ksfilter/ks/pin.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/pin.c [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -1875,7 +1875,7 @@ DPRINT1("KsProbeStreamIrp failed with %x\n", Status);
Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; }
@@ -1888,7 +1888,7 @@ { DPRINT("NoHeader Canceling Irp %p\n", Irp); Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; }
@@ -1911,7 +1911,7 @@ { DPRINT("NoHeader->Data Canceling Irp %p\n", Irp); Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; }
@@ -1960,7 +1960,7 @@ /* invalid device request */ DPRINT("Filter Centric Processing No Process Routine\n"); Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_UNSUCCESSFUL; }
@@ -2095,7 +2095,7 @@ if (Status != STATUS_PENDING) { Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); }
/* done */ @@ -2135,7 +2135,7 @@ { /* abort closing */ Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; }
@@ -2145,7 +2145,7 @@ if (Status != STATUS_PENDING) { Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; } } @@ -2162,7 +2162,7 @@ UNIMPLEMENTED;
Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_NOT_IMPLEMENTED; }
@@ -2244,7 +2244,7 @@
/* done */ Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return Status; }
@@ -2257,7 +2257,7 @@ UNIMPLEMENTED;
Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + CompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_NOT_IMPLEMENTED; }
Modified: trunk/reactos/drivers/ksfilter/ks/priv.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/ks/priv.h?... ============================================================================== --- trunk/reactos/drivers/ksfilter/ks/priv.h [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/ks/priv.h [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -19,6 +19,8 @@
#include "ksmedia.h" #include "bdamedia.h" +#include <swenum.h> +
#define TAG_DEVICE_HEADER 'KSDH' #define REG_PINFLAG_B_MANY 0x4 /* strmif.h */
Modified: trunk/reactos/drivers/ksfilter/swenum/swenum.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/swenum/swe... ============================================================================== --- trunk/reactos/drivers/ksfilter/swenum/swenum.c [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/swenum/swenum.c [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -18,8 +18,56 @@ IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - - UNIMPLEMENTED; + NTSTATUS Status, PnpStatus; + BOOLEAN ChildDevice; + PIO_STACK_LOCATION IoStack; + PDEVICE_OBJECT PnpDeviceObject = NULL; + + /* get current stack location */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + + /* check if the device object is a child device */ + Status = KsIsBusEnumChildDevice(DeviceObject, &ChildDevice); + + /* get bus enum pnp object */ + PnpStatus = KsGetBusEnumPnpDeviceObject(DeviceObject, &PnpDeviceObject); + + /* check for success */ + if (!NT_SUCCESS(Status) || !NT_SUCCESS(PnpStatus)) + { + /* start next power irp */ + PoStartNextPowerIrp(Irp); + + /* just complete the irp */ + Irp->IoStatus.Status = STATUS_SUCCESS; + + /* complete the irp */ + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + /* done */ + return STATUS_SUCCESS; + } + + if (IoStack->MinorFunction == IRP_MN_SET_POWER || IoStack->MinorFunction == IRP_MN_QUERY_POWER) + { + /* fake success */ + Irp->IoStatus.Status = STATUS_SUCCESS; + } + + if (!ChildDevice) + { + /* forward to pnp device object */ + PoStartNextPowerIrp(Irp); + + /* skip current location */ + IoSkipCurrentIrpStackLocation(Irp); + + /* done */ + return PoCallDriver(PnpDeviceObject, Irp); + } + + /* start next power irp */ + PoStartNextPowerIrp(Irp);
/* just complete the irp */ Irp->IoStatus.Status = STATUS_SUCCESS; @@ -29,7 +77,6 @@
/* done */ return STATUS_SUCCESS; - }
NTSTATUS @@ -43,6 +90,9 @@ PIO_STACK_LOCATION IoStack; PDEVICE_OBJECT PnpDeviceObject = NULL;
+ /* get current stack location */ + IoStack = IoGetCurrentIrpStackLocation(Irp); + /* check if the device object is a child device */ Status = KsIsBusEnumChildDevice(DeviceObject, &ChildDevice);
@@ -55,10 +105,30 @@ return Status; }
+ DPRINT("SwDispatchPnp ChildDevice %u Request %x\n", ChildDevice, IoStack->MinorFunction); + /* let ks handle it */ Status = KsServiceBusEnumPnpRequest(DeviceObject, Irp);
- if (!NT_SUCCESS(Status)) + /* check if the request was for a pdo */ + if (!ChildDevice) + { + if (Status != STATUS_NOT_SUPPORTED) + { + /* store result */ + Irp->IoStatus.Status = Status; + } + + /* complete request */ + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + /* done */ + return Status; + } + + DPRINT("SwDispatchPnp KsServiceBusEnumPnpRequest Status %x\n", Status); + + if (NT_SUCCESS(Status)) { /* invalid request or not supported */ Irp->IoStatus.Status = Status; @@ -69,6 +139,8 @@ /* get bus enum pnp object */ Status = KsGetBusEnumPnpDeviceObject(DeviceObject, &PnpDeviceObject);
+ DPRINT("SwDispatchPnp KsGetBusEnumPnpDeviceObject Status %x\n", Status); + /* check for success */ if (!NT_SUCCESS(Status)) { @@ -89,11 +161,49 @@ /* delete the device */ IoDeleteDevice(DeviceObject); } - - /* skip current location */ - IoSkipCurrentIrpStackLocation(Irp); - /* call the pnp device object */ - return IoCallDriver(PnpDeviceObject, Irp); + else + { + if (IoStack->MinorFunction == IRP_MN_QUERY_RESOURCES || IoStack->MinorFunction == IRP_MN_QUERY_RESOURCE_REQUIREMENTS) + { + /* no resources required */ + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_SUCCESS; + + /* skip current location */ + IoSkipCurrentIrpStackLocation(Irp); + + /* call the pnp device object */ + return IoCallDriver(PnpDeviceObject, Irp); + } + + if (IoStack->MajorFunction == IRP_MN_QUERY_PNP_DEVICE_STATE) + { + /* device cannot be disabled */ + Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE; + Irp->IoStatus.Status = STATUS_SUCCESS; + + /* skip current location */ + IoSkipCurrentIrpStackLocation(Irp); + + /* call the pnp device object */ + return IoCallDriver(PnpDeviceObject, Irp); + } + + if (Status == STATUS_NOT_SUPPORTED) + { + /* skip current location */ + IoSkipCurrentIrpStackLocation(Irp); + + /* call the pnp device object */ + return IoCallDriver(PnpDeviceObject, Irp); + } + } + + /* complete the request */ + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Status; }
NTSTATUS @@ -149,7 +259,7 @@ IN PIRP Irp) { PIO_STACK_LOCATION IoStack; - NTSTATUS Status = STATUS_SUCCESS; + NTSTATUS Status;
/* get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -158,16 +268,25 @@ { /* install interface */ Status = KsInstallBusEnumInterface(Irp); + DPRINT("SwDispatchDeviceControl IOCTL_SWENUM_INSTALL_INTERFACE %x\n", Status); } else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_SWENUM_REMOVE_INTERFACE) { /* remove interface */ Status = KsRemoveBusEnumInterface(Irp); + DPRINT("SwDispatchDeviceControl IOCTL_SWENUM_REMOVE_INTERFACE %x\n", Status); + } else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_SWENUM_GET_BUS_ID) { /* get bus id */ - return KsGetBusEnumIdentifier(Irp); + Status = KsGetBusEnumIdentifier(Irp); + DPRINT("SwDispatchDeviceControl IOCTL_SWENUM_GET_BUS_ID %x\n", Status); + } + else + { + DPRINT("SwDispatchDeviceControl Unknown IOCTL %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode); + Status = STATUS_INVALID_PARAMETER; }
/* store result */ @@ -192,6 +311,8 @@
/* check if the device object is a child device */ Status = KsIsBusEnumChildDevice(DeviceObject, &ChildDevice); + + DPRINT("SwDispatchCreate %x\n", Status);
/* check for success */ if (NT_SUCCESS(Status)) @@ -205,6 +326,7 @@ } /* perform the create request */ Status = KsServiceBusEnumCreateRequest(DeviceObject, Irp); + DPRINT("SwDispatchCreate %x\n", Status); }
/* check the irp is pending */ @@ -245,6 +367,7 @@ NTSTATUS Status; PDEVICE_OBJECT FunctionalDeviceObject;
+ DPRINT("SWENUM AddDevice\n"); /* create the device */ Status = IoCreateDevice(DriverObject, sizeof(KSDEVICE_HEADER), NULL, FILE_DEVICE_BUS_EXTENDER, 0, FALSE, &FunctionalDeviceObject);
@@ -303,7 +426,7 @@ DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = SwDispatchDeviceControl; DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = SwDispatchSystemControl;
- + DPRINT("SWENUM loaded\n"); return STATUS_SUCCESS; }
Modified: trunk/reactos/drivers/ksfilter/swenum/swenum.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/swenum/swe... ============================================================================== --- trunk/reactos/drivers/ksfilter/swenum/swenum.rbuild [iso-8859-1] (original) +++ trunk/reactos/drivers/ksfilter/swenum/swenum.rbuild [iso-8859-1] Fri Jan 28 10:37:27 2011 @@ -1,6 +1,7 @@ <?xml version="1.0"?> <!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd"> <module name="swenum" type="kernelmodedriver" installbase="system32/drivers" installname="swenum.sys"> + <bootstrap installbase="$(CDOUTPUT)" /> <library>ntoskrnl</library> <library>ks</library> <file>swenum.c</file>