Author: janderwald
Date: Sun Jun 28 17:58:47 2009
New Revision: 41662
URL:
http://svn.reactos.org/svn/reactos?rev=41662&view=rev
Log:
- Start implementing the stream class driver
- Implemented StreamClassRegisterAdapter, StreamClassReenumerateStreams,
StreamClassDebugAssert, StreamClassDebugPrint, StreamClassGetDmaBuffer
- Drivers using stream class driver should now be able to initialize
Added:
trunk/reactos/drivers/wdm/audio/legacy/stream/ (with props)
trunk/reactos/drivers/wdm/audio/legacy/stream/control.c (with props)
trunk/reactos/drivers/wdm/audio/legacy/stream/dll.c (with props)
trunk/reactos/drivers/wdm/audio/legacy/stream/driver.c (with props)
trunk/reactos/drivers/wdm/audio/legacy/stream/filter.c (with props)
trunk/reactos/drivers/wdm/audio/legacy/stream/helper.c (with props)
trunk/reactos/drivers/wdm/audio/legacy/stream/pnp.c (with props)
trunk/reactos/drivers/wdm/audio/legacy/stream/stream.h (with props)
trunk/reactos/drivers/wdm/audio/legacy/stream/stream.rbuild (with props)
trunk/reactos/drivers/wdm/audio/legacy/stream/stream.rc (with props)
trunk/reactos/drivers/wdm/audio/legacy/stream/stream.spec (with props)
Modified:
trunk/reactos/drivers/wdm/audio/legacy/directory.rbuild
Modified: trunk/reactos/drivers/wdm/audio/legacy/directory.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/d…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/directory.rbuild [iso-8859-1] (original)
+++ trunk/reactos/drivers/wdm/audio/legacy/directory.rbuild [iso-8859-1] Sun Jun 28
17:58:47 2009
@@ -4,4 +4,8 @@
<directory name="wdmaud">
<xi:include href="wdmaud/wdmaud.rbuild" />
</directory>
+ <directory name="stream">
+ <xi:include href="stream/stream.rbuild" />
+ </directory>
+
</group>
Propchange: trunk/reactos/drivers/wdm/audio/legacy/stream/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Sun Jun 28 17:58:47 2009
@@ -1,0 +1,2 @@
+([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))?
+(\d+)
Propchange: trunk/reactos/drivers/wdm/audio/legacy/stream/
------------------------------------------------------------------------------
bugtraq:message = See issue #%BUGID% for more details.
Propchange: trunk/reactos/drivers/wdm/audio/legacy/stream/
------------------------------------------------------------------------------
bugtraq:url =
http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID%
Propchange: trunk/reactos/drivers/wdm/audio/legacy/stream/
------------------------------------------------------------------------------
tsvn:logminsize = 10
Added: trunk/reactos/drivers/wdm/audio/legacy/stream/control.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/s…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/stream/control.c (added)
+++ trunk/reactos/drivers/wdm/audio/legacy/stream/control.c [iso-8859-1] Sun Jun 28
17:58:47 2009
@@ -1,0 +1,71 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/legacy/stream/dll.c
+ * PURPOSE: kernel mode driver initialization
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
+#include "stream.h"
+
+
+NTSTATUS
+NTAPI
+StreamClassPower(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+StreamClassSystemControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+StreamClassCleanup(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+StreamClassFlushBuffers(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+}
+
+NTSTATUS
+NTAPI
+StreamClassDeviceControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+}
Propchange: trunk/reactos/drivers/wdm/audio/legacy/stream/control.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/drivers/wdm/audio/legacy/stream/dll.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/s…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/stream/dll.c (added)
+++ trunk/reactos/drivers/wdm/audio/legacy/stream/dll.c [iso-8859-1] Sun Jun 28 17:58:47
2009
@@ -1,0 +1,30 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/legacy/stream/dll.c
+ * PURPOSE: kernel mode driver initialization
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
+#include "stream.h"
+
+/*
+ * @implemented
+ */
+ULONG
+NTAPI
+DllInitialize(ULONG Unknown)
+{
+ return 0;
+}
+
+/*
+ * @implemented
+ */
+ULONG
+NTAPI
+DllUnload(VOID)
+{
+ return 0;
+}
Propchange: trunk/reactos/drivers/wdm/audio/legacy/stream/dll.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/drivers/wdm/audio/legacy/stream/driver.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/s…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/stream/driver.c (added)
+++ trunk/reactos/drivers/wdm/audio/legacy/stream/driver.c [iso-8859-1] Sun Jun 28
17:58:47 2009
@@ -1,0 +1,299 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/legacy/stream/driver.c
+ * PURPOSE: WDM Codec Class Driver
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+#include "stream.h"
+
+NTSTATUS
+NTAPI
+StreamClassAddDevice(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT PhysicalDeviceObject)
+{
+ PSTREAM_CLASS_DRIVER_EXTENSION DriverObjectExtension;
+ PDEVICE_OBJECT DeviceObject, LowerDeviceObject;
+ PSTREAM_DEVICE_EXTENSION DeviceExtension;
+ PKSOBJECT_CREATE_ITEM ItemList;
+ NTSTATUS Status;
+
+ /* Fetch driver object extension */
+ DriverObjectExtension = IoGetDriverObjectExtension(DriverObject,
(PVOID)StreamClassAddDevice);
+ if (!DriverObjectExtension)
+ {
+ /* Failed to get driver extension */
+ return STATUS_DEVICE_DOES_NOT_EXIST;
+ }
+ /* Allocate Create Item */
+ ItemList = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
+ if (!ItemList)
+ {
+ /* Failed to allocated Create Item */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Create the FDO */
+ Status = IoCreateDevice(DriverObject,
DriverObjectExtension->Data.DeviceExtensionSize + sizeof(STREAM_DEVICE_EXTENSION),
NULL, FILE_DEVICE_KS, FILE_AUTOGENERATED_DEVICE_NAME | FILE_DEVICE_SECURE_OPEN, 0,
&DeviceObject);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failed to create the FDO */
+ ExFreePool(ItemList);
+ return Status;
+ }
+
+ /* Attach to device stack */
+ LowerDeviceObject = IoAttachDeviceToDeviceStack(DeviceObject, PhysicalDeviceObject);
+ if (!LowerDeviceObject)
+ {
+ /* Failed to attach */
+ IoDeleteDevice(DeviceObject);
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ /* Zero Create item */
+ RtlZeroMemory(ItemList, sizeof(KSOBJECT_CREATE_ITEM));
+ /* Setup object class */
+ RtlInitUnicodeString(&ItemList->ObjectClass, L"STREAMCLASS");
+ /* Setup CreateDispatch routine */
+ ItemList->Create = StreamClassCreateFilter;
+
+ /* Get device extension */
+ DeviceExtension = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ /* Zero device extension */
+ RtlZeroMemory(DeviceExtension, sizeof(STREAM_DEVICE_EXTENSION));
+ /* Initialize Ks streaming */
+ Status = KsAllocateDeviceHeader(&DeviceExtension->Header, 1, ItemList);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Cleanup resources */
+ IoDetachDevice(LowerDeviceObject);
+ IoDeleteDevice(DeviceObject);
+ ExFreePool(ItemList);
+ return Status;
+ }
+
+ /* Store lower device object */
+ DeviceExtension->LowerDeviceObject = LowerDeviceObject;
+
+ /* Store physical device object */
+ DeviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
+ /* Store driver object extension */
+ DeviceExtension->DriverExtension = DriverObjectExtension;
+ /* Initialize memory list */
+ InitializeListHead(&DeviceExtension->MemoryResourceList);
+ /* Setup device extension */
+ DeviceExtension->DeviceExtension = (PVOID) (DeviceExtension + 1);
+ /* Init interrupt dpc */
+ KeInitializeDpc(&DeviceExtension->InterruptDpc, StreamClassInterruptDpc,
(PVOID)DeviceExtension);
+
+ /* Set device transfer method */
+ DeviceObject->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE;
+ /* Clear init flag */
+ DeviceObject->Flags &= ~ DO_DEVICE_INITIALIZING;
+
+ return Status;
+}
+
+/*
+ *@implemented
+ */
+NTSTATUS
+STREAMAPI
+StreamClassRegisterAdapter(
+ IN PVOID Argument1,
+ IN PVOID Argument2,
+ IN PHW_INITIALIZATION_DATA HwInitializationData)
+{
+ NTSTATUS Status;
+ PSTREAM_CLASS_DRIVER_EXTENSION DriverObjectExtension;
+ PDRIVER_OBJECT DriverObject = (PDRIVER_OBJECT)Argument1;
+
+ /* Allocate driver extension */
+ Status = IoAllocateDriverObjectExtension(DriverObject, (PVOID)StreamClassAddDevice,
sizeof(STREAM_CLASS_DRIVER_EXTENSION), (PVOID*)&DriverObjectExtension);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failed to allocate */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Zero driver object extension */
+ RtlZeroMemory(DriverObjectExtension, sizeof(STREAM_CLASS_DRIVER_EXTENSION));
+
+ /* copy HwInitializationData */
+ RtlCopyMemory(&DriverObjectExtension->Data, HwInitializationData,
sizeof(HW_INITIALIZATION_DATA));
+
+ /* Setup device init methods */
+ DriverObject->DriverExtension->AddDevice = StreamClassAddDevice;
+ DriverObject->DriverUnload = KsNullDriverUnload;
+
+ /* Setup irp handlers */
+ DriverObject->MajorFunction[IRP_MJ_PNP] = StreamClassPnp;
+ DriverObject->MajorFunction[IRP_MJ_POWER] = StreamClassPower;
+ DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = StreamClassSystemControl;
+ DriverObject->MajorFunction[IRP_MJ_CLEANUP] = StreamClassCleanup;
+ DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = StreamClassFlushBuffers;
+ DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = StreamClassDeviceControl;
+
+ /* Let Ks handle these */
+ KsSetMajorFunctionHandler(DriverObject, IRP_MJ_CREATE);
+ KsSetMajorFunctionHandler(DriverObject, IRP_MJ_CLOSE);
+
+ return STATUS_SUCCESS;
+}
+
+/*
+ *@implemented
+ */
+
+VOID
+NTAPI
+StreamClassReenumerateStreams(
+ IN PVOID HwDeviceExtension,
+ IN ULONG StreamDescriptorSize)
+{
+ HW_STREAM_REQUEST_BLOCK_EXT RequestBlock;
+ PSTREAM_DEVICE_EXTENSION DeviceExtension;
+ PHW_STREAM_DESCRIPTOR StreamDescriptor;
+
+ if (!HwDeviceExtension || !StreamDescriptorSize)
+ return;
+
+ StreamDescriptor = ExAllocatePool(NonPagedPool, StreamDescriptorSize);
+ if (!StreamDescriptor)
+ return;
+
+ /* Zero stream descriptor */
+ RtlZeroMemory(StreamDescriptor, StreamDescriptorSize);
+
+ /* Get our DeviceExtension */
+ DeviceExtension = (PSTREAM_DEVICE_EXTENSION) ((ULONG_PTR)HwDeviceExtension -
sizeof(STREAM_DEVICE_EXTENSION));
+ ASSERT(DeviceExtension->DeviceExtension == HwDeviceExtension);
+
+
+ /* Zero RequestBlock */
+ RtlZeroMemory(&RequestBlock, sizeof(HW_STREAM_REQUEST_BLOCK_EXT));
+
+ /* Setup get stream info struct */
+ RequestBlock.Block.SizeOfThisPacket = sizeof(HW_STREAM_REQUEST_BLOCK);
+ RequestBlock.Block.Command = SRB_GET_STREAM_INFO;
+ RequestBlock.Block.CommandData.StreamBuffer = StreamDescriptor;
+ KeInitializeEvent(&RequestBlock.Event, SynchronizationEvent, FALSE);
+
+ /* FIXME SYNCHRONIZATION */
+
+ /* Send the request */
+ DeviceExtension->DriverExtension->Data.HwReceivePacket
((PHW_STREAM_REQUEST_BLOCK)&RequestBlock);
+
+ /* Is the device already completed? */
+ if (RequestBlock.Block.Status == STATUS_PENDING)
+ {
+ /* Request is pending, wait for result */
+ KeWaitForSingleObject(&RequestBlock.Event, Executive, KernelMode, FALSE,
NULL);
+ }
+
+ if (!NT_SUCCESS(RequestBlock.Block.Status))
+ {
+ /* Release Stream descriptor */
+ ExFreePool(StreamDescriptor);
+ }
+ else
+ {
+ if (DeviceExtension->StreamDescriptor)
+ {
+ /* Release old stream descriptor */
+ ExFreePool(DeviceExtension->StreamDescriptor);
+ }
+
+ /* Store stream descriptor */
+ DeviceExtension->StreamDescriptor = StreamDescriptor;
+ DeviceExtension->StreamDescriptorSize = StreamDescriptorSize;
+ }
+
+}
+
+/*
+ *@implemented
+ */
+
+VOID
+NTAPI
+StreamClassDebugAssert(
+ IN PCHAR File,
+ IN ULONG Line,
+ IN PCHAR AssertText,
+ IN ULONG AssertValue)
+{
+#ifdef DBG
+ DbgBreakPoint();
+#endif
+}
+
+/*
+ *@implemented
+ */
+VOID
+__cdecl
+StreamClassDebugPrint(
+ IN STREAM_DEBUG_LEVEL DebugPrintLevel,
+ IN PCCHAR DebugMessage,
+ ...)
+{
+#ifdef DBG
+ va_list ap;
+
+ if (DebugPrintLevel <=STREAMDEBUG_LEVEL)
+ {
+ va_start(ap, DebugMessage);
+
+ DbgPrint(DebugMessage, ap);
+
+ va_end(ap);
+ }
+#endif
+
+}
+
+/*
+ *@unimplemented
+ */
+VOID
+__cdecl
+StreamClassDeviceNotification(
+ IN STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE NotificationType,
+ IN PVOID HwDeviceExtension,
+ IN PHW_STREAM_REQUEST_BLOCK pSrb,
+ IN PKSEVENT_ENTRY EventEntry,
+ IN GUID *EventSet,
+ IN ULONG EventId)
+{
+ PHW_STREAM_REQUEST_BLOCK_EXT RequestBlock;
+ if (NotificationType == DeviceRequestComplete)
+ {
+ RequestBlock = (PHW_STREAM_REQUEST_BLOCK_EXT)pSrb;
+
+ KeSetEvent(&RequestBlock->Event, 0, FALSE);
+ return;
+ }
+
+ UNIMPLEMENTED
+}
+
+/*
+ *@implemented
+ */
+PVOID
+STREAMAPI
+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);
+
+ return DeviceExtension->DmaCommonBuffer;
+}
+
Propchange: trunk/reactos/drivers/wdm/audio/legacy/stream/driver.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/drivers/wdm/audio/legacy/stream/filter.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/s…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/stream/filter.c (added)
+++ trunk/reactos/drivers/wdm/audio/legacy/stream/filter.c [iso-8859-1] Sun Jun 28
17:58:47 2009
@@ -1,0 +1,194 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/legacy/stream/filter.c
+ * PURPOSE: filter instance handling
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
+#include "stream.h"
+
+NTSTATUS
+NTAPI
+FilterDispatch_fnDeviceIoControl(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+{
+ DPRINT1("FilterDispatch Called\n");
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+}
+
+
+NTSTATUS
+NTAPI
+FilterDispatch_fnClose(
+ PDEVICE_OBJECT DeviceObject,
+ PIRP Irp)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ PSTREAM_DEVICE_EXTENSION DeviceExtension;
+ HW_STREAM_REQUEST_BLOCK_EXT RequestBlock;
+
+ /* Get device extension */
+ DeviceExtension = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ if (!DeviceExtension->DriverExtension->Data.FilterInstanceExtensionSize)
+ {
+ /* driver supports only one instance */
+ if (DeviceExtension->InstanceCount)
+ {
+ /* there is already one instance open */
+ return STATUS_UNSUCCESSFUL;
+ }
+ }
+ else
+ {
+ /* driver supports more than one filter instance */
+ RtlZeroMemory(&RequestBlock, sizeof(HW_STREAM_REQUEST_BLOCK_EXT));
+
+ /* set up request block */
+ RequestBlock.Block.Command = SRB_CLOSE_DEVICE_INSTANCE;
+ RequestBlock.Block.HwDeviceExtension = DeviceExtension->DeviceExtension;
+ RequestBlock.Block.Irp = Irp;
+ KeInitializeEvent(&RequestBlock.Event, SynchronizationEvent, FALSE);
+
+ /*FIXME SYNCHRONIZATION */
+
+ /* Send the request */
+
DeviceExtension->DriverExtension->Data.HwReceivePacket((PHW_STREAM_REQUEST_BLOCK)&RequestBlock);
+ if (RequestBlock.Block.Status == STATUS_PENDING)
+ {
+ /* Wait for the request */
+ KeWaitForSingleObject(&RequestBlock.Event, Executive, KernelMode, FALSE,
NULL);
+ }
+ }
+
+ /* Increment total instance count */
+ InterlockedDecrement(&DeviceExtension->InstanceCount);
+
+ Irp->IoStatus.Status = Status;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+}
+
+static KSDISPATCH_TABLE DispatchTable =
+{
+ FilterDispatch_fnDeviceIoControl,
+ KsDispatchInvalidDeviceRequest,
+ KsDispatchInvalidDeviceRequest,
+ KsDispatchInvalidDeviceRequest,
+ FilterDispatch_fnClose,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+NTSTATUS
+InitializeFilterWithKs(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NTSTATUS Status;
+ PSTREAM_DEVICE_EXTENSION DeviceExtension;
+ KSOBJECT_HEADER ObjectHeader;
+ PKSOBJECT_CREATE_ITEM CreateItem;
+ PIO_STACK_LOCATION IoStack;
+ HW_STREAM_REQUEST_BLOCK_EXT RequestBlock;
+
+ /* Get device extension */
+ DeviceExtension = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ if (!DeviceExtension->DriverExtension->Data.FilterInstanceExtensionSize)
+ {
+ /* driver supports only one instance */
+ if (DeviceExtension->InstanceCount)
+ {
+ /* there is already one instance open */
+ return STATUS_UNSUCCESSFUL;
+ }
+ }
+ else
+ {
+ /* driver supports more than one filter instance */
+ RtlZeroMemory(&RequestBlock, sizeof(HW_STREAM_REQUEST_BLOCK_EXT));
+
+ /* set up request block */
+ RequestBlock.Block.Command = SRB_OPEN_DEVICE_INSTANCE;
+ RequestBlock.Block.HwDeviceExtension = DeviceExtension->DeviceExtension;
+ RequestBlock.Block.Irp = Irp;
+ KeInitializeEvent(&RequestBlock.Event, SynchronizationEvent, FALSE);
+
+ /*FIXME SYNCHRONIZATION */
+
+ /* Send the request */
+
DeviceExtension->DriverExtension->Data.HwReceivePacket((PHW_STREAM_REQUEST_BLOCK)&RequestBlock);
+ if (RequestBlock.Block.Status == STATUS_PENDING)
+ {
+ /* Wait for the request */
+ KeWaitForSingleObject(&RequestBlock.Event, Executive, KernelMode, FALSE,
NULL);
+ }
+ /* Check for success */
+ if (!NT_SUCCESS(RequestBlock.Block.Status))
+ {
+ /* Resource is not available */
+ return RequestBlock.Block.Status;
+ }
+ }
+
+ /* Allocate create item */
+ CreateItem = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
+ if (!CreateItem)
+ {
+ /* not enough memory */
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+ /* Zero create item */
+ RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM));
+ /* Set item class */
+ RtlInitUnicodeString(&CreateItem->ObjectClass, L"STREAMCLASS");
+ /* Get current irp stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ /* Create Ks streaming object header */
+ Status = KsAllocateObjectHeader(&ObjectHeader, 1, CreateItem, Irp,
&DispatchTable);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failed to create header */
+ ExFreePool(CreateItem);
+ return Status;
+ }
+ /* Increment total instance count */
+ InterlockedIncrement(&DeviceExtension->InstanceCount);
+ /* Return result */
+ return Status;
+
+}
+
+NTSTATUS
+NTAPI
+StreamClassCreateFilter(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NTSTATUS Status;
+ DPRINT1("StreamClassCreateFilter Called\n");
+
+ /* FIXME Support Pins/Clocks */
+ /* Init filter */
+ Status = InitializeFilterWithKs(DeviceObject, Irp);
+
+ Irp->IoStatus.Status = Status;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+}
+
+
+
Propchange: trunk/reactos/drivers/wdm/audio/legacy/stream/filter.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/drivers/wdm/audio/legacy/stream/helper.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/s…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/stream/helper.c (added)
+++ trunk/reactos/drivers/wdm/audio/legacy/stream/helper.c [iso-8859-1] Sun Jun 28
17:58:47 2009
@@ -1,0 +1,56 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/legacy/stream/helper.c
+ * PURPOSE: irp helper routines
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
+#include "stream.h"
+
+NTSTATUS
+NTAPI
+CompletionRoutine(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PVOID Context)
+{
+ if (Irp->PendingReturned == TRUE)
+ {
+ KeSetEvent ((PKEVENT) Context, IO_NO_INCREMENT, FALSE);
+ }
+ return STATUS_MORE_PROCESSING_REQUIRED;
+}
+
+
+NTSTATUS
+NTAPI
+ForwardIrpSynchronous(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ KEVENT Event;
+ PSTREAM_DEVICE_EXTENSION DeviceExt;
+ NTSTATUS Status;
+
+ DeviceExt = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ /* initialize the notification event */
+ KeInitializeEvent(&Event, NotificationEvent, FALSE);
+
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+
+ IoSetCompletionRoutine(Irp, CompletionRoutine, (PVOID)&Event, TRUE, TRUE, TRUE);
+
+ /* now call the driver */
+ Status = IoCallDriver(DeviceExt->LowerDeviceObject, Irp);
+ /* did the request complete yet */
+ if (Status == STATUS_PENDING)
+ {
+ /* not yet, lets wait a bit */
+ KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+ Status = Irp->IoStatus.Status;
+ }
+ return Status;
+}
Propchange: trunk/reactos/drivers/wdm/audio/legacy/stream/helper.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/drivers/wdm/audio/legacy/stream/pnp.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/s…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/stream/pnp.c (added)
+++ trunk/reactos/drivers/wdm/audio/legacy/stream/pnp.c [iso-8859-1] Sun Jun 28 17:58:47
2009
@@ -1,0 +1,465 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/wdm/audio/legacy/stream/pnp.c
+ * PURPOSE: pnp handling
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+#include "stream.h"
+
+VOID
+CompleteIrp(
+ IN PIRP Irp,
+ IN NTSTATUS Status,
+ IN ULONG_PTR Information)
+{
+ Irp->IoStatus.Status = Status;
+ Irp->IoStatus.Information = Information;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+}
+
+VOID
+NTAPI
+StreamClassReleaseResources(
+ IN PDEVICE_OBJECT DeviceObject)
+{
+ PSTREAM_DEVICE_EXTENSION DeviceExtension;
+ PLIST_ENTRY Entry;
+ PMEMORY_RESOURCE_LIST Mem;
+
+ /* Get device extension */
+ DeviceExtension = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ /* Disconnect interrupt */
+ if (DeviceExtension->Interrupt)
+ {
+ IoDisconnectInterrupt(DeviceExtension->Interrupt);
+ DeviceExtension->Interrupt = NULL;
+ }
+
+ /* Release DmaAdapter */
+ if (DeviceExtension->DmaAdapter)
+ {
+
DeviceExtension->DmaAdapter->DmaOperations->PutDmaAdapter(DeviceExtension->DmaAdapter);
+ DeviceExtension->DmaAdapter = NULL;
+ }
+
+ /* Release mem mapped I/O */
+ while(!IsListEmpty(&DeviceExtension->MemoryResourceList))
+ {
+ Entry = RemoveHeadList(&DeviceExtension->MemoryResourceList);
+ Mem = (PMEMORY_RESOURCE_LIST)CONTAINING_RECORD(Entry, MEMORY_RESOURCE_LIST,
Entry);
+
+ MmUnmapIoSpace(Mem->Start, Mem->Length);
+ ExFreePool(Entry);
+ }
+}
+
+BOOLEAN
+NTAPI
+StreamClassSynchronize(
+ IN PKINTERRUPT Interrupt,
+ IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
+ IN PVOID SynchronizeContext)
+{
+ /* This function is used when the driver either implements synchronization on its
own
+ * or if there is no interrupt assigned
+ */
+ return SynchronizeRoutine(SynchronizeContext);
+}
+
+VOID
+NTAPI
+StreamClassInterruptDpc(
+ IN PKDPC Dpc,
+ IN PVOID DeferredContext,
+ IN PVOID SystemArgument1,
+ IN PVOID SystemArgument2)
+{
+ //TODO
+ //read/write data
+}
+
+
+BOOLEAN
+NTAPI
+StreamClassInterruptRoutine(
+ IN PKINTERRUPT Interrupt,
+ IN PVOID ServiceContext)
+{
+ BOOLEAN Ret = FALSE;
+ PSTREAM_DEVICE_EXTENSION DeviceExtension = (PSTREAM_DEVICE_EXTENSION)ServiceContext;
+
+ /* Does the driver implement HwInterrupt routine */
+ if (DeviceExtension->DriverExtension->Data.HwInterrupt)
+ {
+ /* Check if the interrupt was coming from this device */
+ Ret =
DeviceExtension->DriverExtension->Data.HwInterrupt(DeviceExtension->DeviceExtension);
+ if (Ret)
+ {
+ /* Interrupt has from this device, schedule a Dpc for us */
+ KeInsertQueueDpc(&DeviceExtension->InterruptDpc, NULL, NULL);
+ }
+ }
+ /* Return result */
+ return Ret;
+}
+
+
+
+NTSTATUS
+NTAPI
+StreamClassStartDevice(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PHW_STREAM_REQUEST_BLOCK_EXT RequestBlock;
+ PPORT_CONFIGURATION_INFORMATION Config;
+ PSTREAM_DEVICE_EXTENSION DeviceExtension;
+ PIO_STACK_LOCATION IoStack;
+ PCM_RESOURCE_LIST List;
+ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor;
+ PSTREAM_CLASS_DRIVER_EXTENSION DriverObjectExtension;
+ PDMA_ADAPTER Adapter;
+ DEVICE_DESCRIPTION DeviceDesc;
+ NTSTATUS Status = STATUS_SUCCESS;
+ ULONG ResultLength, Index;
+ BOOLEAN bUseDMA, bUseInterrupt;
+ ULONG MapRegisters;
+ KAFFINITY Affinity = 0;
+ PHW_STREAM_DESCRIPTOR StreamDescriptor;
+ PACCESS_RANGE Range;
+ PVOID MappedAddr;
+ PMEMORY_RESOURCE_LIST Mem;
+
+ /* Get current stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ /* Get resource list */
+ List = IoStack->Parameters.StartDevice.AllocatedResourcesTranslated;
+ /* Calculate request length */
+ ResultLength = sizeof(HW_STREAM_REQUEST_BLOCK_EXT) +
sizeof(PPORT_CONFIGURATION_INFORMATION) + List->List[0].PartialResourceList.Count *
sizeof(ACCESS_RANGE);
+
+ /* Allocate Request Block */
+ RequestBlock = ExAllocatePool(NonPagedPool, ResultLength);
+
+ if (!RequestBlock)
+ {
+ /* Not enough memory */
+ CompleteIrp(Irp, STATUS_INSUFFICIENT_RESOURCES, 0);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Get device extension */
+ DeviceExtension = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ /* Get driver object extension */
+ DriverObjectExtension = IoGetDriverObjectExtension(DeviceObject->DriverObject,
(PVOID)StreamClassAddDevice);
+
+ /* Zero request block */
+ RtlZeroMemory(RequestBlock, ResultLength);
+
+ /* Locate Config struct */
+ Config = (PPORT_CONFIGURATION_INFORMATION) (RequestBlock + 1);
+ Range = (PACCESS_RANGE) (Config + 1);
+
+ /* Initialize Request */
+ RequestBlock->Block.SizeOfThisPacket = sizeof(HW_STREAM_REQUEST_BLOCK);
+ RequestBlock->Block.Command = SRB_INITIALIZE_DEVICE;
+ RequestBlock->Block.CommandData.ConfigInfo = Config;
+ KeInitializeEvent(&RequestBlock->Event, SynchronizationEvent, FALSE);
+
+ Config->SizeOfThisPacket = sizeof(PPORT_CONFIGURATION_INFORMATION);
+ Config->HwDeviceExtension = (PVOID) (DeviceExtension + 1);
+ Config->ClassDeviceObject = DeviceObject;
+ Config->PhysicalDeviceObject = DeviceExtension->LowerDeviceObject;
+ Config->RealPhysicalDeviceObject = DeviceExtension->PhysicalDeviceObject;
+ Config->AccessRanges = Range;
+
+ IoGetDeviceProperty(DeviceObject, DevicePropertyBusNumber, sizeof(ULONG),
(PVOID)&Config->SystemIoBusNumber, &ResultLength);
+ IoGetDeviceProperty(DeviceObject, DevicePropertyLegacyBusType,
sizeof(INTERFACE_TYPE), (PVOID)&Config->AdapterInterfaceType, &ResultLength);
+
+ /* Get resource list */
+ List = IoStack->Parameters.StartDevice.AllocatedResourcesTranslated;
+
+ /* Scan the translated resources */
+ bUseDMA = FALSE;
+ bUseInterrupt = FALSE;
+
+ Range = (PACCESS_RANGE) (Config + 1);
+
+ for(Index = 0; Index < List->List[0].PartialResourceList.Count; Index++)
+ {
+ /* Locate partial descriptor */
+ Descriptor =
&List->List[0].PartialResourceList.PartialDescriptors[Index];
+
+ switch(Descriptor->Type)
+ {
+ case CmResourceTypePort:
+ {
+ /* Store resource information in AccessRange struct */
+ Range[Config->NumberOfAccessRanges].RangeLength =
Descriptor->u.Port.Length;
+ Range[Config->NumberOfAccessRanges].RangeStart.QuadPart =
Descriptor->u.Port.Start.QuadPart;
+ Range[Config->NumberOfAccessRanges].RangeInMemory = FALSE;
+ Config->NumberOfAccessRanges++;
+ break;
+ }
+ case CmResourceTypeInterrupt:
+ {
+ /* Store resource information */
+ Config->BusInterruptLevel = Descriptor->u.Interrupt.Level;
+ Config->BusInterruptVector = Descriptor->u.Interrupt.Vector;
+ Config->InterruptMode = Descriptor->Flags;
+ Affinity = Descriptor->u.Interrupt.Affinity;
+ bUseInterrupt = TRUE;
+ break;
+ }
+ case CmResourceTypeMemory:
+ {
+ Mem = ExAllocatePool(NonPagedPool, sizeof(MEMORY_RESOURCE_LIST));
+ MappedAddr = MmMapIoSpace(Descriptor->u.Memory.Start,
Descriptor->u.Memory.Length, MmNonCached);
+ if (!MappedAddr || !Mem)
+ {
+ if (Mem)
+ {
+ /* Release Memory resource descriptor */
+ ExFreePool(Mem);
+ }
+
+ if (MappedAddr)
+ {
+ /* Release mem mapped I/O */
+ MmUnmapIoSpace(MappedAddr, Descriptor->u.Memory.Length);
+ }
+
+ /* Release resources */
+ StreamClassReleaseResources(DeviceObject);
+ /* Complete irp */
+ CompleteIrp(Irp, STATUS_INSUFFICIENT_RESOURCES, 0);
+ ExFreePool(RequestBlock);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+ /* Store range for driver */
+ Range[Config->NumberOfAccessRanges].RangeLength =
Descriptor->u.Memory.Length;
+ Range[Config->NumberOfAccessRanges].RangeStart.QuadPart =
Descriptor->u.Memory.Start.QuadPart;
+ Range[Config->NumberOfAccessRanges].RangeInMemory = TRUE;
+ Config->NumberOfAccessRanges++;
+ /* Initialize Memory resource descriptor */
+ Mem->Length = Descriptor->u.Memory.Length;
+ Mem->Start = MappedAddr;
+ InsertTailList(&DeviceExtension->MemoryResourceList,
&Mem->Entry);
+ break;
+ }
+ case CmResourceTypeDma:
+ {
+ bUseDMA = TRUE;
+ Config->DmaChannel = Descriptor->u.Dma.Channel;
+ break;
+ }
+ }
+ }
+
+ if (!!bUseInterrupt || DriverObjectExtension->Data.HwInterrupt == NULL ||
Config->BusInterruptLevel == 0 || Config->BusInterruptVector == 0)
+ {
+ /* requirements not satisfied */
+ DeviceExtension->SynchronizeFunction = StreamClassSynchronize;
+ }
+ else
+ {
+ /* use real sync routine */
+ DeviceExtension->SynchronizeFunction = KeSynchronizeExecution;
+
+ /* connect interrupt */
+ Status = IoConnectInterrupt(&DeviceExtension->Interrupt,
+ StreamClassInterruptRoutine,
+ (PVOID)DeviceExtension,
+ NULL,
+ Config->BusInterruptVector,
+ Config->BusInterruptLevel,
+ Config->BusInterruptLevel,
+ Config->InterruptMode,
+ TRUE,
+ Affinity,
+ FALSE);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Release resources */
+ StreamClassReleaseResources(DeviceObject);
+ /* Failed to connect interrupt */
+ CompleteIrp(Irp, Status, 0);
+ /* Release request block */
+ ExFreePool(RequestBlock);
+ return Status;
+ }
+
+ /* store interrupt object */
+ Config->InterruptObject = DeviceExtension->Interrupt;
+ }
+
+ /* does the device use DMA */
+ if (bUseDMA && DriverObjectExtension->Data.BusMasterDMA)
+ {
+ /* Zero device description */
+ RtlZeroMemory(&DeviceDesc, sizeof(DEVICE_DESCRIPTION));
+
+ DeviceDesc.Version = DEVICE_DESCRIPTION_VERSION;
+ DeviceDesc.Master = TRUE;
+ DeviceDesc.ScatterGather = TRUE;
+ DeviceDesc.AutoInitialize = FALSE;
+ DeviceDesc.DmaChannel = Config->DmaChannel;
+ DeviceDesc.InterfaceType = Config->AdapterInterfaceType;
+ DeviceDesc.DmaWidth = Width32Bits;
+ DeviceDesc.DmaSpeed = Compatible;
+ DeviceDesc.MaximumLength = (ULONG)-1;
+ DeviceDesc.Dma32BitAddresses = DriverObjectExtension->Data.Dma24BitAddresses;
+
+ Adapter = IoGetDmaAdapter(DeviceExtension->PhysicalDeviceObject,
&DeviceDesc, &MapRegisters);
+ if (!Adapter)
+ {
+ /* Failed to claim DMA Adapter */
+ CompleteIrp(Irp, Status, 0);
+ /* Release resources */
+ StreamClassReleaseResources(DeviceObject);
+ /* Release request block */
+ ExFreePool(RequestBlock);
+ return Status;
+ }
+
+ if (DeviceExtension->DriverExtension->Data.DmaBufferSize)
+ {
+ DeviceExtension->DmaCommonBuffer =
Adapter->DmaOperations->AllocateCommonBuffer(Adapter,
DeviceExtension->DriverExtension->Data.DmaBufferSize,
&DeviceExtension->DmaPhysicalAddress, FALSE);
+ if (!DeviceExtension->DmaCommonBuffer)
+ {
+ /* Failed to allocate a common buffer */
+ CompleteIrp(Irp, Status, 0);
+ /* Release resources */
+ StreamClassReleaseResources(DeviceObject);
+ /* Release request block */
+ ExFreePool(RequestBlock);
+ return Status;
+ }
+ }
+
+
+ DeviceExtension->MapRegisters = MapRegisters;
+ DeviceExtension->DmaAdapter = Adapter;
+ Config->DmaAdapterObject = (PADAPTER_OBJECT)Adapter;
+ }
+
+
+ /* First forward the request to lower attached device object */
+ Status = ForwardIrpSynchronous(DeviceObject, Irp);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Failed to start lower devices */
+ CompleteIrp(Irp, Status, 0);
+ /* Release resources */
+ StreamClassReleaseResources(DeviceObject);
+ /* Release request block */
+ ExFreePool(RequestBlock);
+ return Status;
+ }
+
+ Config->Irp = Irp;
+
+ /* FIXME SYNCHRONIZATION */
+
+ /* Send the request */
+
DriverObjectExtension->Data.HwReceivePacket((PHW_STREAM_REQUEST_BLOCK)RequestBlock);
+ if (RequestBlock->Block.Status == STATUS_PENDING)
+ {
+ /* Request is pending, wait for result */
+ KeWaitForSingleObject(&RequestBlock->Event, Executive, KernelMode, FALSE,
NULL);
+ /* Get final status code */
+ Status = RequestBlock->Block.Status;
+ }
+
+ /* Copy stream descriptor size */
+ DeviceExtension->StreamDescriptorSize = Config->StreamDescriptorSize;
+
+ /* check if the request has succeeded or if stream size is valid*/
+ if (!NT_SUCCESS(Status)|| !Config->StreamDescriptorSize)
+ {
+ /* Failed to start device */
+ CompleteIrp(Irp, Status, 0);
+ /* Release resources */
+ StreamClassReleaseResources(DeviceObject);
+ /* Release request block */
+ ExFreePool(RequestBlock);
+ return Status;
+ }
+
+ /* Allocate a stream Descriptor */
+ StreamDescriptor = ExAllocatePool(NonPagedPool,
DeviceExtension->StreamDescriptorSize);
+ if (!StreamDescriptor)
+ {
+ /* Not enough memory */
+ CompleteIrp(Irp, STATUS_INSUFFICIENT_RESOURCES, 0);
+ /* Release resources */
+ StreamClassReleaseResources(DeviceObject);
+ /* Release request block */
+ ExFreePool(RequestBlock);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Zero stream descriptor */
+ RtlZeroMemory(StreamDescriptor, DeviceExtension->StreamDescriptorSize);
+
+ /* Setup get stream info struct */
+ RequestBlock->Block.Command = SRB_GET_STREAM_INFO;
+ RequestBlock->Block.CommandData.StreamBuffer = StreamDescriptor;
+ KeResetEvent(&RequestBlock->Event);
+
+ /* send the request */
+
DriverObjectExtension->Data.HwReceivePacket((PHW_STREAM_REQUEST_BLOCK)RequestBlock);
+ if (RequestBlock->Block.Status == STATUS_PENDING)
+ {
+ /* Request is pending, wait for result */
+ KeWaitForSingleObject(&RequestBlock->Event, Executive, KernelMode, FALSE,
NULL);
+ /* Get final status code */
+ Status = RequestBlock->Block.Status;
+ }
+
+ if (NT_SUCCESS(Status))
+ {
+ /* store stream descriptor */
+ DeviceExtension->StreamDescriptor = StreamDescriptor;
+ }
+ else
+ {
+ /* cleanup resources */
+ ExFreePool(StreamDescriptor);
+ }
+
+ ExFreePool(RequestBlock);
+ /* Complete Irp */
+ CompleteIrp(Irp, Status, 0);
+ /* Return result */
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+StreamClassPnp(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+
+ /* Get current irp stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ switch (IoStack->MinorFunction)
+ {
+ case IRP_MN_START_DEVICE:
+ {
+ return StreamClassStartDevice(DeviceObject, Irp);
+ }
+ }
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_NOT_SUPPORTED;
+}
+
+
Propchange: trunk/reactos/drivers/wdm/audio/legacy/stream/pnp.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/drivers/wdm/audio/legacy/stream/stream.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/s…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/stream/stream.h (added)
+++ trunk/reactos/drivers/wdm/audio/legacy/stream/stream.h [iso-8859-1] Sun Jun 28
17:58:47 2009
@@ -1,0 +1,140 @@
+#ifndef STREAM_H__
+#define STREAM_H__
+
+#include <strmini.h>
+#define YDEBUG
+#include <debug.h>
+
+#define STREAMDEBUG_LEVEL DebugLevelMaximum
+
+typedef BOOLEAN (NTAPI *SYNCHRONIZE_FUNC) (IN PKINTERRUPT Interrupt, IN
PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, IN PVOID SynchronizeContext);
+
+typedef struct
+{
+ HW_INITIALIZATION_DATA Data;
+
+}STREAM_CLASS_DRIVER_EXTENSION, *PSTREAM_CLASS_DRIVER_EXTENSION;
+
+typedef struct
+{
+ LIST_ENTRY Entry;
+ PVOID Start;
+ ULONG Length;
+}MEMORY_RESOURCE_LIST, *PMEMORY_RESOURCE_LIST;
+
+typedef struct
+{
+ KSDEVICE_HEADER Header;
+ PDEVICE_OBJECT LowerDeviceObject;
+ PDEVICE_OBJECT PhysicalDeviceObject;
+
+ SYNCHRONIZE_FUNC SynchronizeFunction;
+
+ ULONG MapRegisters;
+ PDMA_ADAPTER DmaAdapter;
+ PVOID DmaCommonBuffer;
+ PHYSICAL_ADDRESS DmaPhysicalAddress;
+
+ PKINTERRUPT Interrupt;
+ KDPC InterruptDpc;
+
+ LIST_ENTRY MemoryResourceList;
+
+ ULONG StreamDescriptorSize;
+ PHW_STREAM_DESCRIPTOR StreamDescriptor;
+ PSTREAM_CLASS_DRIVER_EXTENSION DriverExtension;
+
+ PVOID DeviceExtension;
+ LONG InstanceCount;
+
+}STREAM_DEVICE_EXTENSION, *PSTREAM_DEVICE_EXTENSION;
+
+typedef struct
+{
+ HW_STREAM_REQUEST_BLOCK Block;
+ KEVENT Event;
+}HW_STREAM_REQUEST_BLOCK_EXT, *PHW_STREAM_REQUEST_BLOCK_EXT;
+
+NTSTATUS
+NTAPI
+StreamClassCreateFilter(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+StreamClassPnp(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+StreamClassPower(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+StreamClassSystemControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+StreamClassCleanup(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+StreamClassFlushBuffers(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+StreamClassDeviceControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+NTSTATUS
+NTAPI
+StreamClassAddDevice(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT PhysicalDeviceObject);
+
+
+NTSTATUS
+NTAPI
+ForwardIrpSynchronous(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
+BOOLEAN
+NTAPI
+StreamClassSynchronize(
+ IN PKINTERRUPT Interrupt,
+ IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
+ IN PVOID SynchronizeContext);
+
+BOOLEAN
+NTAPI
+StreamClassInterruptRoutine(
+ IN PKINTERRUPT Interrupt,
+ IN PVOID ServiceContext);
+
+VOID
+NTAPI
+StreamClassInterruptDpc(
+ IN PKDPC Dpc,
+ IN PVOID DeferredContext,
+ IN PVOID SystemArgument1,
+ IN PVOID SystemArgument2);
+
+VOID
+CompleteIrp(
+ IN PIRP Irp,
+ IN NTSTATUS Status,
+ IN ULONG_PTR Information);
+
+#endif
Propchange: trunk/reactos/drivers/wdm/audio/legacy/stream/stream.h
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/drivers/wdm/audio/legacy/stream/stream.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/s…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/stream/stream.rbuild (added)
+++ trunk/reactos/drivers/wdm/audio/legacy/stream/stream.rbuild [iso-8859-1] Sun Jun 28
17:58:47 2009
@@ -1,0 +1,17 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../../../tools/rbuild/project.dtd">
+<module name="stream" type="kernelmodedriver"
installbase="system32/drivers" installname="stream.sys"
entrypoint="0">
+ <include base="stream">.</include>
+ <define name="_COMDDK_" />
+ <importlibrary definition="stream.spec" />
+ <library>ntoskrnl</library>
+ <library>ks</library>
+ <library>pseh</library>
+ <file>control.c</file>
+ <file>driver.c</file>
+ <file>dll.c</file>
+ <file>filter.c</file>
+ <file>helper.c</file>
+ <file>pnp.c</file>
+ <file>stream.rc</file>
+</module>
Propchange: trunk/reactos/drivers/wdm/audio/legacy/stream/stream.rbuild
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/drivers/wdm/audio/legacy/stream/stream.rc
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/s…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/stream/stream.rc (added)
+++ trunk/reactos/drivers/wdm/audio/legacy/stream/stream.rc [iso-8859-1] Sun Jun 28
17:58:47 2009
@@ -1,0 +1,5 @@
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION "WDM CODEC Class Device Driver 2.0\0"
+#define REACTOS_STR_INTERNAL_NAME "stream.sys\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "stream.sys\0"
+#include <reactos/version.rc>
Propchange: trunk/reactos/drivers/wdm/audio/legacy/stream/stream.rc
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/drivers/wdm/audio/legacy/stream/stream.spec
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/wdm/audio/legacy/s…
==============================================================================
--- trunk/reactos/drivers/wdm/audio/legacy/stream/stream.spec (added)
+++ trunk/reactos/drivers/wdm/audio/legacy/stream/stream.spec [iso-8859-1] Sun Jun 28
17:58:47 2009
@@ -1,0 +1,8 @@
+@ stdcall DllInitialize(long)
+@ stdcall DllUnload()
+@ stdcall StreamClassRegisterAdapter(ptr ptr ptr)
+@ stdcall StreamClassReenumerateStreams(ptr long)
+@ stdcall StreamClassDebugAssert(long long ptr long)
+@ cdecl StreamClassDebugPrint (long str)
+@ cdecl StreamClassDeviceNotification(long ptr)
+@ stdcall StreamClassGetDmaBuffer(ptr)
Propchange: trunk/reactos/drivers/wdm/audio/legacy/stream/stream.spec
------------------------------------------------------------------------------
svn:eol-style = native