blob: a46d811e10b01aa431bb9a0dbba16c2777e29dda [file] [log] [blame]
/*
ReactOS Kernel Streaming
Port Class
This file is in the public domain.
Andrew Greenwood
NOTES:
Does not support PC_OLD_NAMES (which is required for backwards-compatibility
with older code)
Obsolete macros are not implemented. For more info:
http://www.osronline.com/ddkx/stream/audpc-struct_167n.htm
== EXPORTS ==
DRM (new in XP):
* PcAddContentHandlers
* PcCreateContentMixed
* PcDestroyContent
* PcForwardContentToDeviceObject
* PcForwardContentToFileObject
* PcForwardContentToInterface
* PcGetContentRights
IRP HANDLING:
* PcCompleteIrp
* PcDispatchIrp
* PcForwardIrpSynchronous
ADAPTER:
* PcAddAdapterDevice
* PcInitializeAdapterDriver
FACTORIES:
* PcNewDmaChannel
* PcNewInterruptSync
* PcNewMiniport
* PcNewPort
* PcNewRegistryKey
* PcNewResourceList
* PcNewResourceSublist
* PcNewServiceGroup
POWER MANAGEMENT:
* PcRegisterAdapterPowerManagement
* PcRequestNewPowerState
PROPERTIES:
* PcCompletePendingPropertyRequest
* PcGetDeviceProperty
IO TIMEOUTS:
* PcRegisterIoTimeout
* PcUnregisterIoTimeout
PHYSICAL CONNECTIONS:
* PcRegisterPhysicalConnection
* PcRegisterPhysicalConnectionFromExternal
* PcRegisterPhysicalConnectionToExternal
MISC:
* PcGetTimeInterval
* PcRegisterSubdevice
== AUDIO HELPER OBJECT INTERFACES ==
IDmaChannel
IDmaChannelSlave
IDmaOperations
IDrmPort (XP)
IDrmPort2 (XP)
IInterruptSync
IMasterClock
IPortClsVersion (XP)
IPortEvents
IPreFetchOffset (XP)
IRegistryKey
IResourceList
IServiceGroup
IServiceSink
IUnregisterPhysicalConnection (Vista)
IUnregisterSubdevice (Vista)
== AUDIO PORT OBJECT INTERFACES ==
IPort
IPortDMus
IPortMidi
IPortTopology
IPortWaveCyclic
IPortWavePci
== AUDIO MINIPORT OBJECT INTERFACES ==
IMiniport
IMiniportDMus
IMiniportMidi
IMiniportTopology
IMiniportWaveCyclic
IMiniportWavePci
== AUDIO MINIPORT AUXILIARY INTERFACES ==
IMusicTechnology (XP)
IPinCount (XP)
== AUDIO STREAM OBJECT INTERFACES ==
IAllocatorMXF
IDrmAudioStream (XP)
IMiniportMidiStream
IMiniportWaveCyclicStream
IMiniportWavePciStream
IMXF
IPortWavePciStream
ISynthSinkDMus
== DIRECTMUSIC USERMODE SYNTH AND SYNTH SINK INTERFACES ==
IDirectMusicSynth
IDirectMusicSynthSink
== AUDIO POWER MANAGEMENT INTERFACES ==
IAdapterPowerManagement
IPowerNotify
*/
#ifndef PORTCLS_H
#define PORTCLS_H
#ifdef __cplusplus
extern "C"
{
# include <wdm.h>
}
#else
# include <wdm.h>
#endif
#include <windef.h>
#define NOBITMAP
#include <mmreg.h>
#undef NOBITMAP
#include <punknown.h>
#include <ks.h>
#include <ksmedia.h>
#include <drmk.h>
#ifdef __cplusplus
extern "C"
{
# include <wdm.h>
}
#else
# include <wdm.h>
#endif
#ifndef PC_NO_IMPORTS
#define PORTCLASSAPI EXTERN_C __declspec(dllimport)
#else
#define PORTCLASSAPI EXTERN_C
#endif
/* TODO */
#define PCFILTER_NODE ((ULONG) -1)
/* HACK */
/* typedef PVOID CM_RESOURCE_TYPE; */
#define _100NS_UNITS_PER_SECOND 10000000L
#define PORT_CLASS_DEVICE_EXTENSION_SIZE ( 64 * sizeof(ULONG_PTR) )
DEFINE_GUID(CLSID_MiniportDriverFmSynth, 0xb4c90ae0L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(CLSID_MiniportDriverFmSynthWithVol, 0xe5a3c139L, 0xf0f2, 0x11d1, 0x81, 0xaf, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1);
/* ===============================================================
Event Item Flags - TODO
*/
#define PCEVENT_ITEM_FLAG_ENABLE KSEVENT_TYPE_ENABLE
#define PCEVENT_ITEM_FLAG_ONESHOT KSEVENT_TYPE_ONESHOT
#define PCEVENT_ITEM_FLAG_BASICSUPPORT KSEVENT_TYPE_BASICSUPPORT
/* ===============================================================
Event Verbs - TODO
*/
#define PCEVENT_VERB_NONE 0
#define PCEVENT_VERB_ADD 1
#define PCEVENT_VERB_REMOVE 2
#define PCEVENT_VERB_SUPPORT 4
/* ===============================================================
Method Item Flags - TODO
*/
#define PCMETHOD_ITEM_FLAG_NONE KSMETHOD_TYPE_NONE
#define PCMETHOD_ITEM_FLAG_READ KSMETHOD_TYPE_READ
#define PCMETHOD_ITEM_FLAG_WRITE KSMETHOD_TYPE_WRITE
#define PCMETHOD_ITEM_FLAG_MODIFY KSMETHOD_TYPE_MODIFY
#define PCMETHOD_ITEM_FLAG_SOURCE KSMETHOD_TYPE_SOURCE
/* ===============================================================
Method Verbs - TODO
*/
#define PCMETHOD_ITEM_FLAG_BASICSUPPORT KSMETHOD_TYPE_BASICSUPPORT
#define PCMETHOD_ITEM_FLAG_SEND
#define PCMETHOD_ITEM_FLAG_SETSUPPORT
/* ===============================================================
Versions
IoIsWdmVersionAvailable may also be used by older drivers.
*/
enum
{
kVersionInvalid = -1,
kVersionWin98,
kVersionWin98SE,
kVersionWin2K,
kVersionWin98SE_QFE2,
kVersionWin2K_SP2,
kVersionWinME,
kVersionWin98SE_QFE3,
kVersionWinME_QFE1,
kVersionWinXP,
kVersionWinXPSP1,
kVersionWinServer2003,
kVersionWin2K_UAAQFE, /* These support IUnregister* interface */
kVersionWinXP_UAAQFE,
kVersionWinServer2003_UAAQFE
};
/* ===============================================================
Properties
*/
struct _PCPROPERTY_REQUEST;
typedef struct _PCPROPERTY_REQUEST PCPROPERTY_REQUEST, *PPCPROPERTY_REQUEST;
typedef NTSTATUS (NTAPI *PCPFNPROPERTY_HANDLER)(
IN PPCPROPERTY_REQUEST PropertyRequest);
typedef struct
{
const GUID * Set;
ULONG Id;
ULONG Flags;
#define PCPROPERTY_ITEM_FLAG_GET KSPROPERTY_TYPE_GET
#define PCPROPERTY_ITEM_FLAG_SET KSPROPERTY_TYPE_SET
#define PCPROPERTY_ITEM_FLAG_BASICSUPPORT KSPROPERTY_TYPE_BASICSUPPORT
//not supported #define PCPROPERTY_ITEM_FLAG_RELATIONS KSPROPERTY_TYPE_RELATIONS
#define PCPROPERTY_ITEM_FLAG_SERIALIZERAW KSPROPERTY_TYPE_SERIALIZERAW
#define PCPROPERTY_ITEM_FLAG_UNSERIALIZERAW KSPROPERTY_TYPE_UNSERIALIZERAW
#define PCPROPERTY_ITEM_FLAG_SERIALIZESIZE KSPROPERTY_TYPE_SERIALIZESIZE
#define PCPROPERTY_ITEM_FLAG_SERIALIZE\
(PCPROPERTY_ITEM_FLAG_SERIALIZERAW\
|PCPROPERTY_ITEM_FLAG_UNSERIALIZERAW\
|PCPROPERTY_ITEM_FLAG_SERIALIZESIZE\
)
#define PCPROPERTY_ITEM_FLAG_DEFAULTVALUES KSPROPERTY_TYPE_DEFAULTVALUES
PCPFNPROPERTY_HANDLER Handler;
}
PCPROPERTY_ITEM, *PPCPROPERTY_ITEM;
struct _PCPROPERTY_REQUEST
{
PUNKNOWN MajorTarget;
PUNKNOWN MinorTarget;
ULONG Node;
const PCPROPERTY_ITEM * PropertyItem;
ULONG Verb;
ULONG InstanceSize;
PVOID Instance;
ULONG ValueSize;
PVOID Value;
PIRP Irp;
};
struct _PCEVENT_REQUEST;
typedef NTSTATUS (NTAPI *PCPFNEVENT_HANDLER)(
IN struct _PCEVENT_REQUEST* EventRequest);
typedef struct _PCEVENT_ITEM
{
const GUID* Set;
ULONG Id;
ULONG Flags;
PCPFNEVENT_HANDLER Handler;
} PCEVENT_ITEM, *PPCEVENT_ITEM;
typedef struct _PCEVENT_REQUEST
{
PUNKNOWN MajorTarget;
PUNKNOWN MinorTarget;
ULONG Node;
const PCEVENT_ITEM* EventItem;
PKSEVENT_ENTRY EventEntry;
ULONG Verb;
PIRP Irp;
} PCEVENT_REQUEST, *PPCEVENT_REQUEST;
struct _PCMETHOD_REQUEST;
typedef NTSTATUS (NTAPI *PCPFNMETHOD_HANDLER)(
IN struct _PCMETHOD_REQUEST* MethodRequest);
typedef struct _PCMETHOD_ITEM
{
const GUID* Set;
ULONG Id;
ULONG Flags;
PCPFNMETHOD_HANDLER Handler;
} PCMETHOD_ITEM, *PPCMETHOD_ITEM;
typedef struct _PCMETHOD_REQUEST
{
PUNKNOWN MajorTarget;
PUNKNOWN MinorTarget;
ULONG Node;
const PCMETHOD_ITEM* MethodItem;
ULONG Verb;
} PCMETHOD_REQUEST, *PPCMETHOD_REQUEST;
/* ===============================================================
Structures (unsorted)
*/
typedef struct
{
ULONG PropertyItemSize;
ULONG PropertyCount;
const PCPROPERTY_ITEM* Properties;
ULONG MethodItemSize;
ULONG MethodCount;
const PCMETHOD_ITEM* Methods;
ULONG EventItemSize;
ULONG EventCount;
const PCEVENT_ITEM* Events;
ULONG Reserved;
} PCAUTOMATION_TABLE, *PPCAUTOMATION_TABLE;
typedef struct
{
ULONG FromNode;
ULONG FromNodePin;
ULONG ToNode;
ULONG ToNodePin;
} PCCONNECTION_DESCRIPTOR, *PPCCONNECTIONDESCRIPTOR;
typedef struct
{
ULONG MaxGlobalInstanceCount;
ULONG MaxFilterInstanceCount;
ULONG MinFilterInstanceCount;
const PCAUTOMATION_TABLE* AutomationTable;
KSPIN_DESCRIPTOR KsPinDescriptor;
} PCPIN_DESCRIPTOR, *PPCPIN_DESCRIPTOR;
typedef struct
{
ULONG Flags;
const PCAUTOMATION_TABLE* AutomationTable;
const GUID* Type;
const GUID* Name;
} PCNODE_DESCRIPTOR, *PPCNODE_DESCRIPTOR;
typedef struct
{
ULONG Version;
const PCAUTOMATION_TABLE* AutomationTable;
ULONG PinSize;
ULONG PinCount;
const PCPIN_DESCRIPTOR* Pins;
ULONG NodeSize;
ULONG NodeCount;
const PCNODE_DESCRIPTOR* Nodes;
ULONG ConnectionCount;
const PCCONNECTION_DESCRIPTOR* Connections;
ULONG CategoryCount;
const GUID* Categories;
} PCFILTER_DESCRIPTOR, *PPCFILTER_DESCRIPTOR;
#define DEFINE_PCAUTOMATION_TABLE_PROP(AutomationTable,PropertyTable)\
const PCAUTOMATION_TABLE AutomationTable =\
{\
sizeof(PropertyTable[0]),\
SIZEOF_ARRAY(PropertyTable),\
(const PCPROPERTY_ITEM *) PropertyTable,\
0,0,NULL,\
0,0,NULL,\
0\
}
/* ===============================================================
IResourceList Interface
*/
#undef INTERFACE
#define INTERFACE IResourceList
DEFINE_GUID(IID_IResourceList, 0x22C6AC60L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
DECLARE_INTERFACE_(IResourceList, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(ULONG, NumberOfEntries)( THIS ) PURE;
STDMETHOD_(ULONG, NumberOfEntriesOfType)( THIS_
IN CM_RESOURCE_TYPE Type) PURE;
STDMETHOD_(PCM_PARTIAL_RESOURCE_DESCRIPTOR, FindTranslatedEntry)( THIS_
IN CM_RESOURCE_TYPE Type,
IN ULONG Index) PURE;
STDMETHOD_(PCM_PARTIAL_RESOURCE_DESCRIPTOR, FindUntranslatedEntry)( THIS_
IN CM_RESOURCE_TYPE Type,
IN ULONG Index) PURE;
STDMETHOD_(NTSTATUS, AddEntry)( THIS_
IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Translated,
IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Untranslated) PURE;
STDMETHOD_(NTSTATUS, AddEntryFromParent)( THIS_
IN IResourceList* Parent,
IN CM_RESOURCE_TYPE Type,
IN ULONG Index) PURE;
STDMETHOD_(PCM_RESOURCE_LIST, TranslatedList)( THIS ) PURE;
STDMETHOD_(PCM_RESOURCE_LIST, UntranslatedList)( THIS ) PURE;
};
#define IMP_IResourceList \
STDMETHODIMP_(ULONG) NumberOfEntries(void); \
\
STDMETHODIMP_(ULONG) NumberOfEntriesOfType( \
IN CM_RESOURCE_TYPE Type); \
\
STDMETHODIMP_(PCM_PARTIAL_RESOURCE_DESCRIPTOR) FindTranslatedEntry( \
IN CM_RESOURCE_TYPE Type, \
IN ULONG Index); \
\
STDMETHODIMP_(PCM_PARTIAL_RESOURCE_DESCRIPTOR) FindUntranslatedEntry( \
IN CM_RESOURCE_TYPE Type, \
IN ULONG Index); \
\
STDMETHODIMP_(NTSTATUS) AddEntry( \
IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Translated, \
IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Untranslated); \
\
STDMETHODIMP_(NTSTATUS) AddEntryFromParent( \
IN IResourceList* Parent, \
IN CM_RESOURCE_TYPE Type, \
IN ULONG Index); \
\
STDMETHODIMP_(PCM_RESOURCE_LIST) TranslatedList(void); \
STDMETHODIMP_(PCM_RESOURCE_LIST) UntranslatedList(void);
typedef IResourceList *PRESOURCELIST;
#define NumberOfPorts() \
NumberOfEntriesOfType(CmResourceTypePort)
#define FindTranslatedPort(n) \
FindTranslatedEntry(CmResourceTypePort, (n))
#define FindUntranslatedPort(n) \
FindUntranslatedEntry(CmResourceTypePort, (n))
#define AddPortFromParent(p, n) \
AddEntryFromParent((p), CmResourceTypePort, (n))
#define NumberOfInterrupts() \
NumberOfEntriesOfType(CmResourceTypeInterrupt)
#define FindTranslatedInterrupt(n) \
FindTranslatedEntry(CmResourceTypeInterrupt, (n))
#define FindUntranslatedInterrupt(n) \
FindUntranslatedEntry(CmResourceTypeInterrupt, (n))
#define AddInterruptFromParent(p, n) \
AddEntryFromParent((p), CmResourceTypeInterrupt, (n))
#define NumberOfMemories() \
NumberOfEntriesOfType(CmResourceTypeMemory)
#define FindTranslatedMemory(n) \
FindTranslatedEntry(CmResourceTypeMemory, (n))
#define FindUntranslatedMemory(n) \
FindUntranslatedEntry(CmResourceTypeMemory, (n))
#define AddMemoryFromParent(p, n) \
AddEntryFromParent((p), CmResourceTypeMemory, (n))
#define NumberOfDmas() \
NumberOfEntriesOfType(CmResourceTypeDma)
#define FindTranslatedDma(n) \
FindTranslatedEntry(CmResourceTypeDma, (n))
#define FindUntranslatedDma(n) \
FindUntranslatedEntry(CmResourceTypeDma, (n))
#define AddDmaFromParent(p, n) \
AddEntryFromParent((p), CmResourceTypeInterrupt, (n))
#define NumberOfDeviceSpecifics() \
NumberOfEntriesOfType(CmResourceTypeDeviceSpecific)
#define FindTranslatedDeviceSpecific(n) \
FindTranslatedEntry(CmResourceTypeDeviceSpecific, (n))
#define FindUntranslatedDeviceSpecific(n) \
FindUntranslatedEntry(CmResourceTypeDeviceSpecific, (n))
#define AddDeviceSpecificFromParent(p, n) \
AddEntryFromParent((p), CmResourceTypeDeviceSpecific, (n))
#define NumberOfBusNumbers() \
NumberOfEntriesOfType(CmResourceTypeBusNumber)
#define FindTranslatedBusNumber(n) \
FindTranslatedEntry(CmResourceTypeBusNumber, (n))
#define FindUntranslatedBusNumber(n) \
FindUntranslatedEntry(CmResourceTypeBusNumber, (n))
#define AddBusNumberFromParent(p, n) \
AddEntryFromParent((p), CmResourceTypeBusNumber, (n))
#define NumberOfDevicePrivates() \
NumberOfEntriesOfType(CmResourceTypeDevicePrivate)
#define FindTranslatedDevicePrivate(n) \
FindTranslatedEntry(CmResourceTypeDevicePrivate, (n))
#define FindUntranslatedDevicePrivate(n) \
FindUntranslatedEntry(CmResourceTypeDevicePrivate, (n))
#define AddDevicePrivateFromParent(p, n) \
AddEntryFromParent((p), CmResourceTypeDevicePrivate, (n))
#define NumberOfAssignedResources() \
NumberOfEntriesOfType(CmResourceTypeAssignedResource)
#define FindTranslatedAssignedResource(n) \
FindTranslatedEntry(CmResourceTypeAssignedResource, (n))
#define FindUntranslatedAssignedResource(n) \
FindUntranslatedEntry(CmResourceTypeAssignedResource, (n))
#define AddAssignedResourceFromParent(p, n) \
AddEntryFromParent((p), CmResourceTypeAssignedResource, (n))
#define NumberOfSubAllocateFroms() \
NumberOfEntriesOfType(CmResourceTypeSubAllocateFrom)
#define FindTranslatedSubAllocateFrom(n) \
FindTranslatedEntry(CmResourceTypeSubAllocateFrom, (n))
#define FindUntranslatedSubAllocateFrom(n) \
FindUntranslatedEntry(CmResourceTypeSubAllocateFrom, (n))
#define AddSubAllocateFromFromParent(p, n) \
AddEntryFromParent((p), CmResourceTypeSubAllocateFrom, (n))
#undef INTERFACE
/* ===============================================================
IServiceSink Interface
*/
#define INTERFACE IServiceSink
DEFINE_GUID(IID_IServiceSink, 0x22C6AC64L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
DECLARE_INTERFACE_(IServiceSink, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(void, RequestService)( THIS ) PURE;
};
#define IMP_IServiceSink \
STDMETHODIMP_(void) RequestService(void);
typedef IServiceSink *PSERVICESINK;
/* ===============================================================
IServiceGroup Interface
*/
#undef INTERFACE
#define INTERFACE IServiceGroup
DEFINE_GUID(IID_IServiceGroup, 0x22C6AC65L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
DECLARE_INTERFACE_(IServiceGroup, IServiceSink)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(void, RequestService)( THIS ) PURE; /* IServiceSink */
STDMETHOD_(NTSTATUS, AddMember)( THIS_
IN PSERVICESINK pServiceSink) PURE;
STDMETHOD_(void, RemoveMember)( THIS_
IN PSERVICESINK pServiceSink) PURE;
STDMETHOD_(void, SupportDelayedService)( THIS ) PURE;
STDMETHOD_(void, RequestDelayedService)( THIS_
IN ULONGLONG ullDelay) PURE;
STDMETHOD_(void, CancelDelayedService)( THIS ) PURE;
};
#define IMP_IServiceGroup \
IMP_IServiceSink; \
\
STDMETHODIMP_(NTSTATUS) AddMember( \
IN PSERVICESINK pServiceSink); \
\
STDMETHODIMP_(void) RemoveMember( \
IN PSERVICESINK pServiceSink); \
\
STDMETHODIMP_(void) SupportDelayedService(void); \
\
STDMETHODIMP_(void) RequestDelayedService( \
IN ULONGLONG ullDelay); \
\
STDMETHODIMP_(void) CancelDelayedService(void);
typedef IServiceGroup *PSERVICEGROUP;
#if (NTDDI_VERSION >= NTDDI_WS03)
/* ===============================================================
IUnregisterSubdevice Interface
*/
DEFINE_GUID(IID_IUnregisterSubdevice, 0x16738177L, 0xe199, 0x41f9, 0x9a, 0x87, 0xab, 0xb2, 0xa5, 0x43, 0x2f, 0x21);
#undef INTERFACE
#define INTERFACE IUnregisterSubdevice
DECLARE_INTERFACE_(IUnregisterSubdevice,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(NTSTATUS,UnregisterSubdevice)(THIS_
IN PDEVICE_OBJECT DeviceObject,
IN PUNKNOWN Unknown)PURE;
};
typedef IUnregisterSubdevice *PUNREGISTERSUBDEVICE;
#define IMP_IUnregisterSubdevice \
STDMETHODIMP_(NTSTATUS) UnregisterSubdevice(THIS_ \
IN PDEVICE_OBJECT DeviceObject, \
IN PUNKNOWN Unknown)
/* ===============================================================
IUnregisterPhysicalConnection Interface
*/
#undef INTERFACE
#define INTERFACE IUnregisterPhysicalConnection
DEFINE_GUID(IID_IUnregisterPhysicalConnection, 0x6c38e231L, 0x2a0d, 0x428d, 0x81, 0xf8, 0x07, 0xcc, 0x42, 0x8b, 0xb9, 0xa4);
DECLARE_INTERFACE_(IUnregisterPhysicalConnection,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(NTSTATUS,UnregisterPhysicalConnection)(THIS_
IN PDEVICE_OBJECT DeviceObject,
IN PUNKNOWN FromUnknown,
IN ULONG FromPin,
IN PUNKNOWN ToUnknown,
IN ULONG ToPin)PURE;
STDMETHOD_(NTSTATUS,UnregisterPhysicalConnectionToExternal)(THIS_
IN PDEVICE_OBJECT DeviceObject,
IN PUNKNOWN FromUnknown,
IN ULONG FromPin,
IN PUNICODE_STRING ToString,
IN ULONG ToPin)PURE;
STDMETHOD_(NTSTATUS,UnregisterPhysicalConnectionFromExternal)(THIS_
IN PDEVICE_OBJECT DeviceObject,
IN PUNICODE_STRING FromString,
IN ULONG FromPin,
IN PUNKNOWN ToUnknown,
IN ULONG ToPin)PURE;
};
typedef IUnregisterPhysicalConnection *PUNREGISTERPHYSICALCONNECTION;
#endif
#define IMP_IUnregisterPhysicalConnection \
STDMETHODIMP_(NTSTATUS) UnregisterPhysicalConnection( \
IN PDEVICE_OBJECT DeviceObject, \
IN PUNKNOWN FromUnknown, \
IN ULONG FromPin, \
IN PUNKNOWN ToUnknown, \
IN ULONG ToPin); \
\
STDMETHODIMP_(NTSTATUS) UnregisterPhysicalConnectionToExternal( \
IN PDEVICE_OBJECT DeviceObject, \
IN PUNKNOWN FromUnknown, \
IN ULONG FromPin, \
IN PUNICODE_STRING ToString, \
IN ULONG ToPin); \
\
STDMETHODIMP_(NTSTATUS) UnregisterPhysicalConnectionFromExternal( \
IN PDEVICE_OBJECT DeviceObject, \
IN PUNICODE_STRING FromString, \
IN ULONG FromPin, \
IN PUNKNOWN ToUnknown, \
IN ULONG ToPin)
/* ===============================================================
IDmaChannel Interface
*/
#define DEFINE_ABSTRACT_DMACHANNEL() \
STDMETHOD_(NTSTATUS, AllocateBuffer)( THIS_ \
IN ULONG BufferSize, \
IN PPHYSICAL_ADDRESS PhysicalAddressConstraint OPTIONAL) PURE; \
\
STDMETHOD_(void, FreeBuffer)( THIS ) PURE; \
STDMETHOD_(ULONG, TransferCount)( THIS ) PURE; \
STDMETHOD_(ULONG, MaximumBufferSize)( THIS ) PURE; \
STDMETHOD_(ULONG, AllocatedBufferSize)( THIS ) PURE; \
STDMETHOD_(ULONG, BufferSize)( THIS ) PURE; \
\
STDMETHOD_(void, SetBufferSize)( THIS_ \
IN ULONG BufferSize) PURE; \
\
STDMETHOD_(PVOID, SystemAddress)( THIS ) PURE; \
STDMETHOD_(PHYSICAL_ADDRESS, PhysicalAddress)( THIS ) PURE; \
STDMETHOD_(PADAPTER_OBJECT, GetAdapterObject)( THIS ) PURE; \
\
STDMETHOD_(void, CopyTo)( THIS_ \
IN PVOID Destination, \
IN PVOID Source, \
IN ULONG ByteCount) PURE; \
\
STDMETHOD_(void, CopyFrom)( THIS_ \
IN PVOID Destination, \
IN PVOID Source, \
IN ULONG ByteCount) PURE;
#define IMP_IDmaChannel \
STDMETHODIMP_(NTSTATUS) AllocateBuffer( \
IN ULONG BufferSize, \
IN PPHYSICAL_ADDRESS PhysicalAddressConstraint OPTIONAL); \
\
STDMETHODIMP_(void) FreeBuffer(void); \
STDMETHODIMP_(ULONG) TransferCount(void); \
STDMETHODIMP_(ULONG) MaximumBufferSize(void); \
STDMETHODIMP_(ULONG) AllocatedBufferSize(void); \
STDMETHODIMP_(ULONG) BufferSize(void); \
\
STDMETHODIMP_(void) SetBufferSize( \
IN ULONG BufferSize); \
\
STDMETHODIMP_(PVOID) SystemAddress(void); \
STDMETHODIMP_(PHYSICAL_ADDRESS) PhysicalAddress(void); \
STDMETHODIMP_(PADAPTER_OBJECT) GetAdapterObject(void); \
\
STDMETHODIMP_(void) CopyTo( \
IN PVOID Destination, \
IN PVOID Source, \
IN ULONG ByteCount); \
\
STDMETHODIMP_(void) CopyFrom( \
IN PVOID Destination, \
IN PVOID Source, \
IN ULONG ByteCount)
#undef INTERFACE
#define INTERFACE IDmaChannel
DEFINE_GUID(IID_IDmaChannel, 0x22C6AC61L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
DECLARE_INTERFACE_(IDmaChannel, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_DMACHANNEL()
};
typedef IDmaChannel *PDMACHANNEL;
/* ===============================================================
IDmaChannelSlave Interface
*/
#define DEFINE_ABSTRACT_DMACHANNELSLAVE() \
STDMETHOD_(NTSTATUS, Start)( THIS_ \
IN ULONG MapSize, \
IN BOOLEAN WriteToDevice) PURE; \
\
STDMETHOD_(NTSTATUS, Stop)( THIS ) PURE; \
STDMETHOD_(ULONG, ReadCounter)( THIS ) PURE; \
\
STDMETHOD_(NTSTATUS, WaitForTC)( THIS_ \
ULONG Timeout) PURE;
#define IMP_IDmaChannelSlave \
IMP_IDmaChannel; \
STDMETHODIMP_(NTSTATUS) Start( \
IN ULONG MapSize, \
IN BOOLEAN WriteToDevice); \
\
STDMETHODIMP_(NTSTATUS) Stop(void); \
STDMETHODIMP_(ULONG) ReadCounter(void); \
\
STDMETHODIMP_(NTSTATUS) WaitForTC( \
ULONG Timeout)
#undef INTERFACE
#define INTERFACE IDmaChannelSlave
#if (NTDDI_VERSION < NTDDI_LONGHORN)
DEFINE_GUID(IID_IDmaChannelSlave, 0x22C6AC62L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
#endif
#undef INTERFACE
#define INTERFACE IDmaChannelSlave
DECLARE_INTERFACE_(IDmaChannelSlave, IDmaChannel)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_DMACHANNEL()
DEFINE_ABSTRACT_DMACHANNELSLAVE()
};
typedef IDmaChannelSlave *PDMACHANNELSLAVE;
/* ===============================================================
IInterruptSync Interface
*/
typedef enum
{
InterruptSyncModeNormal = 1,
InterruptSyncModeAll,
InterruptSyncModeRepeat
} INTERRUPTSYNCMODE;
struct IInterruptSync;
typedef NTSTATUS (NTAPI *PINTERRUPTSYNCROUTINE)(
IN struct IInterruptSync* InterruptSync,
IN PVOID DynamicContext);
#undef INTERFACE
#define INTERFACE IInterruptSync
DECLARE_INTERFACE_(IInterruptSync, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(NTSTATUS, CallSynchronizedRoutine)( THIS_
IN PINTERRUPTSYNCROUTINE Routine,
IN PVOID DynamicContext) PURE;
STDMETHOD_(PKINTERRUPT, GetKInterrupt)( THIS ) PURE;
STDMETHOD_(NTSTATUS, Connect)( THIS ) PURE;
STDMETHOD_(void, Disconnect)( THIS ) PURE;
STDMETHOD_(NTSTATUS, RegisterServiceRoutine)( THIS_
IN PINTERRUPTSYNCROUTINE Routine,
IN PVOID DynamicContext,
IN BOOLEAN First) PURE;
};
DEFINE_GUID(IID_IInterruptSync, 0x22C6AC63L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
#define IMP_IInterruptSync \
STDMETHODIMP_(NTSTATUS) CallSynchronizedRoutine( \
IN PINTERRUPTSYNCROUTINE Routine, \
IN PVOID DynamicContext); \
\
STDMETHODIMP_(PKINTERRUPT) GetKInterrupt(void); \
STDMETHODIMP_(NTSTATUS) Connect(void); \
STDMETHODIMP_(void) Disconnect(void); \
\
STDMETHODIMP_(NTSTATUS) RegisterServiceRoutine( \
IN PINTERRUPTSYNCROUTINE Routine, \
IN PVOID DynamicContext, \
IN BOOLEAN First)
typedef IInterruptSync *PINTERRUPTSYNC;
/* ===============================================================
IRegistryKey Interface
*/
#undef INTERFACE
#define INTERFACE IRegistryKey
enum
{
GeneralRegistryKey,
DeviceRegistryKey,
DriverRegistryKey,
HwProfileRegistryKey,
DeviceInterfaceRegistryKey
};
DEFINE_GUID(IID_IRegistryKey, 0xE8DA4302l, 0xF304, 0x11D0, 0x95, 0x8B, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3);
DECLARE_INTERFACE_(IRegistryKey, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(NTSTATUS, QueryKey)( THIS_
IN KEY_INFORMATION_CLASS KeyInformationClass,
OUT PVOID KeyInformation,
IN ULONG Length,
OUT PULONG ResultLength) PURE;
STDMETHOD_(NTSTATUS, EnumerateKey)( THIS_
IN ULONG Index,
IN KEY_INFORMATION_CLASS KeyInformationClass,
OUT PVOID KeyInformation,
IN ULONG Length,
OUT PULONG ResultLength) PURE;
STDMETHOD_(NTSTATUS, QueryValueKey)( THIS_
IN PUNICODE_STRING ValueName,
IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
OUT PVOID KeyValueInformation,
IN ULONG Length,
OUT PULONG ResultLength) PURE;
STDMETHOD_(NTSTATUS, EnumerateValueKey)( THIS_
IN ULONG Index,
IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
OUT PVOID KeyValueInformation,
IN ULONG Length,
OUT PULONG ResultLength) PURE;
STDMETHOD_(NTSTATUS, SetValueKey)( THIS_
IN PUNICODE_STRING ValueName OPTIONAL,
IN ULONG Type,
IN PVOID Data,
IN ULONG DataSize) PURE;
STDMETHOD_(NTSTATUS, QueryRegistryValues)( THIS_
IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
IN PVOID Context OPTIONAL) PURE;
STDMETHOD_(NTSTATUS, NewSubKey)( THIS_
OUT IRegistryKey** RegistrySubKey,
IN PUNKNOWN OuterUnknown,
IN ACCESS_MASK DesiredAccess,
IN PUNICODE_STRING SubKeyName,
IN ULONG CreateOptions,
OUT PULONG Disposition OPTIONAL) PURE;
STDMETHOD_(NTSTATUS, DeleteKey)( THIS ) PURE;
};
#define IMP_IRegistryKey \
STDMETHODIMP_(NTSTATUS) QueryKey( \
IN KEY_INFORMATION_CLASS KeyInformationClass, \
OUT PVOID KeyInformation, \
IN ULONG Length, \
OUT PULONG ResultLength); \
\
STDMETHODIMP_(NTSTATUS) EnumerateKey( \
IN ULONG Index, \
IN KEY_INFORMATION_CLASS KeyInformationClass, \
OUT PVOID KeyInformation, \
IN ULONG Length, \
OUT PULONG ResultLength); \
\
STDMETHODIMP_(NTSTATUS) QueryValueKey( \
IN PUNICODE_STRING ValueName, \
IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, \
OUT PVOID KeyValueInformation, \
IN ULONG Length, \
OUT PULONG ResultLength); \
\
STDMETHODIMP_(NTSTATUS) EnumerateValueKey( \
IN ULONG Index, \
IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, \
OUT PVOID KeyValueInformation, \
IN ULONG Length, \
OUT PULONG ResultLength); \
\
STDMETHODIMP_(NTSTATUS) SetValueKey( \
IN PUNICODE_STRING ValueName OPTIONAL, \
IN ULONG Type, \
IN PVOID Data, \
IN ULONG DataSize); \
\
STDMETHODIMP_(NTSTATUS) QueryRegistryValues( \
IN PRTL_QUERY_REGISTRY_TABLE QueryTable, \
IN PVOID Context OPTIONAL); \
\
STDMETHODIMP_(NTSTATUS) NewSubKey( \
OUT IRegistryKey** RegistrySubKey, \
IN PUNKNOWN OuterUnknown, \
IN ACCESS_MASK DesiredAccess, \
IN PUNICODE_STRING SubKeyName, \
IN ULONG CreateOptions, \
OUT PULONG Disposition OPTIONAL); \
\
STDMETHODIMP_(NTSTATUS) DeleteKey(void);
typedef IRegistryKey *PREGISTRYKEY;
/* ===============================================================
IMusicTechnology Interface
*/
DECLARE_INTERFACE_(IMusicTechnology, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(NTSTATUS, SetTechnology)( THIS_
IN const GUID* Technology) PURE;
};
#define IMP_IMusicTechnology \
STDMETHODIMP_(NTSTATUS) SetTechnology( \
IN const GUID* Technology);
typedef IMusicTechnology *PMUSICTECHNOLOGY;
/* ===============================================================
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_IMiniport,
0xb4c90a24L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(IID_IPort,
0xb4c90a25L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
#define DEFINE_ABSTRACT_PORT() \
STDMETHOD_(NTSTATUS, Init)( THIS_ \
IN PDEVICE_OBJECT DeviceObject, \
IN PIRP Irp, \
IN PUNKNOWN UnknownMiniport, \
IN PUNKNOWN UnknownAdapter OPTIONAL, \
IN PRESOURCELIST ResourceList) PURE; \
\
STDMETHOD_(NTSTATUS, GetDeviceProperty)( THIS_ \
IN DEVICE_REGISTRY_PROPERTY DeviceProperty, \
IN ULONG BufferLength, \
OUT PVOID PropertyBuffer, \
OUT PULONG ResultLength) PURE; \
\
STDMETHOD_(NTSTATUS, NewRegistryKey)( THIS_ \
OUT PREGISTRYKEY* OutRegistryKey, \
IN PUNKNOWN OuterUnknown OPTIONAL, \
IN ULONG RegistryKeyType, \
IN ACCESS_MASK DesiredAccess, \
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, \
IN ULONG CreateOptiona OPTIONAL, \
OUT PULONG Disposition OPTIONAL) PURE;
#ifdef PC_IMPLEMENTATION
#define IMP_IPort\
STDMETHODIMP_(NTSTATUS) Init\
( IN PDEVICE_OBJECT DeviceObject,\
IN PIRP Irp,\
IN PUNKNOWN UnknownMiniport,\
IN PUNKNOWN UnknownAdapter OPTIONAL,\
IN PRESOURCELIST ResourceList\
);\
STDMETHODIMP_(NTSTATUS) GetDeviceProperty\
( IN DEVICE_REGISTRY_PROPERTY DeviceProperty,\
IN ULONG BufferLength,\
OUT PVOID PropertyBuffer,\
OUT PULONG ResultLength\
);\
STDMETHODIMP_(NTSTATUS) NewRegistryKey\
( OUT PREGISTRYKEY * OutRegistryKey,\
IN PUNKNOWN OuterUnknown OPTIONAL,\
IN ULONG RegistryKeyType,\
IN ACCESS_MASK DesiredAccess,\
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,\
IN ULONG CreateOptions OPTIONAL,\
OUT PULONG Disposition OPTIONAL\
)
#endif
#undef INTERFACE
#define INTERFACE IPort
DECLARE_INTERFACE_(IPort, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_PORT()
};
typedef IPort *PPORT;
/* ===============================================================
IPortMidi Interface
*/
DEFINE_GUID(IID_IPortMidi,
0xb4c90a40L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(CLSID_PortMidi,
0xb4c90a43L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
#undef INTERFACE
#define INTERFACE IPortMidi
DECLARE_INTERFACE_(IPortMidi, IPort)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_PORT()
STDMETHOD_(VOID, Notify)(THIS_
IN PSERVICEGROUP ServiceGroup OPTIONAL) PURE;
STDMETHOD_(NTSTATUS, RegisterServiceGroup)(THIS_
IN PSERVICEGROUP ServiceGroup) PURE;
};
typedef IPortMidi *PPORTMIDI;
#define IMP_IPortMidi() \
STDMETHODIMP_(VOID) Notify( \
IN PSERVICEGROUP ServiceGroup OPTIONAL); \
\
STDMETHODIMP_(NTSTATUS) RegisterServiceGroup( \
IN PSERVICEGROUP ServiceGroup);
#undef INTERFACE
/* ===============================================================
IPortWaveCyclic Interface
*/
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);
#define INTERFACE IPortWaveCyclic
DECLARE_INTERFACE_(IPortWaveCyclic, IPort)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_PORT()
STDMETHOD_(VOID, Notify)(THIS_
IN PSERVICEGROUP ServiceGroup) PURE;
STDMETHOD_(NTSTATUS, NewSlaveDmaChannel)(THIS_
OUT PDMACHANNELSLAVE* DmaChannel,
IN PUNKNOWN OuterUnknown,
IN PRESOURCELIST ResourceList OPTIONAL,
IN ULONG DmaIndex,
IN ULONG MaximumLength,
IN BOOLEAN DemandMode,
IN DMA_SPEED DmaSpeed) PURE;
STDMETHOD_(NTSTATUS, NewMasterDmaChannel)(THIS_
OUT PDMACHANNEL* DmaChannel,
IN PUNKNOWN OuterUnknown,
IN PRESOURCELIST ResourceList OPTIONAL,
IN ULONG MaximumLength,
IN BOOLEAN Dma32BitAddresses,
IN BOOLEAN Dma64BitAddresses,
IN DMA_WIDTH DmaWidth,
IN DMA_SPEED DmaSpeed) PURE;
};
typedef IPortWaveCyclic *PPORTWAVECYCLIC;
#ifdef PC_IMPLEMENTATION
#define IMP_IPortWaveCyclic \
IMP_IPort; \
STDMETHODIMP_(VOID) Notify( \
IN PSERVICEGROUP ServiceGroup); \
\
STDMETHODIMP_(NTSTATUS) NewSlaveDmaChannel( \
OUT PDMACHANNELSLAVE* DmaChannel, \
IN PUNKNOWN OuterUnknown, \
IN PRESOURCELIST ResourceList OPTIONAL, \
IN ULONG DmaIndex, \
IN ULONG MaximumLength, \
IN BOOLEAN DemandMode, \
IN DMA_SPEED DmaSpeed); \
\
STDMETHODIMP_(NTSTATUS) NewMasterDmaChannel( \
OUT PDMACHANNEL* DmaChannel, \
IN PUNKNOWN OuterUnknown, \
IN PRESOURCELIST ResourceList OPTIONAL, \
IN ULONG MaximumLength, \
IN BOOLEAN Dma32BitAddresses, \
IN BOOLEAN Dma64BitAddresses, \
IN DMA_WIDTH DmaWidth, \
IN DMA_SPEED DmaSpeed)
#endif
#undef INTERFACE
/* ===============================================================
IPortWavePci Interface
*/
#undef INTERFACE
#define INTERFACE IPortWavePci
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)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_PORT()
STDMETHOD_(VOID, Notify)(THIS_
IN PSERVICEGROUP ServiceGroup) PURE;
STDMETHOD_(NTSTATUS, NewMasterDmaChannel)(THIS_
OUT PDMACHANNEL* DmaChannel,
IN PUNKNOWN OuterUnknown,
IN POOL_TYPE PoolType,
IN PRESOURCELIST ResourceList OPTIONAL,
IN BOOLEAN ScatterGather,
IN BOOLEAN Dma32BitAddresses,
IN BOOLEAN Dma64BitAddresses,
IN BOOLEAN IgnoreCount,
IN DMA_WIDTH DmaWidth,
IN DMA_SPEED DmaSpeed,
IN ULONG MaximumLength,
IN ULONG DmaPort) PURE;
};
typedef IPortWavePci *PPORTWAVEPCI;
#undef INTERFACE
#ifdef PC_IMPLEMENTATION
#define IMP_IPortWavePci \
IMP_IPort; \
STDMETHODIMP_(VOID) Notify( \
IN PSERVICEGROUP ServiceGroup); \
\
STDMETHODIMP_(NTSTATUS) NewMasterDmaChannel( \
OUT PDMACHANNEL* DmaChannel, \
IN PUNKNOWN OuterUnknown, \
IN POOL_TYPE PoolType, \
IN PRESOURCELIST ResourceList OPTIONAL, \
IN BOOLEAN ScatterGather, \
IN BOOLEAN Dma32BitAddresses, \
IN BOOLEAN Dma64BitAddresses, \
IN BOOLEAN IgnoreCount, \
IN DMA_WIDTH DmaWidth, \
IN DMA_SPEED DmaSpeed, \
IN ULONG MaximumLength, \
IN ULONG DmaPort);
#endif
/* ===============================================================
IMiniPort Interface
*/
DEFINE_GUID(IID_IMiniPort,
0xb4c90a24L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
#define DEFINE_ABSTRACT_MINIPORT() \
STDMETHOD_(NTSTATUS, GetDescription)( THIS_ \
OUT PPCFILTER_DESCRIPTOR* Description) PURE; \
\
STDMETHOD_(NTSTATUS, DataRangeIntersection)( THIS_ \
IN ULONG PinId, \
IN PKSDATARANGE DataRange, \
IN PKSDATARANGE MatchingDataRange, \
IN ULONG OutputBufferLength, \
OUT PVOID ResultantFormat OPTIONAL, \
OUT PULONG ResultantFormatLength) PURE;
#define IMP_IMiniport \
STDMETHODIMP_(NTSTATUS) GetDescription( \
OUT PPCFILTER_DESCRIPTOR* Description); \
\
STDMETHODIMP_(NTSTATUS) DataRangeIntersection( \
IN ULONG PinId, \
IN PKSDATARANGE DataRange, \
IN PKSDATARANGE MatchingDataRange, \
IN ULONG OutputBufferLength, \
OUT PVOID ResultantFormat OPTIONAL, \
OUT PULONG ResultantFormatLength)
DECLARE_INTERFACE_(IMiniport, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_MINIPORT()
};
typedef IMiniport *PMINIPORT;
/* ===============================================================
IMiniportMidiStream Interface
*/
#undef INTERFACE
#define INTERFACE IMiniportMidiStream
DEFINE_GUID(IID_IMiniportMidiStream,
0xb4c90a42L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DECLARE_INTERFACE_(IMiniportMidiStream, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(NTSTATUS,SetFormat)(THIS_
IN PKSDATAFORMAT DataFormat)PURE;
STDMETHOD_(NTSTATUS,SetState)(THIS_
IN KSSTATE State)PURE;
STDMETHOD_(NTSTATUS,Read)(THIS_
IN PVOID BufferAddress,
IN ULONG BufferLength,
OUT PULONG BytesRead)PURE;
STDMETHOD_(NTSTATUS,Write)(THIS_
IN PVOID BufferAddress,
IN ULONG BytesToWrite,
OUT PULONG BytesWritten)PURE;
};
typedef IMiniportMidiStream* PMINIPORTMIDISTREAM;
#undef INTERFACE
/* ===============================================================
IMiniportMidi Interface
*/
#undef INTERFACE
#define INTERFACE IMiniportMidi
DEFINE_GUID(IID_IMiniportMidi,
0xb4c90a41L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DECLARE_INTERFACE_(IMiniportMidi, IMiniport)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_MINIPORT()
STDMETHOD_(NTSTATUS, Init)(THIS_
IN PUNKNOWN UnknownAdapter,
IN PRESOURCELIST ResourceList,
IN PPORTMIDI Port,
OUT PSERVICEGROUP* ServiceGroup) PURE;
STDMETHOD_(void, Service)(THIS) PURE;
STDMETHOD_(NTSTATUS, NewStream)(THIS_
OUT PMINIPORTMIDISTREAM *Stream,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType,
IN ULONG Pin,
IN BOOLEAN Capture,
IN PKSDATAFORMAT DataFormat,
OUT PSERVICEGROUP* ServiceGroup) PURE;
};
typedef IMiniportMidi *PMINIPORTMIDI;
#undef INTERFACE
/* ===============================================================
IMiniportDriverUart Interface
*/
DEFINE_GUID(IID_MiniportDriverUart,
0xb4c90ae1L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(CLSID_MiniportDriverUart,
0xb4c90ae1L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
/* ===============================================================
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
#undef INTERFACE
#define INTERFACE IPortTopology
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);
#undef INTERFACE
#define INTERFACE IPortTopology
DECLARE_INTERFACE_(IPortTopology, IPort)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_PORT()
};
typedef IPortTopology *PPORTTOPOLOGY;
#define IMP_IPortTopology IMP_IPort
/* ===============================================================
IMiniportTopology Interface
*/
#undef INTERFACE
#define INTERFACE IMiniportTopology
DEFINE_GUID(IID_IMiniportTopology, 0xb4c90a31L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
#undef INTERFACE
#define INTERFACE IMiniportTopology
DECLARE_INTERFACE_(IMiniportTopology,IMiniport)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_MINIPORT()
STDMETHOD_(NTSTATUS,Init)(THIS_
IN PUNKNOWN UnknownAdapter,
IN PRESOURCELIST ResourceList,
IN PPORTTOPOLOGY Port)PURE;
};
typedef IMiniportTopology *PMINIPORTTOPOLOGY;
/* ===============================================================
IMiniportWaveCyclicStream Interface
*/
#undef INTERFACE
#define INTERFACE IMiniportWaveCyclicStream
DEFINE_GUID(IID_IMiniportWaveCyclicStream,
0xb4c90a28L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DECLARE_INTERFACE_(IMiniportWaveCyclicStream,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(NTSTATUS,SetFormat)(THIS_
IN PKSDATAFORMAT DataFormat)PURE;
STDMETHOD_(ULONG,SetNotificationFreq)(THIS_
IN ULONG Interval,
OUT PULONG FrameSize) PURE;
STDMETHOD_(NTSTATUS,SetState)(THIS_
IN KSSTATE State) PURE;
STDMETHOD_(NTSTATUS,GetPosition)( THIS_
OUT PULONG Position) PURE;
STDMETHOD_(NTSTATUS,NormalizePhysicalPosition)(THIS_
IN OUT PLONGLONG PhysicalPosition) PURE;
STDMETHOD_(void, Silence)( THIS_
IN PVOID Buffer,
IN ULONG ByteCount) PURE;
};
typedef IMiniportWaveCyclicStream *PMINIPORTWAVECYCLICSTREAM;
#define IMP_IMiniportWaveCyclicStream\
STDMETHODIMP_(NTSTATUS) SetFormat\
( IN PKSDATAFORMAT DataFormat\
);\
STDMETHODIMP_(ULONG) SetNotificationFreq\
( IN ULONG Interval,\
OUT PULONG FrameSize\
);\
STDMETHODIMP_(NTSTATUS) SetState\
( IN KSSTATE State\
);\
STDMETHODIMP_(NTSTATUS) GetPosition\
( OUT PULONG Position\
);\
STDMETHODIMP_(NTSTATUS) NormalizePhysicalPosition\
( IN OUT PLONGLONG PhysicalPosition\
);\
STDMETHODIMP_(void) Silence\
( IN PVOID Buffer,\
IN ULONG ByteCount\
)
/* ===============================================================
IMiniportWaveCyclic Interface
*/
#undef INTERFACE
DEFINE_GUID(IID_IMiniportWaveCyclic,
0xb4c90a27L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
#define INTERFACE IMiniportWaveCyclic
DECLARE_INTERFACE_(IMiniportWaveCyclic, IMiniport)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_MINIPORT()
STDMETHOD_(NTSTATUS, Init)(THIS_
IN PUNKNOWN UnknownAdapter,
IN PRESOURCELIST ResourceList,
IN PPORTWAVECYCLIC Port) PURE;
STDMETHOD_(NTSTATUS, NewStream)(THIS_
OUT PMINIPORTWAVECYCLICSTREAM *Stream,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType,
IN ULONG Pin,
IN BOOLEAN Capture,
IN PKSDATAFORMAT DataFormat,
OUT PDMACHANNEL *DmaChannel,
OUT PSERVICEGROUP *ServiceGroup) PURE;
};
typedef IMiniportWaveCyclic *PMINIPORTWAVECYCLIC;
#undef INTERFACE
#define IMP_IMiniportWaveCyclic\
IMP_IMiniport;\
STDMETHODIMP_(NTSTATUS) Init\
( IN PUNKNOWN UnknownAdapter,\
IN PRESOURCELIST ResourceList,\
IN PPORTWAVECYCLIC Port\
);\
STDMETHODIMP_(NTSTATUS) NewStream\
( OUT PMINIPORTWAVECYCLICSTREAM * Stream,\
IN PUNKNOWN OuterUnknown OPTIONAL,\
IN POOL_TYPE PoolType,\
IN ULONG Pin,\
IN BOOLEAN Capture,\
IN PKSDATAFORMAT DataFormat,\
OUT PDMACHANNEL * DmaChannel,\
OUT PSERVICEGROUP * ServiceGroup\
)
/* ===============================================================
IPortWavePciStream Interface
*/
#undef INTERFACE
#define INTERFACE IPortWavePciStream
DEFINE_GUID(IID_IPortWavePciStream, 0xb4c90a51L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DECLARE_INTERFACE_(IPortWavePciStream,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
STDMETHOD_(NTSTATUS,GetMapping)(THIS_
IN PVOID Tag,
OUT PPHYSICAL_ADDRESS PhysicalAddress,
OUT PVOID * VirtualAddress,
OUT PULONG ByteCount,
OUT PULONG Flags)PURE;
STDMETHOD_(NTSTATUS,ReleaseMapping)(THIS_
IN PVOID Tag)PURE;
STDMETHOD_(NTSTATUS,TerminatePacket)(THIS)PURE;
};
typedef IPortWavePciStream *PPORTWAVEPCISTREAM;
#define IMP_IPortWavePciStream \
STDMETHODIMP_(NTSTATUS) GetMapping( \
IN PVOID Tag, \
OUT PPHYSICAL_ADDRESS PhysicalAddress, \
OUT PVOID * VirtualAddress, \
OUT PULONG ByteCount, \
OUT PULONG Flags); \
\
STDMETHODIMP_(NTSTATUS) ReleaseMapping( \
IN PVOID Tag); \
\
STDMETHODIMP_(NTSTATUS) TerminatePacket(THIS)
/* ===============================================================
IMiniportWavePciStream Interface
*/
#undef INTERFACE
#define INTERFACE IMiniportWavePciStream
DEFINE_GUID(IID_IMiniportWavePciStream, 0xb4c90a53L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DECLARE_INTERFACE_(IMiniportWavePciStream,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(NTSTATUS,SetFormat)(THIS_
IN PKSDATAFORMAT DataFormat)PURE;
STDMETHOD_(NTSTATUS,SetState)(THIS_
IN KSSTATE State)PURE;
STDMETHOD_(NTSTATUS,GetPosition)(THIS_
OUT PULONGLONG Position)PURE;
STDMETHOD_(NTSTATUS,NormalizePhysicalPosition)(THIS_
IN OUT PLONGLONG PhysicalPosition)PURE;
STDMETHOD_(NTSTATUS,GetAllocatorFraming)(THIS_
OUT PKSALLOCATOR_FRAMING AllocatorFraming) PURE;
STDMETHOD_(NTSTATUS,RevokeMappings)(THIS_
IN PVOID FirstTag,
IN PVOID LastTag,
OUT PULONG MappingsRevoked)PURE;
STDMETHOD_(void,MappingAvailable)(THIS)PURE;
STDMETHOD_(void,Service)(THIS)PURE;
};
typedef IMiniportWavePciStream *PMINIPORTWAVEPCISTREAM;
/* ===============================================================
IMiniportWavePci Interface
*/
#undef INTERFACE
#define INTERFACE IMiniportWavePci
DEFINE_GUID(IID_IMiniportWavePci, 0xb4c90a52L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DECLARE_INTERFACE_(IMiniportWavePci,IMiniport)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_MINIPORT()
STDMETHOD_(NTSTATUS,Init)(THIS_
IN PUNKNOWN UnknownAdapter,
IN PRESOURCELIST ResourceList,
IN PPORTWAVEPCI Port,
OUT PSERVICEGROUP * ServiceGroup)PURE;
STDMETHOD_(NTSTATUS,NewStream)(THIS_
OUT PMINIPORTWAVEPCISTREAM * Stream,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType,
IN PPORTWAVEPCISTREAM PortStream,
IN ULONG Pin,
IN BOOLEAN Capture,
IN PKSDATAFORMAT DataFormat,
OUT PDMACHANNEL * DmaChannel,
OUT PSERVICEGROUP * ServiceGroup)PURE;
STDMETHOD_(void,Service)(THIS)PURE;
};
typedef IMiniportWavePci *PMINIPORTWAVEPCI;
#if !defined(DEFINE_ABSTRACT_MINIPORTWAVERTSTREAM)
#define DEFINE_ABSTRACT_MINIPORTWAVERTSTREAM() \
STDMETHOD_(NTSTATUS,SetFormat) \
( THIS_ \
IN PKSDATAFORMAT DataFormat \
) PURE; \
STDMETHOD_(NTSTATUS,SetState) \
( THIS_ \
IN KSSTATE State \
) PURE; \
STDMETHOD_(NTSTATUS,GetPosition) \
( THIS_ \
OUT PKSAUDIO_POSITION Position \
) PURE; \
STDMETHOD_(NTSTATUS,AllocateAudioBuffer) \
( THIS_ \
IN ULONG RequestedSize, \
OUT PMDL *AudioBufferMdl, \
OUT ULONG *ActualSize, \
OUT ULONG *OffsetFromFirstPage, \
OUT MEMORY_CACHING_TYPE *CacheType \
) PURE; \
STDMETHOD_(VOID,FreeAudioBuffer) \
( THIS_ \
IN PMDL AudioBufferMdl, \
IN ULONG BufferSize \
) PURE; \
STDMETHOD_(VOID,GetHWLatency) \
( THIS_ \
OUT KSRTAUDIO_HWLATENCY *hwLatency \
) PURE; \
STDMETHOD_(NTSTATUS,GetPositionRegister) \
( THIS_ \
OUT KSRTAUDIO_HWREGISTER *Register \
) PURE; \
STDMETHOD_(NTSTATUS,GetClockRegister) \
( THIS_ \
OUT KSRTAUDIO_HWREGISTER *Register \
) PURE;
#endif
/* ===============================================================
IAdapterPowerManagement Interface
*/
#if (NTDDI_VERSION >= NTDDI_VISTA)
/* ===============================================================
IPortWaveRT Interface
*/
DEFINE_GUID(CLSID_PortWaveRT, 0xcc9be57a, 0xeb9e, 0x42b4, 0x94, 0xfc, 0xc, 0xad, 0x3d, 0xbc, 0xe7, 0xfa);
DEFINE_GUID(IID_IPortWaveRT, 0x339ff909, 0x68a9, 0x4310, 0xb0, 0x9b, 0x27, 0x4e, 0x96, 0xee, 0x4c, 0xbd);
#undef INTERFACE
#define INTERFACE IPortWaveRT
DECLARE_INTERFACE_(IPortWaveRT,IPort)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_PORT() // For IPort
};
typedef IPortWaveRT *PPORTWAVERT;
#ifdef PC_IMPLEMENTATION
#define IMP_IPortWaveRT IMP_IPort
#endif
/* ===============================================================
IPortWaveRTStream Interface
*/
#undef INTERFACE
#define INTERFACE IPortWaveRTStream
DEFINE_GUID(IID_IPortWaveRTStream, 0x1809ce5a, 0x64bc, 0x4e62, 0xbd, 0x7d, 0x95, 0xbc, 0xe4, 0x3d, 0xe3, 0x93);
DECLARE_INTERFACE_(IPortWaveRTStream, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(PMDL, AllocatePagesForMdl)
( THIS_
IN PHYSICAL_ADDRESS HighAddress,
IN SIZE_T TotalBytes
) PURE;
STDMETHOD_(PMDL, AllocateContiguousPagesForMdl)
( THIS_
IN PHYSICAL_ADDRESS LowAddress,
IN PHYSICAL_ADDRESS HighAddress,
IN SIZE_T TotalBytes
) PURE;
STDMETHOD_(PVOID, MapAllocatedPages)
( THIS_
IN PMDL MemoryDescriptorList,
IN MEMORY_CACHING_TYPE CacheType
) PURE;
STDMETHOD_(VOID, UnmapAllocatedPages)
( THIS_
IN PVOID BaseAddress,
IN PMDL MemoryDescriptorList
) PURE;
STDMETHOD_(VOID, FreePagesFromMdl)
( THIS_
IN PMDL MemoryDescriptorList
) PURE;
STDMETHOD_(ULONG, GetPhysicalPagesCount)
( THIS_
IN PMDL MemoryDescriptorList
) PURE;
STDMETHOD_(PHYSICAL_ADDRESS, GetPhysicalPageAddress)
( THIS_
IN PMDL MemoryDescriptorList,
IN ULONG Index
) PURE;
};
typedef IPortWaveRTStream *PPORTWAVERTSTREAM;
/* ===============================================================
IMiniportWaveRTStream Interface
*/
#undef INTERFACE
#define INTERFACE IMiniportWaveRTStream
DEFINE_GUID(IID_IMiniportWaveRTStream, 0xac9ab, 0xfaab, 0x4f3d, 0x94, 0x55, 0x6f, 0xf8, 0x30, 0x6a, 0x74, 0xa0);
DECLARE_INTERFACE_(IMiniportWaveRTStream, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_MINIPORTWAVERTSTREAM()
};
typedef IMiniportWaveRTStream *PMINIPORTWAVERTSTREAM;
#define IMP_IMiniportWaveRTStream\
STDMETHODIMP_(NTSTATUS) SetFormat\
( IN PKSDATAFORMAT DataFormat\
);\
STDMETHODIMP_(NTSTATUS) SetState\
( IN KSSTATE State\
);\
STDMETHODIMP_(NTSTATUS) GetPosition\
( OUT PKSAUDIO_POSITION Position\
);\
STDMETHODIMP_(NTSTATUS) AllocateAudioBuffer\
(\
IN ULONG RequestedSize,\
OUT PMDL *AudioBufferMdl,\
OUT ULONG *ActualSize,\
OUT ULONG *OffsetFromFirstPage,\
OUT MEMORY_CACHING_TYPE *CacheType\
);\
STDMETHODIMP_(VOID) FreeAudioBuffer\
(\
IN PMDL AudioBufferMdl,\
IN ULONG BufferSize\
);\
STDMETHODIMP_(VOID) GetHWLatency\
(\
OUT KSRTAUDIO_HWLATENCY *hwLatency\
);\
STDMETHODIMP_(NTSTATUS) GetPositionRegister\
(\
OUT KSRTAUDIO_HWREGISTER *Register\
);\
STDMETHODIMP_(NTSTATUS) GetClockRegister\
(\
OUT KSRTAUDIO_HWREGISTER *Register\
)
/* ===============================================================
IMiniportWaveRTStreamNotification Interface
*/
#undef INTERFACE
#define INTERFACE IMiniportWaveRTStreamNotification
DEFINE_GUID(IID_IMiniportWaveRTStreamNotification, 0x23759128, 0x96f1, 0x423b, 0xab, 0x4d, 0x81, 0x63, 0x5b, 0xcf, 0x8c, 0xa1);
DECLARE_INTERFACE_(IMiniportWaveRTStreamNotification, IMiniportWaveRTStream)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_MINIPORTWAVERTSTREAM()
STDMETHOD_(NTSTATUS,AllocateBufferWithNotification)
( THIS_
IN ULONG NotificationCount,
IN ULONG RequestedSize,
OUT PMDL *AudioBufferMdl,
OUT ULONG *ActualSize,
OUT ULONG *OffsetFromFirstPage,
OUT MEMORY_CACHING_TYPE *CacheType
) PURE;
STDMETHOD_(VOID,FreeBufferWithNotification)
( THIS_
IN PMDL AudioBufferMdl,
IN ULONG BufferSize
) PURE;
STDMETHOD_(NTSTATUS,RegisterNotificationEvent)
( THIS_
IN PKEVENT NotificationEvent
) PURE;
STDMETHOD_(NTSTATUS,UnregisterNotificationEvent)
( THIS_
IN PKEVENT NotificationEvent
) PURE;
};
/* ===============================================================
IMiniportWaveRT Interface
*/
#undef INTERFACE
#define INTERFACE IMiniportWaveRT
DEFINE_GUID(IID_IMiniportWaveRT, 0xf9fc4d6, 0x6061, 0x4f3c, 0xb1, 0xfc, 0x7, 0x5e, 0x35, 0xf7, 0x96, 0xa);
DECLARE_INTERFACE_(IMiniportWaveRT, IMiniport)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_MINIPORT()
STDMETHOD_(NTSTATUS,Init)
( THIS_
IN PUNKNOWN UnknownAdapter,
IN PRESOURCELIST ResourceList,
IN PPORTWAVERT Port
) PURE;
STDMETHOD_(NTSTATUS,NewStream)
( THIS_
OUT PMINIPORTWAVERTSTREAM * Stream,
IN PPORTWAVERTSTREAM PortStream,
IN ULONG Pin,
IN BOOLEAN Capture,
IN PKSDATAFORMAT DataFormat
) PURE;
STDMETHOD_(NTSTATUS,GetDeviceDescription)
( THIS_
OUT PDEVICE_DESCRIPTION DeviceDescription
) PURE;
};
typedef IMiniportWaveRT *PMINIPORTWAVERT;
#define IMP_IMiniportWaveRT\
IMP_IMiniport;\
STDMETHODIMP_(NTSTATUS) Init\
( IN PUNKNOWN UnknownAdapter,\
IN PRESOURCELIST ResourceList,\
IN PPORTWAVERT Port\
);\
STDMETHODIMP_(NTSTATUS) NewStream\
( OUT PMINIPORTWAVERTSTREAM * Stream,\
IN PPORTWAVERTSTREAM PortStream,\
IN ULONG Pin,\
IN BOOLEAN Capture,\
IN PKSDATAFORMAT DataFormat\
);\
STDMETHODIMP_(NTSTATUS) GetDeviceDescription\
( OUT PDEVICE_DESCRIPTION DeviceDescription\
)
#endif
/* ===============================================================
IAdapterPowerManagement Interface
*/
#undef INTERFACE
#define INTERFACE IAdapterPowerManagement
DEFINE_GUID(IID_IAdapterPowerManagement, 0x793417D0L, 0x35FE, 0x11D1, 0xAD, 0x08, 0x00, 0xA0, 0xC9, 0x0A, 0xB1, 0xB0);
DECLARE_INTERFACE_(IAdapterPowerManagement, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(void,PowerChangeState)(THIS_
IN POWER_STATE NewState) PURE;
STDMETHOD_(NTSTATUS,QueryPowerChangeState)(THIS_
IN POWER_STATE NewStateQuery) PURE;
STDMETHOD_(NTSTATUS,QueryDeviceCapabilities)(THIS_
IN PDEVICE_CAPABILITIES PowerDeviceCaps) PURE;
};
#define IMP_IAdapterPowerManagement \
STDMETHODIMP_(void) PowerChangeState \
( IN POWER_STATE NewState \
); \
STDMETHODIMP_(NTSTATUS) QueryPowerChangeState \
( IN POWER_STATE NewStateQuery \
); \
STDMETHODIMP_(NTSTATUS) QueryDeviceCapabilities \
( IN PDEVICE_CAPABILITIES PowerDeviceCaps \
)
typedef IAdapterPowerManagement *PADAPTERPOWERMANAGEMENT;
/* ===============================================================
IPowerNotify Interface
*/
#undef INTERFACE
#define INTERFACE IPowerNotify
DEFINE_GUID(IID_IPowerNotify, 0x3DD648B8L, 0x969F, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3);
DECLARE_INTERFACE_(IPowerNotify, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(void, PowerChangeNotify)(THIS_
IN POWER_STATE PowerState)PURE;
};
typedef IPowerNotify *PPOWERNOTIFY;
#undef INTERFACE
/* ===============================================================
IPinCount Interface
*/
#if (NTDDI_VERSION >= NTDDI_WINXP)
#undef INTERFACE
#define INTERFACE IPinCount
DEFINE_GUID(IID_IPinCount, 0x5dadb7dcL, 0xa2cb, 0x4540, 0xa4, 0xa8, 0x42, 0x5e, 0xe4, 0xae, 0x90, 0x51);
DECLARE_INTERFACE_(IPinCount, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(void,PinCount)(THIS_
IN ULONG PinId,
IN OUT PULONG FilterNecessary,
IN OUT PULONG FilterCurrent,
IN OUT PULONG FilterPossible,
IN OUT PULONG GlobalCurrent,
IN OUT PULONG GlobalPossible) PURE;
};
typedef IPinCount *PPINCOUNT;
#undef INTERFACE
#endif
/* ===============================================================
IPortEvents Interface
*/
#undef INTERFACE
#define INTERFACE IPortEvents
DEFINE_GUID(IID_IPortEvents, 0xA80F29C4L, 0x5498, 0x11D2, 0x95, 0xD9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3);
DECLARE_INTERFACE_(IPortEvents, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(void,AddEventToEventList)(THIS_
IN PKSEVENT_ENTRY EventEntry)PURE;
STDMETHOD_(void,GenerateEventList)(THIS_
IN GUID* Set OPTIONAL,
IN ULONG EventId,
IN BOOL PinEvent,
IN ULONG PinId,
IN BOOL NodeEvent,
IN ULONG NodeId)PURE;
};
typedef IPortEvents *PPORTEVENTS;
#define IMP_IPortEvents \
STDMETHODIMP_(void) AddEventToEventList( \
IN PKSEVENT_ENTRY EventEntry); \
\
STDMETHODIMP_(void) GenerateEventList( \
IN GUID* Set OPTIONAL, \
IN ULONG EventId, \
IN BOOL PinEvent, \
IN ULONG PinId, \
IN BOOL NodeEvent, \
IN ULONG NodeId)
/* ===============================================================
IDrmPort / IDrmPort2 Interfaces
These are almost identical, except for the addition of two extra methods.
*/
#undef INTERFACE
#define INTERFACE IDrmPort
#if (NTDDI_VERSION >= NTDDI_WINXP)
DEFINE_GUID(IID_IDrmPort, 0x286D3DF8L, 0xCA22, 0x4E2E, 0xB9, 0xBC, 0x20, 0xB4, 0xF0, 0xE2, 0x01, 0xCE);
#endif
#define DEFINE_ABSTRACT_DRMPORT() \
STDMETHOD_(NTSTATUS,CreateContentMixed)(THIS_ \
IN PULONG paContentId, \
IN ULONG cContentId, \
OUT PULONG pMixedContentId)PURE; \
\
STDMETHOD_(NTSTATUS,DestroyContent)(THIS_ \
IN ULONG ContentId)PURE; \
\
STDMETHOD_(NTSTATUS,ForwardContentToFileObject)(THIS_ \
IN ULONG ContentId, \
IN PFILE_OBJECT FileObject)PURE; \
\
STDMETHOD_(NTSTATUS,ForwardContentToInterface)(THIS_ \
IN ULONG ContentId, \
IN PUNKNOWN pUnknown, \
IN ULONG NumMethods)PURE; \
\
STDMETHOD_(NTSTATUS,GetContentRights)(THIS_ \
IN ULONG ContentId, \
OUT PDRMRIGHTS DrmRights)PURE;
DECLARE_INTERFACE_(IDrmPort, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_DRMPORT()
};
typedef IDrmPort *PDRMPORT;
#define IMP_IDrmPort \
STDMETHODIMP_(NTSTATUS) CreateContentMixed( \
IN PULONG paContentId, \
IN ULONG cContentId, \
OUT PULONG pMixedContentId); \
\
STDMETHODIMP_(NTSTATUS) DestroyContent( \
IN ULONG ContentId); \
\
STDMETHODIMP_(NTSTATUS) ForwardContentToFileObject( \
IN ULONG ContentId, \
IN PFILE_OBJECT FileObject); \
\
STDMETHODIMP_(NTSTATUS) ForwardContentToInterface( \
IN ULONG ContentId, \
IN PUNKNOWN pUnknown, \
IN ULONG NumMethods); \
\
STDMETHODIMP_(NTSTATUS) GetContentRights( \
IN ULONG ContentId, \
OUT PDRMRIGHTS DrmRights)
/* ===============================================================
IDrmPort2 Interface
*/
#undef INTERFACE
#define INTERFACE IDrmPort2
#if (NTDDI_VERSION >= NTDDI_WINXP)
DEFINE_GUID(IID_IDrmPort2, 0x1ACCE59CL, 0x7311, 0x4B6B, 0x9F, 0xBA, 0xCC, 0x3B, 0xA5, 0x9A, 0xCD, 0xCE);
#endif
DECLARE_INTERFACE_(IDrmPort2, IDrmPort)
{
DEFINE_ABSTRACT_UNKNOWN()
DEFINE_ABSTRACT_DRMPORT()
STDMETHOD_(NTSTATUS,AddContentHandlers)(THIS_
IN ULONG ContentId,
IN PVOID * paHandlers,
IN ULONG NumHandlers)PURE;
STDMETHOD_(NTSTATUS,ForwardContentToDeviceObject)(THIS_
IN ULONG ContentId,
IN PVOID Reserved,
IN PCDRMFORWARD DrmForward)PURE;
};
typedef IDrmPort2 *PDRMPORT2;
#define IMP_IDrmPort2 \
IMP_IDrmPort; \
STDMETHODIMP_(NTSTATUS) AddContentHandlers( \
IN ULONG ContentId, \
IN PVOID * paHandlers, \
IN ULONG NumHandlers); \
\
STDMETHODIMP_(NTSTATUS) ForwardContentToDeviceObject( \
IN ULONG ContentId, \
IN PVOID Reserved, \
IN PCDRMFORWARD DrmForward)
/* ===============================================================
IPortClsVersion Interface
*/
#undef INTERFACE
#define INTERFACE IPortClsVersion
#if (NTDDI_VERSION >= NTDDI_WINXP)
DEFINE_GUID(IID_IPortClsVersion, 0x7D89A7BBL, 0x869B, 0x4567, 0x8D, 0xBE, 0x1E, 0x16, 0x8C, 0xC8, 0x53, 0xDE);
#endif
DECLARE_INTERFACE_(IPortClsVersion, IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN()
STDMETHOD_(DWORD, GetVersion)(THIS) PURE;
};
#define IMP_IPortClsVersion \
STDMETHODIMP_(DWORD) GetVersion(void);
typedef IPortClsVersion *PPORTCLSVERSION;
#undef INTERFACE
/* ===============================================================
IDmaOperations Interface
*/
/* ===============================================================
IPreFetchOffset Interface
*/
/* ===============================================================
PortCls API Functions
*/
typedef NTSTATUS (NTAPI *PCPFNSTARTDEVICE)(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PRESOURCELIST ResourceList);
/* This is in NTDDK.H */
/*
typedef NTSTATUS (*PDRIVER_ADD_DEVICE)(
IN struct _DRIVER_OBJECT* DriverObject,
IN struct _DEVICE_OBJECT* PhysicalDeviceObject);
*/
PORTCLASSAPI NTSTATUS NTAPI
PcAddAdapterDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject,
IN PCPFNSTARTDEVICE StartDevice,
IN ULONG MaxObjects,
IN ULONG DeviceExtensionSize);
PORTCLASSAPI NTSTATUS NTAPI
PcInitializeAdapterDriver(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPathName,
IN PDRIVER_ADD_DEVICE AddDevice);
/* ===============================================================
Factories (TODO: Move elsewhere)
*/
PORTCLASSAPI NTSTATUS NTAPI
PcNewDmaChannel(
OUT PDMACHANNEL* OutDmaChannel,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType,
IN PDEVICE_DESCRIPTION DeviceDescription,
IN PDEVICE_OBJECT DeviceObject);
PORTCLASSAPI NTSTATUS NTAPI
PcNewInterruptSync(
OUT PINTERRUPTSYNC* OUtInterruptSync,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN PRESOURCELIST ResourceList,
IN ULONG ResourceIndex,
IN INTERRUPTSYNCMODE Mode);
PORTCLASSAPI NTSTATUS NTAPI
PcNewMiniport(
OUT PMINIPORT* OutMiniport,
IN REFCLSID ClassId);
PORTCLASSAPI NTSTATUS NTAPI
PcNewPort(
OUT PPORT* OutPort,
IN REFCLSID ClassId);
PORTCLASSAPI NTSTATUS NTAPI
PcNewRegistryKey(
OUT PREGISTRYKEY* OutRegistryKey,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN ULONG RegistryKeyType,
IN ACCESS_MASK DesiredAccess,
IN PVOID DeviceObject OPTIONAL,
IN PVOID SubDevice OPTIONAL,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN ULONG CreateOptions OPTIONAL,
OUT PULONG Disposition OPTIONAL);
PORTCLASSAPI NTSTATUS NTAPI
PcNewResourceList(
OUT PRESOURCELIST* OutResourceList,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType,
IN PCM_RESOURCE_LIST TranslatedResources,
IN PCM_RESOURCE_LIST UntranslatedResources);
PORTCLASSAPI NTSTATUS NTAPI
PcNewResourceSublist(
OUT PRESOURCELIST* OutResourceList,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType,
IN PRESOURCELIST ParentList,
IN ULONG MaximumEntries);
PORTCLASSAPI NTSTATUS NTAPI
PcNewServiceGroup(
OUT PSERVICEGROUP* OutServiceGroup,
IN PUNKNOWN OuterUnknown OPTIONAL);
/* ===============================================================
IRP Handling
*/
PORTCLASSAPI NTSTATUS NTAPI
PcDispatchIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
PORTCLASSAPI NTSTATUS NTAPI
PcCompleteIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN NTSTATUS Status);
PORTCLASSAPI NTSTATUS NTAPI
PcForwardIrpSynchronous(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
/* ===============================================================
Power Management
*/
PORTCLASSAPI NTSTATUS NTAPI
PcRegisterAdapterPowerManagement(
IN PUNKNOWN pUnknown,
IN PVOID pvContext1);
PORTCLASSAPI NTSTATUS NTAPI
PcRequestNewPowerState(
IN PDEVICE_OBJECT pDeviceObject,
IN DEVICE_POWER_STATE RequestedNewState);
/* ===============================================================
Properties
*/
PORTCLASSAPI NTSTATUS NTAPI
PcGetDeviceProperty(
IN PVOID DeviceObject,
IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
IN ULONG BufferLength,
OUT PVOID PropertyBuffer,
OUT PULONG ResultLength);
PORTCLASSAPI NTSTATUS NTAPI
PcCompletePendingPropertyRequest(
IN PPCPROPERTY_REQUEST PropertyRequest,
IN NTSTATUS NtStatus);
/* ===============================================================
I/O Timeouts
*/
PORTCLASSAPI NTSTATUS NTAPI
PcRegisterIoTimeout(
IN PDEVICE_OBJECT pDeviceObject,
IN PIO_TIMER_ROUTINE pTimerRoutine,
IN PVOID pContext);
PORTCLASSAPI NTSTATUS NTAPI
PcUnregisterIoTimeout(
IN PDEVICE_OBJECT pDeviceObject,
IN PIO_TIMER_ROUTINE pTimerRoutine,
IN PVOID pContext);
/* ===============================================================
Physical Connections
*/
PORTCLASSAPI NTSTATUS NTAPI
PcRegisterPhysicalConnection(
IN PDEVICE_OBJECT DeviceObject,
IN PUNKNOWN FromUnknown,
IN ULONG FromPin,
IN PUNKNOWN ToUnknown,
IN ULONG ToPin);
PORTCLASSAPI NTSTATUS NTAPI
PcRegisterPhysicalConnectionFromExternal(
IN PDEVICE_OBJECT DeviceObject,
IN PUNICODE_STRING FromString,
IN ULONG FromPin,
IN PUNKNOWN ToUnknown,
IN ULONG ToPin);
PORTCLASSAPI NTSTATUS NTAPI
PcRegisterPhysicalConnectionToExternal(
IN PDEVICE_OBJECT DeviceObject,
IN PUNKNOWN FromUnknown,
IN ULONG FromPin,
IN PUNICODE_STRING ToString,
IN ULONG ToPin);
/* ===============================================================
Misc
*/
PORTCLASSAPI ULONGLONG NTAPI
PcGetTimeInterval(
IN ULONGLONG Since);
PORTCLASSAPI NTSTATUS NTAPI
PcRegisterSubdevice(
IN PDEVICE_OBJECT DeviceObject,
IN PWCHAR Name,
IN PUNKNOWN Unknown);
/* ===============================================================
Digital Rights Management Functions
Implemented in XP and above
*/
PORTCLASSAPI NTSTATUS NTAPI
PcAddContentHandlers(
IN ULONG ContentId,
IN PVOID *paHandlers,
IN ULONG NumHandlers);
PORTCLASSAPI NTSTATUS NTAPI
PcCreateContentMixed(
IN PULONG paContentId,
IN ULONG cContentId,
OUT PULONG pMixedContentId);
PORTCLASSAPI NTSTATUS NTAPI
PcDestroyContent(
IN ULONG ContentId);
PORTCLASSAPI NTSTATUS NTAPI
PcForwardContentToDeviceObject(
IN ULONG ContentId,
IN PVOID Reserved,
IN PCDRMFORWARD DrmForward);
PORTCLASSAPI NTSTATUS NTAPI
PcForwardContentToFileObject(
IN ULONG ContentId,
IN PFILE_OBJECT FileObject);
PORTCLASSAPI NTSTATUS NTAPI
PcForwardContentToInterface(
IN ULONG ContentId,
IN PUNKNOWN pUnknown,
IN ULONG NumMethods);
PORTCLASSAPI NTSTATUS NTAPI
PcGetContentRights(
IN ULONG ContentId,
OUT PDRMRIGHTS DrmRights);
#endif /* PORTCLS_H */