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/alloca…
==============================================================================
--- 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?…
==============================================================================
--- 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/filter…
==============================================================================
--- 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?…
==============================================================================
--- 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.rbu…
==============================================================================
--- 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/ksifac…
==============================================================================
--- 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/kstype…
==============================================================================
--- 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?…
==============================================================================
--- 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/sw…
==============================================================================
--- 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/sw…
==============================================================================
--- 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>