Home | History | Annotate | Download | only in ddk
      1 /*
      2     ReactOS Kernel Streaming
      3     Port Class
      4 
      5     This file is in the public domain.
      6 
      7     Andrew Greenwood
      8 
      9     NOTES:
     10     Does not support PC_OLD_NAMES (which is required for backwards-compatibility
     11     with older code)
     12 
     13     Obsolete macros are not implemented. For more info:
     14     http://www.osronline.com/ddkx/stream/audpc-struct_167n.htm
     15 
     16 
     17     == EXPORTS ==
     18     DRM (new in XP):
     19     * PcAddContentHandlers
     20     * PcCreateContentMixed
     21     * PcDestroyContent
     22     * PcForwardContentToDeviceObject
     23     * PcForwardContentToFileObject
     24     * PcForwardContentToInterface
     25     * PcGetContentRights
     26 
     27     IRP HANDLING:
     28     * PcCompleteIrp
     29     * PcDispatchIrp
     30     * PcForwardIrpSynchronous
     31 
     32     ADAPTER:
     33     * PcAddAdapterDevice
     34     * PcInitializeAdapterDriver
     35 
     36     FACTORIES:
     37     * PcNewDmaChannel
     38     * PcNewInterruptSync
     39     * PcNewMiniport
     40     * PcNewPort
     41     * PcNewRegistryKey
     42     * PcNewResourceList
     43     * PcNewResourceSublist
     44     * PcNewServiceGroup
     45 
     46     POWER MANAGEMENT:
     47     * PcRegisterAdapterPowerManagement
     48     * PcRequestNewPowerState
     49 
     50     PROPERTIES:
     51     * PcCompletePendingPropertyRequest
     52     * PcGetDeviceProperty
     53 
     54     IO TIMEOUTS:
     55     * PcRegisterIoTimeout
     56     * PcUnregisterIoTimeout
     57 
     58     PHYSICAL CONNECTIONS:
     59     * PcRegisterPhysicalConnection
     60     * PcRegisterPhysicalConnectionFromExternal
     61     * PcRegisterPhysicalConnectionToExternal
     62 
     63     MISC:
     64     * PcGetTimeInterval
     65     * PcRegisterSubdevice
     66 
     67 
     68     == AUDIO HELPER OBJECT INTERFACES ==
     69     IDmaChannel
     70     IDmaChannelSlave
     71     IDmaOperations
     72     IDrmPort                        (XP)
     73     IDrmPort2                       (XP)
     74     IInterruptSync
     75     IMasterClock
     76     IPortClsVersion                 (XP)
     77     IPortEvents
     78     IPreFetchOffset                 (XP)
     79     IRegistryKey
     80     IResourceList
     81     IServiceGroup
     82     IServiceSink
     83     IUnregisterPhysicalConnection   (Vista)
     84     IUnregisterSubdevice            (Vista)
     85 
     86     == AUDIO PORT OBJECT INTERFACES ==
     87     IPort
     88     IPortDMus
     89     IPortMidi
     90     IPortTopology
     91     IPortWaveCyclic
     92     IPortWavePci
     93 
     94     == AUDIO MINIPORT OBJECT INTERFACES ==
     95     IMiniport
     96     IMiniportDMus
     97     IMiniportMidi
     98     IMiniportTopology
     99     IMiniportWaveCyclic
    100     IMiniportWavePci
    101 
    102     == AUDIO MINIPORT AUXILIARY INTERFACES ==
    103     IMusicTechnology                (XP)
    104     IPinCount                       (XP)
    105 
    106     == AUDIO STREAM OBJECT INTERFACES ==
    107     IAllocatorMXF
    108     IDrmAudioStream                 (XP)
    109     IMiniportMidiStream
    110     IMiniportWaveCyclicStream
    111     IMiniportWavePciStream
    112     IMXF
    113     IPortWavePciStream
    114     ISynthSinkDMus
    115 
    116     == DIRECTMUSIC USERMODE SYNTH AND SYNTH SINK INTERFACES ==
    117     IDirectMusicSynth
    118     IDirectMusicSynthSink
    119 
    120     == AUDIO POWER MANAGEMENT INTERFACES ==
    121     IAdapterPowerManagement
    122     IPowerNotify
    123 */
    124 
    125 #ifndef PORTCLS_H
    126 #define PORTCLS_H
    127 
    128 #ifdef __cplusplus
    129 extern "C"
    130 {
    131 # include <wdm.h>
    132 }
    133 #else
    134 # include <wdm.h>
    135 #endif
    136 
    137 #include <windef.h>
    138 
    139 #define NOBITMAP
    140 #include <mmreg.h>
    141 #undef NOBITMAP
    142 
    143 #include <punknown.h>
    144 #include <ks.h>
    145 #include <ksmedia.h>
    146 #include <drmk.h>
    147 
    148 #ifdef __cplusplus
    149 extern "C"
    150 {
    151 # include <wdm.h>
    152 }
    153 #else
    154 # include <wdm.h>
    155 #endif
    156 
    157 #ifndef PC_NO_IMPORTS
    158 #define PORTCLASSAPI EXTERN_C __declspec(dllimport)
    159 #else
    160 #define PORTCLASSAPI EXTERN_C
    161 #endif
    162 
    163 /* TODO */
    164 #define PCFILTER_NODE ((ULONG) -1)
    165 
    166 /* HACK */
    167 /* typedef PVOID CM_RESOURCE_TYPE; */
    168 
    169 #define _100NS_UNITS_PER_SECOND 10000000L
    170 #define PORT_CLASS_DEVICE_EXTENSION_SIZE ( 64 * sizeof(ULONG_PTR) )
    171 
    172 
    173 DEFINE_GUID(CLSID_MiniportDriverFmSynth, 0xb4c90ae0L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
    174 DEFINE_GUID(CLSID_MiniportDriverFmSynthWithVol, 0xe5a3c139L, 0xf0f2, 0x11d1, 0x81, 0xaf, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1);
    175 
    176 /* ===============================================================
    177     Event Item Flags - TODO
    178 */
    179 #define PCEVENT_ITEM_FLAG_ENABLE            KSEVENT_TYPE_ENABLE
    180 #define PCEVENT_ITEM_FLAG_ONESHOT           KSEVENT_TYPE_ONESHOT
    181 #define PCEVENT_ITEM_FLAG_BASICSUPPORT      KSEVENT_TYPE_BASICSUPPORT
    182 
    183 
    184 /* ===============================================================
    185     Event Verbs - TODO
    186 */
    187 #define PCEVENT_VERB_NONE       0
    188 #define PCEVENT_VERB_ADD        1
    189 #define PCEVENT_VERB_REMOVE     2
    190 #define PCEVENT_VERB_SUPPORT    4
    191 
    192 
    193 /* ===============================================================
    194     Method Item Flags - TODO
    195 */
    196 #define PCMETHOD_ITEM_FLAG_NONE             KSMETHOD_TYPE_NONE
    197 #define PCMETHOD_ITEM_FLAG_READ             KSMETHOD_TYPE_READ
    198 #define PCMETHOD_ITEM_FLAG_WRITE            KSMETHOD_TYPE_WRITE
    199 #define PCMETHOD_ITEM_FLAG_MODIFY           KSMETHOD_TYPE_MODIFY
    200 #define PCMETHOD_ITEM_FLAG_SOURCE           KSMETHOD_TYPE_SOURCE
    201 
    202 
    203 /* ===============================================================
    204     Method Verbs - TODO
    205 */
    206 #define PCMETHOD_ITEM_FLAG_BASICSUPPORT     KSMETHOD_TYPE_BASICSUPPORT
    207 #define PCMETHOD_ITEM_FLAG_SEND
    208 #define PCMETHOD_ITEM_FLAG_SETSUPPORT
    209 
    210 
    211 /* ===============================================================
    212     Versions
    213     IoIsWdmVersionAvailable may also be used by older drivers.
    214 */
    215 
    216 enum
    217 {
    218     kVersionInvalid = -1,
    219 
    220     kVersionWin98,
    221     kVersionWin98SE,
    222     kVersionWin2K,
    223     kVersionWin98SE_QFE2,
    224     kVersionWin2K_SP2,
    225     kVersionWinME,
    226     kVersionWin98SE_QFE3,
    227     kVersionWinME_QFE1,
    228     kVersionWinXP,
    229     kVersionWinXPSP1,
    230     kVersionWinServer2003,
    231     kVersionWin2K_UAAQFE,           /* These support IUnregister* interface */
    232     kVersionWinXP_UAAQFE,
    233     kVersionWinServer2003_UAAQFE
    234 };
    235 
    236 /* ===============================================================
    237     Properties
    238 */
    239 
    240 struct _PCPROPERTY_REQUEST;
    241 
    242 typedef struct _PCPROPERTY_REQUEST PCPROPERTY_REQUEST, *PPCPROPERTY_REQUEST;
    243 
    244 typedef NTSTATUS (NTAPI *PCPFNPROPERTY_HANDLER)(
    245     IN  PPCPROPERTY_REQUEST PropertyRequest);
    246 
    247 typedef struct
    248 {
    249     const GUID *            Set;
    250     ULONG                   Id;
    251     ULONG                   Flags;
    252 #define PCPROPERTY_ITEM_FLAG_GET            KSPROPERTY_TYPE_GET
    253 #define PCPROPERTY_ITEM_FLAG_SET            KSPROPERTY_TYPE_SET
    254 #define PCPROPERTY_ITEM_FLAG_BASICSUPPORT   KSPROPERTY_TYPE_BASICSUPPORT
    255 //not supported #define PCPROPERTY_ITEM_FLAG_RELATIONS      KSPROPERTY_TYPE_RELATIONS
    256 #define PCPROPERTY_ITEM_FLAG_SERIALIZERAW   KSPROPERTY_TYPE_SERIALIZERAW
    257 #define PCPROPERTY_ITEM_FLAG_UNSERIALIZERAW KSPROPERTY_TYPE_UNSERIALIZERAW
    258 #define PCPROPERTY_ITEM_FLAG_SERIALIZESIZE  KSPROPERTY_TYPE_SERIALIZESIZE
    259 #define PCPROPERTY_ITEM_FLAG_SERIALIZE\
    260         (PCPROPERTY_ITEM_FLAG_SERIALIZERAW\
    261         |PCPROPERTY_ITEM_FLAG_UNSERIALIZERAW\
    262         |PCPROPERTY_ITEM_FLAG_SERIALIZESIZE\
    263         )
    264 #define PCPROPERTY_ITEM_FLAG_DEFAULTVALUES  KSPROPERTY_TYPE_DEFAULTVALUES
    265     PCPFNPROPERTY_HANDLER   Handler;
    266 }
    267 PCPROPERTY_ITEM, *PPCPROPERTY_ITEM;
    268 
    269 
    270 struct _PCPROPERTY_REQUEST
    271 {
    272     PUNKNOWN                MajorTarget;
    273     PUNKNOWN                MinorTarget;
    274     ULONG                   Node;
    275     const PCPROPERTY_ITEM * PropertyItem;
    276     ULONG                   Verb;
    277     ULONG                   InstanceSize;
    278     PVOID                   Instance;
    279     ULONG                   ValueSize;
    280     PVOID                   Value;
    281     PIRP                    Irp;
    282 };
    283 
    284 struct _PCEVENT_REQUEST;
    285 
    286 typedef NTSTATUS (NTAPI *PCPFNEVENT_HANDLER)(
    287     IN  struct _PCEVENT_REQUEST* EventRequest);
    288 
    289 typedef struct _PCEVENT_ITEM
    290 {
    291     const GUID* Set;
    292     ULONG Id;
    293     ULONG Flags;
    294     PCPFNEVENT_HANDLER Handler;
    295 } PCEVENT_ITEM, *PPCEVENT_ITEM;
    296 
    297 typedef struct _PCEVENT_REQUEST
    298 {
    299     PUNKNOWN MajorTarget;
    300     PUNKNOWN MinorTarget;
    301     ULONG Node;
    302     const PCEVENT_ITEM* EventItem;
    303     PKSEVENT_ENTRY EventEntry;
    304     ULONG Verb;
    305     PIRP Irp;
    306 } PCEVENT_REQUEST, *PPCEVENT_REQUEST;
    307 
    308 
    309 
    310 struct _PCMETHOD_REQUEST;
    311 
    312 typedef NTSTATUS (NTAPI *PCPFNMETHOD_HANDLER)(
    313     IN  struct _PCMETHOD_REQUEST* MethodRequest);
    314 
    315 typedef struct _PCMETHOD_ITEM
    316 {
    317     const GUID* Set;
    318     ULONG Id;
    319     ULONG Flags;
    320     PCPFNMETHOD_HANDLER Handler;
    321 } PCMETHOD_ITEM, *PPCMETHOD_ITEM;
    322 
    323 typedef struct _PCMETHOD_REQUEST
    324 {
    325     PUNKNOWN MajorTarget;
    326     PUNKNOWN MinorTarget;
    327     ULONG Node;
    328     const PCMETHOD_ITEM* MethodItem;
    329     ULONG Verb;
    330 } PCMETHOD_REQUEST, *PPCMETHOD_REQUEST;
    331 
    332 
    333 /* ===============================================================
    334     Structures (unsorted)
    335 */
    336 
    337 typedef struct
    338 {
    339     ULONG PropertyItemSize;
    340     ULONG PropertyCount;
    341     const PCPROPERTY_ITEM* Properties;
    342     ULONG MethodItemSize;
    343     ULONG MethodCount;
    344     const PCMETHOD_ITEM* Methods;
    345     ULONG EventItemSize;
    346     ULONG EventCount;
    347     const PCEVENT_ITEM* Events;
    348     ULONG Reserved;
    349 } PCAUTOMATION_TABLE, *PPCAUTOMATION_TABLE;
    350 
    351 typedef struct
    352 {
    353     ULONG FromNode;
    354     ULONG FromNodePin;
    355     ULONG ToNode;
    356     ULONG ToNodePin;
    357 } PCCONNECTION_DESCRIPTOR, *PPCCONNECTIONDESCRIPTOR;
    358 
    359 typedef struct
    360 {
    361     ULONG MaxGlobalInstanceCount;
    362     ULONG MaxFilterInstanceCount;
    363     ULONG MinFilterInstanceCount;
    364     const PCAUTOMATION_TABLE* AutomationTable;
    365     KSPIN_DESCRIPTOR KsPinDescriptor;
    366 } PCPIN_DESCRIPTOR, *PPCPIN_DESCRIPTOR;
    367 
    368 typedef struct
    369 {
    370     ULONG Flags;
    371     const PCAUTOMATION_TABLE* AutomationTable;
    372     const GUID* Type;
    373     const GUID* Name;
    374 } PCNODE_DESCRIPTOR, *PPCNODE_DESCRIPTOR;
    375 
    376 typedef struct
    377 {
    378     ULONG Version;
    379     const PCAUTOMATION_TABLE* AutomationTable;
    380     ULONG PinSize;
    381     ULONG PinCount;
    382     const PCPIN_DESCRIPTOR* Pins;
    383     ULONG NodeSize;
    384     ULONG NodeCount;
    385     const PCNODE_DESCRIPTOR* Nodes;
    386     ULONG ConnectionCount;
    387     const PCCONNECTION_DESCRIPTOR* Connections;
    388     ULONG CategoryCount;
    389     const GUID* Categories;
    390 } PCFILTER_DESCRIPTOR, *PPCFILTER_DESCRIPTOR;
    391 
    392 #define DEFINE_PCAUTOMATION_TABLE_PROP(AutomationTable,PropertyTable)\
    393 const PCAUTOMATION_TABLE AutomationTable =\
    394 {\
    395     sizeof(PropertyTable[0]),\
    396     SIZEOF_ARRAY(PropertyTable),\
    397     (const PCPROPERTY_ITEM *) PropertyTable,\
    398     0,0,NULL,\
    399     0,0,NULL,\
    400     0\
    401 }
    402 
    403 /* ===============================================================
    404     IResourceList Interface
    405 */
    406 
    407 #undef INTERFACE
    408 #define INTERFACE IResourceList
    409 
    410 DEFINE_GUID(IID_IResourceList, 0x22C6AC60L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
    411 
    412 DECLARE_INTERFACE_(IResourceList, IUnknown)
    413 {
    414     DEFINE_ABSTRACT_UNKNOWN()
    415 
    416     STDMETHOD_(ULONG, NumberOfEntries)( THIS ) PURE;
    417 
    418     STDMETHOD_(ULONG, NumberOfEntriesOfType)( THIS_
    419         IN  CM_RESOURCE_TYPE Type) PURE;
    420 
    421     STDMETHOD_(PCM_PARTIAL_RESOURCE_DESCRIPTOR, FindTranslatedEntry)( THIS_
    422         IN  CM_RESOURCE_TYPE Type,
    423         IN  ULONG Index) PURE;
    424 
    425     STDMETHOD_(PCM_PARTIAL_RESOURCE_DESCRIPTOR, FindUntranslatedEntry)( THIS_
    426         IN  CM_RESOURCE_TYPE Type,
    427         IN  ULONG Index) PURE;
    428 
    429     STDMETHOD_(NTSTATUS, AddEntry)( THIS_
    430         IN  PCM_PARTIAL_RESOURCE_DESCRIPTOR Translated,
    431         IN  PCM_PARTIAL_RESOURCE_DESCRIPTOR Untranslated) PURE;
    432 
    433     STDMETHOD_(NTSTATUS, AddEntryFromParent)( THIS_
    434         IN  IResourceList* Parent,
    435         IN  CM_RESOURCE_TYPE Type,
    436         IN  ULONG Index) PURE;
    437 
    438     STDMETHOD_(PCM_RESOURCE_LIST, TranslatedList)( THIS ) PURE;
    439     STDMETHOD_(PCM_RESOURCE_LIST, UntranslatedList)( THIS ) PURE;
    440 };
    441 
    442 #define IMP_IResourceList \
    443     STDMETHODIMP_(ULONG) NumberOfEntries(void); \
    444 \
    445     STDMETHODIMP_(ULONG) NumberOfEntriesOfType( \
    446         IN  CM_RESOURCE_TYPE Type); \
    447 \
    448     STDMETHODIMP_(PCM_PARTIAL_RESOURCE_DESCRIPTOR) FindTranslatedEntry( \
    449         IN  CM_RESOURCE_TYPE Type, \
    450         IN  ULONG Index); \
    451 \
    452     STDMETHODIMP_(PCM_PARTIAL_RESOURCE_DESCRIPTOR) FindUntranslatedEntry( \
    453         IN  CM_RESOURCE_TYPE Type, \
    454         IN  ULONG Index); \
    455 \
    456     STDMETHODIMP_(NTSTATUS) AddEntry( \
    457         IN  PCM_PARTIAL_RESOURCE_DESCRIPTOR Translated, \
    458         IN  PCM_PARTIAL_RESOURCE_DESCRIPTOR Untranslated); \
    459 \
    460     STDMETHODIMP_(NTSTATUS) AddEntryFromParent( \
    461         IN  IResourceList* Parent, \
    462         IN  CM_RESOURCE_TYPE Type, \
    463         IN  ULONG Index); \
    464 \
    465     STDMETHODIMP_(PCM_RESOURCE_LIST) TranslatedList(void); \
    466     STDMETHODIMP_(PCM_RESOURCE_LIST) UntranslatedList(void);
    467 
    468 typedef IResourceList *PRESOURCELIST;
    469 
    470 #define NumberOfPorts() \
    471     NumberOfEntriesOfType(CmResourceTypePort)
    472 
    473 #define FindTranslatedPort(n) \
    474     FindTranslatedEntry(CmResourceTypePort, (n))
    475 
    476 #define FindUntranslatedPort(n) \
    477     FindUntranslatedEntry(CmResourceTypePort, (n))
    478 
    479 #define AddPortFromParent(p, n) \
    480     AddEntryFromParent((p), CmResourceTypePort, (n))
    481 
    482 #define NumberOfInterrupts() \
    483     NumberOfEntriesOfType(CmResourceTypeInterrupt)
    484 
    485 #define FindTranslatedInterrupt(n) \
    486     FindTranslatedEntry(CmResourceTypeInterrupt, (n))
    487 
    488 #define FindUntranslatedInterrupt(n) \
    489     FindUntranslatedEntry(CmResourceTypeInterrupt, (n))
    490 
    491 #define AddInterruptFromParent(p, n) \
    492     AddEntryFromParent((p), CmResourceTypeInterrupt, (n))
    493 
    494 #define NumberOfMemories() \
    495     NumberOfEntriesOfType(CmResourceTypeMemory)
    496 
    497 #define FindTranslatedMemory(n) \
    498     FindTranslatedEntry(CmResourceTypeMemory, (n))
    499 
    500 #define FindUntranslatedMemory(n) \
    501     FindUntranslatedEntry(CmResourceTypeMemory, (n))
    502 
    503 #define AddMemoryFromParent(p, n) \
    504     AddEntryFromParent((p), CmResourceTypeMemory, (n))
    505 
    506 #define NumberOfDmas() \
    507     NumberOfEntriesOfType(CmResourceTypeDma)
    508 
    509 #define FindTranslatedDma(n) \
    510     FindTranslatedEntry(CmResourceTypeDma, (n))
    511 
    512 #define FindUntranslatedDma(n) \
    513     FindUntranslatedEntry(CmResourceTypeDma, (n))
    514 
    515 #define AddDmaFromParent(p, n) \
    516     AddEntryFromParent((p), CmResourceTypeInterrupt, (n))
    517 
    518 #define NumberOfDeviceSpecifics() \
    519     NumberOfEntriesOfType(CmResourceTypeDeviceSpecific)
    520 
    521 #define FindTranslatedDeviceSpecific(n) \
    522     FindTranslatedEntry(CmResourceTypeDeviceSpecific, (n))
    523 
    524 #define FindUntranslatedDeviceSpecific(n) \
    525     FindUntranslatedEntry(CmResourceTypeDeviceSpecific, (n))
    526 
    527 #define AddDeviceSpecificFromParent(p, n) \
    528     AddEntryFromParent((p), CmResourceTypeDeviceSpecific, (n))
    529 
    530 #define NumberOfBusNumbers() \
    531     NumberOfEntriesOfType(CmResourceTypeBusNumber)
    532 
    533 #define FindTranslatedBusNumber(n) \
    534     FindTranslatedEntry(CmResourceTypeBusNumber, (n))
    535 
    536 #define FindUntranslatedBusNumber(n) \
    537     FindUntranslatedEntry(CmResourceTypeBusNumber, (n))
    538 
    539 #define AddBusNumberFromParent(p, n) \
    540     AddEntryFromParent((p), CmResourceTypeBusNumber, (n))
    541 
    542 #define NumberOfDevicePrivates() \
    543     NumberOfEntriesOfType(CmResourceTypeDevicePrivate)
    544 
    545 #define FindTranslatedDevicePrivate(n) \
    546     FindTranslatedEntry(CmResourceTypeDevicePrivate, (n))
    547 
    548 #define FindUntranslatedDevicePrivate(n) \
    549     FindUntranslatedEntry(CmResourceTypeDevicePrivate, (n))
    550 
    551 #define AddDevicePrivateFromParent(p, n) \
    552     AddEntryFromParent((p), CmResourceTypeDevicePrivate, (n))
    553 
    554 #define NumberOfAssignedResources() \
    555     NumberOfEntriesOfType(CmResourceTypeAssignedResource)
    556 
    557 #define FindTranslatedAssignedResource(n) \
    558     FindTranslatedEntry(CmResourceTypeAssignedResource, (n))
    559 
    560 #define FindUntranslatedAssignedResource(n) \
    561     FindUntranslatedEntry(CmResourceTypeAssignedResource, (n))
    562 
    563 #define AddAssignedResourceFromParent(p, n) \
    564     AddEntryFromParent((p), CmResourceTypeAssignedResource, (n))
    565 
    566 #define NumberOfSubAllocateFroms() \
    567     NumberOfEntriesOfType(CmResourceTypeSubAllocateFrom)
    568 
    569 #define FindTranslatedSubAllocateFrom(n) \
    570     FindTranslatedEntry(CmResourceTypeSubAllocateFrom, (n))
    571 
    572 #define FindUntranslatedSubAllocateFrom(n) \
    573     FindUntranslatedEntry(CmResourceTypeSubAllocateFrom, (n))
    574 
    575 #define AddSubAllocateFromFromParent(p, n) \
    576     AddEntryFromParent((p), CmResourceTypeSubAllocateFrom, (n))
    577 
    578 #undef INTERFACE
    579 
    580 
    581 /* ===============================================================
    582     IServiceSink Interface
    583 */
    584 #define INTERFACE IServiceSink
    585 
    586 DEFINE_GUID(IID_IServiceSink, 0x22C6AC64L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
    587 
    588 DECLARE_INTERFACE_(IServiceSink, IUnknown)
    589 {
    590     DEFINE_ABSTRACT_UNKNOWN()
    591     STDMETHOD_(void, RequestService)( THIS ) PURE;
    592 };
    593 
    594 #define IMP_IServiceSink \
    595     STDMETHODIMP_(void) RequestService(void);
    596 
    597 typedef IServiceSink *PSERVICESINK;
    598 
    599 
    600 /* ===============================================================
    601     IServiceGroup Interface
    602 */
    603 #undef INTERFACE
    604 #define INTERFACE IServiceGroup
    605 
    606 DEFINE_GUID(IID_IServiceGroup, 0x22C6AC65L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
    607 
    608 DECLARE_INTERFACE_(IServiceGroup, IServiceSink)
    609 {
    610     DEFINE_ABSTRACT_UNKNOWN()
    611 
    612     STDMETHOD_(void, RequestService)( THIS ) PURE;  /* IServiceSink */
    613 
    614     STDMETHOD_(NTSTATUS, AddMember)( THIS_
    615         IN  PSERVICESINK pServiceSink) PURE;
    616 
    617     STDMETHOD_(void, RemoveMember)( THIS_
    618         IN  PSERVICESINK pServiceSink) PURE;
    619 
    620     STDMETHOD_(void, SupportDelayedService)( THIS ) PURE;
    621 
    622     STDMETHOD_(void, RequestDelayedService)( THIS_
    623         IN  ULONGLONG ullDelay) PURE;
    624 
    625     STDMETHOD_(void, CancelDelayedService)( THIS ) PURE;
    626 };
    627 
    628 #define IMP_IServiceGroup \
    629     IMP_IServiceSink; \
    630 \
    631     STDMETHODIMP_(NTSTATUS) AddMember( \
    632         IN  PSERVICESINK pServiceSink); \
    633 \
    634     STDMETHODIMP_(void) RemoveMember( \
    635         IN  PSERVICESINK pServiceSink); \
    636 \
    637     STDMETHODIMP_(void) SupportDelayedService(void); \
    638 \
    639     STDMETHODIMP_(void) RequestDelayedService( \
    640         IN  ULONGLONG ullDelay); \
    641 \
    642     STDMETHODIMP_(void) CancelDelayedService(void);
    643 
    644 typedef IServiceGroup *PSERVICEGROUP;
    645 
    646 
    647 #if (NTDDI_VERSION >= NTDDI_WS03)
    648 /* ===============================================================
    649     IUnregisterSubdevice Interface
    650 */
    651 
    652 DEFINE_GUID(IID_IUnregisterSubdevice, 0x16738177L, 0xe199, 0x41f9, 0x9a, 0x87, 0xab, 0xb2, 0xa5, 0x43, 0x2f, 0x21);
    653 
    654 #undef INTERFACE
    655 #define INTERFACE IUnregisterSubdevice
    656 
    657 DECLARE_INTERFACE_(IUnregisterSubdevice,IUnknown)
    658 {
    659     DEFINE_ABSTRACT_UNKNOWN()
    660 
    661     STDMETHOD_(NTSTATUS,UnregisterSubdevice)(THIS_
    662         IN  PDEVICE_OBJECT  DeviceObject,
    663         IN  PUNKNOWN        Unknown)PURE;
    664 };
    665 
    666 typedef IUnregisterSubdevice *PUNREGISTERSUBDEVICE;
    667 
    668 #define IMP_IUnregisterSubdevice                        \
    669     STDMETHODIMP_(NTSTATUS) UnregisterSubdevice(THIS_   \
    670         IN  PDEVICE_OBJECT  DeviceObject,               \
    671         IN  PUNKNOWN        Unknown)
    672 
    673 /* ===============================================================
    674     IUnregisterPhysicalConnection Interface
    675 */
    676 
    677 #undef INTERFACE
    678 #define INTERFACE IUnregisterPhysicalConnection
    679 
    680 DEFINE_GUID(IID_IUnregisterPhysicalConnection, 0x6c38e231L, 0x2a0d, 0x428d, 0x81, 0xf8, 0x07, 0xcc, 0x42, 0x8b, 0xb9, 0xa4);
    681 
    682 DECLARE_INTERFACE_(IUnregisterPhysicalConnection,IUnknown)
    683 {
    684     DEFINE_ABSTRACT_UNKNOWN()
    685 
    686     STDMETHOD_(NTSTATUS,UnregisterPhysicalConnection)(THIS_
    687         IN  PDEVICE_OBJECT  DeviceObject,
    688         IN  PUNKNOWN        FromUnknown,
    689         IN  ULONG           FromPin,
    690         IN  PUNKNOWN        ToUnknown,
    691         IN  ULONG           ToPin)PURE;
    692 
    693     STDMETHOD_(NTSTATUS,UnregisterPhysicalConnectionToExternal)(THIS_
    694         IN  PDEVICE_OBJECT  DeviceObject,
    695         IN  PUNKNOWN        FromUnknown,
    696         IN  ULONG           FromPin,
    697         IN  PUNICODE_STRING ToString,
    698         IN  ULONG           ToPin)PURE;
    699 
    700     STDMETHOD_(NTSTATUS,UnregisterPhysicalConnectionFromExternal)(THIS_
    701         IN  PDEVICE_OBJECT  DeviceObject,
    702         IN  PUNICODE_STRING FromString,
    703         IN  ULONG           FromPin,
    704         IN  PUNKNOWN        ToUnknown,
    705         IN  ULONG           ToPin)PURE;
    706 };
    707 
    708 typedef IUnregisterPhysicalConnection *PUNREGISTERPHYSICALCONNECTION;
    709 #endif
    710 
    711 #define IMP_IUnregisterPhysicalConnection                                    \
    712     STDMETHODIMP_(NTSTATUS) UnregisterPhysicalConnection(                    \
    713         IN  PDEVICE_OBJECT  DeviceObject,                                    \
    714         IN  PUNKNOWN        FromUnknown,                                     \
    715         IN  ULONG           FromPin,                                         \
    716         IN  PUNKNOWN        ToUnknown,                                       \
    717         IN  ULONG           ToPin);                                          \
    718                                                                              \
    719     STDMETHODIMP_(NTSTATUS) UnregisterPhysicalConnectionToExternal(          \
    720         IN  PDEVICE_OBJECT  DeviceObject,                                    \
    721         IN  PUNKNOWN        FromUnknown,                                     \
    722         IN  ULONG           FromPin,                                         \
    723         IN  PUNICODE_STRING ToString,                                        \
    724         IN  ULONG           ToPin);                                          \
    725                                                                              \
    726     STDMETHODIMP_(NTSTATUS) UnregisterPhysicalConnectionFromExternal(        \
    727         IN  PDEVICE_OBJECT  DeviceObject,                                    \
    728         IN  PUNICODE_STRING FromString,                                      \
    729         IN  ULONG           FromPin,                                         \
    730         IN  PUNKNOWN        ToUnknown,                                       \
    731         IN  ULONG           ToPin)
    732 
    733 
    734 /* ===============================================================
    735     IDmaChannel Interface
    736 */
    737 
    738 #define DEFINE_ABSTRACT_DMACHANNEL() \
    739     STDMETHOD_(NTSTATUS, AllocateBuffer)( THIS_ \
    740         IN  ULONG BufferSize, \
    741         IN  PPHYSICAL_ADDRESS PhysicalAddressConstraint OPTIONAL) PURE; \
    742 \
    743     STDMETHOD_(void, FreeBuffer)( THIS ) PURE; \
    744     STDMETHOD_(ULONG, TransferCount)( THIS ) PURE; \
    745     STDMETHOD_(ULONG, MaximumBufferSize)( THIS ) PURE; \
    746     STDMETHOD_(ULONG, AllocatedBufferSize)( THIS ) PURE; \
    747     STDMETHOD_(ULONG, BufferSize)( THIS ) PURE; \
    748 \
    749     STDMETHOD_(void, SetBufferSize)( THIS_ \
    750         IN  ULONG BufferSize) PURE; \
    751 \
    752     STDMETHOD_(PVOID, SystemAddress)( THIS ) PURE; \
    753     STDMETHOD_(PHYSICAL_ADDRESS, PhysicalAddress)( THIS ) PURE; \
    754     STDMETHOD_(PADAPTER_OBJECT, GetAdapterObject)( THIS ) PURE; \
    755 \
    756     STDMETHOD_(void, CopyTo)( THIS_ \
    757         IN  PVOID Destination, \
    758         IN  PVOID Source, \
    759         IN  ULONG ByteCount) PURE; \
    760 \
    761     STDMETHOD_(void, CopyFrom)( THIS_ \
    762         IN  PVOID Destination, \
    763         IN  PVOID Source, \
    764         IN  ULONG ByteCount) PURE;
    765 
    766 #define IMP_IDmaChannel                                                   \
    767     STDMETHODIMP_(NTSTATUS) AllocateBuffer(                               \
    768         IN  ULONG BufferSize,                                             \
    769         IN  PPHYSICAL_ADDRESS PhysicalAddressConstraint OPTIONAL);        \
    770                                                                           \
    771     STDMETHODIMP_(void) FreeBuffer(void);                                 \
    772     STDMETHODIMP_(ULONG) TransferCount(void);                             \
    773     STDMETHODIMP_(ULONG) MaximumBufferSize(void);                         \
    774     STDMETHODIMP_(ULONG) AllocatedBufferSize(void);                       \
    775     STDMETHODIMP_(ULONG) BufferSize(void);                                \
    776                                                                           \
    777     STDMETHODIMP_(void) SetBufferSize(                                    \
    778         IN  ULONG BufferSize);                                            \
    779                                                                           \
    780     STDMETHODIMP_(PVOID) SystemAddress(void);                             \
    781     STDMETHODIMP_(PHYSICAL_ADDRESS) PhysicalAddress(void);                \
    782     STDMETHODIMP_(PADAPTER_OBJECT) GetAdapterObject(void);                \
    783                                                                           \
    784     STDMETHODIMP_(void) CopyTo(                                           \
    785         IN  PVOID Destination,                                            \
    786         IN  PVOID Source,                                                 \
    787         IN  ULONG ByteCount);                                             \
    788                                                                           \
    789     STDMETHODIMP_(void) CopyFrom(                                         \
    790         IN  PVOID Destination,                                            \
    791         IN  PVOID Source,                                                 \
    792         IN  ULONG ByteCount)
    793 
    794 #undef INTERFACE
    795 #define INTERFACE IDmaChannel
    796 
    797 DEFINE_GUID(IID_IDmaChannel, 0x22C6AC61L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
    798 
    799 DECLARE_INTERFACE_(IDmaChannel, IUnknown)
    800 {
    801     DEFINE_ABSTRACT_UNKNOWN()
    802     DEFINE_ABSTRACT_DMACHANNEL()
    803 };
    804 
    805 typedef IDmaChannel *PDMACHANNEL;
    806 
    807 
    808 /* ===============================================================
    809     IDmaChannelSlave Interface
    810 */
    811 
    812 #define DEFINE_ABSTRACT_DMACHANNELSLAVE() \
    813     STDMETHOD_(NTSTATUS, Start)( THIS_ \
    814         IN  ULONG MapSize, \
    815         IN  BOOLEAN WriteToDevice) PURE; \
    816 \
    817     STDMETHOD_(NTSTATUS, Stop)( THIS ) PURE; \
    818     STDMETHOD_(ULONG, ReadCounter)( THIS ) PURE; \
    819 \
    820     STDMETHOD_(NTSTATUS, WaitForTC)( THIS_ \
    821         ULONG Timeout) PURE;
    822 
    823 #define IMP_IDmaChannelSlave                   \
    824     IMP_IDmaChannel;                           \
    825     STDMETHODIMP_(NTSTATUS) Start(             \
    826         IN  ULONG MapSize,                     \
    827         IN  BOOLEAN WriteToDevice);            \
    828                                                \
    829     STDMETHODIMP_(NTSTATUS) Stop(void);        \
    830     STDMETHODIMP_(ULONG) ReadCounter(void);    \
    831                                                \
    832     STDMETHODIMP_(NTSTATUS) WaitForTC(         \
    833         ULONG Timeout)
    834 
    835 #undef INTERFACE
    836 #define INTERFACE IDmaChannelSlave
    837 
    838 #if (NTDDI_VERSION < NTDDI_LONGHORN)
    839 DEFINE_GUID(IID_IDmaChannelSlave, 0x22C6AC62L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
    840 #endif
    841 
    842 #undef INTERFACE
    843 #define INTERFACE IDmaChannelSlave
    844 
    845 DECLARE_INTERFACE_(IDmaChannelSlave, IDmaChannel)
    846 {
    847     DEFINE_ABSTRACT_UNKNOWN()
    848     DEFINE_ABSTRACT_DMACHANNEL()
    849     DEFINE_ABSTRACT_DMACHANNELSLAVE()
    850 };
    851 
    852 typedef IDmaChannelSlave *PDMACHANNELSLAVE;
    853 
    854 
    855 /* ===============================================================
    856     IInterruptSync Interface
    857 */
    858 
    859 typedef enum
    860 {
    861     InterruptSyncModeNormal = 1,
    862     InterruptSyncModeAll,
    863     InterruptSyncModeRepeat
    864 } INTERRUPTSYNCMODE;
    865 
    866 struct IInterruptSync;
    867 
    868 typedef NTSTATUS (NTAPI *PINTERRUPTSYNCROUTINE)(
    869     IN  struct IInterruptSync* InterruptSync,
    870     IN  PVOID DynamicContext);
    871 
    872 #undef INTERFACE
    873 #define INTERFACE IInterruptSync
    874 
    875 DECLARE_INTERFACE_(IInterruptSync, IUnknown)
    876 {
    877     DEFINE_ABSTRACT_UNKNOWN()
    878 
    879     STDMETHOD_(NTSTATUS, CallSynchronizedRoutine)( THIS_
    880         IN  PINTERRUPTSYNCROUTINE Routine,
    881         IN  PVOID DynamicContext) PURE;
    882 
    883     STDMETHOD_(PKINTERRUPT, GetKInterrupt)( THIS ) PURE;
    884     STDMETHOD_(NTSTATUS, Connect)( THIS ) PURE;
    885     STDMETHOD_(void, Disconnect)( THIS ) PURE;
    886 
    887     STDMETHOD_(NTSTATUS, RegisterServiceRoutine)( THIS_
    888         IN  PINTERRUPTSYNCROUTINE Routine,
    889         IN  PVOID DynamicContext,
    890         IN  BOOLEAN First) PURE;
    891 };
    892 
    893 DEFINE_GUID(IID_IInterruptSync, 0x22C6AC63L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
    894 
    895 #define IMP_IInterruptSync                           \
    896     STDMETHODIMP_(NTSTATUS) CallSynchronizedRoutine( \
    897         IN  PINTERRUPTSYNCROUTINE Routine,           \
    898         IN  PVOID DynamicContext);                   \
    899                                                      \
    900     STDMETHODIMP_(PKINTERRUPT) GetKInterrupt(void);  \
    901     STDMETHODIMP_(NTSTATUS) Connect(void);           \
    902     STDMETHODIMP_(void) Disconnect(void);            \
    903                                                      \
    904     STDMETHODIMP_(NTSTATUS) RegisterServiceRoutine(  \
    905         IN  PINTERRUPTSYNCROUTINE Routine,           \
    906         IN  PVOID DynamicContext,                    \
    907         IN  BOOLEAN First)
    908 
    909 typedef IInterruptSync *PINTERRUPTSYNC;
    910 
    911 
    912 /* ===============================================================
    913     IRegistryKey Interface
    914 */
    915 
    916 #undef INTERFACE
    917 #define INTERFACE IRegistryKey
    918 
    919 enum
    920 {
    921     GeneralRegistryKey,
    922     DeviceRegistryKey,
    923     DriverRegistryKey,
    924     HwProfileRegistryKey,
    925     DeviceInterfaceRegistryKey
    926 };
    927 
    928 DEFINE_GUID(IID_IRegistryKey, 0xE8DA4302l, 0xF304, 0x11D0, 0x95, 0x8B, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3);
    929 
    930 DECLARE_INTERFACE_(IRegistryKey, IUnknown)
    931 {
    932     DEFINE_ABSTRACT_UNKNOWN()
    933 
    934     STDMETHOD_(NTSTATUS, QueryKey)( THIS_
    935         IN  KEY_INFORMATION_CLASS KeyInformationClass,
    936         OUT PVOID KeyInformation,
    937         IN  ULONG Length,
    938         OUT PULONG ResultLength) PURE;
    939 
    940     STDMETHOD_(NTSTATUS, EnumerateKey)( THIS_
    941         IN  ULONG Index,
    942         IN  KEY_INFORMATION_CLASS KeyInformationClass,
    943         OUT PVOID KeyInformation,
    944         IN  ULONG Length,
    945         OUT PULONG ResultLength) PURE;
    946 
    947     STDMETHOD_(NTSTATUS, QueryValueKey)( THIS_
    948         IN  PUNICODE_STRING ValueName,
    949         IN  KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
    950         OUT PVOID KeyValueInformation,
    951         IN  ULONG Length,
    952         OUT PULONG ResultLength) PURE;
    953 
    954     STDMETHOD_(NTSTATUS, EnumerateValueKey)( THIS_
    955         IN  ULONG Index,
    956         IN  KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
    957         OUT PVOID KeyValueInformation,
    958         IN  ULONG Length,
    959         OUT PULONG ResultLength) PURE;
    960 
    961     STDMETHOD_(NTSTATUS, SetValueKey)( THIS_
    962         IN  PUNICODE_STRING ValueName OPTIONAL,
    963         IN  ULONG Type,
    964         IN  PVOID Data,
    965         IN  ULONG DataSize) PURE;
    966 
    967     STDMETHOD_(NTSTATUS, QueryRegistryValues)( THIS_
    968         IN  PRTL_QUERY_REGISTRY_TABLE QueryTable,
    969         IN  PVOID Context OPTIONAL) PURE;
    970 
    971     STDMETHOD_(NTSTATUS, NewSubKey)( THIS_
    972         OUT IRegistryKey** RegistrySubKey,
    973         IN  PUNKNOWN OuterUnknown,
    974         IN  ACCESS_MASK DesiredAccess,
    975         IN  PUNICODE_STRING SubKeyName,
    976         IN  ULONG CreateOptions,
    977         OUT PULONG Disposition OPTIONAL) PURE;
    978 
    979     STDMETHOD_(NTSTATUS, DeleteKey)( THIS ) PURE;
    980 };
    981 
    982 #define IMP_IRegistryKey \
    983     STDMETHODIMP_(NTSTATUS) QueryKey( \
    984         IN  KEY_INFORMATION_CLASS KeyInformationClass, \
    985         OUT PVOID KeyInformation, \
    986         IN  ULONG Length, \
    987         OUT PULONG ResultLength); \
    988 \
    989     STDMETHODIMP_(NTSTATUS) EnumerateKey( \
    990         IN  ULONG Index, \
    991         IN  KEY_INFORMATION_CLASS KeyInformationClass, \
    992         OUT PVOID KeyInformation, \
    993         IN  ULONG Length, \
    994         OUT PULONG ResultLength); \
    995 \
    996     STDMETHODIMP_(NTSTATUS) QueryValueKey( \
    997         IN  PUNICODE_STRING ValueName, \
    998         IN  KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, \
    999         OUT PVOID KeyValueInformation, \
   1000         IN  ULONG Length, \
   1001         OUT PULONG ResultLength); \
   1002 \
   1003     STDMETHODIMP_(NTSTATUS) EnumerateValueKey( \
   1004         IN  ULONG Index, \
   1005         IN  KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, \
   1006         OUT PVOID KeyValueInformation, \
   1007         IN  ULONG Length, \
   1008         OUT PULONG ResultLength); \
   1009 \
   1010     STDMETHODIMP_(NTSTATUS) SetValueKey( \
   1011         IN  PUNICODE_STRING ValueName OPTIONAL, \
   1012         IN  ULONG Type, \
   1013         IN  PVOID Data, \
   1014         IN  ULONG DataSize); \
   1015 \
   1016     STDMETHODIMP_(NTSTATUS) QueryRegistryValues( \
   1017         IN  PRTL_QUERY_REGISTRY_TABLE QueryTable, \
   1018         IN  PVOID Context OPTIONAL); \
   1019 \
   1020     STDMETHODIMP_(NTSTATUS) NewSubKey( \
   1021         OUT IRegistryKey** RegistrySubKey, \
   1022         IN  PUNKNOWN OuterUnknown, \
   1023         IN  ACCESS_MASK DesiredAccess, \
   1024         IN  PUNICODE_STRING SubKeyName, \
   1025         IN  ULONG CreateOptions, \
   1026         OUT PULONG Disposition OPTIONAL); \
   1027 \
   1028     STDMETHODIMP_(NTSTATUS) DeleteKey(void);
   1029 
   1030 typedef IRegistryKey *PREGISTRYKEY;
   1031 
   1032 
   1033 /* ===============================================================
   1034     IMusicTechnology Interface
   1035 */
   1036 
   1037 DECLARE_INTERFACE_(IMusicTechnology, IUnknown)
   1038 {
   1039     DEFINE_ABSTRACT_UNKNOWN()
   1040 
   1041     STDMETHOD_(NTSTATUS, SetTechnology)( THIS_
   1042         IN  const GUID* Technology) PURE;
   1043 };
   1044 
   1045 #define IMP_IMusicTechnology \
   1046     STDMETHODIMP_(NTSTATUS) SetTechnology( \
   1047         IN  const GUID* Technology);
   1048 
   1049 typedef IMusicTechnology *PMUSICTECHNOLOGY;
   1050 
   1051 
   1052 /* ===============================================================
   1053     IPort Interface
   1054 */
   1055 
   1056 #if 0
   1057 #define STATIC_IPort 0xb4c90a25L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
   1058 DEFINE_GUIDSTRUCT("0xB4C90A25-5791-11d0-86f9-00a0c911b544", IID_IPort);
   1059 #define IID_IPort DEFINE_GUIDNAMED(IID_IPort)
   1060 #endif
   1061 
   1062 DEFINE_GUID(IID_IMiniport,
   1063     0xb4c90a24L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1064 
   1065 DEFINE_GUID(IID_IPort,
   1066     0xb4c90a25L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1067 
   1068 #define DEFINE_ABSTRACT_PORT() \
   1069     STDMETHOD_(NTSTATUS, Init)( THIS_ \
   1070         IN  PDEVICE_OBJECT DeviceObject, \
   1071         IN  PIRP Irp, \
   1072         IN  PUNKNOWN UnknownMiniport, \
   1073         IN  PUNKNOWN UnknownAdapter OPTIONAL, \
   1074         IN  PRESOURCELIST ResourceList) PURE; \
   1075 \
   1076     STDMETHOD_(NTSTATUS, GetDeviceProperty)( THIS_ \
   1077         IN  DEVICE_REGISTRY_PROPERTY DeviceProperty, \
   1078         IN  ULONG BufferLength, \
   1079         OUT PVOID PropertyBuffer, \
   1080         OUT PULONG ResultLength) PURE; \
   1081 \
   1082     STDMETHOD_(NTSTATUS, NewRegistryKey)( THIS_ \
   1083         OUT PREGISTRYKEY* OutRegistryKey, \
   1084         IN  PUNKNOWN OuterUnknown OPTIONAL, \
   1085         IN  ULONG RegistryKeyType, \
   1086         IN  ACCESS_MASK DesiredAccess, \
   1087         IN  POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, \
   1088         IN  ULONG CreateOptiona OPTIONAL, \
   1089         OUT PULONG Disposition OPTIONAL) PURE;
   1090 
   1091 #ifdef PC_IMPLEMENTATION
   1092 #define IMP_IPort\
   1093     STDMETHODIMP_(NTSTATUS) Init\
   1094     (   IN      PDEVICE_OBJECT  DeviceObject,\
   1095         IN      PIRP            Irp,\
   1096         IN      PUNKNOWN        UnknownMiniport,\
   1097         IN      PUNKNOWN        UnknownAdapter      OPTIONAL,\
   1098         IN      PRESOURCELIST   ResourceList\
   1099     );\
   1100     STDMETHODIMP_(NTSTATUS) GetDeviceProperty\
   1101     (   IN      DEVICE_REGISTRY_PROPERTY    DeviceProperty,\
   1102         IN      ULONG                       BufferLength,\
   1103         OUT     PVOID                       PropertyBuffer,\
   1104         OUT     PULONG                      ResultLength\
   1105     );\
   1106     STDMETHODIMP_(NTSTATUS) NewRegistryKey\
   1107     (   OUT     PREGISTRYKEY *      OutRegistryKey,\
   1108         IN      PUNKNOWN            OuterUnknown        OPTIONAL,\
   1109         IN      ULONG               RegistryKeyType,\
   1110         IN      ACCESS_MASK         DesiredAccess,\
   1111         IN      POBJECT_ATTRIBUTES  ObjectAttributes    OPTIONAL,\
   1112         IN      ULONG               CreateOptions       OPTIONAL,\
   1113         OUT     PULONG              Disposition         OPTIONAL\
   1114     )
   1115 #endif
   1116 
   1117 #undef INTERFACE
   1118 #define INTERFACE IPort
   1119 
   1120 DECLARE_INTERFACE_(IPort, IUnknown)
   1121 {
   1122     DEFINE_ABSTRACT_UNKNOWN()
   1123     DEFINE_ABSTRACT_PORT()
   1124 };
   1125 
   1126 typedef IPort *PPORT;
   1127 
   1128 
   1129 /* ===============================================================
   1130     IPortMidi Interface
   1131 */
   1132 
   1133 DEFINE_GUID(IID_IPortMidi,
   1134     0xb4c90a40L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1135 DEFINE_GUID(CLSID_PortMidi,
   1136     0xb4c90a43L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1137 
   1138 #undef INTERFACE
   1139 #define INTERFACE IPortMidi
   1140 
   1141 DECLARE_INTERFACE_(IPortMidi, IPort)
   1142 {
   1143     DEFINE_ABSTRACT_UNKNOWN()
   1144     DEFINE_ABSTRACT_PORT()
   1145 
   1146     STDMETHOD_(VOID, Notify)(THIS_
   1147         IN  PSERVICEGROUP ServiceGroup OPTIONAL) PURE;
   1148 
   1149     STDMETHOD_(NTSTATUS, RegisterServiceGroup)(THIS_
   1150         IN  PSERVICEGROUP ServiceGroup) PURE;
   1151 };
   1152 
   1153 typedef IPortMidi *PPORTMIDI;
   1154 
   1155 #define IMP_IPortMidi() \
   1156     STDMETHODIMP_(VOID) Notify( \
   1157         IN  PSERVICEGROUP ServiceGroup OPTIONAL); \
   1158 \
   1159     STDMETHODIMP_(NTSTATUS) RegisterServiceGroup( \
   1160         IN  PSERVICEGROUP ServiceGroup);
   1161 
   1162 #undef INTERFACE
   1163 
   1164 /* ===============================================================
   1165     IPortWaveCyclic Interface
   1166 */
   1167 
   1168 DEFINE_GUID(IID_IPortWaveCyclic,
   1169     0xb4c90a26L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1170 DEFINE_GUID(CLSID_PortWaveCyclic,
   1171     0xb4c90a2aL, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1172 
   1173 #define INTERFACE IPortWaveCyclic
   1174 
   1175 DECLARE_INTERFACE_(IPortWaveCyclic, IPort)
   1176 {
   1177     DEFINE_ABSTRACT_UNKNOWN()
   1178 
   1179     DEFINE_ABSTRACT_PORT()
   1180 
   1181     STDMETHOD_(VOID, Notify)(THIS_
   1182         IN  PSERVICEGROUP ServiceGroup) PURE;
   1183 
   1184     STDMETHOD_(NTSTATUS, NewSlaveDmaChannel)(THIS_
   1185         OUT PDMACHANNELSLAVE* DmaChannel,
   1186         IN  PUNKNOWN OuterUnknown,
   1187         IN  PRESOURCELIST ResourceList OPTIONAL,
   1188         IN  ULONG DmaIndex,
   1189         IN  ULONG MaximumLength,
   1190         IN  BOOLEAN DemandMode,
   1191         IN  DMA_SPEED DmaSpeed) PURE;
   1192 
   1193     STDMETHOD_(NTSTATUS, NewMasterDmaChannel)(THIS_
   1194         OUT PDMACHANNEL* DmaChannel,
   1195         IN  PUNKNOWN OuterUnknown,
   1196         IN  PRESOURCELIST ResourceList OPTIONAL,
   1197         IN  ULONG MaximumLength,
   1198         IN  BOOLEAN Dma32BitAddresses,
   1199         IN  BOOLEAN Dma64BitAddresses,
   1200         IN  DMA_WIDTH DmaWidth,
   1201         IN  DMA_SPEED DmaSpeed) PURE;
   1202 
   1203 };
   1204 
   1205 typedef IPortWaveCyclic *PPORTWAVECYCLIC;
   1206 
   1207 #ifdef PC_IMPLEMENTATION
   1208 #define IMP_IPortWaveCyclic                           \
   1209     IMP_IPort;                                        \
   1210     STDMETHODIMP_(VOID) Notify(                       \
   1211         IN  PSERVICEGROUP ServiceGroup);              \
   1212                                                       \
   1213     STDMETHODIMP_(NTSTATUS) NewSlaveDmaChannel(       \
   1214         OUT PDMACHANNELSLAVE* DmaChannel,             \
   1215         IN  PUNKNOWN OuterUnknown,                    \
   1216         IN  PRESOURCELIST ResourceList OPTIONAL,      \
   1217         IN  ULONG DmaIndex,                           \
   1218         IN  ULONG MaximumLength,                      \
   1219         IN  BOOLEAN DemandMode,                       \
   1220         IN  DMA_SPEED DmaSpeed);                      \
   1221                                                       \
   1222     STDMETHODIMP_(NTSTATUS) NewMasterDmaChannel(      \
   1223         OUT PDMACHANNEL* DmaChannel,                  \
   1224         IN  PUNKNOWN OuterUnknown,                    \
   1225         IN  PRESOURCELIST ResourceList OPTIONAL,      \
   1226         IN  ULONG MaximumLength,                      \
   1227         IN  BOOLEAN Dma32BitAddresses,                \
   1228         IN  BOOLEAN Dma64BitAddresses,                \
   1229         IN  DMA_WIDTH DmaWidth,                       \
   1230         IN  DMA_SPEED DmaSpeed)
   1231 #endif
   1232 
   1233 
   1234 #undef INTERFACE
   1235 /* ===============================================================
   1236     IPortWavePci Interface
   1237 */
   1238 #undef INTERFACE
   1239 #define INTERFACE IPortWavePci
   1240 
   1241 DEFINE_GUID(IID_IPortWavePci,
   1242     0xb4c90a50L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1243 DEFINE_GUID(CLSID_PortWavePci,
   1244     0xb4c90a54L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1245 
   1246 DECLARE_INTERFACE_(IPortWavePci, IPort)
   1247 {
   1248     DEFINE_ABSTRACT_UNKNOWN()
   1249     DEFINE_ABSTRACT_PORT()
   1250 
   1251     STDMETHOD_(VOID, Notify)(THIS_
   1252         IN  PSERVICEGROUP ServiceGroup) PURE;
   1253 
   1254     STDMETHOD_(NTSTATUS, NewMasterDmaChannel)(THIS_
   1255         OUT PDMACHANNEL* DmaChannel,
   1256         IN  PUNKNOWN OuterUnknown,
   1257         IN  POOL_TYPE PoolType,
   1258         IN  PRESOURCELIST ResourceList OPTIONAL,
   1259         IN  BOOLEAN ScatterGather,
   1260         IN  BOOLEAN Dma32BitAddresses,
   1261         IN  BOOLEAN Dma64BitAddresses,
   1262         IN  BOOLEAN IgnoreCount,
   1263         IN  DMA_WIDTH DmaWidth,
   1264         IN  DMA_SPEED DmaSpeed,
   1265         IN  ULONG MaximumLength,
   1266         IN  ULONG DmaPort) PURE;
   1267 };
   1268 
   1269 typedef IPortWavePci *PPORTWAVEPCI;
   1270 #undef INTERFACE
   1271 
   1272 #ifdef PC_IMPLEMENTATION
   1273 #define IMP_IPortWavePci                                     \
   1274     IMP_IPort;                                               \
   1275     STDMETHODIMP_(VOID) Notify(                              \
   1276         IN  PSERVICEGROUP ServiceGroup);                     \
   1277                                                              \
   1278     STDMETHODIMP_(NTSTATUS) NewMasterDmaChannel(             \
   1279         OUT PDMACHANNEL* DmaChannel,                         \
   1280         IN  PUNKNOWN OuterUnknown,                           \
   1281         IN  POOL_TYPE PoolType,                              \
   1282         IN  PRESOURCELIST ResourceList OPTIONAL,             \
   1283         IN  BOOLEAN ScatterGather,                           \
   1284         IN  BOOLEAN Dma32BitAddresses,                       \
   1285         IN  BOOLEAN Dma64BitAddresses,                       \
   1286         IN  BOOLEAN IgnoreCount,                             \
   1287         IN  DMA_WIDTH DmaWidth,                              \
   1288         IN  DMA_SPEED DmaSpeed,                              \
   1289         IN  ULONG MaximumLength,                             \
   1290         IN  ULONG DmaPort);
   1291 #endif
   1292 
   1293 /* ===============================================================
   1294     IMiniPort Interface
   1295 */
   1296 
   1297 DEFINE_GUID(IID_IMiniPort,
   1298     0xb4c90a24L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1299 
   1300 #define DEFINE_ABSTRACT_MINIPORT() \
   1301     STDMETHOD_(NTSTATUS, GetDescription)( THIS_ \
   1302         OUT  PPCFILTER_DESCRIPTOR* Description) PURE; \
   1303 \
   1304     STDMETHOD_(NTSTATUS, DataRangeIntersection)( THIS_ \
   1305         IN  ULONG PinId, \
   1306         IN  PKSDATARANGE DataRange, \
   1307         IN  PKSDATARANGE MatchingDataRange, \
   1308         IN  ULONG OutputBufferLength, \
   1309         OUT PVOID ResultantFormat OPTIONAL, \
   1310         OUT PULONG ResultantFormatLength) PURE;
   1311 
   1312 #define IMP_IMiniport                                        \
   1313     STDMETHODIMP_(NTSTATUS) GetDescription(                  \
   1314         OUT  PPCFILTER_DESCRIPTOR* Description);             \
   1315                                                              \
   1316     STDMETHODIMP_(NTSTATUS) DataRangeIntersection(           \
   1317         IN  ULONG PinId,                                     \
   1318         IN  PKSDATARANGE DataRange,                          \
   1319         IN  PKSDATARANGE MatchingDataRange,                  \
   1320         IN  ULONG OutputBufferLength,                        \
   1321         OUT PVOID ResultantFormat OPTIONAL,                  \
   1322         OUT PULONG ResultantFormatLength)
   1323 
   1324 DECLARE_INTERFACE_(IMiniport, IUnknown)
   1325 {
   1326     DEFINE_ABSTRACT_UNKNOWN()
   1327     DEFINE_ABSTRACT_MINIPORT()
   1328 };
   1329 
   1330 typedef IMiniport *PMINIPORT;
   1331 
   1332 
   1333 /* ===============================================================
   1334     IMiniportMidiStream Interface
   1335 */
   1336 #undef INTERFACE
   1337 #define INTERFACE IMiniportMidiStream
   1338 
   1339 DEFINE_GUID(IID_IMiniportMidiStream,
   1340     0xb4c90a42L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1341 
   1342 DECLARE_INTERFACE_(IMiniportMidiStream, IUnknown)
   1343 {
   1344     DEFINE_ABSTRACT_UNKNOWN()
   1345 
   1346     STDMETHOD_(NTSTATUS,SetFormat)(THIS_
   1347         IN PKSDATAFORMAT DataFormat)PURE;
   1348 
   1349     STDMETHOD_(NTSTATUS,SetState)(THIS_
   1350         IN KSSTATE State)PURE;
   1351 
   1352     STDMETHOD_(NTSTATUS,Read)(THIS_
   1353         IN PVOID BufferAddress,
   1354         IN ULONG BufferLength,
   1355         OUT PULONG BytesRead)PURE;
   1356 
   1357     STDMETHOD_(NTSTATUS,Write)(THIS_
   1358         IN PVOID BufferAddress,
   1359         IN ULONG BytesToWrite,
   1360         OUT PULONG BytesWritten)PURE;
   1361 };
   1362 
   1363 typedef IMiniportMidiStream* PMINIPORTMIDISTREAM;
   1364 #undef INTERFACE
   1365 
   1366 /* ===============================================================
   1367     IMiniportMidi Interface
   1368 */
   1369 #undef INTERFACE
   1370 #define INTERFACE IMiniportMidi
   1371 
   1372 DEFINE_GUID(IID_IMiniportMidi,
   1373     0xb4c90a41L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1374 
   1375 DECLARE_INTERFACE_(IMiniportMidi, IMiniport)
   1376 {
   1377     DEFINE_ABSTRACT_UNKNOWN()
   1378     DEFINE_ABSTRACT_MINIPORT()
   1379 
   1380     STDMETHOD_(NTSTATUS, Init)(THIS_
   1381     IN  PUNKNOWN UnknownAdapter,
   1382     IN  PRESOURCELIST ResourceList,
   1383     IN  PPORTMIDI Port,
   1384     OUT PSERVICEGROUP* ServiceGroup) PURE;
   1385 
   1386     STDMETHOD_(void, Service)(THIS) PURE;
   1387 
   1388     STDMETHOD_(NTSTATUS, NewStream)(THIS_
   1389         OUT PMINIPORTMIDISTREAM *Stream,
   1390         IN  PUNKNOWN OuterUnknown OPTIONAL,
   1391         IN  POOL_TYPE PoolType,
   1392         IN  ULONG Pin,
   1393         IN  BOOLEAN Capture,
   1394         IN  PKSDATAFORMAT DataFormat,
   1395         OUT PSERVICEGROUP* ServiceGroup) PURE;
   1396 
   1397 };
   1398 
   1399 typedef IMiniportMidi *PMINIPORTMIDI;
   1400 #undef INTERFACE
   1401 
   1402 /* ===============================================================
   1403     IMiniportDriverUart Interface
   1404 */
   1405 
   1406 DEFINE_GUID(IID_MiniportDriverUart,
   1407     0xb4c90ae1L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1408 DEFINE_GUID(CLSID_MiniportDriverUart,
   1409     0xb4c90ae1L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1410 
   1411 /* ===============================================================
   1412     IPortTopology Interface
   1413 */
   1414 #if 0
   1415 #define STATIC_IPortTopology \
   1416     0xb4c90a30L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
   1417 DEFINE_GUIDSTRUCT("0xB4C90A30-5791-11d0-86f9-00a0c911b544", IID_IPortTopology);
   1418 #define IID_IPortTopology DEFINE_GUIDNAMED(IID_IPortTopology)
   1419 #endif
   1420 
   1421 #undef INTERFACE
   1422 #define INTERFACE IPortTopology
   1423 
   1424 DEFINE_GUID(IID_IPortTopology, 0xb4c90a30L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1425 DEFINE_GUID(CLSID_PortTopology, 0xb4c90a32L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1426 
   1427 #undef INTERFACE
   1428 #define INTERFACE IPortTopology
   1429 
   1430 DECLARE_INTERFACE_(IPortTopology, IPort)
   1431 {
   1432     DEFINE_ABSTRACT_UNKNOWN()
   1433     DEFINE_ABSTRACT_PORT()
   1434 };
   1435 
   1436 typedef IPortTopology *PPORTTOPOLOGY;
   1437 
   1438 #define IMP_IPortTopology IMP_IPort
   1439 
   1440 
   1441 /* ===============================================================
   1442     IMiniportTopology Interface
   1443 */
   1444 
   1445 #undef INTERFACE
   1446 #define INTERFACE IMiniportTopology
   1447 
   1448 DEFINE_GUID(IID_IMiniportTopology, 0xb4c90a31L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1449 
   1450 #undef INTERFACE
   1451 #define INTERFACE IMiniportTopology
   1452 
   1453 DECLARE_INTERFACE_(IMiniportTopology,IMiniport)
   1454 {
   1455     DEFINE_ABSTRACT_UNKNOWN()
   1456     DEFINE_ABSTRACT_MINIPORT()
   1457 
   1458     STDMETHOD_(NTSTATUS,Init)(THIS_
   1459         IN PUNKNOWN UnknownAdapter,
   1460         IN PRESOURCELIST ResourceList,
   1461         IN PPORTTOPOLOGY Port)PURE;
   1462 };
   1463 
   1464 typedef IMiniportTopology *PMINIPORTTOPOLOGY;
   1465 
   1466 /* ===============================================================
   1467     IMiniportWaveCyclicStream Interface
   1468 */
   1469 
   1470 #undef INTERFACE
   1471 #define INTERFACE IMiniportWaveCyclicStream
   1472 
   1473 DEFINE_GUID(IID_IMiniportWaveCyclicStream,
   1474 0xb4c90a28L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1475 
   1476 DECLARE_INTERFACE_(IMiniportWaveCyclicStream,IUnknown)
   1477 {
   1478     DEFINE_ABSTRACT_UNKNOWN()
   1479 
   1480     STDMETHOD_(NTSTATUS,SetFormat)(THIS_
   1481         IN PKSDATAFORMAT DataFormat)PURE;
   1482 
   1483     STDMETHOD_(ULONG,SetNotificationFreq)(THIS_
   1484         IN ULONG Interval,
   1485         OUT PULONG FrameSize) PURE;
   1486 
   1487     STDMETHOD_(NTSTATUS,SetState)(THIS_
   1488         IN KSSTATE State) PURE;
   1489 
   1490     STDMETHOD_(NTSTATUS,GetPosition)( THIS_
   1491         OUT PULONG Position) PURE;
   1492 
   1493     STDMETHOD_(NTSTATUS,NormalizePhysicalPosition)(THIS_
   1494         IN OUT PLONGLONG PhysicalPosition) PURE;
   1495 
   1496     STDMETHOD_(void, Silence)( THIS_
   1497         IN PVOID Buffer,
   1498         IN ULONG ByteCount) PURE;
   1499 };
   1500 
   1501 typedef IMiniportWaveCyclicStream *PMINIPORTWAVECYCLICSTREAM;
   1502 
   1503 #define IMP_IMiniportWaveCyclicStream\
   1504     STDMETHODIMP_(NTSTATUS) SetFormat\
   1505     (   IN      PKSDATAFORMAT   DataFormat\
   1506     );\
   1507     STDMETHODIMP_(ULONG) SetNotificationFreq\
   1508     (   IN      ULONG           Interval,\
   1509         OUT     PULONG          FrameSize\
   1510     );\
   1511     STDMETHODIMP_(NTSTATUS) SetState\
   1512     (   IN      KSSTATE         State\
   1513     );\
   1514     STDMETHODIMP_(NTSTATUS) GetPosition\
   1515     (   OUT     PULONG          Position\
   1516     );\
   1517     STDMETHODIMP_(NTSTATUS) NormalizePhysicalPosition\
   1518     (   IN OUT PLONGLONG        PhysicalPosition\
   1519     );\
   1520     STDMETHODIMP_(void) Silence\
   1521     (   IN      PVOID           Buffer,\
   1522         IN      ULONG           ByteCount\
   1523     )
   1524 
   1525 
   1526 /* ===============================================================
   1527     IMiniportWaveCyclic Interface
   1528 */
   1529 #undef INTERFACE
   1530 
   1531 DEFINE_GUID(IID_IMiniportWaveCyclic,
   1532     0xb4c90a27L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1533 
   1534 #define INTERFACE IMiniportWaveCyclic
   1535 
   1536 DECLARE_INTERFACE_(IMiniportWaveCyclic, IMiniport)
   1537 {
   1538     DEFINE_ABSTRACT_UNKNOWN()
   1539     DEFINE_ABSTRACT_MINIPORT()
   1540 
   1541     STDMETHOD_(NTSTATUS, Init)(THIS_
   1542         IN PUNKNOWN  UnknownAdapter,
   1543         IN PRESOURCELIST  ResourceList,
   1544         IN PPORTWAVECYCLIC  Port) PURE;
   1545 
   1546     STDMETHOD_(NTSTATUS, NewStream)(THIS_
   1547         OUT PMINIPORTWAVECYCLICSTREAM  *Stream,
   1548         IN PUNKNOWN  OuterUnknown  OPTIONAL,
   1549         IN POOL_TYPE  PoolType,
   1550         IN ULONG  Pin,
   1551         IN BOOLEAN  Capture,
   1552         IN PKSDATAFORMAT  DataFormat,
   1553         OUT PDMACHANNEL  *DmaChannel,
   1554         OUT PSERVICEGROUP  *ServiceGroup) PURE;
   1555 };
   1556 
   1557 typedef IMiniportWaveCyclic *PMINIPORTWAVECYCLIC;
   1558 #undef INTERFACE
   1559 
   1560 #define IMP_IMiniportWaveCyclic\
   1561     IMP_IMiniport;\
   1562     STDMETHODIMP_(NTSTATUS) Init\
   1563     (   IN      PUNKNOWN        UnknownAdapter,\
   1564         IN      PRESOURCELIST   ResourceList,\
   1565         IN      PPORTWAVECYCLIC Port\
   1566     );\
   1567     STDMETHODIMP_(NTSTATUS) NewStream\
   1568     (   OUT     PMINIPORTWAVECYCLICSTREAM * Stream,\
   1569         IN      PUNKNOWN                    OuterUnknown    OPTIONAL,\
   1570         IN      POOL_TYPE                   PoolType,\
   1571         IN      ULONG                       Pin,\
   1572         IN      BOOLEAN                     Capture,\
   1573         IN      PKSDATAFORMAT               DataFormat,\
   1574         OUT     PDMACHANNEL *               DmaChannel,\
   1575         OUT     PSERVICEGROUP *             ServiceGroup\
   1576     )
   1577 
   1578 
   1579 /* ===============================================================
   1580     IPortWavePciStream Interface
   1581 */
   1582 #undef INTERFACE
   1583 #define INTERFACE IPortWavePciStream
   1584 
   1585 DEFINE_GUID(IID_IPortWavePciStream, 0xb4c90a51L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1586 
   1587 DECLARE_INTERFACE_(IPortWavePciStream,IUnknown)
   1588 {
   1589     DEFINE_ABSTRACT_UNKNOWN()   //  For IUnknown
   1590 
   1591     STDMETHOD_(NTSTATUS,GetMapping)(THIS_
   1592         IN PVOID Tag,
   1593         OUT PPHYSICAL_ADDRESS PhysicalAddress,
   1594         OUT PVOID * VirtualAddress,
   1595         OUT PULONG ByteCount,
   1596         OUT PULONG Flags)PURE;
   1597 
   1598     STDMETHOD_(NTSTATUS,ReleaseMapping)(THIS_
   1599         IN PVOID Tag)PURE;
   1600 
   1601     STDMETHOD_(NTSTATUS,TerminatePacket)(THIS)PURE;
   1602 };
   1603 
   1604 typedef IPortWavePciStream *PPORTWAVEPCISTREAM;
   1605 
   1606 #define IMP_IPortWavePciStream                             \
   1607     STDMETHODIMP_(NTSTATUS) GetMapping(                    \
   1608         IN PVOID Tag,                                      \
   1609         OUT PPHYSICAL_ADDRESS PhysicalAddress,             \
   1610         OUT PVOID * VirtualAddress,                        \
   1611         OUT PULONG ByteCount,                              \
   1612         OUT PULONG Flags);                                 \
   1613                                                            \
   1614     STDMETHODIMP_(NTSTATUS) ReleaseMapping(                \
   1615         IN PVOID Tag);                                     \
   1616                                                            \
   1617     STDMETHODIMP_(NTSTATUS) TerminatePacket(THIS)
   1618 
   1619 
   1620 /* ===============================================================
   1621     IMiniportWavePciStream Interface
   1622 */
   1623 #undef INTERFACE
   1624 #define INTERFACE IMiniportWavePciStream
   1625 
   1626 DEFINE_GUID(IID_IMiniportWavePciStream, 0xb4c90a53L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1627 
   1628 DECLARE_INTERFACE_(IMiniportWavePciStream,IUnknown)
   1629 {
   1630     DEFINE_ABSTRACT_UNKNOWN()
   1631 
   1632     STDMETHOD_(NTSTATUS,SetFormat)(THIS_
   1633         IN PKSDATAFORMAT DataFormat)PURE;
   1634 
   1635     STDMETHOD_(NTSTATUS,SetState)(THIS_
   1636         IN KSSTATE State)PURE;
   1637 
   1638     STDMETHOD_(NTSTATUS,GetPosition)(THIS_
   1639         OUT PULONGLONG Position)PURE;
   1640 
   1641     STDMETHOD_(NTSTATUS,NormalizePhysicalPosition)(THIS_
   1642         IN OUT PLONGLONG PhysicalPosition)PURE;
   1643 
   1644     STDMETHOD_(NTSTATUS,GetAllocatorFraming)(THIS_
   1645         OUT PKSALLOCATOR_FRAMING AllocatorFraming) PURE;
   1646 
   1647     STDMETHOD_(NTSTATUS,RevokeMappings)(THIS_
   1648         IN PVOID FirstTag,
   1649         IN PVOID LastTag,
   1650         OUT PULONG MappingsRevoked)PURE;
   1651 
   1652     STDMETHOD_(void,MappingAvailable)(THIS)PURE;
   1653 
   1654     STDMETHOD_(void,Service)(THIS)PURE;
   1655 };
   1656 
   1657 typedef IMiniportWavePciStream *PMINIPORTWAVEPCISTREAM;
   1658 
   1659 /* ===============================================================
   1660     IMiniportWavePci Interface
   1661 */
   1662 #undef INTERFACE
   1663 #define INTERFACE IMiniportWavePci
   1664 
   1665 DEFINE_GUID(IID_IMiniportWavePci, 0xb4c90a52L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
   1666 
   1667 DECLARE_INTERFACE_(IMiniportWavePci,IMiniport)
   1668 {
   1669     DEFINE_ABSTRACT_UNKNOWN()
   1670 
   1671     DEFINE_ABSTRACT_MINIPORT()
   1672 
   1673     STDMETHOD_(NTSTATUS,Init)(THIS_
   1674         IN PUNKNOWN UnknownAdapter,
   1675         IN PRESOURCELIST ResourceList,
   1676         IN PPORTWAVEPCI Port,
   1677         OUT PSERVICEGROUP * ServiceGroup)PURE;
   1678 
   1679     STDMETHOD_(NTSTATUS,NewStream)(THIS_
   1680         OUT PMINIPORTWAVEPCISTREAM *    Stream,
   1681         IN PUNKNOWN OuterUnknown    OPTIONAL,
   1682         IN POOL_TYPE PoolType,
   1683         IN PPORTWAVEPCISTREAM PortStream,
   1684         IN ULONG Pin,
   1685         IN BOOLEAN Capture,
   1686         IN PKSDATAFORMAT DataFormat,
   1687         OUT PDMACHANNEL * DmaChannel,
   1688         OUT PSERVICEGROUP * ServiceGroup)PURE;
   1689 
   1690     STDMETHOD_(void,Service)(THIS)PURE;
   1691 };
   1692 
   1693 typedef IMiniportWavePci *PMINIPORTWAVEPCI;
   1694 
   1695 
   1696 #if !defined(DEFINE_ABSTRACT_MINIPORTWAVERTSTREAM)
   1697 
   1698 #define DEFINE_ABSTRACT_MINIPORTWAVERTSTREAM()                 \
   1699     STDMETHOD_(NTSTATUS,SetFormat)                             \
   1700     (   THIS_                                                  \
   1701         IN      PKSDATAFORMAT   DataFormat                   \
   1702     )   PURE;                                                  \
   1703     STDMETHOD_(NTSTATUS,SetState)                              \
   1704     (   THIS_                                                  \
   1705         IN      KSSTATE         State                        \
   1706     )   PURE;                                                  \
   1707     STDMETHOD_(NTSTATUS,GetPosition)                           \
   1708     (   THIS_                                                  \
   1709         OUT     PKSAUDIO_POSITION   Position                 \
   1710     )   PURE;                                                  \
   1711     STDMETHOD_(NTSTATUS,AllocateAudioBuffer)                   \
   1712     (   THIS_                                                  \
   1713         IN  ULONG                   RequestedSize,           \
   1714         OUT PMDL                    *AudioBufferMdl,         \
   1715         OUT ULONG                   *ActualSize,             \
   1716         OUT ULONG                   *OffsetFromFirstPage,    \
   1717         OUT MEMORY_CACHING_TYPE     *CacheType               \
   1718     ) PURE;                                                    \
   1719     STDMETHOD_(VOID,FreeAudioBuffer)                           \
   1720     (   THIS_                                                  \
   1721         IN     PMDL                    AudioBufferMdl,          \
   1722         IN     ULONG                   BufferSize               \
   1723     ) PURE;                                                    \
   1724     STDMETHOD_(VOID,GetHWLatency)                              \
   1725     (   THIS_                                                  \
   1726         OUT KSRTAUDIO_HWLATENCY     *hwLatency               \
   1727     ) PURE;                                                    \
   1728     STDMETHOD_(NTSTATUS,GetPositionRegister)                   \
   1729     (   THIS_                                                  \
   1730         OUT KSRTAUDIO_HWREGISTER    *Register                \
   1731     ) PURE;                                                    \
   1732     STDMETHOD_(NTSTATUS,GetClockRegister)                      \
   1733     (   THIS_                                                  \
   1734         OUT KSRTAUDIO_HWREGISTER    *Register                \
   1735     ) PURE;
   1736 
   1737 #endif
   1738 
   1739 
   1740 /* ===============================================================
   1741     IAdapterPowerManagement Interface
   1742 */
   1743 
   1744 #if (NTDDI_VERSION >= NTDDI_VISTA)
   1745 /* ===============================================================
   1746     IPortWaveRT Interface
   1747 */
   1748 
   1749 DEFINE_GUID(CLSID_PortWaveRT, 0xcc9be57a, 0xeb9e, 0x42b4, 0x94, 0xfc, 0xc, 0xad, 0x3d, 0xbc, 0xe7, 0xfa);
   1750 DEFINE_GUID(IID_IPortWaveRT, 0x339ff909, 0x68a9, 0x4310, 0xb0, 0x9b, 0x27, 0x4e, 0x96, 0xee, 0x4c, 0xbd);
   1751 
   1752 #undef INTERFACE
   1753 #define INTERFACE IPortWaveRT
   1754 
   1755 DECLARE_INTERFACE_(IPortWaveRT,IPort)
   1756 {
   1757     DEFINE_ABSTRACT_UNKNOWN()   //  For IUnknown
   1758 
   1759     DEFINE_ABSTRACT_PORT()      //  For IPort
   1760 };
   1761 
   1762 typedef IPortWaveRT *PPORTWAVERT;
   1763 
   1764 #ifdef PC_IMPLEMENTATION
   1765 #define IMP_IPortWaveRT IMP_IPort
   1766 #endif
   1767 
   1768 
   1769 /* ===============================================================
   1770     IPortWaveRTStream Interface
   1771 */
   1772 
   1773 #undef INTERFACE
   1774 #define INTERFACE IPortWaveRTStream
   1775 
   1776 DEFINE_GUID(IID_IPortWaveRTStream, 0x1809ce5a, 0x64bc, 0x4e62, 0xbd, 0x7d, 0x95, 0xbc, 0xe4, 0x3d, 0xe3, 0x93);
   1777 
   1778 DECLARE_INTERFACE_(IPortWaveRTStream, IUnknown)
   1779 {
   1780     DEFINE_ABSTRACT_UNKNOWN()
   1781 
   1782     STDMETHOD_(PMDL, AllocatePagesForMdl)
   1783     (   THIS_
   1784         IN      PHYSICAL_ADDRESS    HighAddress,
   1785         IN      SIZE_T              TotalBytes
   1786     )   PURE;
   1787 
   1788     STDMETHOD_(PMDL, AllocateContiguousPagesForMdl)
   1789     (   THIS_
   1790         IN      PHYSICAL_ADDRESS    LowAddress,
   1791         IN      PHYSICAL_ADDRESS    HighAddress,
   1792         IN      SIZE_T              TotalBytes
   1793     )   PURE;
   1794 
   1795     STDMETHOD_(PVOID, MapAllocatedPages)
   1796     (   THIS_
   1797         IN      PMDL                    MemoryDescriptorList,
   1798         IN      MEMORY_CACHING_TYPE     CacheType
   1799     )   PURE;
   1800 
   1801     STDMETHOD_(VOID, UnmapAllocatedPages)
   1802     (   THIS_
   1803         IN      PVOID   BaseAddress,
   1804         IN      PMDL    MemoryDescriptorList
   1805     )   PURE;
   1806 
   1807     STDMETHOD_(VOID, FreePagesFromMdl)
   1808     (   THIS_
   1809         IN      PMDL    MemoryDescriptorList
   1810     )   PURE;
   1811 
   1812     STDMETHOD_(ULONG, GetPhysicalPagesCount)
   1813     (   THIS_
   1814         IN      PMDL    MemoryDescriptorList
   1815     )   PURE;
   1816 
   1817     STDMETHOD_(PHYSICAL_ADDRESS, GetPhysicalPageAddress)
   1818     (   THIS_
   1819         IN      PMDL    MemoryDescriptorList,
   1820         IN      ULONG   Index
   1821     )   PURE;
   1822 };
   1823 
   1824 typedef IPortWaveRTStream *PPORTWAVERTSTREAM;
   1825 
   1826 
   1827 /* ===============================================================
   1828     IMiniportWaveRTStream Interface
   1829 */
   1830 
   1831 #undef INTERFACE
   1832 #define INTERFACE IMiniportWaveRTStream
   1833 
   1834 DEFINE_GUID(IID_IMiniportWaveRTStream, 0xac9ab, 0xfaab, 0x4f3d, 0x94, 0x55, 0x6f, 0xf8, 0x30, 0x6a, 0x74, 0xa0);
   1835 
   1836 DECLARE_INTERFACE_(IMiniportWaveRTStream, IUnknown)
   1837 {
   1838     DEFINE_ABSTRACT_UNKNOWN()
   1839     DEFINE_ABSTRACT_MINIPORTWAVERTSTREAM()
   1840 };
   1841 
   1842 typedef IMiniportWaveRTStream *PMINIPORTWAVERTSTREAM;
   1843 
   1844 #define IMP_IMiniportWaveRTStream\
   1845     STDMETHODIMP_(NTSTATUS) SetFormat\
   1846     (   IN      PKSDATAFORMAT   DataFormat\
   1847     );\
   1848     STDMETHODIMP_(NTSTATUS) SetState\
   1849     (   IN      KSSTATE         State\
   1850     );\
   1851     STDMETHODIMP_(NTSTATUS) GetPosition\
   1852     (   OUT     PKSAUDIO_POSITION   Position\
   1853     );\
   1854     STDMETHODIMP_(NTSTATUS) AllocateAudioBuffer\
   1855     (\
   1856         IN      ULONG                   RequestedSize,\
   1857         OUT     PMDL                    *AudioBufferMdl,\
   1858         OUT     ULONG                   *ActualSize,\
   1859         OUT     ULONG                   *OffsetFromFirstPage,\
   1860         OUT     MEMORY_CACHING_TYPE     *CacheType\
   1861     );\
   1862     STDMETHODIMP_(VOID) FreeAudioBuffer\
   1863     (\
   1864         IN  PMDL                    AudioBufferMdl,\
   1865         IN  ULONG                   BufferSize\
   1866     );\
   1867     STDMETHODIMP_(VOID) GetHWLatency\
   1868     (\
   1869         OUT KSRTAUDIO_HWLATENCY     *hwLatency\
   1870     );\
   1871     STDMETHODIMP_(NTSTATUS) GetPositionRegister\
   1872     (\
   1873         OUT KSRTAUDIO_HWREGISTER    *Register\
   1874     );\
   1875     STDMETHODIMP_(NTSTATUS) GetClockRegister\
   1876     (\
   1877         OUT KSRTAUDIO_HWREGISTER    *Register\
   1878     )
   1879 
   1880 
   1881 /* ===============================================================
   1882     IMiniportWaveRTStreamNotification Interface
   1883 */
   1884 
   1885 #undef INTERFACE
   1886 #define INTERFACE IMiniportWaveRTStreamNotification
   1887 
   1888 DEFINE_GUID(IID_IMiniportWaveRTStreamNotification, 0x23759128, 0x96f1, 0x423b, 0xab, 0x4d, 0x81, 0x63, 0x5b, 0xcf, 0x8c, 0xa1);
   1889 
   1890 DECLARE_INTERFACE_(IMiniportWaveRTStreamNotification, IMiniportWaveRTStream)
   1891 {
   1892     DEFINE_ABSTRACT_UNKNOWN()
   1893 
   1894     DEFINE_ABSTRACT_MINIPORTWAVERTSTREAM()
   1895 
   1896     STDMETHOD_(NTSTATUS,AllocateBufferWithNotification)
   1897     (   THIS_
   1898         IN      ULONG                   NotificationCount,
   1899         IN      ULONG                   RequestedSize,
   1900         OUT     PMDL                    *AudioBufferMdl,
   1901         OUT     ULONG                   *ActualSize,
   1902         OUT     ULONG                   *OffsetFromFirstPage,
   1903         OUT     MEMORY_CACHING_TYPE     *CacheType
   1904     )   PURE;
   1905 
   1906     STDMETHOD_(VOID,FreeBufferWithNotification)
   1907     (   THIS_
   1908         IN      PMDL            AudioBufferMdl,
   1909         IN      ULONG           BufferSize
   1910     )   PURE;
   1911 
   1912     STDMETHOD_(NTSTATUS,RegisterNotificationEvent)
   1913     (   THIS_
   1914         IN      PKEVENT         NotificationEvent
   1915     )   PURE;
   1916 
   1917     STDMETHOD_(NTSTATUS,UnregisterNotificationEvent)
   1918     (   THIS_
   1919         IN      PKEVENT         NotificationEvent
   1920     )   PURE;
   1921 };
   1922 
   1923 /* ===============================================================
   1924     IMiniportWaveRT Interface
   1925 */
   1926 
   1927 #undef INTERFACE
   1928 #define INTERFACE IMiniportWaveRT
   1929 
   1930 DEFINE_GUID(IID_IMiniportWaveRT, 0xf9fc4d6, 0x6061, 0x4f3c, 0xb1, 0xfc, 0x7, 0x5e, 0x35, 0xf7, 0x96, 0xa);
   1931 
   1932 DECLARE_INTERFACE_(IMiniportWaveRT, IMiniport)
   1933 {
   1934     DEFINE_ABSTRACT_UNKNOWN()
   1935 
   1936     DEFINE_ABSTRACT_MINIPORT()
   1937 
   1938     STDMETHOD_(NTSTATUS,Init)
   1939     (   THIS_
   1940         IN      PUNKNOWN            UnknownAdapter,
   1941         IN      PRESOURCELIST       ResourceList,
   1942         IN      PPORTWAVERT             Port
   1943     )   PURE;
   1944 
   1945     STDMETHOD_(NTSTATUS,NewStream)
   1946     (   THIS_
   1947         OUT     PMINIPORTWAVERTSTREAM *         Stream,
   1948         IN      PPORTWAVERTSTREAM               PortStream,
   1949         IN      ULONG                       Pin,
   1950         IN      BOOLEAN                     Capture,
   1951         IN      PKSDATAFORMAT               DataFormat
   1952     )   PURE;
   1953 
   1954     STDMETHOD_(NTSTATUS,GetDeviceDescription)
   1955     (   THIS_
   1956         OUT     PDEVICE_DESCRIPTION     DeviceDescription
   1957     )   PURE;
   1958 };
   1959 
   1960 typedef IMiniportWaveRT *PMINIPORTWAVERT;
   1961 
   1962 #define IMP_IMiniportWaveRT\
   1963     IMP_IMiniport;\
   1964     STDMETHODIMP_(NTSTATUS) Init\
   1965     (   IN      PUNKNOWN            UnknownAdapter,\
   1966         IN      PRESOURCELIST       ResourceList,\
   1967         IN      PPORTWAVERT             Port\
   1968     );\
   1969     STDMETHODIMP_(NTSTATUS) NewStream\
   1970     (   OUT     PMINIPORTWAVERTSTREAM *         Stream,\
   1971         IN      PPORTWAVERTSTREAM               PortStream,\
   1972         IN      ULONG                       Pin,\
   1973         IN      BOOLEAN                     Capture,\
   1974         IN      PKSDATAFORMAT               DataFormat\
   1975     );\
   1976     STDMETHODIMP_(NTSTATUS) GetDeviceDescription\
   1977     (   OUT     PDEVICE_DESCRIPTION     DeviceDescription\
   1978     )
   1979 
   1980 #endif
   1981 
   1982 /* ===============================================================
   1983     IAdapterPowerManagement Interface
   1984 */
   1985 
   1986 #undef INTERFACE
   1987 #define INTERFACE IAdapterPowerManagement
   1988 
   1989 DEFINE_GUID(IID_IAdapterPowerManagement, 0x793417D0L, 0x35FE, 0x11D1, 0xAD, 0x08, 0x00, 0xA0, 0xC9, 0x0A, 0xB1, 0xB0);
   1990 
   1991 DECLARE_INTERFACE_(IAdapterPowerManagement, IUnknown)
   1992 {
   1993     DEFINE_ABSTRACT_UNKNOWN()
   1994 
   1995     STDMETHOD_(void,PowerChangeState)(THIS_
   1996         IN POWER_STATE NewState) PURE;
   1997 
   1998     STDMETHOD_(NTSTATUS,QueryPowerChangeState)(THIS_
   1999         IN POWER_STATE NewStateQuery) PURE;
   2000 
   2001     STDMETHOD_(NTSTATUS,QueryDeviceCapabilities)(THIS_
   2002         IN PDEVICE_CAPABILITIES PowerDeviceCaps) PURE;
   2003 };
   2004 
   2005 #define IMP_IAdapterPowerManagement                       \
   2006     STDMETHODIMP_(void) PowerChangeState                  \
   2007     (   IN      POWER_STATE     NewState                  \
   2008     );                                                    \
   2009     STDMETHODIMP_(NTSTATUS) QueryPowerChangeState         \
   2010     (   IN      POWER_STATE     NewStateQuery             \
   2011     );                                                    \
   2012     STDMETHODIMP_(NTSTATUS) QueryDeviceCapabilities       \
   2013     (   IN      PDEVICE_CAPABILITIES    PowerDeviceCaps   \
   2014     )
   2015 
   2016 typedef IAdapterPowerManagement *PADAPTERPOWERMANAGEMENT;
   2017 
   2018 
   2019 /* ===============================================================
   2020     IPowerNotify Interface
   2021 */
   2022 
   2023 #undef INTERFACE
   2024 #define INTERFACE IPowerNotify
   2025 
   2026 DEFINE_GUID(IID_IPowerNotify, 0x3DD648B8L, 0x969F, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3);
   2027 
   2028 DECLARE_INTERFACE_(IPowerNotify, IUnknown)
   2029 {
   2030     DEFINE_ABSTRACT_UNKNOWN()
   2031 
   2032     STDMETHOD_(void, PowerChangeNotify)(THIS_
   2033         IN POWER_STATE PowerState)PURE;
   2034 };
   2035 
   2036 typedef IPowerNotify *PPOWERNOTIFY;
   2037 
   2038 #undef INTERFACE
   2039 
   2040 /* ===============================================================
   2041     IPinCount Interface
   2042 */
   2043 #if (NTDDI_VERSION >= NTDDI_WINXP)
   2044 
   2045 #undef INTERFACE
   2046 #define INTERFACE IPinCount
   2047 
   2048 DEFINE_GUID(IID_IPinCount, 0x5dadb7dcL, 0xa2cb, 0x4540, 0xa4, 0xa8, 0x42, 0x5e, 0xe4, 0xae, 0x90, 0x51);
   2049 
   2050 DECLARE_INTERFACE_(IPinCount, IUnknown)
   2051 {
   2052     DEFINE_ABSTRACT_UNKNOWN()
   2053 
   2054     STDMETHOD_(void,PinCount)(THIS_
   2055         IN ULONG PinId,
   2056         IN OUT PULONG FilterNecessary,
   2057         IN OUT PULONG FilterCurrent,
   2058         IN OUT PULONG FilterPossible,
   2059         IN OUT PULONG GlobalCurrent,
   2060         IN OUT PULONG GlobalPossible) PURE;
   2061 };
   2062 typedef IPinCount *PPINCOUNT;
   2063 
   2064 #undef INTERFACE
   2065 #endif
   2066 
   2067 
   2068 /* ===============================================================
   2069     IPortEvents Interface
   2070 */
   2071 
   2072 #undef INTERFACE
   2073 #define INTERFACE IPortEvents
   2074 
   2075 DEFINE_GUID(IID_IPortEvents, 0xA80F29C4L, 0x5498, 0x11D2, 0x95, 0xD9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3);
   2076 DECLARE_INTERFACE_(IPortEvents, IUnknown)
   2077 {
   2078     DEFINE_ABSTRACT_UNKNOWN()
   2079 
   2080     STDMETHOD_(void,AddEventToEventList)(THIS_
   2081         IN  PKSEVENT_ENTRY EventEntry)PURE;
   2082 
   2083     STDMETHOD_(void,GenerateEventList)(THIS_
   2084         IN  GUID* Set OPTIONAL,
   2085         IN  ULONG EventId,
   2086         IN  BOOL  PinEvent,
   2087         IN  ULONG PinId,
   2088         IN  BOOL  NodeEvent,
   2089         IN  ULONG NodeId)PURE;
   2090 };
   2091 
   2092 typedef IPortEvents *PPORTEVENTS;
   2093 
   2094 
   2095 #define IMP_IPortEvents                        \
   2096     STDMETHODIMP_(void) AddEventToEventList(   \
   2097         IN  PKSEVENT_ENTRY EventEntry);        \
   2098                                                \
   2099     STDMETHODIMP_(void) GenerateEventList(     \
   2100         IN  GUID* Set OPTIONAL,                \
   2101         IN  ULONG EventId,                     \
   2102         IN  BOOL  PinEvent,                    \
   2103         IN  ULONG PinId,                       \
   2104         IN  BOOL  NodeEvent,                   \
   2105         IN  ULONG NodeId)
   2106 
   2107 /* ===============================================================
   2108     IDrmPort / IDrmPort2 Interfaces
   2109     These are almost identical, except for the addition of two extra methods.
   2110 */
   2111 
   2112 #undef INTERFACE
   2113 #define INTERFACE IDrmPort
   2114 
   2115 #if (NTDDI_VERSION >= NTDDI_WINXP)
   2116 DEFINE_GUID(IID_IDrmPort, 0x286D3DF8L, 0xCA22, 0x4E2E, 0xB9, 0xBC, 0x20, 0xB4, 0xF0, 0xE2, 0x01, 0xCE);
   2117 #endif
   2118 
   2119 #define DEFINE_ABSTRACT_DRMPORT()                          \
   2120     STDMETHOD_(NTSTATUS,CreateContentMixed)(THIS_          \
   2121         IN  PULONG paContentId,                            \
   2122         IN  ULONG cContentId,                              \
   2123         OUT PULONG pMixedContentId)PURE;                   \
   2124                                                            \
   2125     STDMETHOD_(NTSTATUS,DestroyContent)(THIS_              \
   2126         IN ULONG ContentId)PURE;                           \
   2127                                                            \
   2128     STDMETHOD_(NTSTATUS,ForwardContentToFileObject)(THIS_  \
   2129         IN ULONG        ContentId,                         \
   2130         IN PFILE_OBJECT FileObject)PURE;                   \
   2131                                                            \
   2132     STDMETHOD_(NTSTATUS,ForwardContentToInterface)(THIS_   \
   2133         IN ULONG ContentId,                                \
   2134         IN PUNKNOWN pUnknown,                              \
   2135         IN ULONG NumMethods)PURE;                          \
   2136                                                            \
   2137     STDMETHOD_(NTSTATUS,GetContentRights)(THIS_            \
   2138         IN  ULONG ContentId,                               \
   2139         OUT PDRMRIGHTS  DrmRights)PURE;
   2140 
   2141 DECLARE_INTERFACE_(IDrmPort, IUnknown)
   2142 {
   2143     DEFINE_ABSTRACT_UNKNOWN()
   2144     DEFINE_ABSTRACT_DRMPORT()
   2145 };
   2146 
   2147 typedef IDrmPort *PDRMPORT;
   2148 
   2149 #define IMP_IDrmPort                                       \
   2150     STDMETHODIMP_(NTSTATUS) CreateContentMixed(            \
   2151         IN  PULONG paContentId,                            \
   2152         IN  ULONG cContentId,                              \
   2153         OUT PULONG pMixedContentId);                       \
   2154                                                            \
   2155     STDMETHODIMP_(NTSTATUS) DestroyContent(                \
   2156         IN ULONG ContentId);                               \
   2157                                                            \
   2158     STDMETHODIMP_(NTSTATUS) ForwardContentToFileObject(    \
   2159         IN ULONG        ContentId,                         \
   2160         IN PFILE_OBJECT FileObject);                       \
   2161                                                            \
   2162     STDMETHODIMP_(NTSTATUS) ForwardContentToInterface(     \
   2163         IN ULONG ContentId,                                \
   2164         IN PUNKNOWN pUnknown,                              \
   2165         IN ULONG NumMethods);                              \
   2166                                                            \
   2167     STDMETHODIMP_(NTSTATUS) GetContentRights(              \
   2168         IN  ULONG ContentId,                               \
   2169         OUT PDRMRIGHTS  DrmRights)
   2170 
   2171 
   2172 /* ===============================================================
   2173     IDrmPort2 Interface
   2174 */
   2175 
   2176 #undef INTERFACE
   2177 #define INTERFACE IDrmPort2
   2178 
   2179 #if (NTDDI_VERSION >= NTDDI_WINXP)
   2180 DEFINE_GUID(IID_IDrmPort2, 0x1ACCE59CL, 0x7311, 0x4B6B, 0x9F, 0xBA, 0xCC, 0x3B, 0xA5, 0x9A, 0xCD, 0xCE);
   2181 #endif
   2182 
   2183 DECLARE_INTERFACE_(IDrmPort2, IDrmPort)
   2184 {
   2185     DEFINE_ABSTRACT_UNKNOWN()
   2186     DEFINE_ABSTRACT_DRMPORT()
   2187 
   2188     STDMETHOD_(NTSTATUS,AddContentHandlers)(THIS_
   2189         IN ULONG ContentId,
   2190         IN PVOID * paHandlers,
   2191         IN ULONG NumHandlers)PURE;
   2192 
   2193     STDMETHOD_(NTSTATUS,ForwardContentToDeviceObject)(THIS_
   2194         IN ULONG ContentId,
   2195         IN PVOID Reserved,
   2196         IN PCDRMFORWARD DrmForward)PURE;
   2197 };
   2198 
   2199 typedef IDrmPort2 *PDRMPORT2;
   2200 
   2201 #define IMP_IDrmPort2                                                \
   2202     IMP_IDrmPort;                                                    \
   2203     STDMETHODIMP_(NTSTATUS) AddContentHandlers(                      \
   2204         IN ULONG ContentId,                                          \
   2205         IN PVOID * paHandlers,                                       \
   2206         IN ULONG NumHandlers);                                       \
   2207                                                                      \
   2208     STDMETHODIMP_(NTSTATUS) ForwardContentToDeviceObject(            \
   2209         IN ULONG ContentId,                                          \
   2210         IN PVOID Reserved,                                           \
   2211         IN PCDRMFORWARD DrmForward)
   2212 
   2213 
   2214 /* ===============================================================
   2215     IPortClsVersion Interface
   2216 */
   2217 #undef INTERFACE
   2218 #define INTERFACE IPortClsVersion
   2219 
   2220 #if (NTDDI_VERSION >= NTDDI_WINXP)
   2221 DEFINE_GUID(IID_IPortClsVersion, 0x7D89A7BBL, 0x869B, 0x4567, 0x8D, 0xBE, 0x1E, 0x16, 0x8C, 0xC8, 0x53, 0xDE);
   2222 #endif
   2223 
   2224 DECLARE_INTERFACE_(IPortClsVersion, IUnknown)
   2225 {
   2226     DEFINE_ABSTRACT_UNKNOWN()
   2227 
   2228     STDMETHOD_(DWORD, GetVersion)(THIS) PURE;
   2229 };
   2230 
   2231 #define IMP_IPortClsVersion \
   2232     STDMETHODIMP_(DWORD) GetVersion(void);
   2233 
   2234 typedef IPortClsVersion *PPORTCLSVERSION;
   2235 
   2236 #undef INTERFACE
   2237 
   2238 /* ===============================================================
   2239     IDmaOperations Interface
   2240 */
   2241 
   2242 /* ===============================================================
   2243     IPreFetchOffset Interface
   2244 */
   2245 
   2246 
   2247 
   2248 /* ===============================================================
   2249     PortCls API Functions
   2250 */
   2251 
   2252 typedef NTSTATUS (NTAPI *PCPFNSTARTDEVICE)(
   2253     IN  PDEVICE_OBJECT DeviceObject,
   2254     IN  PIRP Irp,
   2255     IN  PRESOURCELIST ResourceList);
   2256 
   2257 /* This is in NTDDK.H */
   2258 /*
   2259 typedef NTSTATUS (*PDRIVER_ADD_DEVICE)(
   2260     IN struct _DRIVER_OBJECT* DriverObject,
   2261     IN struct _DEVICE_OBJECT* PhysicalDeviceObject);
   2262 */
   2263 
   2264 PORTCLASSAPI NTSTATUS NTAPI
   2265 PcAddAdapterDevice(
   2266     IN  PDRIVER_OBJECT DriverObject,
   2267     IN  PDEVICE_OBJECT PhysicalDeviceObject,
   2268     IN  PCPFNSTARTDEVICE StartDevice,
   2269     IN  ULONG MaxObjects,
   2270     IN  ULONG DeviceExtensionSize);
   2271 
   2272 PORTCLASSAPI NTSTATUS NTAPI
   2273 PcInitializeAdapterDriver(
   2274     IN  PDRIVER_OBJECT DriverObject,
   2275     IN  PUNICODE_STRING RegistryPathName,
   2276     IN  PDRIVER_ADD_DEVICE AddDevice);
   2277 
   2278 
   2279 /* ===============================================================
   2280     Factories (TODO: Move elsewhere)
   2281 */
   2282 
   2283 PORTCLASSAPI NTSTATUS NTAPI
   2284 PcNewDmaChannel(
   2285     OUT PDMACHANNEL* OutDmaChannel,
   2286     IN  PUNKNOWN OuterUnknown OPTIONAL,
   2287     IN  POOL_TYPE PoolType,
   2288     IN  PDEVICE_DESCRIPTION DeviceDescription,
   2289     IN  PDEVICE_OBJECT DeviceObject);
   2290 
   2291 PORTCLASSAPI NTSTATUS NTAPI
   2292 PcNewInterruptSync(
   2293     OUT PINTERRUPTSYNC* OUtInterruptSync,
   2294     IN  PUNKNOWN OuterUnknown OPTIONAL,
   2295     IN  PRESOURCELIST ResourceList,
   2296     IN  ULONG ResourceIndex,
   2297     IN  INTERRUPTSYNCMODE Mode);
   2298 
   2299 PORTCLASSAPI NTSTATUS NTAPI
   2300 PcNewMiniport(
   2301     OUT PMINIPORT* OutMiniport,
   2302     IN  REFCLSID ClassId);
   2303 
   2304 PORTCLASSAPI NTSTATUS NTAPI
   2305 PcNewPort(
   2306     OUT PPORT* OutPort,
   2307     IN  REFCLSID ClassId);
   2308 
   2309 PORTCLASSAPI NTSTATUS NTAPI
   2310 PcNewRegistryKey(
   2311     OUT PREGISTRYKEY* OutRegistryKey,
   2312     IN  PUNKNOWN OuterUnknown OPTIONAL,
   2313     IN  ULONG RegistryKeyType,
   2314     IN  ACCESS_MASK DesiredAccess,
   2315     IN  PVOID DeviceObject OPTIONAL,
   2316     IN  PVOID SubDevice OPTIONAL,
   2317     IN  POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
   2318     IN  ULONG CreateOptions OPTIONAL,
   2319     OUT PULONG Disposition OPTIONAL);
   2320 
   2321 PORTCLASSAPI NTSTATUS NTAPI
   2322 PcNewResourceList(
   2323     OUT PRESOURCELIST* OutResourceList,
   2324     IN  PUNKNOWN OuterUnknown OPTIONAL,
   2325     IN  POOL_TYPE PoolType,
   2326     IN  PCM_RESOURCE_LIST TranslatedResources,
   2327     IN  PCM_RESOURCE_LIST UntranslatedResources);
   2328 
   2329 PORTCLASSAPI NTSTATUS NTAPI
   2330 PcNewResourceSublist(
   2331     OUT PRESOURCELIST* OutResourceList,
   2332     IN  PUNKNOWN OuterUnknown OPTIONAL,
   2333     IN  POOL_TYPE PoolType,
   2334     IN  PRESOURCELIST ParentList,
   2335     IN  ULONG MaximumEntries);
   2336 
   2337 PORTCLASSAPI NTSTATUS NTAPI
   2338 PcNewServiceGroup(
   2339     OUT PSERVICEGROUP* OutServiceGroup,
   2340     IN  PUNKNOWN OuterUnknown OPTIONAL);
   2341 
   2342 
   2343 /* ===============================================================
   2344     IRP Handling
   2345 */
   2346 
   2347 PORTCLASSAPI NTSTATUS NTAPI
   2348 PcDispatchIrp(
   2349     IN  PDEVICE_OBJECT DeviceObject,
   2350     IN  PIRP Irp);
   2351 
   2352 PORTCLASSAPI NTSTATUS NTAPI
   2353 PcCompleteIrp(
   2354     IN  PDEVICE_OBJECT DeviceObject,
   2355     IN  PIRP Irp,
   2356     IN  NTSTATUS Status);
   2357 
   2358 PORTCLASSAPI NTSTATUS NTAPI
   2359 PcForwardIrpSynchronous(
   2360     IN  PDEVICE_OBJECT DeviceObject,
   2361     IN  PIRP Irp);
   2362 
   2363 
   2364 /* ===============================================================
   2365     Power Management
   2366 */
   2367 
   2368 PORTCLASSAPI NTSTATUS NTAPI
   2369 PcRegisterAdapterPowerManagement(
   2370     IN  PUNKNOWN pUnknown,
   2371     IN  PVOID pvContext1);
   2372 
   2373 PORTCLASSAPI NTSTATUS NTAPI
   2374 PcRequestNewPowerState(
   2375     IN  PDEVICE_OBJECT pDeviceObject,
   2376     IN  DEVICE_POWER_STATE RequestedNewState);
   2377 
   2378 
   2379 /* ===============================================================
   2380     Properties
   2381 */
   2382 
   2383 PORTCLASSAPI NTSTATUS NTAPI
   2384 PcGetDeviceProperty(
   2385     IN  PVOID DeviceObject,
   2386     IN  DEVICE_REGISTRY_PROPERTY DeviceProperty,
   2387     IN  ULONG BufferLength,
   2388     OUT PVOID PropertyBuffer,
   2389     OUT PULONG ResultLength);
   2390 
   2391 PORTCLASSAPI NTSTATUS NTAPI
   2392 PcCompletePendingPropertyRequest(
   2393     IN  PPCPROPERTY_REQUEST PropertyRequest,
   2394     IN  NTSTATUS NtStatus);
   2395 
   2396 
   2397 /* ===============================================================
   2398     I/O Timeouts
   2399 */
   2400 
   2401 PORTCLASSAPI NTSTATUS NTAPI
   2402 PcRegisterIoTimeout(
   2403     IN  PDEVICE_OBJECT pDeviceObject,
   2404     IN  PIO_TIMER_ROUTINE pTimerRoutine,
   2405     IN  PVOID pContext);
   2406 
   2407 PORTCLASSAPI NTSTATUS NTAPI
   2408 PcUnregisterIoTimeout(
   2409     IN  PDEVICE_OBJECT pDeviceObject,
   2410     IN  PIO_TIMER_ROUTINE pTimerRoutine,
   2411     IN  PVOID pContext);
   2412 
   2413 
   2414 /* ===============================================================
   2415     Physical Connections
   2416 */
   2417 
   2418 PORTCLASSAPI NTSTATUS NTAPI
   2419 PcRegisterPhysicalConnection(
   2420     IN  PDEVICE_OBJECT DeviceObject,
   2421     IN  PUNKNOWN FromUnknown,
   2422     IN  ULONG FromPin,
   2423     IN  PUNKNOWN ToUnknown,
   2424     IN  ULONG ToPin);
   2425 
   2426 PORTCLASSAPI NTSTATUS NTAPI
   2427 PcRegisterPhysicalConnectionFromExternal(
   2428     IN  PDEVICE_OBJECT DeviceObject,
   2429     IN  PUNICODE_STRING FromString,
   2430     IN  ULONG FromPin,
   2431     IN  PUNKNOWN ToUnknown,
   2432     IN  ULONG ToPin);
   2433 
   2434 PORTCLASSAPI NTSTATUS NTAPI
   2435 PcRegisterPhysicalConnectionToExternal(
   2436     IN  PDEVICE_OBJECT DeviceObject,
   2437     IN  PUNKNOWN FromUnknown,
   2438     IN  ULONG FromPin,
   2439     IN  PUNICODE_STRING ToString,
   2440     IN  ULONG ToPin);
   2441 
   2442 
   2443 /* ===============================================================
   2444     Misc
   2445 */
   2446 
   2447 PORTCLASSAPI ULONGLONG NTAPI
   2448 PcGetTimeInterval(
   2449     IN  ULONGLONG Since);
   2450 
   2451 PORTCLASSAPI NTSTATUS NTAPI
   2452 PcRegisterSubdevice(
   2453     IN  PDEVICE_OBJECT DeviceObject,
   2454     IN  PWCHAR Name,
   2455     IN  PUNKNOWN Unknown);
   2456 
   2457 
   2458 /* ===============================================================
   2459     Digital Rights Management Functions
   2460     Implemented in XP and above
   2461 */
   2462 
   2463 PORTCLASSAPI NTSTATUS NTAPI
   2464 PcAddContentHandlers(
   2465     IN  ULONG ContentId,
   2466     IN  PVOID *paHandlers,
   2467     IN  ULONG NumHandlers);
   2468 
   2469 PORTCLASSAPI NTSTATUS NTAPI
   2470 PcCreateContentMixed(
   2471     IN  PULONG paContentId,
   2472     IN  ULONG cContentId,
   2473     OUT PULONG pMixedContentId);
   2474 
   2475 PORTCLASSAPI NTSTATUS NTAPI
   2476 PcDestroyContent(
   2477     IN  ULONG ContentId);
   2478 
   2479 PORTCLASSAPI NTSTATUS NTAPI
   2480 PcForwardContentToDeviceObject(
   2481     IN  ULONG ContentId,
   2482     IN  PVOID Reserved,
   2483     IN  PCDRMFORWARD DrmForward);
   2484 
   2485 PORTCLASSAPI NTSTATUS NTAPI
   2486 PcForwardContentToFileObject(
   2487     IN  ULONG ContentId,
   2488     IN  PFILE_OBJECT FileObject);
   2489 
   2490 PORTCLASSAPI NTSTATUS NTAPI
   2491 PcForwardContentToInterface(
   2492     IN  ULONG ContentId,
   2493     IN  PUNKNOWN pUnknown,
   2494     IN  ULONG NumMethods);
   2495 
   2496 PORTCLASSAPI NTSTATUS NTAPI
   2497 PcGetContentRights(
   2498     IN  ULONG ContentId,
   2499     OUT PDRMRIGHTS DrmRights);
   2500 
   2501 
   2502 #endif /* PORTCLS_H */
   2503 
   2504