Some preliminary stubbing of the Kernel Streaming components (portcls being moved from other directory)

svn path=/trunk/; revision=19525
This commit is contained in:
Andrew Greenwood 2005-11-24 13:30:51 +00:00
parent aa70297ede
commit b0d0ca15fb
12 changed files with 751 additions and 0 deletions

View file

@ -0,0 +1,17 @@
This is a directory for the kernel streaming components, along with multimedia
kernel-mode drivers.
Platform components:
- ks.sys Kernel Streaming (and AvStream)
- sysaudio Filter graph builder (topology?)
- portcls Port Class
- wdmaud Kernel-mode portion of the MME (Win 3.1-style) driver
Optional drivers:
- sndblst Sound Blaster (+ Pro / 16) compatible driver
- mpu401 MPU-401 MIDI compatible driver
Much of this code exists only as stubs for future implementation.
-Andrew Greenwood

View file

@ -0,0 +1,8 @@
<module name="avtest" type="kernelmodedriver" installbase="system32/drivers" installname="avtest.sys" warnings="true">
<include base="avtest">.</include>
<include base="avtest">..</include>
<define name="__USE_W32API" />
<library>ks</library>
<library>ntoskrnl</library>
<file>entry.c</file>
</module>

View file

@ -0,0 +1,83 @@
#include <debug.h>
#include <ks.h>
/* Where do we go? */
#ifndef SIZEOF_ARRAY
#define SIZEOF_ARRAY(array) \
(sizeof(array) / sizeof(array[0]))
#endif
/* Not in the DDK but hey! */
#define DEFINE_KSFILTER_DISPATCH(name) \
const KSFILTER_DISPATCH name =
/* To be put in KS.H */
#define DEFINE_KSFILTER_DESCRIPTOR(name) \
const KSFILTER_DESCRIPTOR name =
#define DEFINE_KSFILTER_DESCRIPTOR_TABLE(name) \
const KSFILTER_DESCRIPTOR* const name[] =
NTSTATUS FilterCreate(
IN OUT PKSFILTER Filter,
IN PIRP Irp)
{
return STATUS_SUCCESS;
}
NTSTATUS FilterClose(
IN OUT PKSFILTER Filter,
IN PIRP Irp)
{
return STATUS_SUCCESS;
}
NTSTATUS Process(
IN PKSFILTER Filter,
IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex)
{
return STATUS_SUCCESS;
}
DEFINE_KSFILTER_DISPATCH(FilterDispatch)
{
FilterCreate,
FilterClose,
Process,
NULL // Reset
};
DEFINE_KSFILTER_DESCRIPTOR(FilterDesc)
{
};
DEFINE_KSFILTER_DESCRIPTOR_TABLE(FilterDescs)
{
&FilterDesc
};
const KSDEVICE_DESCRIPTOR DeviceDescriptor =
{
NULL,
SIZEOF_ARRAY(FilterDescs),
FilterDescs
};
/* Funcs */
NTSTATUS STDCALL
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPathName)
{
DPRINT1("AVStream test component loaded!\n");
return KsInitializeDriver(DriverObject, RegistryPathName,
&DeviceDescriptor);
}

View file

@ -0,0 +1,24 @@
<!--
Kernel Streaming
This is mostly incomplete at the moment.
-->
<directory name="portcls">
<xi:include href="portcls/portcls.xml" />
</directory>
<!--directory name="wdmaud">
<xi:include href="wdmaud/wdmaud.xml" />
</directory-->
<!--directory name="ks">
<xi:include href="ks/ks.xml" />
</directory>
<directory name="portcls">
<xi:include href="portcls/portcls.xml" />
</directory>
<directory name="avtest">
<xi:include href="avtest/avtest.xml" />
</directory-->

352
reactos/drivers/multimedia/ks.h Executable file
View file

@ -0,0 +1,352 @@
/*
Kernel Streaming
Part of the ReactOS project
(See ReactOS licence for usage restrictions/permissions)
This file created by Andrew Greenwood.
Started September 12th, 2005.
You may notice some structs are empty. These are just placeholders and
should be fleshed-out when functions are implemented that require the
use of such structs.
*/
#ifndef __INCLUDES_REACTOS_KS_H__
#define __INCLUDES_REACTOS_KS_H__
#include <ddk/ntddk.h>
/* What's this meant to be?! */
#define KSDDKAPI
/* Some unimplemented structs :) */
typedef struct _BUS_INTERFACE_REFERENCE
{
} BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE;
typedef struct _KSPIN_DESCRIPTOR
{
} KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR;
typedef struct _KSPIN_DESCRIPTOR_EX
{
} KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;
/* This is just to shut the compiler up so DON'T USE IT! */
typedef void (*PFNKSINTERSECTHANDLER)(void);
typedef struct _KS_COMPRESSION
{
ULONG RatioNumerator;
ULONG RatioDenominator;
ULONG RatioConstantMargin;
} KS_COMPRESSION, *PKS_COMPRESSION;
typedef struct _KS_FRAMING_RANGE
{
ULONG MinFrameSize;
ULONG MaxFrameSize;
ULONG Stepping;
} KS_FRAMING_RANGE, *PKS_FRAMING_RANGE;
typedef struct _KS_FRAMING_RANGE_WEIGHTED
{
/* Obsolete */
} KS_FRAMING_RANGE_WEIGHTED, *PKS_FRAMING_RANGE_WEIGHTED;
typedef struct _KS_FRAMING_ITEM
{
GUID MemoryType;
GUID BusType;
ULONG MemoryFlags;
ULONG BusFlags;
ULONG Flags;
ULONG Frames;
ULONG FileAlignment;
ULONG MemoryTypeWeight;
KS_FRAMING_RANGE PhysicalRange;
KS_FRAMING_RANGE_WEIGHTED FramingRange;
} KS_FRAMING_ITEM, *PKS_FRAMING_ITEM;
typedef struct _KSALLOCATOR_FRAMING
{
union
{
ULONG OptionFlags;
ULONG RequirementsFlags;
};
POOL_TYPE PoolType;
ULONG Frames;
ULONG FrameSize;
ULONG FileAlignment;
ULONG Reserved;
} KSALLOCATOR_FRAMING, *PKSALLOCATOR_FRAMING;
typedef struct _KSALLOCATOR_FRAMING_EX
{
ULONG CountItems;
ULONG PinFlags;
KS_COMPRESSION OutputCompression;
ULONG PinWeight;
KS_FRAMING_ITEM FramingItem[1];
} KSALLOCATOR_FRAMING_EX, *PKSALLOCATOR_FRAMING_EX;
typedef struct _KSATTRIBUTE
{
ULONG Size;
ULONG Flags;
GUID Attribute;
} KSATTRIBUTE, *PKSATTRIBUTE;
/*
typedef struct _KSBUFFER_ITEM
{
KSDPC_ITEM DpcItem;
LIST_ENTRY BufferList;
} KSBUFFER_ITEM, *PKSBUFFER_ITEM;
*/
typedef struct _KSIDENTIFIER
{
GUID Set;
ULONG Id;
ULONG Flags;
} KSIDENTIFIER;
typedef KSIDENTIFIER KSPIN_MEDIUM, *PKSPIN_MEDIUM;
typedef KSIDENTIFIER KSPIN_INTERFACE, *PKSPIN_INTERFACE;
typedef KSIDENTIFIER KSPROPERTY, *PKSPROPERTY;
typedef struct _KSPRIORITY
{
ULONG PriorityClass;
ULONG PrioritySubClass;
} KSPRIORITY, *PKSPRIORITY;
typedef struct _KSPIN_CONNECT
{
KSPIN_INTERFACE Interface;
KSPIN_MEDIUM Medium;
ULONG PinId;
HANDLE PinToHandle;
KSPRIORITY Priority;
} KSPIN_CONNECT, *PKSPIN_CONNECT;
typedef struct _KSP_PIN
{
KSPROPERTY Property;
ULONG PinId;
ULONG Reserved;
} KSP_PIN, *PKSP_PIN;
typedef struct _KSDEVICE
{
/* TODO */
} KSDEVICE, *PKSDEVICE;
/* Device dispatch routines */
typedef NTSTATUS
(*PFNKSDEVICECREATE)
(
IN PKSDEVICE Device
);
typedef NTSTATUS
(*PFNKSDEVICEPNPSTART)
(
IN PKSDEVICE Device,
IN PIRP Irp,
IN PCM_RESOURCE_LIST TranslatedResourceList OPTIONAL,
IN PCM_RESOURCE_LIST UntranslatedResourceList OPTIONAL
);
typedef NTSTATUS
(*PFNKSDEVICE)
(
IN PKSDEVICE Device
);
typedef NTSTATUS
(*PFNKSDEVICEIRP)
(
IN PKSDEVICE Device,
IN PIRP Irp
);
typedef VOID
(*PFNKSDEVICEIRPVOID)
(
IN PKSDEVICE Device,
IN PIRP Irp
);
typedef NTSTATUS
(*PFNKSDEVICEQUERYCAPABILITIES)
(
IN PKSDEVICE Device,
IN PIRP Irp,
IN OUT PDEVICE_CAPABILITIES Capabilities
);
typedef NTSTATUS
(*PFNKSDEVICEQUERYPOWER)
(
IN PKSDEVICE Device,
IN PIRP Irp,
IN DEVICE_POWER_STATE DeviceTo,
IN DEVICE_POWER_STATE DeviceFrom,
IN SYSTEM_POWER_STATE SystemTo,
IN SYSTEM_POWER_STATE SystemFrom,
IN POWER_ACTION Action
);
typedef VOID
(*PFNKSDEVICESETPOWER)
(
IN PKSDEVICE Device,
IN PIRP Irp,
IN DEVICE_POWER_STATE To,
IN DEVICE_POWER_STATE From
);
typedef struct _KSDEVICE_DISPATCH
{
PFNKSDEVICECREATE Add;
PFNKSDEVICEPNPSTART Start;
PFNKSDEVICE PostStart;
PFNKSDEVICEIRP QueryStop;
PFNKSDEVICEIRPVOID CancelStop;
PFNKSDEVICEIRPVOID Stop;
PFNKSDEVICEIRP QueryRemove;
PFNKSDEVICEIRPVOID CancelRemove;
PFNKSDEVICEIRPVOID Remove;
PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities;
PFNKSDEVICEIRPVOID SurpriseRemoval;
PFNKSDEVICEQUERYPOWER Querypower;
PFNKSDEVICESETPOWER SetPower;
} KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH;
/* Some more unimplemented stuff */
typedef struct _KSFILTER
{
} KSFILTER, *PKSFILTER;
typedef struct _KSPROCESSPIN_INDEXENTRY
{
} KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY;
/* Filter dispatch routines */
typedef NTSTATUS
(*PFNKSFILTERIRP)
(
IN PKSFILTER Filter,
IN PIRP Irp
);
typedef NTSTATUS
(*PFNKSFILTERPROCESS)
(
IN PKSFILTER FIlter,
IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
);
typedef NTSTATUS
(*PFNKSFILTERVOID)
(
IN PKSFILTER Filter
);
typedef struct _KSFILTER_DISPATCH
{
PFNKSFILTERIRP Create;
PFNKSFILTERIRP Close;
PFNKSFILTERPROCESS Process;
PFNKSFILTERVOID Reset;
} KSFILTER_DISPATCH, *PKSFILTER_DISPATCH;
/* TODO! */
typedef struct _KSAUTOMATION_TABLE
{
} KSAUTOMATION_TABLE, *PKSAUTOMATION_TABLE;
typedef struct _KSNODE_DESCRIPTOR
{
} KSNODE_DESCRIPTOR, *PKSNODE_DESCRIPTOR;
typedef struct _KSTOPOLOGY_CONNECTION
{
} KSTOPOLOGY_CONNECTION, *PKSTOPOLOGY_CONNECTION;
typedef struct _KSCOMPONENTID
{
} KSCOMPONENTID, *PKSCOMPONENTID;
/* Descriptors (filter, device, ...) */
typedef struct _KSFILTER_DESCRIPTOR
{
const KSFILTER_DISPATCH* Dispatch;
const KSAUTOMATION_TABLE* AutomationTable;
ULONG Version;
ULONG Flags;
const GUID* ReferenceGuid;
ULONG PinDescriptorsCount;
ULONG PinDescriptorSize;
const KSPIN_DESCRIPTOR_EX* PinDescriptors;
ULONG CategoriesCount;
const GUID* Categories;
ULONG NodeDescriptorsCount;
ULONG NodeDescriptorSize;
const KSNODE_DESCRIPTOR* NodeDescriptors;
ULONG ConnectionsCount;
const KSTOPOLOGY_CONNECTION* Connections;
const KSCOMPONENTID* ComponentId;
} KSFILTER_DESCRIPTOR, *PKSFILTER_DESCRIPTOR;
typedef struct _KSDEVICE_DESCRIPTOR
{
const KSDEVICE_DISPATCH* Dispatch;
ULONG FilterDescriptorsCount;
const KSFILTER_DESCRIPTOR* const* FilterDescriptors;
ULONG Version; /* Doesn't appear to be in the documentation */
} KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
/*
API functions
*/
NTSTATUS NTAPI
KsInitializeDriver(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath,
IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL);
#endif

View file

@ -0,0 +1,16 @@
#include <ks.h>
#include <debug.h>
NTSTATUS NTAPI
KsInitializeDriver(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath,
IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL)
{
DPRINT("KsInitializeDriver\n");
/* This should set up IRPs etc. */
return STATUS_NOT_IMPLEMENTED;
}

View file

@ -0,0 +1,57 @@
/*
ReactOS Kernel Streaming component
Written (or rather, stubbed!) by Andrew Greenwood
September 2005
*/
#include <ks.h>
KSDDKAPI NTSTATUS NTAPI
KsCreatePin(
IN HANDLE FilterHandle,
IN PKSPIN_CONNECT Connect,
IN ACCESS_MASK DesiredAccess,
OUT PHANDLE ConnectionHandle)
{
}
KSDDKAPI NTSTATUS NTAPI
KsHandleSizedListQuery(
IN PIRP Irp,
IN ULONG DataItemsCount,
IN ULONG DataItemSize,
IN const VOID* DataItems)
{
}
KSDDKAPI NTSTATUS NTAPI
KsPinDataIntersection(
IN PIRP Irp,
IN PKSP_PIN Pin,
OUT PVOID Data,
IN ULONG DescriptorsCount,
IN const KSPIN_DESCRIPTOR* Descriptor,
IN PFNKSINTERSECTHANDLER IntersectHandler)
{
}
KSDDKAPI NTSTATUS NTAPI
KsPinPropertyHandler(
IN PIRP Irp,
IN PKSPROPERTY Property,
IN OUT PVOID Data,
IN ULONG DescriptorsCount,
IN const KSPIN_DESCRIPTOR* Descriptor)
{
}
KSDDKAPI NTSTATUS NTAPI
KsValidateConnectRequest(
IN PIRP Irp,
IN ULONG DescriptorsCount,
IN KSPIN_DESCRIPTOR* Descriptor,
OUT PKSPIN_CONNECT* Connect)
{
}

View file

@ -0,0 +1,7 @@
; ks.sys - Kernel Streaming
LIBRARY ks.sys
EXPORTS
KsInitializeDriver@12

View file

@ -0,0 +1,9 @@
<module name="ks" type="kernelmodedriver" installbase="system32/drivers" installname="ks.sys" warnings="true">
<include base="ks">.</include>
<include base="ks">..</include>
<importlibrary definition="ks.def" />
<library>ntoskrnl</library>
<define name="__USE_W32API" />
<!--file>connect.c</file-->
<file>avstream.c</file>
</module>

View file

@ -0,0 +1,112 @@
#include "ks.h"
typedef struct _KSDEVICE_DESCRIPTOR
{
} KSDEVICE_DESCRIPTOR, *PKSDEVICE_DESCRIPTOR;
typedef struct _KSDEVICE
{
} KSDEVICE, *PKSDEVICE;
NTSTATUS
KsAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject)
{
/* KsCreateDevice(DriverObject, PhysicalDeviceObject, ...); */
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
KsInitializeDriver(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath,
IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL)
{
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
KsInitializeDevice(
IN PDEVICE_OBJECT FunctionalDeviceObject,
IN PDEVICE_OBJECT PhysicalDeviceObject,
IN PDEVICE_OBJECT NextDeviceObject,
IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL)
{
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
KsCreateDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject,
IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL,
IN ULONG ExtensionSize OPTIONAL,
OUT PKSDEVICE* Device OPTIONAL)
{
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
KsTerminateDevice(
IN PDEVICE_OBJECT DeviceObject)
{
return STATUS_NOT_IMPLEMENTED;
}
VOID
KsAcquireDevice(
IN PKSDEVICE Device)
{
/* Acquire device mutex */
}
VOID
KsReleaseDevice(
IN PKSDEVICE Device)
{
/* Releases device mutex and exits critical region */
}
VOID
KsAcquireControl(
IN PVOID Object)
{
/* Acquire filter control mutex for Object */
/* Object should be pointed to a KSFILTER or KSPIN */
}
PKSDEVICE
KsGetDevice(
IN PVOID Object)
{
/* ? */
return 0;
}
// inline
/*
PKSDEVICE __inline
KsFilterGetDevice(
IN PKSFILTER Filter)
{
return KsGetDevice((PVOID) Filter);
}
PKSDEVICE __inline
KsPinGetDevice(
IN PKSPIN Pin)
{
return KsGetDevice((PVOID) Pin);
}
*/

View file

@ -0,0 +1,59 @@
/*
This doesn't do much yet...
*/
#include <debug.h>
#define InPassiveIrql() \
(KeGetCurrentIrql() == IRQL_PASSIVE_LEVEL)
NTSTATUS AudioDeviceControl(
IN PDEVICE_OBJECT device,
IN PIRP irp
)
{
return STATUS_SUCCESS;
}
NTSTATUS AudioAddDevice(
IN PDRIVER_OBJECT driver,
IN PDEVICE_OBJECT device
)
{
DPRINT("AudioAddDevice called\n");
if ( ! IsPassiveIrql() )
{
/* What do we do?! */
/* RtlAssert("FAIL", __FILE__, __LINE__, "?" */
}
return STATUS_SUCCESS;
}
VOID AudioUnload(
IN PDRIVER_OBJECT driver
)
{
DPRINT("AudioUnload called\n");
}
NTSTATUS STDCALL
DriverEntry(
IN PDRIVER_OBJECT driver,
IN PUNICODE_STRING registry_path
)
{
DPRINT("Wdmaud.sys loaded\n");
driver->DriverExtension->AddDevice = AudioAddDevice;
driver->DriverUnload = AudioUnload;
driver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = AudioDeviceControl;
return STATUS_SUCCESS;
}

View file

@ -0,0 +1,7 @@
<module name="wdmaud_kernel" type="kernelmodedriver" installbase="system32/drivers" installname="wdmaud.sys" warnings="true">
<include base="wdmaud">.</include>
<include base="wdmaud">..</include>
<define name="__USE_W32API" />
<library>ntoskrnl</library>
<file>entry.c</file>
</module>