From f6ef04567a7feafc7262e456ed573f29cfd557bd Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Wed, 1 Jul 2009 14:44:31 +0000 Subject: [PATCH] - Partly Implement StreamClassReadWriteConfig - Allocate a HwInstance buffer which is passed to each instantiated filter instance svn path=/trunk/; revision=41725 --- .../drivers/wdm/audio/legacy/stream/driver.c | 95 +++++++++++++++++++ .../drivers/wdm/audio/legacy/stream/filter.c | 23 +++++ .../wdm/audio/legacy/stream/stream.spec | 3 +- 3 files changed, 120 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/wdm/audio/legacy/stream/driver.c b/reactos/drivers/wdm/audio/legacy/stream/driver.c index c1a9c03cd96..b36f08d12ee 100644 --- a/reactos/drivers/wdm/audio/legacy/stream/driver.c +++ b/reactos/drivers/wdm/audio/legacy/stream/driver.c @@ -290,6 +290,7 @@ StreamClassGetDmaBuffer( IN PVOID HwDeviceExtension) { PSTREAM_DEVICE_EXTENSION DeviceExtension; + /* Get our DeviceExtension */ DeviceExtension = (PSTREAM_DEVICE_EXTENSION) ((ULONG_PTR)HwDeviceExtension - sizeof(STREAM_DEVICE_EXTENSION)); ASSERT(DeviceExtension->DeviceExtension == HwDeviceExtension); @@ -297,3 +298,97 @@ StreamClassGetDmaBuffer( return DeviceExtension->DmaCommonBuffer; } +NTSTATUS +NTAPI +StreamClassRWCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID Context) +{ + PIO_STATUS_BLOCK IoStatusBlock = (PIO_STATUS_BLOCK)Context; + + IoStatusBlock->Information = Irp->IoStatus.Information; + IoStatusBlock->Status = Irp->IoStatus.Status; + + return STATUS_SUCCESS; +} + +/* + *@implemented + */ +BOOLEAN +STREAMAPI +StreamClassReadWriteConfig( + IN PVOID HwDeviceExtension, + IN BOOLEAN Read, + IN PVOID Buffer, + IN ULONG OffSet, + IN ULONG Length) +{ + PIRP Irp; + ULONG MajorFunction; + KEVENT Event; + PSTREAM_DEVICE_EXTENSION DeviceExtension; + LARGE_INTEGER Offset; + IO_STATUS_BLOCK StatusBlock; + NTSTATUS Status; + + /* Get our DeviceExtension */ + DeviceExtension = (PSTREAM_DEVICE_EXTENSION) ((ULONG_PTR)HwDeviceExtension - sizeof(STREAM_DEVICE_EXTENSION)); + ASSERT(DeviceExtension->DeviceExtension == HwDeviceExtension); + + if (Read) + { + /* Zero input buffer */ + RtlZeroMemory(Buffer, Length); + } + + /* Set request type */ + MajorFunction = (Read ? IRP_MJ_READ : IRP_MJ_WRITE); + + /* Initialize event */ + KeInitializeEvent(&Event, NotificationEvent, FALSE); + + /* Set offset */ + Offset.QuadPart = OffSet; + + /* Pre-init status block */ + StatusBlock.Status = STATUS_NOT_SUPPORTED; + + /* Create Irp */ + Irp = IoBuildSynchronousFsdRequest(MajorFunction, + DeviceExtension->LowerDeviceObject, /* Verify */ + Buffer, + Length, + &Offset, + &Event, + &StatusBlock); + + if (!Irp) + { + /* Failed to allocate memory */ + return FALSE; + } + + /* Setup a completion routine */ + IoSetCompletionRoutine(Irp, StreamClassRWCompletion, (PVOID)&Event, TRUE, TRUE, TRUE); + + /* Call driver */ + Status = IoCallDriver(DeviceExtension->LowerDeviceObject, Irp); + + if (Status == STATUS_PENDING) + { + /* Request is pending, wait for result */ + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + /* Fetch result */ + Status = StatusBlock.Status; + } + + if (!NT_SUCCESS(Status)) + { + return FALSE; + } + + /* FIXME Handle Length != InputLength */ + return TRUE; +} diff --git a/reactos/drivers/wdm/audio/legacy/stream/filter.c b/reactos/drivers/wdm/audio/legacy/stream/filter.c index f23e038d565..58ac89aeedf 100644 --- a/reactos/drivers/wdm/audio/legacy/stream/filter.c +++ b/reactos/drivers/wdm/audio/legacy/stream/filter.c @@ -102,6 +102,7 @@ InitializeFilterWithKs( PKSOBJECT_CREATE_ITEM CreateItem; PIO_STACK_LOCATION IoStack; HW_STREAM_REQUEST_BLOCK_EXT RequestBlock; + PVOID HwInstanceExtension = NULL; /* Get device extension */ DeviceExtension = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension; @@ -120,10 +121,22 @@ InitializeFilterWithKs( /* driver supports more than one filter instance */ RtlZeroMemory(&RequestBlock, sizeof(HW_STREAM_REQUEST_BLOCK_EXT)); + /* allocate instance extension */ + HwInstanceExtension = ExAllocatePool(NonPagedPool, DeviceExtension->DriverExtension->Data.FilterInstanceExtensionSize); + if (!HwInstanceExtension) + { + /* Not enough memory */ + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Zero instance extension */ + RtlZeroMemory(HwInstanceExtension, DeviceExtension->DriverExtension->Data.FilterInstanceExtensionSize); + /* set up request block */ RequestBlock.Block.Command = SRB_OPEN_DEVICE_INSTANCE; RequestBlock.Block.HwDeviceExtension = DeviceExtension->DeviceExtension; RequestBlock.Block.Irp = Irp; + RequestBlock.Block.HwInstanceExtension = HwInstanceExtension; KeInitializeEvent(&RequestBlock.Event, SynchronizationEvent, FALSE); /*FIXME SYNCHRONIZATION */ @@ -139,6 +152,7 @@ InitializeFilterWithKs( if (!NT_SUCCESS(RequestBlock.Block.Status)) { /* Resource is not available */ + ExFreePool(HwInstanceExtension); return RequestBlock.Block.Status; } } @@ -162,8 +176,17 @@ InitializeFilterWithKs( { /* Failed to create header */ ExFreePool(CreateItem); + if (HwInstanceExtension) + { + /* free instance buffer */ + ExFreePool(HwInstanceExtension); + } return Status; } + + /* Store instance buffer in file object context */ + IoStack->FileObject->FsContext2 = HwInstanceExtension; + /* Increment total instance count */ InterlockedIncrement(&DeviceExtension->InstanceCount); /* Return result */ diff --git a/reactos/drivers/wdm/audio/legacy/stream/stream.spec b/reactos/drivers/wdm/audio/legacy/stream/stream.spec index 0618b1d168c..85cb8dc4b6a 100644 --- a/reactos/drivers/wdm/audio/legacy/stream/stream.spec +++ b/reactos/drivers/wdm/audio/legacy/stream/stream.spec @@ -5,4 +5,5 @@ @ stdcall StreamClassDebugAssert(long long ptr long) @ cdecl StreamClassDebugPrint (long str) @ cdecl StreamClassDeviceNotification(long ptr) -@ stdcall StreamClassGetDmaBuffer(ptr) \ No newline at end of file +@ stdcall StreamClassGetDmaBuffer(ptr) +@ stdcall StreamClassReadWriteConfig(ptr long ptr long long) \ No newline at end of file