Mercurial > games > semicongine
diff fuhtark_test/include/ddk/portcls.h @ 1500:91c8c3b7cbf0
add: futhark tests for generating vulkan api
| author | sam <sam@basx.dev> |
|---|---|
| date | Wed, 26 Nov 2025 21:36:48 +0700 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fuhtark_test/include/ddk/portcls.h Wed Nov 26 21:36:48 2025 +0700 @@ -0,0 +1,2448 @@ +/* + 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_WIN2003) +/* =============================================================== + 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; + + +/* =============================================================== + 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; + +#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
