A few modifications necessary to get PortCls and KS to build. PortCls

needs restructuring but that will be done later.


svn path=/trunk/; revision=27474
This commit is contained in:
Andrew Greenwood 2007-07-08 13:53:39 +00:00
parent 9be5d6e114
commit dff03c9e44
18 changed files with 326 additions and 43 deletions

View file

@ -280,6 +280,13 @@ KsDispatchIrp(
IN PIRP Irp) IN PIRP Irp)
{ {
/* Calls a dispatch routine corresponding to the function code of the IRP */ /* Calls a dispatch routine corresponding to the function code of the IRP */
/*
First we need to get the dispatch table. An opaque header is pointed to by
FsContext. The first element points to this table. This table is the key
to dispatching the IRP correctly.
*/
UNIMPLEMENTED; UNIMPLEMENTED;
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }

View file

@ -110,3 +110,6 @@ KsSetTargetDeviceObject@8
KsSetTargetState@8 KsSetTargetState@8
KsSynchronousIoControlDevice@32 KsSynchronousIoControlDevice@32
KsInitializeDriver@12 KsInitializeDriver@12
; Kernel COM
KoCreateInstance@20

View file

@ -7,6 +7,7 @@
<define name="__USE_W32API" /> <define name="__USE_W32API" />
<define name="BUILDING_KS" /> <define name="BUILDING_KS" />
<define name="_NTDDK_" /> <define name="_NTDDK_" />
<define name="_COMDDK_" />
<file>ks.rc</file> <file>ks.rc</file>
<file>allocators.c</file> <file>allocators.c</file>
<file>clocks.c</file> <file>clocks.c</file>
@ -18,4 +19,5 @@
<file>properties.c</file> <file>properties.c</file>
<file>topology.c</file> <file>topology.c</file>
<file>worker.c</file> <file>worker.c</file>
<file>kcom.c</file>
</module> </module>

View file

@ -51,7 +51,8 @@ ResourceList_AddRef(
{ {
struct CUnknown* this = CONTAINING_RECORD(this_container, struct CUnknown, IUnknown); struct CUnknown* this = CONTAINING_RECORD(this_container, struct CUnknown, IUnknown);
InterlockedIncrement(&this->m_ref_count); /* fixme */
/* ExInterlockedIncrement(&this->m_ref_count); */
return this->m_ref_count; return this->m_ref_count;
} }
@ -62,7 +63,8 @@ ResourceList_Release(
{ {
struct CUnknown* this = CONTAINING_RECORD(this_container, struct CUnknown, IUnknown); struct CUnknown* this = CONTAINING_RECORD(this_container, struct CUnknown, IUnknown);
InterlockedDecrement(&this->m_ref_count); /* fixme */
/* ExInterlockedDecrement(&this->m_ref_count); */
if ( this->m_ref_count == 0 ) if ( this->m_ref_count == 0 )
{ {

View file

@ -5,8 +5,12 @@
by Andrew Greenwood by Andrew Greenwood
*/ */
#define INITGUID
#include "../private.h" #include "../private.h"
#include <portcls.h> #include <portcls.h>
#include <ks.h>
#include <kcom.h>
#include "port.h" #include "port.h"
/* /*
@ -19,14 +23,17 @@ PcNewPort(
{ {
/* /*
ClassId can be one of the following: ClassId can be one of the following:
CLSID_PortDMus -> IPortDMus (dmusicks.h) CLSID_PortDMus -> IPortDMus (dmusicks.h) -- TODO
CLSID_PortMidi -> IPortMidi CLSID_PortMidi -> IPortMidi
CLSID_PortTopology -> IPortTopology CLSID_PortTopology -> IPortTopology
CLSID_PortWaveCyclic -> IPortWaveCyclic CLSID_PortWaveCyclic -> IPortWaveCyclic
CLSID_PortWavePci -> IPortWavePci CLSID_PortWavePci -> IPortWavePci
TODO: What about PortWavePciStream?
*/ */
PPORT new_port = NULL; PPORT new_port = NULL;
NTSTATUS status = STATUS_UNSUCCESSFUL;
if ( ! OutPort ) if ( ! OutPort )
{ {
@ -34,26 +41,32 @@ PcNewPort(
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
} }
/* FIXME - do not hack, for it is bad */ if ( ( IsEqualGUIDAligned(ClassId, &CLSID_PortMidi) ) ||
//new_port = new PPortMidi; ( IsEqualGUIDAligned(ClassId, &CLSID_PortTopology) ) ||
( IsEqualGUIDAligned(ClassId, &CLSID_PortWaveCyclic) ) ||
// STD_CREATE_BODY_(CPortMidi, (PUNKNOWN) &new_port, NULL, 0, PUNKNOWN); ( IsEqualGUIDAligned(ClassId, &CLSID_PortWavePci) ) )
{
/* DPRINT("Calling KoCreateInstance\n");
if ( ClassId == CLSID_PortMidi ) /* Call KS.SYS's Kernel-mode COM function */
new_port = new IPortMidi; status = KoCreateInstance(ClassId, NULL, CLSCTX_KERNEL_SERVER, &IID_IPort, &new_port);
else if ( ClassId == CLSID_PortTopology ) }
new_port = new IPortTopology;
else if ( ClassId == CLSID_PortWaveCyclic )
new_port = new IPortWaveCyclic;
else if ( ClassId == CLSID_PortWavePci )
new_port = new IPortWavePci;
else else
*/ {
return STATUS_NOT_SUPPORTED;
DPRINT("PcNewPort received a CLSID it does not deal with\n");
status = STATUS_NOT_SUPPORTED;
}
/* If an unsupported CLSID was handed to us, or the creation failed, we fail */
if ( status != STATUS_SUCCESS )
{
return status;
}
/* Fill the caller's PPORT* to point to the new port */ /* Fill the caller's PPORT* to point to the new port */
*OutPort = new_port; *OutPort = new_port;
DPRINT("PcNewPort succeeded\n");
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View file

@ -4,6 +4,7 @@
<importlibrary definition="portcls.def" /> <importlibrary definition="portcls.def" />
<define name="__USE_W32API" /> <define name="__USE_W32API" />
<define name="_NTDDK_" /> <define name="_NTDDK_" />
<define name="DBG" />
<include base="portcls">../include</include> <include base="portcls">../include</include>
<library>ntoskrnl</library> <library>ntoskrnl</library>
<library>ks</library> <library>ks</library>

View file

@ -17,12 +17,13 @@
This is a little bit of a hack, but ReactOS doesn't seem to have this This is a little bit of a hack, but ReactOS doesn't seem to have this
defined. TODO: Make the aligned test truly aligned. defined. TODO: Make the aligned test truly aligned.
*/ */
#if 0
#define IsEqualGUID(a, b) \ #define IsEqualGUID(a, b) \
RtlEqualMemory(&a, &b, sizeof(GUID)) RtlEqualMemory(&a, &b, sizeof(GUID))
#define IsEqualGUIDAligned(a, b) \ #define IsEqualGUIDAligned(a, b) \
IsEqualGUID(a, b) IsEqualGUID(a, b)
#endif
/* /*
Shut the linker up - can also pass -defsym ___cxa_pure_virtual=0 Shut the linker up - can also pass -defsym ___cxa_pure_virtual=0
@ -43,7 +44,7 @@ CUnknown::CUnknown(PUNKNOWN outer_unknown)
} }
else else
{ {
m_outer_unknown = PUNKNOWN(dynamic_cast<PNONDELEGATINGUNKNOWN>(this)); m_outer_unknown = PUNKNOWN(static_cast<PNONDELEGATINGUNKNOWN>(this));
} }
} }

View file

@ -15,6 +15,9 @@
#define PUT_GUIDS_HERE #define PUT_GUIDS_HERE
#define INITGUID #define INITGUID
#include <debug.h>
#include <ntddk.h>
#include <portcls.h> #include <portcls.h>
extern "C" extern "C"
@ -24,6 +27,8 @@ StartDevice(
IN PIRP pIrp, IN PIRP pIrp,
IN PRESOURCELIST ResourceList) IN PRESOURCELIST ResourceList)
{ {
DPRINT1("MPU401_KS StartDevice called\n");
if ( ! ResourceList ) if ( ! ResourceList )
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
@ -32,42 +37,54 @@ StartDevice(
return STATUS_INSUFFICIENT_RESOURCES; return STATUS_INSUFFICIENT_RESOURCES;
} }
DPRINT1("Sufficient resources available :)\n");
PPORT port; PPORT port;
PMINIPORT miniport; PMINIPORT miniport;
NTSTATUS status; NTSTATUS status;
DPRINT1("Calling PcNewPort with CLSID_PortMidi\n");
status = PcNewPort(&port, CLSID_PortMidi); status = PcNewPort(&port, CLSID_PortMidi);
if ( ! NT_SUCCESS(status) ) if ( ! NT_SUCCESS(status) )
{ {
DPRINT("PcNewPort FAILED with status 0x%08x\n", status);
return status; return status;
} }
DPRINT1("Calling PcNewMiniport with CLSID_MiniportDriverUart\n");
status = PcNewMiniport(&miniport, CLSID_MiniportDriverUart); status = PcNewMiniport(&miniport, CLSID_MiniportDriverUart);
if ( ! NT_SUCCESS(status) ) if ( ! NT_SUCCESS(status) )
{ {
DPRINT1("PcNewMiniport FAILED with status 0x%08x\n", status);
return status; return status;
} }
DPRINT1("Calling Init of port object\n");
status = port->Init(pDeviceObject, pIrp, miniport, NULL, ResourceList); status = port->Init(pDeviceObject, pIrp, miniport, NULL, ResourceList);
if ( ! NT_SUCCESS(status) ) if ( ! NT_SUCCESS(status) )
{ {
DPRINT1("Init FAILED with status 0x%08x\n", status);
return status; return status;
} }
DPRINT1("Registering subdevice via PcRegisterSubdevice\n");
status = PcRegisterSubdevice(pDeviceObject, L"Uart", port); status = PcRegisterSubdevice(pDeviceObject, L"Uart", port);
if ( ! NT_SUCCESS(status) ) if ( ! NT_SUCCESS(status) )
{ {
/* just print an error here */ /* just print an error here */
DPRINT1("PcRegisterSubdevice FAILED with status 0x%08x\n", status);
} }
miniport->Release(); miniport->Release();
port->Release(); port->Release();
DPRINT1("Device started\n");
return status; return status;
} }
@ -78,6 +95,7 @@ AddDevice(
IN PVOID Context1, IN PVOID Context1,
IN PVOID Context2) IN PVOID Context2)
{ {
DPRINT1("MPU401_KS AddDevice called, redirecting to PcAddAdapterDevice\n");
return PcAddAdapterDevice((PDRIVER_OBJECT) Context1, return PcAddAdapterDevice((PDRIVER_OBJECT) Context1,
(PDEVICE_OBJECT) Context2, (PDEVICE_OBJECT) Context2,
StartDevice, StartDevice,
@ -85,14 +103,41 @@ AddDevice(
0); 0);
} }
extern "C" extern "C"
NTSTATUS
DriverEntry(
IN PVOID Context1,
IN PVOID Context2)
{ {
return PcInitializeAdapterDriver((PDRIVER_OBJECT) Context1,
NTSTATUS NTAPI
DriverEntry(
IN PDRIVER_OBJECT Context1,
IN PUNICODE_STRING Context2)
{
PDEVICE_OBJECT DeviceObject;
UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\MPU401Static");
// KeBugCheck(0x0000007F);
DPRINT1("MPU401_KS DriverEntry called, redirecting to PcInitializeAdapterDriver\n");
NTSTATUS status = PcInitializeAdapterDriver((PDRIVER_OBJECT) Context1,
(PUNICODE_STRING) Context2, (PUNICODE_STRING) Context2,
(PDRIVER_ADD_DEVICE) AddDevice); (PDRIVER_ADD_DEVICE) AddDevice);
DPRINT1("Result was 0x%08x\n", status);
/* Create a device (this will be handled by PnP manager really but we fake for now */
/*
DPRINT1("Creating device\n");
status = IoCreateDevice(Context1,
0,
&DeviceName,
FILE_DEVICE_SOUND,
0,
FALSE,
&DeviceObject);
DPRINT1("Result was 0x%08x\n", status);
*/
return status;
}; };
}

View file

@ -1,10 +1,11 @@
<module name="mpu401_ks" type="exportdriver" installbase="system32/drivers" installname="mpu401_ks.sys" allowwarnings="true"> <module name="mpu401" type="kernelmodedriver" installbase="system32/drivers" installname="mpu401.sys" allowwarnings="true" entrypoint="DriverEntry">
<linkerflag>-Wl,--entry,_DriverEntry@8</linkerflag>
<include base="mpu401">.</include> <include base="mpu401">.</include>
<include base="mpu401">..</include> <include base="mpu401">..</include>
<importlibrary definition="mpu401.def" /> <library>ntoskrnl</library>
<library>ntoskrnl</library> <library>portcls</library>
<library>portcls</library> <define name="DBG" />
<define name="__USE_W32API" /> <define name="__USE_W32API" />
<file>mpu401.rc</file> <!--file>mpu401.rc</file-->
<file>adapter.cpp</file> <file>adapter.cpp</file>
</module> </module>

View file

@ -7,5 +7,5 @@
<define name="__USE_W32API" /> <define name="__USE_W32API" />
<define name="BUILDING_DRMK" /> <define name="BUILDING_DRMK" />
<file>drmk.rc</file> <file>drmk.rc</file>
<file>stubs.c</file> <file>stubs.cpp</file>
</module> </module>

View file

@ -8,6 +8,10 @@
#ifndef DRMK_H #ifndef DRMK_H
#define DRMK_H #define DRMK_H
#include <ntddk.h>
#include <debug.h>
#include <punknown.h>
typedef struct typedef struct
{ {
DWORD Flags; DWORD Flags;
@ -29,6 +33,11 @@ typedef struct
TODO: Check calling convention TODO: Check calling convention
*/ */
#ifdef __cplusplus
extern "C"
{
#endif
NTAPI NTSTATUS NTAPI NTSTATUS
DrmAddContentHandlers( DrmAddContentHandlers(
IN ULONG ContentId, IN ULONG ContentId,
@ -67,5 +76,8 @@ DrmGetContentRights(
IN ULONG ContentId, IN ULONG ContentId,
OUT PDRMRIGHTS DrmRights); OUT PDRMRIGHTS DrmRights);
#ifdef __cplusplus
}
#endif
#endif #endif

View file

@ -1,5 +1,3 @@
#if !defined(_KS_) #if !defined(_KS_)
#error KS.H must be included before KCOM.H #error KS.H must be included before KCOM.H
#endif #endif

View file

@ -123,11 +123,19 @@
#ifndef PORTCLS_H #ifndef PORTCLS_H
#define PORTCLS_H #define PORTCLS_H
#include <wdm.h> #ifdef __cplusplus
extern "C"
{
#include <wdm.h>
}
#else
#include <wdm.h>
#endif
#include <windef.h> //#include <windef.h>
#include <ks.h> #include <ks.h>
#include <punknown.h> #include <punknown.h>
#include <ntddk.h>
#include <drmk.h> #include <drmk.h>
/* TODO */ /* TODO */
@ -400,7 +408,7 @@ DECLARE_INTERFACE_(IResourceList, IUnknown)
IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Untranslated) PURE; IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Untranslated) PURE;
STDMETHOD_(NTSTATUS, AddEntryFromParent)( THIS_ STDMETHOD_(NTSTATUS, AddEntryFromParent)( THIS_
IN struct IResourceList* Parent, IN IResourceList* Parent,
IN CM_RESOURCE_TYPE Type, IN CM_RESOURCE_TYPE Type,
IN ULONG Index) PURE; IN ULONG Index) PURE;
@ -427,7 +435,7 @@ DECLARE_INTERFACE_(IResourceList, IUnknown)
IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Untranslated); \ IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Untranslated); \
\ \
STDMETHODIMP_(NTSTATUS) AddEntryFromParent( \ STDMETHODIMP_(NTSTATUS) AddEntryFromParent( \
IN struct IResourceList* Parent, \ IN IResourceList* Parent, \
IN CM_RESOURCE_TYPE Type, \ IN CM_RESOURCE_TYPE Type, \
IN ULONG Index); \ IN ULONG Index); \
\ \
@ -893,6 +901,11 @@ typedef IMusicTechnology *PMUSICTECHNOLOGY;
IPort Interface IPort Interface
*/ */
#if 0
#define STATIC_IPort 0xb4c90a25L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
DEFINE_GUIDSTRUCT("0xB4C90A25-5791-11d0-86f9-00a0c911b544", IID_IPort);
#define IID_IPort DEFINE_GUIDNAMED(IID_IPort)
#endif
DEFINE_GUID(IID_IPort, DEFINE_GUID(IID_IPort,
0xb4c90a25L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44); 0xb4c90a25L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
@ -955,6 +968,15 @@ typedef IPort *PPORT;
IPortMidi Interface IPortMidi Interface
*/ */
#if 0
#define STATIC_IID_IPortMidi \
0xb4c90a43L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
DEFINE_GUIDSTRUCT("0xB4C90A43-5791-11d0-86f9-00a0c911b544", IID_IPortMidi);
#define IID_IPortMidi DEFINE_GUIDNAMED(IID_IPortMidi)
#endif
DEFINE_GUID(IID_IPortMidi,
0xb4c90a40L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(CLSID_PortMidi, DEFINE_GUID(CLSID_PortMidi,
0xb4c90a43L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44); 0xb4c90a43L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
@ -985,6 +1007,18 @@ typedef IPortMidi *PPORTMIDI;
IPortWaveCyclic Interface IPortWaveCyclic Interface
*/ */
#if 0
#define STATIC_IPortWaveCyclic \
0xb4c90a26L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
DEFINE_GUIDSTRUCT("0xB4C90A26-5791-11d0-86f9-00a0c911b544", IID_IPortWaveCyclic);
#define IID_IPortWaveCyclic DEFINE_GUIDNAMED(IID_IPortWaveCyclic)
#endif
DEFINE_GUID(IID_IPortWaveCyclic,
0xb4c90a26L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(CLSID_PortWaveCyclic,
0xb4c90a2aL, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DECLARE_INTERFACE_(IPortWaveCyclic, IPort) DECLARE_INTERFACE_(IPortWaveCyclic, IPort)
{ {
DEFINE_ABSTRACT_UNKNOWN() DEFINE_ABSTRACT_UNKNOWN()
@ -1020,6 +1054,18 @@ DECLARE_INTERFACE_(IPortWaveCyclic, IPort)
IPortWavePci Interface IPortWavePci Interface
*/ */
#if 0
#define STATIC_IID_IPortWavePci \
0xb4c90a50L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
DEFINE_GUIDSTRUCT("0xB4C90A50-5791-11d0-86f9-00a0c911b544", IID_IPortWavePci);
#define IID_IPortWavePci DEFINE_GUIDNAMED(IID_IPortWavePci)
#endif
DEFINE_GUID(IID_IPortWavePci,
0xb4c90a50L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(CLSID_PortWavePci,
0xb4c90a54L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DECLARE_INTERFACE_(IPortWavePci, IPort) DECLARE_INTERFACE_(IPortWavePci, IPort)
{ {
DEFINE_ABSTRACT_UNKNOWN() DEFINE_ABSTRACT_UNKNOWN()
@ -1049,6 +1095,14 @@ DECLARE_INTERFACE_(IPortWavePci, IPort)
IPortWavePciStream Interface IPortWavePciStream Interface
*/ */
#define STATIC_IPortWavePciStream \
0xb4c90a51L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
DEFINE_GUIDSTRUCT("0xB4C90A51-5791-11d0-86f9-00a0c911b544", IID_IPortWavePciStream);
/* ... */
/* =============================================================== /* ===============================================================
IMiniPort Interface IMiniPort Interface
@ -1133,12 +1187,25 @@ DECLARE_INTERFACE_(IMiniportMidi, IMiniport)
IMiniportDriverUart Interface IMiniportDriverUart Interface
*/ */
DEFINE_GUID(IID_MiniportDriverUart,
0xb4c90ae1L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(CLSID_MiniportDriverUart, DEFINE_GUID(CLSID_MiniportDriverUart,
0xb4c90ae1L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44); 0xb4c90ae1L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
/* =============================================================== /* ===============================================================
IPortTopology Interface IPortTopology Interface
*/ */
#if 0
#define STATIC_IPortTopology \
0xb4c90a30L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
DEFINE_GUIDSTRUCT("0xB4C90A30-5791-11d0-86f9-00a0c911b544", IID_IPortTopology);
#define IID_IPortTopology DEFINE_GUIDNAMED(IID_IPortTopology)
#endif
DEFINE_GUID(IID_IPortTopology,
0xb4c90a30L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(CLSID_PortTopology,
0xb4c90a32L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DECLARE_INTERFACE_(IPortTopology, IPort) DECLARE_INTERFACE_(IPortTopology, IPort)
{ {

View file

@ -90,7 +90,7 @@ class CUnknown : public INonDelegatingUnknown
: CUnknown(outer_unknown) \ : CUnknown(outer_unknown) \
{ } { }
#else /* Not C++ */ #else /* Not C++ - this is probably very buggy... */
STDMETHODCALLTYPE STDMETHODCALLTYPE
NTSTATUS NTSTATUS

View file

@ -111,6 +111,18 @@ extern "C" {
#define ALIGN_UP_POINTER(p, t) \ #define ALIGN_UP_POINTER(p, t) \
(ALIGN_DOWN_POINTER(((ULONG_PTR)(p) + sizeof(t) - 1), t)) (ALIGN_DOWN_POINTER(((ULONG_PTR)(p) + sizeof(t) - 1), t))
/*
* GUID Comparison
*/
#ifndef __IID_ALIGNED__
#define __IID_ALIGNED__
#define IsEqualGUIDAligned(guid1, guid2) \
( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \
(*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) )
#endif
/* /*
** Forward declarations ** Forward declarations
*/ */
@ -5726,7 +5738,7 @@ RemoveTailList(
return Entry; return Entry;
} }
#if !defined(_WINBASE_H) || _WIN32_WINNT < 0x0501 #if !defined(_WINBASE_) || _WIN32_WINNT < 0x0501
NTKERNELAPI NTKERNELAPI
PSLIST_ENTRY PSLIST_ENTRY

View file

@ -30,6 +30,8 @@
#ifndef KS_H #ifndef KS_H
#define KS_H #define KS_H
#define _KS_
#if __GNUC__ >=3 #if __GNUC__ >=3
#pragma GCC system_header #pragma GCC system_header
#endif #endif
@ -38,6 +40,12 @@
extern "C" { extern "C" {
#endif #endif
/*
Not sure if this is correct but it causes problems if not included. Can't
seem to compile without this...
*/
#include "ntddk.h"
#ifdef BUILDING_KS #ifdef BUILDING_KS
#define KSDDKAPI #define KSDDKAPI
#else #else
@ -50,6 +58,36 @@ extern "C" {
typedef PVOID PKSWORKER; typedef PVOID PKSWORKER;
/* ===============================================================
GUID definition helpers
*/
#ifndef _NTRTL_
#ifndef DEFINE_GUIDEX
/* CDECL is used here in MS DDK but does this really work?? */
#define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
#endif
#ifndef STATICGUIDOF
#define STATICGUIDOF(guid) STATIC_##guid
#endif
#endif
#if defined(__cplusplus) && _MSC_VER >= 1100
#define DEFINE_GUIDSTRUCT(guid, name) struct __declspec(uuid(guid)) name
#define DEFINE_GUIDNAMED(name) __uidof(struct name)
#else
#define DEFINE_GUIDSTRUCT(guid, name) DEFINE_GUIDEX(name)
#define DEFINE_GUIDNAMED(name) name
#endif
#define STATIC_GUID_NULL \
0x00000000L, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
DEFINE_GUIDSTRUCT("00000000-0000-0000-0000-000000000000", GUID_NULL);
#define GUID_NULL DEFINE_GUIDNAMED(GUID_NULL)
/* =============================================================== /* ===============================================================
I/O Control Codes I/O Control Codes
*/ */
@ -104,6 +142,86 @@ typedef PVOID PKSWORKER;
FILE_ANY_ACCESS) FILE_ANY_ACCESS)
/* ===============================================================
Categories
*/
#define STATIC_KSCATEGORY_BRIDGE \
0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000", KSCATEGORY_BRIDGE);
#define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE)
#define STATIC_KSCATEGORY_CAPTURE \
0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_CAPTURE);
#define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE)
#define STATIC_KSCATEGORY_RENDER \
0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_RENDER);
#define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER)
#define STATIC_KSCATEGORY_MIXER \
0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000", KSCATEGORY_MIXER);
#define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER)
#define STATIC_KSCATEGORY_SPLITTER \
0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_SPLITTER);
#define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER)
#define STATIC_KSCATEGORY_DATACOMPRESSOR \
0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATACOMPRESSOR);
#define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR)
#define STATIC_KSCATEGORY_DATADECOMPRESSOR \
0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATADECOMPRESSOR);
#define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR)
#define STATIC_KSCATEGORY_DATATRANSFORM \
0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATATRANSFORM);
#define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM)
#define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \
0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_COMMUNICATIONSTRANSFORM);
#define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM)
#define STATIC_KSCATEGORY_INTERFACETRANSFORM \
0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_INTERFACETRANSFORM);
#define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM)
#define STATIC_KSCATEGORY_MEDIUMTRANSFORM \
0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_MEDIUMTRANSFORM);
#define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM)
#define STATIC_KSCATEGORY_FILESYSTEM \
0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196", KSCATEGORY_FILESYSTEM);
#define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM)
#define STATIC_KSCATEGORY_CLOCK \
0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSCATEGORY_CLOCK);
#define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK)
#define STATIC_KSCATEGORY_PROXY \
0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_PROXY);
#define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY)
#define STATIC_KSCATEGORY_QUALITY \
0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_QUALITY);
#define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY)
/* =============================================================== /* ===============================================================
Clock Properties/Methods/Events Clock Properties/Methods/Events
*/ */
@ -2315,12 +2433,13 @@ KsSynchronousIoControlDevice(
http://www.osronline.com/ddkx/stream/avstream_5q9f.htm http://www.osronline.com/ddkx/stream/avstream_5q9f.htm
*/ */
#if defined(_NTDDK_)
KSDDKAPI NTSTATUS NTAPI KSDDKAPI NTSTATUS NTAPI
KsInitializeDriver( KsInitializeDriver(
IN PDRIVER_OBJECT DriverObject, IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING RegistryPath,
IN const KSDEVICE_DESCRIPTOR *Descriptor OPTIONAL IN const KSDEVICE_DESCRIPTOR *Descriptor OPTIONAL);
); #endif
#if 0 #if 0
typedef void (*PFNKSFILTERFACTORYPOWER)( typedef void (*PFNKSFILTERFACTORYPOWER)(