Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2847 lines
97 KiB

/*****************************************************************************
* portcls.h - WDM Streaming port class driver
*****************************************************************************
* Copyright (c) Microsoft Corporation. All rights reserved.
*/
#ifndef _PORTCLS_H_
#define _PORTCLS_H_
#ifdef __cplusplus
// WDM.H does not play well with C++.
extern "C"
{
#include <wdm.h>
}
#else
#include <wdm.h>
#endif
#ifndef IRP_MN_FILTER_RESOURCE_REQUIREMENTS
#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
#endif
#include <windef.h>
#define NOBITMAP
#include <mmreg.h>
#undef NOBITMAP
#include <ks.h>
#include <ksmedia.h>
#include <punknown.h>
#include <drmk.h>
#define PORTCLASSAPI EXTERN_C
#define _100NS_UNITS_PER_SECOND 10000000L
#define PORT_CLASS_DEVICE_EXTENSION_SIZE (64*sizeof(ULONG_PTR))
//
// N.B.: If you are having problems building your driver,
// #define PC_OLD_NAMES in your sources file.
// This flag is no longer turned on by default.
//
//#ifndef PC_NEW_NAMES
//#define PC_OLD_NAMES
//#endif
#define IID_IAdapterPowerManagment IID_IAdapterPowerManagement
#define PADAPTERPOWERMANAGMENT PADAPTERPOWERMANAGEMENT
/*****************************************************************************
* Interface identifiers.
*/
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_GUID(IID_IResourceList,
0x22C6AC60L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
DEFINE_GUID(IID_IMusicTechnology,
0x80396C3CL, 0xCBCB, 0x409B, 0x9F, 0x65, 0x4F, 0x1E, 0x74, 0x67, 0xCD, 0xAF);
DEFINE_GUID(IID_IDmaChannel,
0x22C6AC61L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
DEFINE_GUID(IID_IDmaChannelSlave,
0x22C6AC62L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
DEFINE_GUID(IID_IInterruptSync,
0x22C6AC63L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
DEFINE_GUID(IID_IServiceSink,
0x22C6AC64L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
DEFINE_GUID(IID_IServiceGroup,
0x22C6AC65L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
DEFINE_GUID(IID_IRegistryKey,
0xE8DA4302l, 0xF304, 0x11D0, 0x95, 0x8B, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3);
DEFINE_GUID(IID_IPortMidi,
0xb4c90a40L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(IID_IMiniportMidi,
0xb4c90a41L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(IID_IMiniportMidiStream,
0xb4c90a42L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(IID_IPortTopology,
0xb4c90a30L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(IID_IMiniportTopology,
0xb4c90a31L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(IID_IPortWaveCyclic,
0xb4c90a26L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(IID_IMiniportWaveCyclic,
0xb4c90a27L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(IID_IMiniportWaveCyclicStream,
0xb4c90a28L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(IID_IPortWavePci,
0xb4c90a50L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(IID_IPortWavePciStream,
0xb4c90a51L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(IID_IMiniportWavePci,
0xb4c90a52L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(IID_IMiniportWavePciStream,
0xb4c90a53L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
DEFINE_GUID(IID_IAdapterPowerManagement,
0x793417D0L, 0x35FE, 0x11D1, 0xAD, 0x08, 0x00, 0xA0, 0xC9, 0x0A, 0xB1, 0xB0);
DEFINE_GUID(IID_IPowerNotify,
0x3DD648B8L, 0x969F, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3);
DEFINE_GUID(IID_IWaveCyclicClock,
0xdec1ec78L, 0x419a, 0x11d1, 0xad, 0x09, 0x00, 0xc0, 0x4f, 0xb9, 0x1b, 0xc4);
DEFINE_GUID(IID_IWavePciClock,
0xd5d7a256L, 0x5d10, 0x11d1, 0xad, 0xae, 0x00, 0xc0, 0x4f, 0xb9, 0x1b, 0xc4);
DEFINE_GUID(IID_IPortEvents,
0xA80F29C4L, 0x5498, 0x11D2, 0x95, 0xD9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3);
DEFINE_GUID(IID_IDrmPort,
0x286D3DF8L, 0xCA22, 0x4E2E, 0xB9, 0xBC, 0x20, 0xB4, 0xF0, 0xE2, 0x01, 0xCE);
DEFINE_GUID(IID_IDrmPort2,
0x1ACCE59CL, 0x7311, 0x4B6B, 0x9F, 0xBA, 0xCC, 0x3B, 0xA5, 0x9A, 0xCD, 0xCE);
DEFINE_GUID(IID_IPortClsVersion,
0x7D89A7BBL, 0x869B, 0x4567, 0x8D, 0xBE, 0x1E, 0x16, 0x8C, 0xC8, 0x53, 0xDE);
DEFINE_GUID(IID_IDmaOperations,
0xe5372d4cL, 0x0ecb, 0x4df8, 0xa5, 0x00, 0xa6, 0x5c, 0x86, 0x78, 0xbb, 0xe4);
DEFINE_GUID(IID_IPinCount,
0x5dadb7dcL, 0xa2cb, 0x4540, 0xa4, 0xa8, 0x42, 0x5e, 0xe4, 0xae, 0x90, 0x51);
DEFINE_GUID(IID_IPreFetchOffset,
0x7000f480L, 0xed44, 0x4e8b, 0xb3, 0x8a, 0x41, 0x2f, 0x8d, 0x7a, 0x50, 0x4d);
/*****************************************************************************
* Class identifiers.
*/
DEFINE_GUID(CLSID_PortMidi,
0xb4c90a43L, 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);
DEFINE_GUID(CLSID_PortWaveCyclic,
0xb4c90a2aL, 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);
DEFINE_GUID(CLSID_MiniportDriverFmSynth,
0xb4c90ae0L, 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);
DEFINE_GUID(CLSID_MiniportDriverFmSynthWithVol,
0xe5a3c139L, 0xf0f2, 0x11d1, 0x81, 0xaf, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1);
/*****************************************************************************
* Interfaces
*/
#if !defined(DEFINE_ABSTRACT_UNKNOWN)
#define DEFINE_ABSTRACT_UNKNOWN() \
STDMETHOD_(NTSTATUS, QueryInterface)(THIS_ \
REFIID InterfaceId, \
PVOID* Interface \
) PURE; \
STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
STDMETHOD_(ULONG,Release)(THIS) PURE;
#endif //!defined(DEFINE_ABSTRACT_UNKNOWN)
#if !defined(DEFINE_ABSTRACT_PORT)
#ifdef PC_OLD_NAMES
#define DEFINE_ABSTRACT_PORT() \
STDMETHOD_(NTSTATUS,Init) \
( THIS_ \
IN PVOID DeviceObject, \
IN PVOID 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 CreateOptions OPTIONAL, \
OUT PULONG Disposition OPTIONAL \
) PURE;
#else // !PC_OLD_NAMES
#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 CreateOptions OPTIONAL, \
OUT PULONG Disposition OPTIONAL \
) PURE;
#endif // !PC_OLD_NAMES
#endif //!defined(DEFINE_ABSTRACT_PORT)
#if !defined(DEFINE_ABSTRACT_MINIPORT)
#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;
#endif //!defined(DEFINE_ABSTRACT_MINIPORT)
#if !defined(DEFINE_ABSTRACT_DMACHANNEL)
#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;
#endif //!defined(DEFINE_ABSTRACT_DMACHANNEL)
#if !defined(DEFINE_ABSTRACT_DMACHANNELSLAVE)
#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;
#endif //!defined(DEFINE_ABSTRACT_DMACHANNELSLAVE)
#if !defined(DEFINE_ABSTRACT_DRMPORT)
#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;
#endif //!defined(DEFINE_ABSTRACT_DRMPORT)
/*****************************************************************************
* IResourceList
*****************************************************************************
* List of resources.
*/
DECLARE_INTERFACE_(IResourceList,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
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 struct 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;
};
typedef IResourceList *PRESOURCELIST;
#ifdef PC_IMPLEMENTATION
#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 struct IResourceList * Parent,\
IN CM_RESOURCE_TYPE Type,\
IN ULONG Index\
);\
STDMETHODIMP_(PCM_RESOURCE_LIST) TranslatedList\
( void\
);\
STDMETHODIMP_(PCM_RESOURCE_LIST) UntranslatedList\
( void\
)
#endif
#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),CmResourceTypeDma,(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))
/*****************************************************************************
* IDmaChannel
*****************************************************************************
* Interface for DMA channel.
*/
DECLARE_INTERFACE_(IDmaChannel,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_DMACHANNEL() // For IDmaChannel
};
typedef IDmaChannel *PDMACHANNEL;
#ifdef PC_IMPLEMENTATION
#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\
)
#endif
/*****************************************************************************
* IDmaChannelSlave
*****************************************************************************
* Interface for slave DMA channel.
*/
DECLARE_INTERFACE_(IDmaChannelSlave,IDmaChannel)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_DMACHANNEL() // For IDmaChannel
DEFINE_ABSTRACT_DMACHANNELSLAVE() // For IDmaChannelSlave
};
typedef IDmaChannelSlave *PDMACHANNELSLAVE;
#ifdef PC_IMPLEMENTATION
#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\
)
#endif
/*****************************************************************************
* INTERRUPTSYNCMODE
*****************************************************************************
* Interrupt sync mode of operation.
*/
typedef enum
{
InterruptSyncModeNormal = 1, // One pass, stop when successful.
InterruptSyncModeAll, // One pass regardless of success.
InterruptSyncModeRepeat // Repeat until all return unsuccessful.
} INTERRUPTSYNCMODE;
/*****************************************************************************
* PINTERRUPTSYNCROUTINE
*****************************************************************************
* Pointer to an interrupt synchronization routine. Both interrupt service
* routines and routines that are synchronized with ISRs use this type.
*/
typedef NTSTATUS
(*PINTERRUPTSYNCROUTINE)
(
IN struct IInterruptSync * InterruptSync,
IN PVOID DynamicContext
);
/*****************************************************************************
* IInterruptSync
*****************************************************************************
* Interface for objects providing access synchronization with interrupts.
*/
DECLARE_INTERFACE_(IInterruptSync,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
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;
};
typedef IInterruptSync *PINTERRUPTSYNC;
#ifdef PC_IMPLEMENTATION
#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\
)
#endif
/*****************************************************************************
* IServiceSink
*****************************************************************************
* Interface for notification sinks for service groups.
*/
DECLARE_INTERFACE_(IServiceSink,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
// For IServiceSink
STDMETHOD_(void,RequestService)
( THIS
) PURE;
};
typedef IServiceSink *PSERVICESINK;
#ifdef PC_IMPLEMENTATION
#define IMP_IServiceSink\
STDMETHODIMP_(void) RequestService\
( void\
)
#endif
/*****************************************************************************
* IServiceGroup
*****************************************************************************
* Interface for objects representing a group that is serviced collectively.
*/
DECLARE_INTERFACE_(IServiceGroup,IServiceSink)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
// For IServiceSink
STDMETHOD_(void,RequestService)
( THIS
) PURE;
// For IServiceGroup
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;
};
typedef IServiceGroup *PSERVICEGROUP;
#ifdef PC_IMPLEMENTATION
#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\
)
#endif
/*****************************************************************************
* IRegistryKey
*****************************************************************************
* Interface for objects providing access to a registry key.
*/
DECLARE_INTERFACE_(IRegistryKey,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
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;
};
typedef IRegistryKey *PREGISTRYKEY;
#ifdef PC_IMPLEMENTATION
#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\
)
#endif
/*****************************************************************************
* IMusicTechnology
*****************************************************************************
* Interface for setting MusicTechnology.
*/
DECLARE_INTERFACE_(IMusicTechnology,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
// For IMusicTechnology
STDMETHOD_(NTSTATUS,SetTechnology)
( THIS_
IN const GUID * Technology
) PURE;
};
typedef IMusicTechnology *PMUSICTECHNOLOGY;
#define IMP_IMusicTechnology\
STDMETHODIMP_(NTSTATUS) SetTechnology\
( IN const GUID * Technology\
)
typedef struct _PCPROPERTY_REQUEST PCPROPERTY_REQUEST, *PPCPROPERTY_REQUEST;
typedef struct _PCMETHOD_REQUEST PCMETHOD_REQUEST, *PPCMETHOD_REQUEST;
typedef struct _PCEVENT_REQUEST PCEVENT_REQUEST, *PPCEVENT_REQUEST;
/*****************************************************************************
* PCPFNPROPERTY_HANDLER
*****************************************************************************
* Property handler function prototype.
*
* All property accesses and support queries for a given property on a given
* filter, pin or node are routed to a single handler. The parameter contains
* complete information regarding the request. The handler may return
* STATUS_PENDING, in which case it must eventually call
* PcCompletePendingPropertyRequest() to complete the request.
*/
typedef
NTSTATUS
(*PCPFNPROPERTY_HANDLER)
(
IN PPCPROPERTY_REQUEST PropertyRequest
);
/*****************************************************************************
* PCPFNMETHOD_HANDLER
*****************************************************************************
* Method handler function prototype.
*
* All method calls and support queries for a given method on a given filter,
* pin or node are routed to a single handler. The parameter contains
* complete information regarding the request. The handler may return
* STATUS_PENDING, in which case it must eventually call
* PcCompletePendingMethodRequest() to complete the request.
*/
typedef
NTSTATUS
(*PCPFNMETHOD_HANDLER)
(
IN PPCMETHOD_REQUEST MethodRequest
);
/*****************************************************************************
* PCPFNEVENT_HANDLER
*****************************************************************************
* Event handler function prototype.
*
* All event add and remove requests and all event support queries for a
* given event on a given filter, pin or node are routed to a single handler.
* The parameter contains complete information regarding the request. The
* handler may return STATUS_PENDING, in which case it must eventually call
* PcCompletePendingEventRequest() to complete the request.
*/
typedef
NTSTATUS
(*PCPFNEVENT_HANDLER)
(
IN PPCEVENT_REQUEST EventRequest
);
/*****************************************************************************
* PCPROPERTY_ITEM
*****************************************************************************
* Property table entry.
*
* A property item describes a property supported by a given filter, pin or
* node. The flags indicate what operations regarding the property are
* supported and specify selected options with respect to the port's handling
* of property requests.
*/
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;
/*****************************************************************************
* PCMETHOD_ITEM
*****************************************************************************
* Method table entry.
*
* A method item describes a method supported by a given filter, pin or node.
* The flags indicate what operations regarding the method are supported and
* specify selected options with respect to the port's handling of method
* requests.
*/
typedef struct
{
const GUID * Set;
ULONG Id;
ULONG Flags;
#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
#define PCMETHOD_ITEM_FLAG_BASICSUPPORT KSMETHOD_TYPE_BASICSUPPORT
PCPFNMETHOD_HANDLER Handler;
}
PCMETHOD_ITEM, *PPCMETHOD_ITEM;
/*****************************************************************************
* PCEVENT_ITEM
*****************************************************************************
* Event table entry.
*
* An event item describes an event supported by a given filter, pin or node.
* The flags indicate what operations regarding the event are supported and
* specify selected options with respect to the port's handling of event
* requests.
*/
typedef struct
{
const GUID * Set;
ULONG Id;
ULONG Flags;
#define PCEVENT_ITEM_FLAG_ENABLE KSEVENT_TYPE_ENABLE
#define PCEVENT_ITEM_FLAG_ONESHOT KSEVENT_TYPE_ONESHOT
#define PCEVENT_ITEM_FLAG_BASICSUPPORT KSEVENT_TYPE_BASICSUPPORT
PCPFNEVENT_HANDLER Handler;
}
PCEVENT_ITEM, *PPCEVENT_ITEM;
/*****************************************************************************
* PCPROPERTY_REQUEST
*****************************************************************************
* Property request submitted to a property handler.
*
* This is the form that a property request takes. Although the major target
* is generic, in the case of miniports, it will be a pointer to the miniport
* object. Likewise, the minor target is the stream or voice if the request
* is specific to a stream or voice. Otherwise, the minor target is NULL.
* If the request is targeted at a node, the Node parameter will specify which
* one, otherwise it will be ULONG(-1). If the target is a node, the minor
* target may be specified to indicate the stream or voice with which the
* targeted node instance is associated.
*/
typedef 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;
}
PCPROPERTY_REQUEST, *PPCPROPERTY_REQUEST;
/*****************************************************************************
* PCMETHOD_REQUEST
*****************************************************************************
* Method request submitted to a property handler.
*
* Comments in the description of PCPROPERTY_REQUEST regarding the target
* fields apply to this structure as well.
*/
typedef struct _PCMETHOD_REQUEST
{
PUNKNOWN MajorTarget;
PUNKNOWN MinorTarget;
ULONG Node;
const PCMETHOD_ITEM * MethodItem;
ULONG Verb;
// TODO
}
PCMETHOD_REQUEST, *PPCMETHOD_REQUEST;
/*****************************************************************************
* PCEVENT_REQUEST
*****************************************************************************
* Event request submitted to a property handler.
*
* Comments in the description of PCPROPERTY_REQUEST regarding the target
* fields apply to this structure as well.
*/
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;
#define PCEVENT_VERB_NONE 0
#define PCEVENT_VERB_ADD 1
#define PCEVENT_VERB_REMOVE 2
#define PCEVENT_VERB_SUPPORT 4
/*****************************************************************************
* PCAUTOMATION_TABLE
*****************************************************************************
* Master table of properties, methods and events.
*
* Any of the item pointers may be NULL, in which case, corresponding counts
* must be zero. For item tables that are not zero length, the item size must
* not be smaller than the size of the item structure defined by port class.
* The item size may be larger, in which case the port class item structure is
* assumed to be followed by private data. Item sizes must be a multiple of
* 8.
*/
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;
#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\
}
#define DEFINE_PCAUTOMATION_TABLE_PROP_EVENT(AutomationTable,PropertyTable,EventTable)\
const PCAUTOMATION_TABLE AutomationTable =\
{\
sizeof(PropertyTable[0]),\
SIZEOF_ARRAY(PropertyTable),\
(const PCPROPERTY_ITEM *) PropertyTable,\
0,0,NULL,\
sizeof(EventTable[0]),\
SIZEOF_ARRAY(EventTable),\
(const PCEVENT_ITEM *) EventTable,\
0\
}
/*****************************************************************************
* PCPIN_DESCRIPTOR for IMiniport::GetDescription()
*****************************************************************************
* Description of a pin on the filter implemented by the miniport.
*
* MaxGlobalInstanceCount and MaxFilterInstanceCount may be zero to indicate
* that the pin may not be instantiated, ULONG(-1) to indicate the pin may be
* allocated any number of times, or any other value to indicate a specific
* number of times the pin may be allocated. MinFilterInstanceCount may not
* be ULONG(-1) because it specifies a definite lower bound on the number of
* instances of a pin that must exist in order for a filter to function.
*
* The KS pin descriptor may have zero interfaces and zero mediums. The list
* of interfaces is ignored in all cases. The medium list will default to
* a list containing only the standard medium (device I/O).
*
* The automation table pointer may be NULL indicating that no automation is
* supported.
*/
typedef struct
{
ULONG MaxGlobalInstanceCount;
ULONG MaxFilterInstanceCount;
ULONG MinFilterInstanceCount;
const PCAUTOMATION_TABLE * AutomationTable;
KSPIN_DESCRIPTOR KsPinDescriptor;
}
PCPIN_DESCRIPTOR, *PPCPIN_DESCRIPTOR;
/*****************************************************************************
* PCNODE_DESCRIPTOR for IMiniport::GetDescription()
*****************************************************************************
* Description of a node in the filter implemented by the miniport.
*
* The automation table pointer may be NULL indicating that no automation is
* supported. The name GUID pointer may be NULL indicating that the type GUID
* should be used to determine the node name.
*/
typedef struct
{
ULONG Flags;
const PCAUTOMATION_TABLE * AutomationTable;
const GUID * Type;
const GUID * Name;
}
PCNODE_DESCRIPTOR, *PPCNODE_DESCRIPTOR;
/*****************************************************************************
* PCCONNECTION_DESCRIPTOR for IMiniport::GetDescription()
*****************************************************************************
* Description of a node connection in the topology of the filter implemented
* by the miniport.
*/
typedef KSTOPOLOGY_CONNECTION
PCCONNECTION_DESCRIPTOR, *PPCCONNECTION_DESCRIPTOR;
/*****************************************************************************
* PCFILTER_DESCRIPTOR for IMiniport::GetDescription()
*****************************************************************************
* Description of the of the filter implemented by a miniport, including
* pins, nodes, connections and properties.
*
* The version number should be zero.
*/
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;
/*****************************************************************************
* PCFILTER_NODE for IMiniport::GetTopology()
*****************************************************************************
* The placeholder for the FromNode or ToNode fields in connections which
* describe connections to the filter's pins.
*/
#define PCFILTER_NODE KSFILTER_NODE
/*****************************************************************************
* IMiniport
*****************************************************************************
* Interface common to all miniports.
*/
DECLARE_INTERFACE_(IMiniport,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_MINIPORT() // For IMiniport
};
typedef IMiniport *PMINIPORT;
#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\
)
/*****************************************************************************
* IPort
*****************************************************************************
* Interface common to all port lower edges.
*/
DECLARE_INTERFACE_(IPort,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_PORT() // For IPort
};
typedef IPort *PPORT;
#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
/*****************************************************************************
* IPortMidi
*****************************************************************************
* Interface for MIDI port lower edge.
*/
DECLARE_INTERFACE_(IPortMidi,IPort)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_PORT() // For IPort
// For IPortMidi
STDMETHOD_(void,Notify)
( THIS_
IN PSERVICEGROUP ServiceGroup OPTIONAL
) PURE;
STDMETHOD_(void,RegisterServiceGroup)
( THIS_
IN PSERVICEGROUP ServiceGroup
) PURE;
};
typedef IPortMidi *PPORTMIDI;
#ifdef PC_IMPLEMENTATION
#define IMP_IPortMidi\
IMP_IPort;\
STDMETHODIMP_(void) Notify\
( IN PSERVICEGROUP ServiceGroup OPTIONAL\
);\
STDMETHODIMP_(void) RegisterServiceGroup\
( IN PSERVICEGROUP ServiceGroup\
)
#endif
/*****************************************************************************
* IMiniportMidiStream
*****************************************************************************
* Interface for MIDI miniport streams.
*/
DECLARE_INTERFACE_(IMiniportMidiStream,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
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;
#define IMP_IMiniportMidiStream\
STDMETHODIMP_(NTSTATUS) SetFormat\
( IN PKSDATAFORMAT DataFormat\
);\
STDMETHODIMP_(NTSTATUS) SetState\
( IN KSSTATE State\
);\
STDMETHODIMP_(NTSTATUS) Read\
( IN PVOID BufferAddress,\
IN ULONG BufferLength,\
OUT PULONG BytesRead\
);\
STDMETHODIMP_(NTSTATUS) Write\
( IN PVOID BufferAddress,\
IN ULONG BytesToWrite,\
OUT PULONG BytesWritten\
)
/*****************************************************************************
* IMiniportMidi
*****************************************************************************
* Interface for MIDI miniports.
*/
DECLARE_INTERFACE_(IMiniportMidi,IMiniport)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_MINIPORT() // For IMiniport
// For IMiniportMidi
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;
#define IMP_IMiniportMidi\
IMP_IMiniport;\
STDMETHODIMP_(NTSTATUS) Init\
( IN PUNKNOWN UnknownAdapter,\
IN PRESOURCELIST ResourceList,\
IN PPORTMIDI Port,\
OUT PSERVICEGROUP * ServiceGroup\
);\
STDMETHODIMP_(void) Service\
( void\
);\
STDMETHODIMP_(NTSTATUS) NewStream\
( OUT PMINIPORTMIDISTREAM * Stream,\
IN PUNKNOWN OuterUnknown OPTIONAL,\
IN POOL_TYPE PoolType,\
IN ULONG Pin,\
IN BOOLEAN Capture,\
IN PKSDATAFORMAT DataFormat,\
OUT PSERVICEGROUP * ServiceGroup\
)
/*****************************************************************************
* IPortDMus
*****************************************************************************
* See DMusicKS.h
*/
/*****************************************************************************
* IMXF
*****************************************************************************
* See DMusicKS.h
*/
/*****************************************************************************
* IAllocatorMXF
*****************************************************************************
* See DMusicKS.h
*/
/*****************************************************************************
* IMiniportDMus
*****************************************************************************
* See DMusicKS.h
*/
/*****************************************************************************
* IPortTopology
*****************************************************************************
* Interface for topology port lower edge.
*/
DECLARE_INTERFACE_(IPortTopology,IPort)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_PORT() // For IPort
};
typedef IPortTopology *PPORTTOPOLOGY;
#ifdef PC_IMPLEMENTATION
#define IMP_IPortTopology IMP_IPort
#endif
/*****************************************************************************
* IMiniportTopology
*****************************************************************************
* Interface for topology miniports.
*/
DECLARE_INTERFACE_(IMiniportTopology,IMiniport)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_MINIPORT() // For IMiniport
// For IMiniportTopology
STDMETHOD_(NTSTATUS,Init)
( THIS_
IN PUNKNOWN UnknownAdapter,
IN PRESOURCELIST ResourceList,
IN PPORTTOPOLOGY Port
) PURE;
};
typedef IMiniportTopology *PMINIPORTTOPOLOGY;
#define IMP_IMiniportTopology\
IMP_IMiniport;\
STDMETHODIMP_(NTSTATUS) Init\
( IN PUNKNOWN UnknownAdapter,\
IN PRESOURCELIST ResourceList,\
IN PPORTTOPOLOGY Port\
)
/*****************************************************************************
* IPortWaveCyclic
*****************************************************************************
* Interface for cyclic wave port lower edge.
*/
DECLARE_INTERFACE_(IPortWaveCyclic,IPort)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_PORT() // For IPort
// For IPortWaveCyclic
STDMETHOD_(void,Notify)
( THIS_
IN PSERVICEGROUP ServiceGroup
) PURE;
STDMETHOD_(NTSTATUS,NewSlaveDmaChannel)
( THIS_
OUT PDMACHANNELSLAVE * DmaChannel,
IN PUNKNOWN OuterUnknown,
IN PRESOURCELIST ResourceList,
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,\
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
/*****************************************************************************
* IMiniportWaveCyclicStream
*****************************************************************************
* Interface for cyclic wave miniport streams.
*/
DECLARE_INTERFACE_(IMiniportWaveCyclicStream,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
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 for cyclic wave miniports.
*/
DECLARE_INTERFACE_(IMiniportWaveCyclic,IMiniport)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_MINIPORT() // For IMiniport
// For IMiniportWaveCyclic
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;
#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\
)
/*****************************************************************************
* IPortWavePci
*****************************************************************************
* Interface for PCI wave port lower edge.
*/
DECLARE_INTERFACE_(IPortWavePci,IPort)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_PORT() // For IPort
// For IPortWavePci
STDMETHOD_(void,Notify)
( THIS_
IN PSERVICEGROUP ServiceGroup
) PURE;
STDMETHOD_(NTSTATUS,NewMasterDmaChannel)
( THIS_
OUT PDMACHANNEL * OutDmaChannel,
IN PUNKNOWN OuterUnknown OPTIONAL,
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;
#ifdef PC_IMPLEMENTATION
#define IMP_IPortWavePci\
IMP_IPort;\
STDMETHODIMP_(void) Notify\
( IN PSERVICEGROUP ServiceGroup\
);\
STDMETHODIMP_(NTSTATUS) NewMasterDmaChannel\
( OUT PDMACHANNEL * OutDmaChannel,\
IN PUNKNOWN OuterUnknown OPTIONAL,\
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
/*****************************************************************************
* IPortWavePciStream
*****************************************************************************
* Interface for PCI wave port pin lower edge.
*/
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;
#ifdef PC_IMPLEMENTATION
#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\
( void\
)
#endif
/*****************************************************************************
* IMiniportWavePciStream
*****************************************************************************
* Interface for PCI wave miniport streams.
*/
DECLARE_INTERFACE_(IMiniportWavePciStream,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
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;
#define IMP_IMiniportWavePciStream\
STDMETHODIMP_(NTSTATUS) SetFormat\
( IN PKSDATAFORMAT DataFormat\
);\
STDMETHODIMP_(NTSTATUS) SetState\
( IN KSSTATE State\
);\
STDMETHODIMP_(NTSTATUS) GetPosition\
( OUT PULONGLONG Position\
);\
STDMETHODIMP_(NTSTATUS) NormalizePhysicalPosition\
( IN OUT PLONGLONG PhysicalPosition\
);\
STDMETHODIMP_(NTSTATUS) GetAllocatorFraming\
( OUT PKSALLOCATOR_FRAMING AllocatorFraming\
);\
STDMETHODIMP_(NTSTATUS) RevokeMappings\
( IN PVOID FirstTag,\
IN PVOID LastTag,\
OUT PULONG MappingsRevoked\
);\
STDMETHODIMP_(void) MappingAvailable\
( void\
);\
STDMETHODIMP_(void) Service\
( void\
)
/*****************************************************************************
* IMiniportWavePci
*****************************************************************************
* Interface for PCI wave miniports.
*/
DECLARE_INTERFACE_(IMiniportWavePci,IMiniport)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_MINIPORT() // For IMiniport
// For IMiniportWavePci
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;
#define IMP_IMiniportWavePci\
IMP_IMiniport;\
STDMETHODIMP_(NTSTATUS) Init\
( IN PUNKNOWN UnknownAdapter,\
IN PRESOURCELIST ResourceList,\
IN PPORTWAVEPCI Port,\
OUT PSERVICEGROUP * ServiceGroup\
);\
STDMETHODIMP_(NTSTATUS) NewStream\
( 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\
);\
STDMETHODIMP_(void) Service\
( void\
)
/*****************************************************************************
* IAdapterPowerManagement
*****************************************************************************
* An interface that adapters should implement and
* register if they want power management messages.
* Register this interface with PortCls via the
* PcRegisterAdapterPowerManagement() call.
*
* NOTE: If you want to fill in the caps struct
* for your device, register the interface
* with PortCls in or before your AddDevice()
* function. The OS queries devices before
* StartDevice() gets called.
*/
DECLARE_INTERFACE_(IAdapterPowerManagement,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
// Called by PortCls to tell the device
// to change to the new power state.
//
STDMETHOD_(void,PowerChangeState)
( THIS_
IN POWER_STATE NewState
) PURE;
// Called by PortCls to ask whether the device
// can change to the requested power state.
//
STDMETHOD_(NTSTATUS,QueryPowerChangeState)
( THIS_
IN POWER_STATE NewStateQuery
) PURE;
// Called by PortCls to get the power management
// capabilities of the device. See ACPI documentation
// for data about the DEVICE_CAPABILITIES struct.
//
STDMETHOD_(NTSTATUS,QueryDeviceCapabilities)
( THIS_
IN PDEVICE_CAPABILITIES PowerDeviceCaps
) PURE;
};
typedef IAdapterPowerManagement *PADAPTERPOWERMANAGEMENT;
#define IMP_IAdapterPowerManagement\
STDMETHODIMP_(void) PowerChangeState\
( IN POWER_STATE NewState\
);\
STDMETHODIMP_(NTSTATUS) QueryPowerChangeState\
( IN POWER_STATE NewStateQuery\
);\
STDMETHODIMP_(NTSTATUS) QueryDeviceCapabilities\
( IN PDEVICE_CAPABILITIES PowerDeviceCaps\
)
/*****************************************************************************
* IPowerNotify
*****************************************************************************
* An OPTIONAL interface for miniports and pins to implement to
* enable them to get device power state change notifications.
*/
DECLARE_INTERFACE_(IPowerNotify,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
// Called by the port to notify registered miniports
// and pins of device power state changes, so that
// appropriate context save/restore can take place.
//
STDMETHOD_(void,PowerChangeNotify)
( THIS_
IN POWER_STATE PowerState
) PURE;
};
typedef IPowerNotify *PPOWERNOTIFY;
#define IMP_IPowerNotify\
STDMETHODIMP_(void) PowerChangeNotify\
( IN POWER_STATE PowerState\
)
/*****************************************************************************
* IPinCount
*****************************************************************************
* An OPTIONAL interface for miniports to implement to
* enable them to get pin count queries, for dynamic pin counts.
*/
DECLARE_INTERFACE_(IPinCount,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
// Called by the port to notify registered miniports
// of pin count queries, so that appropriate pin
// count manipulation can take place.
//
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;
#define IMP_IPinCount \
STDMETHODIMP_(void) PinCount \
( IN ULONG PinId, \
IN OUT PULONG FilterNecessary, \
IN OUT PULONG FilterCurrent, \
IN OUT PULONG FilterPossible, \
IN OUT PULONG GlobalCurrent, \
IN OUT PULONG GlobalPossible \
)
/*****************************************************************************
* IPortEvents
*****************************************************************************
* An interface implemented by ports to provide
* notification event helpers to miniports.
*/
DECLARE_INTERFACE_(IPortEvents,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
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
*****************************************************************************
* An optional interface implemented by ports
* to provide DRM functionality to miniports.
*/
DECLARE_INTERFACE_(IDrmPort,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_DRMPORT() // For IDrmPort
};
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
*****************************************************************************
* An optional interface implemented by ports
* to provide DRM functionality to miniports.
* This is identical to IDrmPort with the
* addition of two new routines.
*/
DECLARE_INTERFACE_(IDrmPort2,IDrmPort)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
DEFINE_ABSTRACT_DRMPORT() // For IDrmPort
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
*****************************************************************************
* What version of PortCls is this?
*/
DECLARE_INTERFACE_(IPortClsVersion,IUnknown)
{
STDMETHOD_(DWORD,GetVersion)
( THIS
) PURE;
};
typedef IPortClsVersion *PPORTCLSVERSION;
// DO NOT ASSUME THAT EACH SUCCESSIVE ENUM IMPLIES A FEATURE SUPERSET!
// Example: Win2K has more audio features than Win98SE_QFE2.
//
enum
{
kVersionInvalid = -1,
kVersionWin98, // IPortClsVersion is unsupported
kVersionWin98SE, // IPortClsVersion is unsupported
kVersionWin2K, // IPortClsVersion is unsupported
kVersionWin98SE_QFE2, // IPortClsVersion is unsupported
// QFE Package 269601 (contains 242937 and 247565)
kVersionWin2K_SP2, // IPortClsVersion is supported
kVersionWinME, // IPortClsVersion is unsupported
kVersionWin98SE_QFE3, // IPortClsVersion is supported
// QFE Package (not yet released, as of 6/15/2001)
kVersionWinME_QFE1, // IPortClsVersion is supported
// QFE Package (not yet released, as of 6/15/2001)
kVersionWinXP, // IPortClsVersion is supported
kVersionWinXPSP1 // IPortClsVersion is supported
// Additional enum values will be added here, in
// *roughly* chronological (not feature set) order.
};
/*****************************************************************************
* IDmaOperations
*****************************************************************************
* An interface implemented by the DMA object to provide operations on the
* "DMA adapter" like HalAllocateCommonBuffer.
*/
DECLARE_INTERFACE_(IDmaOperations,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
STDMETHOD_(PVOID,AllocateCommonBuffer)
( THIS_
IN ULONG Length,
OUT PPHYSICAL_ADDRESS physAddr,
IN BOOLEAN bCacheEnabled
) PURE;
};
typedef IDmaOperations *PDMAOPERATIONS;
#define IMP_IDmaOperations\
STDMETHODIMP_(PVOID) AllocateCommonBuffer\
(\
IN ULONG Length,\
OUT PPHYSICAL_ADDRESS physAddr,\
IN BOOLEAN bCacheEnabled\
)
/*****************************************************************************
* IPreFetchOffset
*****************************************************************************
* An interface implemented by the pin to implement prefetch characteristics
* of bus master hardware - to specify the hardware queue size, determining
* the pad between play cursor and write cursor.
*/
DECLARE_INTERFACE_(IPreFetchOffset,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
STDMETHOD_(VOID,SetPreFetchOffset)
( THIS_
IN ULONG PreFetchOffset
) PURE;
};
typedef IPreFetchOffset *PPREFETCHOFFSET;
#define IMP_IPreFetchOffset\
STDMETHODIMP_(VOID) SetPreFetchOffset\
(\
IN ULONG PreFetchOffset\
)
/*****************************************************************************
* Functions.
*/
/*****************************************************************************
* PCPFNSTARTDEVICE
*****************************************************************************
* Type for start device callback.
*/
typedef
NTSTATUS
(*PCPFNSTARTDEVICE)
(
#ifdef PC_OLD_NAMES
IN PVOID DeviceObject,
IN PVOID Irp,
#else
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
#endif
IN PRESOURCELIST ResourceList
);
/*****************************************************************************
* PcInitializeAdapterDriver()
*****************************************************************************
* Initializes an adapter driver.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcInitializeAdapterDriver
(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPathName,
IN PDRIVER_ADD_DEVICE AddDevice
);
/*****************************************************************************
* PcDispatchIrp()
*****************************************************************************
* Dispatch an IRP.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcDispatchIrp
(
IN PDEVICE_OBJECT pDeviceObject,
IN PIRP pIrp
);
/*****************************************************************************
* PcAddAdapterDevice()
*****************************************************************************
* Adds an adapter device. DeviceExtensionSize may be zero for default size.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcAddAdapterDevice
(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject,
IN PCPFNSTARTDEVICE StartDevice,
IN ULONG MaxObjects,
IN ULONG DeviceExtensionSize
);
/*****************************************************************************
* PcCompleteIrp()
*****************************************************************************
* Complete an IRP unless status is STATUS_PENDING.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcCompleteIrp
(
IN PDEVICE_OBJECT pDeviceObject,
IN PIRP pIrp,
IN NTSTATUS ntStatus
);
/*****************************************************************************
* PcForwardIrpSynchronous()
*****************************************************************************
* Forward a PnP IRP to the PDO. The IRP is not completed at this level,
* this function does not return until the lower driver has completed the IRP,
* and DecrementPendingIrpCount() is not called.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcForwardIrpSynchronous
(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
/*****************************************************************************
* PcRegisterSubdevice()
*****************************************************************************
* Registers a subdevice.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcRegisterSubdevice
(
IN PDEVICE_OBJECT DeviceObject,
IN PWCHAR Name,
IN PUNKNOWN Unknown
);
/*****************************************************************************
* PcRegisterPhysicalConnection()
*****************************************************************************
* Registers a physical connection between subdevices.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcRegisterPhysicalConnection
(
IN PDEVICE_OBJECT DeviceObject,
IN PUNKNOWN FromUnknown,
IN ULONG FromPin,
IN PUNKNOWN ToUnknown,
IN ULONG ToPin
);
/*****************************************************************************
* PcRegisterPhysicalConnectionToExternal()
*****************************************************************************
* Registers a physical connection from a subdevice to an external device.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcRegisterPhysicalConnectionToExternal
(
IN PDEVICE_OBJECT DeviceObject,
IN PUNKNOWN FromUnknown,
IN ULONG FromPin,
IN PUNICODE_STRING ToString,
IN ULONG ToPin
);
/*****************************************************************************
* PcRegisterPhysicalConnectionFromExternal()
*****************************************************************************
* Registers a physical connection to a subdevice from an external device.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcRegisterPhysicalConnectionFromExternal
(
IN PDEVICE_OBJECT DeviceObject,
IN PUNICODE_STRING FromString,
IN ULONG FromPin,
IN PUNKNOWN ToUnknown,
IN ULONG ToPin
);
/*****************************************************************************
* PcNewPort()
*****************************************************************************
* Creates an instance of a port driver.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcNewPort
(
OUT PPORT * OutPort,
IN REFCLSID ClassID
);
/*****************************************************************************
* PcNewMiniport()
*****************************************************************************
* Creates an instance of a system-supplied miniport driver.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcNewMiniport
(
OUT PMINIPORT * OutMiniPort,
IN REFCLSID ClassID
);
/*****************************************************************************
* PcNewDmaChannel()
*****************************************************************************
* Creates a DMA channel.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcNewDmaChannel
(
OUT PDMACHANNEL * OutDmaChannel,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType,
IN PDEVICE_DESCRIPTION DeviceDescription,
IN PDEVICE_OBJECT DeviceObject
);
/*****************************************************************************
* PcCompletePendingPropertyRequest()
*****************************************************************************
* Completes a pending property request.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcCompletePendingPropertyRequest
(
IN PPCPROPERTY_REQUEST PropertyRequest,
IN NTSTATUS NtStatus
);
/*****************************************************************************
* PcGetTimeInterval
*****************************************************************************
* Gets the system time interval
*/
PORTCLASSAPI
ULONGLONG
NTAPI
PcGetTimeInterval
(
IN ULONGLONG Since
);
#define GTI_SECONDS(t) (ULONGLONG(t)*10000000)
#define GTI_MILLISECONDS(t) (ULONGLONG(t)*10000)
#define GTI_MICROSECONDS(t) (ULONGLONG(t)*10)
/*****************************************************************************
* PcNewResourceList()
*****************************************************************************
* Creates and initializes a resource list.
*/
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
);
/*****************************************************************************
* PcNewResourceSublist()
*****************************************************************************
* Creates and initializes an empty resource list derived from another
* resource list.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcNewResourceSublist
(
OUT PRESOURCELIST * OutResourceList,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN POOL_TYPE PoolType,
IN PRESOURCELIST ParentList,
IN ULONG MaximumEntries
);
/*****************************************************************************
* PcNewInterruptSync()
*****************************************************************************
* Creates and initializes an interrupt-level synchronization object.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcNewInterruptSync
(
OUT PINTERRUPTSYNC * OutInterruptSync,
IN PUNKNOWN OuterUnknown OPTIONAL,
IN PRESOURCELIST ResourceList,
IN ULONG ResourceIndex,
IN INTERRUPTSYNCMODE Mode
);
/*****************************************************************************
* PcNewServiceGroup()
*****************************************************************************
* Creates and initializes a service group object.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcNewServiceGroup
(
OUT PSERVICEGROUP * OutServiceGroup,
IN PUNKNOWN OuterUnknown OPTIONAL
);
/*****************************************************************************
* PcNewRegistryKey()
*****************************************************************************
* Creates and initializes a registry key object.
*/
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
);
/*****************************************************************************
* RegistryKeyType for NewRegistryKey()
*****************************************************************************
* Enumeration of key types.
*/
enum
{
GeneralRegistryKey, // ObjectAttributes and CreateOptions are req'd.
DeviceRegistryKey, // Device Object is required
DriverRegistryKey, // Device Object is required
HwProfileRegistryKey, // Device Object is required
DeviceInterfaceRegistryKey // Device Object and SubDevice are required
};
/*****************************************************************************
* PcGetDeviceProperty()
*****************************************************************************
* This returns the requested device property from the registry.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcGetDeviceProperty
(
IN PVOID DeviceObject,
IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
IN ULONG BufferLength,
OUT PVOID PropertyBuffer,
OUT PULONG ResultLength
);
/*****************************************************************************
* PcRegisterAdapterPowerManagement()
*****************************************************************************
* Register the adapter's power management interface with PortCls.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcRegisterAdapterPowerManagement
(
IN PUNKNOWN Unknown,
IN PVOID pvContext1
);
/*****************************************************************************
* PcRequestNewPowerState()
*****************************************************************************
* This routine is used to request a new power state for the device. It is
* normally not needed by adapter drivers but is exported in order to
* support unusual circumstances.
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcRequestNewPowerState
(
IN PDEVICE_OBJECT pDeviceObject,
IN DEVICE_POWER_STATE RequestedNewState
);
/*****************************************************************************
* PcRegisterIoTimeout()
*****************************************************************************
* This routine registers a driver-supplied callback associated with a given
* device object (see IoInitializeTimer in the DDK). This callback that will
* be called approximately once per second while the device is active (see
* IoStartTimer, and IoStopTimer in the DDK - these are called upon device
* START and STOP).
*
* This routine must be called at PASSIVE_LEVEL.
* pTimerRoutine can and will be called at DISPATCH_LEVEL; it must be non-paged.
*
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcRegisterIoTimeout
(
IN PDEVICE_OBJECT pDeviceObject,
IN PIO_TIMER_ROUTINE pTimerRoutine,
IN PVOID pContext
);
/*****************************************************************************
* PcUnregisterIoTimeout()
*****************************************************************************
* This routine unregisters a driver-supplied callback associated with a given
* device object. This callback must have been previously registered with
* PcRegisterIoTimeout (with the same device object, timer routine and context).
*
* This routine must be called at PASSIVE_LEVEL.
* pTimerRoutine can and will be called at DISPATCH_LEVEL; it must be non-paged.
*
*/
PORTCLASSAPI
NTSTATUS
NTAPI
PcUnregisterIoTimeout
(
IN PDEVICE_OBJECT pDeviceObject,
IN PIO_TIMER_ROUTINE pTimerRoutine,
IN PVOID pContext
);
/*****************************************************************************
* Pc DRM functions
*****************************************************************************
* These functions link directly to the kernel-mode Digital Rights Management
* module. They all must be called at PASSIVE_LEVEL.
*/
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
);
#ifdef PC_OLD_NAMES
#define InitializeAdapterDriver(c1,c2,a) \
PcInitializeAdapterDriver(PDRIVER_OBJECT(c1),PUNICODE_STRING(c2),PDRIVER_ADD_DEVICE(a))
#define AddAdapterDevice(c1,c2,s,m) \
PcAddAdapterDevice(PDRIVER_OBJECT(c1),PDEVICE_OBJECT(c2),s,m,0)
#define RegisterSubdevice(c1,c2,n,u) \
PcRegisterSubdevice(PDEVICE_OBJECT(c1),n,u)
#define RegisterPhysicalConnection(c1,c2,fs,fp,ts,tp) \
PcRegisterPhysicalConnection(PDEVICE_OBJECT(c1),fs,fp,ts,tp)
#define RegisterPhysicalConnectionToExternal(c1,c2,fs,fp,ts,tp) \
PcRegisterPhysicalConnectionToExternal(PDEVICE_OBJECT(c1),fs,fp,ts,tp)
#define RegisterPhysicalConnectionFromExternal(c1,c2,fs,fp,ts,tp) \
PcRegisterPhysicalConnectionFromExternal(PDEVICE_OBJECT(c1),fs,fp,ts,tp)
#define NewPort PcNewPort
#define NewMiniport PcNewMiniport
#define CompletePendingPropertyRequest PcCompletePendingPropertyRequest
#define NewResourceList PcNewResourceList
#define NewResourceSublist PcNewResourceSublist
#define NewDmaChannel PcNewDmaChannel
#define NewServiceGroup PcNewServiceGroup
#define GetTimeInterval PcGetTimeInterval
#define WIN95COMPAT_ReadPortUChar(Port) READ_PORT_UCHAR(Port)
#define WIN95COMPAT_WritePortUChar(Port,Value) WRITE_PORT_UCHAR(Port,Value)
#define WIN95COMPAT_ReadPortUShort(Port) READ_PORT_USHORT(Port)
#define WIN95COMPAT_WritePortUShort(Port,Value) WRITE_PORT_USHORT(Port,Value)
#endif //PC_OLD_NAMES
#endif //_PORTCLS_H_