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