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