716d17a9e3a00a8de20f97fda292ce7add6796dc
[reactos.git] / reactos / include / ddk / portcls.h
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_WIN2003)
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 /* ===============================================================
669 IUnregisterPhysicalConnection Interface
670 */
671
672 #undef INTERFACE
673 #define INTERFACE IUnregisterPhysicalConnection
674
675 DEFINE_GUID(IID_IUnregisterPhysicalConnection, 0x6c38e231L, 0x2a0d, 0x428d, 0x81, 0xf8, 0x07, 0xcc, 0x42, 0x8b, 0xb9, 0xa4);
676
677 DECLARE_INTERFACE_(IUnregisterPhysicalConnection,IUnknown)
678 {
679 DEFINE_ABSTRACT_UNKNOWN()
680
681 STDMETHOD_(NTSTATUS,UnregisterPhysicalConnection)(THIS_
682 IN PDEVICE_OBJECT DeviceObject,
683 IN PUNKNOWN FromUnknown,
684 IN ULONG FromPin,
685 IN PUNKNOWN ToUnknown,
686 IN ULONG ToPin)PURE;
687
688 STDMETHOD_(NTSTATUS,UnregisterPhysicalConnectionToExternal)(THIS_
689 IN PDEVICE_OBJECT DeviceObject,
690 IN PUNKNOWN FromUnknown,
691 IN ULONG FromPin,
692 IN PUNICODE_STRING ToString,
693 IN ULONG ToPin)PURE;
694
695 STDMETHOD_(NTSTATUS,UnregisterPhysicalConnectionFromExternal)(THIS_
696 IN PDEVICE_OBJECT DeviceObject,
697 IN PUNICODE_STRING FromString,
698 IN ULONG FromPin,
699 IN PUNKNOWN ToUnknown,
700 IN ULONG ToPin)PURE;
701 };
702
703 typedef IUnregisterPhysicalConnection *PUNREGISTERPHYSICALCONNECTION;
704 #endif
705
706 /* ===============================================================
707 IDmaChannel Interface
708 */
709
710 #define DEFINE_ABSTRACT_DMACHANNEL() \
711 STDMETHOD_(NTSTATUS, AllocateBuffer)( THIS_ \
712 IN ULONG BufferSize, \
713 IN PPHYSICAL_ADDRESS PhysicalAddressConstraint OPTIONAL) PURE; \
714 \
715 STDMETHOD_(void, FreeBuffer)( THIS ) PURE; \
716 STDMETHOD_(ULONG, TransferCount)( THIS ) PURE; \
717 STDMETHOD_(ULONG, MaximumBufferSize)( THIS ) PURE; \
718 STDMETHOD_(ULONG, AllocatedBufferSize)( THIS ) PURE; \
719 STDMETHOD_(ULONG, BufferSize)( THIS ) PURE; \
720 \
721 STDMETHOD_(void, SetBufferSize)( THIS_ \
722 IN ULONG BufferSize) PURE; \
723 \
724 STDMETHOD_(PVOID, SystemAddress)( THIS ) PURE; \
725 STDMETHOD_(PHYSICAL_ADDRESS, PhysicalAddress)( THIS ) PURE; \
726 STDMETHOD_(PADAPTER_OBJECT, GetAdapterObject)( THIS ) PURE; \
727 \
728 STDMETHOD_(void, CopyTo)( THIS_ \
729 IN PVOID Destination, \
730 IN PVOID Source, \
731 IN ULONG ByteCount) PURE; \
732 \
733 STDMETHOD_(void, CopyFrom)( THIS_ \
734 IN PVOID Destination, \
735 IN PVOID Source, \
736 IN ULONG ByteCount) PURE;
737
738 #define IMP_IDmaChannel() \
739 STDMETHODIMP_(NTSTATUS) AllocateBuffer( \
740 IN ULONG BufferSize, \
741 IN PPHYSICAL_ADDRESS PhysicalAddressConstraint OPTIONAL); \
742 \
743 STDMETHODIMP_(void) FreeBuffer(void); \
744 STDMETHODIMP_(ULONG) TransferCount(void); \
745 STDMETHODIMP_(ULONG) MaximumBufferSize(void); \
746 STDMETHODIMP_(ULONG) AllocatedBufferSize(void); \
747 STDMETHODIMP_(ULONG) BufferSize(void); \
748 \
749 STDMETHODIMP_(void) SetBufferSize)( \
750 IN ULONG BufferSize); \
751 \
752 STDMETHODIMP_(PVOID) SystemAddress(void); \
753 STDMETHODIMP_(PHYSICAL_ADDRESS) PhysicalAddress(void); \
754 STDMETHODIMP_(PADAPTER_OBJECT) GetAdapterObject(void); \
755 \
756 STDMETHODIMP_(void) CopyTo( \
757 IN PVOID Destination, \
758 IN PVOID Source, \
759 IN ULONG ByteCount); \
760 \
761 STDMETHODIMP_(void) CopyFrom( \
762 IN PVOID Destination, \
763 IN PVOID Source, \
764 IN ULONG ByteCount);
765
766 #undef INTERFACE
767 #define INTERFACE IDmaChannel
768
769 DEFINE_GUID(IID_IDmaChannel, 0x22C6AC61L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
770
771 DECLARE_INTERFACE_(IDmaChannel, IUnknown)
772 {
773 DEFINE_ABSTRACT_UNKNOWN()
774 DEFINE_ABSTRACT_DMACHANNEL()
775 };
776
777 typedef IDmaChannel *PDMACHANNEL;
778
779
780 /* ===============================================================
781 IDmaChannelSlave Interface
782 */
783
784 #define DEFINE_ABSTRACT_DMACHANNELSLAVE() \
785 STDMETHOD_(NTSTATUS, Start)( THIS_ \
786 IN ULONG MapSize, \
787 IN BOOLEAN WriteToDevice) PURE; \
788 \
789 STDMETHOD_(NTSTATUS, Stop)( THIS ) PURE; \
790 STDMETHOD_(ULONG, ReadCounter)( THIS ) PURE; \
791 \
792 STDMETHOD_(NTSTATUS, WaitForTC)( THIS_ \
793 ULONG Timeout) PURE;
794
795 #define IMP_IDmaChannelSlave \
796 STDMETHODIMP_(NTSTATUS) Start( \
797 IN ULONG MapSize, \
798 IN BOOLEAN WriteToDevice); \
799 \
800 STDMETHODIMP_(NTSTATUS) Stop(void); \
801 STDMETHODIMP_(ULONG) ReadCounter)(void); \
802 \
803 STDMETHODIMP_(NTSTATUS, WaitForTC)( \
804 ULONG Timeout);
805
806 #undef INTERFACE
807 #define INTERFACE IDmaChannelSlave
808
809 #if (NTDDI_VERSION < NTDDI_LONGHORN)
810 DEFINE_GUID(IID_IDmaChannelSlave, 0x22C6AC62L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
811 #endif
812
813 #undef INTERFACE
814 #define INTERFACE IDmaChannelSlave
815
816 DECLARE_INTERFACE_(IDmaChannelSlave, IDmaChannel)
817 {
818 DEFINE_ABSTRACT_UNKNOWN()
819 DEFINE_ABSTRACT_DMACHANNEL()
820 DEFINE_ABSTRACT_DMACHANNELSLAVE()
821 };
822
823 typedef IDmaChannelSlave *PDMACHANNELSLAVE;
824
825
826 /* ===============================================================
827 IInterruptSync Interface
828 */
829
830 typedef enum
831 {
832 InterruptSyncModeNormal = 1,
833 InterruptSyncModeAll,
834 InterruptSyncModeRepeat
835 } INTERRUPTSYNCMODE;
836
837 struct IInterruptSync;
838
839 typedef NTSTATUS (NTAPI *PINTERRUPTSYNCROUTINE)(
840 IN struct IInterruptSync* InterruptSync,
841 IN PVOID DynamicContext);
842
843 #undef INTERFACE
844 #define INTERFACE IInterruptSync
845
846 DECLARE_INTERFACE_(IInterruptSync, IUnknown)
847 {
848 DEFINE_ABSTRACT_UNKNOWN()
849
850 STDMETHOD_(NTSTATUS, CallSynchronizedRoutine)( THIS_
851 IN PINTERRUPTSYNCROUTINE Routine,
852 IN PVOID DynamicContext) PURE;
853
854 STDMETHOD_(PKINTERRUPT, GetKInterrupt)( THIS ) PURE;
855 STDMETHOD_(NTSTATUS, Connect)( THIS ) PURE;
856 STDMETHOD_(void, Disconnect)( THIS ) PURE;
857
858 STDMETHOD_(NTSTATUS, RegisterServiceRoutine)( THIS_
859 IN PINTERRUPTSYNCROUTINE Routine,
860 IN PVOID DynamicContext,
861 IN BOOLEAN First) PURE;
862 };
863
864 DEFINE_GUID(IID_IInterruptSync, 0x22C6AC63L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
865
866 #define IMP_IInterruptSync \
867 STDMETHODIMP_(NTSTATUS, CallSynchronizedRoutine)( \
868 IN PINTERRUPTSYNCROUTINE Routine, \
869 IN PVOID DynamicContext); \
870 \
871 STDMETHODIMP_(PKINTERRUPT, GetKInterrupt)(void); \
872 STDMETHODIMP_(NTSTATUS, Connect)(void); \
873 STDMETHODIMP_(void, Disconnect)(void); \
874 \
875 STDMETHODIMP_(NTSTATUS, RegisterServiceRoutine)( \
876 IN PINTERRUPTSYNCROUTINE Routine, \
877 IN PVOID DynamicContext, \
878 IN BOOLEAN First);
879
880 typedef IInterruptSync *PINTERRUPTSYNC;
881
882
883 /* ===============================================================
884 IRegistryKey Interface
885 */
886
887 #undef INTERFACE
888 #define INTERFACE IRegistryKey
889
890 enum
891 {
892 GeneralRegistryKey,
893 DeviceRegistryKey,
894 DriverRegistryKey,
895 HwProfileRegistryKey,
896 DeviceInterfaceRegistryKey
897 };
898
899 DEFINE_GUID(IID_IRegistryKey, 0xE8DA4302l, 0xF304, 0x11D0, 0x95, 0x8B, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3);
900
901 DECLARE_INTERFACE_(IRegistryKey, IUnknown)
902 {
903 DEFINE_ABSTRACT_UNKNOWN()
904
905 STDMETHOD_(NTSTATUS, QueryKey)( THIS_
906 IN KEY_INFORMATION_CLASS KeyInformationClass,
907 OUT PVOID KeyInformation,
908 IN ULONG Length,
909 OUT PULONG ResultLength) PURE;
910
911 STDMETHOD_(NTSTATUS, EnumerateKey)( THIS_
912 IN ULONG Index,
913 IN KEY_INFORMATION_CLASS KeyInformationClass,
914 OUT PVOID KeyInformation,
915 IN ULONG Length,
916 OUT PULONG ResultLength) PURE;
917
918 STDMETHOD_(NTSTATUS, QueryValueKey)( THIS_
919 IN PUNICODE_STRING ValueName,
920 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
921 OUT PVOID KeyValueInformation,
922 IN ULONG Length,
923 OUT PULONG ResultLength) PURE;
924
925 STDMETHOD_(NTSTATUS, EnumerateValueKey)( THIS_
926 IN ULONG Index,
927 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
928 OUT PVOID KeyValueInformation,
929 IN ULONG Length,
930 OUT PULONG ResultLength) PURE;
931
932 STDMETHOD_(NTSTATUS, SetValueKey)( THIS_
933 IN PUNICODE_STRING ValueName OPTIONAL,
934 IN ULONG Type,
935 IN PVOID Data,
936 IN ULONG DataSize) PURE;
937
938 STDMETHOD_(NTSTATUS, QueryRegistryValues)( THIS_
939 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
940 IN PVOID Context OPTIONAL) PURE;
941
942 STDMETHOD_(NTSTATUS, NewSubKey)( THIS_
943 OUT IRegistryKey** RegistrySubKey,
944 IN PUNKNOWN OuterUnknown,
945 IN ACCESS_MASK DesiredAccess,
946 IN PUNICODE_STRING SubKeyName,
947 IN ULONG CreateOptions,
948 OUT PULONG Disposition OPTIONAL) PURE;
949
950 STDMETHOD_(NTSTATUS, DeleteKey)( THIS ) PURE;
951 };
952
953 #define IMP_IRegistryKey \
954 STDMETHODIMP_(NTSTATUS) QueryKey( \
955 IN KEY_INFORMATION_CLASS KeyInformationClass, \
956 OUT PVOID KeyInformation, \
957 IN ULONG Length, \
958 OUT PULONG ResultLength); \
959 \
960 STDMETHODIMP_(NTSTATUS) EnumerateKey( \
961 IN ULONG Index, \
962 IN KEY_INFORMATION_CLASS KeyInformationClass, \
963 OUT PVOID KeyInformation, \
964 IN ULONG Length, \
965 OUT PULONG ResultLength); \
966 \
967 STDMETHODIMP_(NTSTATUS) QueryValueKey( \
968 IN PUNICODE_STRING ValueName, \
969 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, \
970 OUT PVOID KeyValueInformation, \
971 IN ULONG Length, \
972 OUT PULONG ResultLength); \
973 \
974 STDMETHODIMP_(NTSTATUS) EnumerateValueKey( \
975 IN ULONG Index, \
976 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, \
977 OUT PVOID KeyValueInformation, \
978 IN ULONG Length, \
979 OUT PULONG ResultLength); \
980 \
981 STDMETHODIMP_(NTSTATUS) SetValueKey( \
982 IN PUNICODE_STRING ValueName OPTIONAL, \
983 IN ULONG Type, \
984 IN PVOID Data, \
985 IN ULONG DataSize); \
986 \
987 STDMETHODIMP_(NTSTATUS) QueryRegistryValues( \
988 IN PRTL_QUERY_REGISTRY_TABLE QueryTable, \
989 IN PVOID Context OPTIONAL); \
990 \
991 STDMETHODIMP_(NTSTATUS) NewSubKey( \
992 OUT IRegistryKey** RegistrySubKey, \
993 IN PUNKNOWN OuterUnknown, \
994 IN ACCESS_MASK DesiredAccess, \
995 IN PUNICODE_STRING SubKeyName, \
996 IN ULONG CreateOptions, \
997 OUT PULONG Disposition OPTIONAL); \
998 \
999 STDMETHODIMP_(NTSTATUS) DeleteKey(void);
1000
1001 typedef IRegistryKey *PREGISTRYKEY;
1002
1003
1004 /* ===============================================================
1005 IMusicTechnology Interface
1006 */
1007
1008 DECLARE_INTERFACE_(IMusicTechnology, IUnknown)
1009 {
1010 DEFINE_ABSTRACT_UNKNOWN()
1011
1012 STDMETHOD_(NTSTATUS, SetTechnology)( THIS_
1013 IN const GUID* Technology) PURE;
1014 };
1015
1016 #define IMP_IMusicTechnology \
1017 STDMETHODIMP_(NTSTATUS) SetTechnology( \
1018 IN const GUID* Technology);
1019
1020 typedef IMusicTechnology *PMUSICTECHNOLOGY;
1021
1022
1023 /* ===============================================================
1024 IPort Interface
1025 */
1026
1027 #if 0
1028 #define STATIC_IPort 0xb4c90a25L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
1029 DEFINE_GUIDSTRUCT("0xB4C90A25-5791-11d0-86f9-00a0c911b544", IID_IPort);
1030 #define IID_IPort DEFINE_GUIDNAMED(IID_IPort)
1031 #endif
1032
1033 DEFINE_GUID(IID_IMiniport,
1034 0xb4c90a24L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1035
1036 DEFINE_GUID(IID_IPort,
1037 0xb4c90a25L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1038
1039 #define DEFINE_ABSTRACT_PORT() \
1040 STDMETHOD_(NTSTATUS, Init)( THIS_ \
1041 IN PDEVICE_OBJECT DeviceObject, \
1042 IN PIRP Irp, \
1043 IN PUNKNOWN UnknownMiniport, \
1044 IN PUNKNOWN UnknownAdapter OPTIONAL, \
1045 IN PRESOURCELIST ResourceList) PURE; \
1046 \
1047 STDMETHOD_(NTSTATUS, GetDeviceProperty)( THIS_ \
1048 IN DEVICE_REGISTRY_PROPERTY DeviceProperty, \
1049 IN ULONG BufferLength, \
1050 OUT PVOID PropertyBuffer, \
1051 OUT PULONG ResultLength) PURE; \
1052 \
1053 STDMETHOD_(NTSTATUS, NewRegistryKey)( THIS_ \
1054 OUT PREGISTRYKEY* OutRegistryKey, \
1055 IN PUNKNOWN OuterUnknown OPTIONAL, \
1056 IN ULONG RegistryKeyType, \
1057 IN ACCESS_MASK DesiredAccess, \
1058 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, \
1059 IN ULONG CreateOptiona OPTIONAL, \
1060 OUT PULONG Disposition OPTIONAL) PURE;
1061
1062 #define IMP_IPort() \
1063 STDMETHODIMP_(NTSTATUS) Init( \
1064 IN PDEVICE_OBJECT DeviceObject, \
1065 IN PIRP Irp, \
1066 IN PUNKNOWN UnknownMiniport, \
1067 IN PUNKNOWN UnknownAdapter OPTIONAL, \
1068 IN PRESOURCELIST ResourceList); \
1069 \
1070 STDMETHODIMP_(NTSTATUS) GetDeviceProperty( \
1071 IN DEVICE_REGISTRY_PROPERTY DeviceProperty, \
1072 IN ULONG BufferLength, \
1073 OUT PVOID PropertyBuffer, \
1074 OUT PULONG ResultLength); \
1075 \
1076 STDMETHODIMP_(NTSTATUS) NewRegistryKey( \
1077 OUT PREGISTRYKEY* OutRegistryKey, \
1078 IN PUNKNOWN OuterUnknown OPTIONAL, \
1079 IN ULONG RegistryKeyType, \
1080 IN ACCESS_MASK DesiredAccess, \
1081 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, \
1082 IN ULONG CreateOptiona OPTIONAL, \
1083 OUT PULONG Disposition OPTIONAL);
1084
1085 #undef INTERFACE
1086 #define INTERFACE IPort
1087
1088 DECLARE_INTERFACE_(IPort, IUnknown)
1089 {
1090 DEFINE_ABSTRACT_UNKNOWN()
1091 DEFINE_ABSTRACT_PORT()
1092 };
1093
1094 typedef IPort *PPORT;
1095
1096
1097 /* ===============================================================
1098 IPortMidi Interface
1099 */
1100
1101 DEFINE_GUID(IID_IPortMidi,
1102 0xb4c90a40L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1103 DEFINE_GUID(CLSID_PortMidi,
1104 0xb4c90a43L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1105
1106 #undef INTERFACE
1107 #define INTERFACE IPortMidi
1108
1109 DECLARE_INTERFACE_(IPortMidi, IPort)
1110 {
1111 DEFINE_ABSTRACT_UNKNOWN()
1112 DEFINE_ABSTRACT_PORT()
1113
1114 STDMETHOD_(VOID, Notify)(THIS_
1115 IN PSERVICEGROUP ServiceGroup OPTIONAL) PURE;
1116
1117 STDMETHOD_(NTSTATUS, RegisterServiceGroup)(THIS_
1118 IN PSERVICEGROUP ServiceGroup) PURE;
1119 };
1120
1121 typedef IPortMidi *PPORTMIDI;
1122
1123 #define IMP_IPortMidi() \
1124 STDMETHODIMP_(VOID) Notify( \
1125 IN PSERVICEGROUP ServiceGroup OPTIONAL); \
1126 \
1127 STDMETHODIMP_(NTSTATUS) RegisterServiceGroup( \
1128 IN PSERVICEGROUP ServiceGroup);
1129
1130 #undef INTERFACE
1131
1132 /* ===============================================================
1133 IPortWaveCyclic Interface
1134 */
1135
1136 DEFINE_GUID(IID_IPortWaveCyclic,
1137 0xb4c90a26L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1138 DEFINE_GUID(CLSID_PortWaveCyclic,
1139 0xb4c90a2aL, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1140
1141 #define INTERFACE IPortWaveCyclic
1142
1143 DECLARE_INTERFACE_(IPortWaveCyclic, IPort)
1144 {
1145 DEFINE_ABSTRACT_UNKNOWN()
1146
1147 DEFINE_ABSTRACT_PORT()
1148
1149 STDMETHOD_(VOID, Notify)(THIS_
1150 IN PSERVICEGROUP ServiceGroup) PURE;
1151
1152 STDMETHOD_(NTSTATUS, NewSlaveDmaChannel)(THIS_
1153 OUT PDMACHANNELSLAVE* DmaChannel,
1154 IN PUNKNOWN OuterUnknown,
1155 IN PRESOURCELIST ResourceList OPTIONAL,
1156 IN ULONG DmaIndex,
1157 IN ULONG MaximumLength,
1158 IN BOOL DemandMode,
1159 IN DMA_SPEED DmaSpeed) PURE;
1160
1161 STDMETHOD_(NTSTATUS, NewMasterDmaChannel)(THIS_
1162 OUT PDMACHANNEL* DmaChannel,
1163 IN PUNKNOWN OuterUnknown,
1164 IN PRESOURCELIST ResourceList OPTIONAL,
1165 IN ULONG MaximumLength,
1166 IN BOOL Dma32BitAddresses,
1167 IN BOOL Dma64BitAddresses,
1168 IN DMA_WIDTH DmaWidth,
1169 IN DMA_SPEED DmaSpeed) PURE;
1170
1171 };
1172
1173 typedef IPortWaveCyclic *PPORTWAVECYCLIC;
1174
1175 #undef INTERFACE
1176 /* ===============================================================
1177 IPortWavePci Interface
1178 */
1179 #undef INTERFACE
1180 #define INTERFACE IPortWavePci
1181
1182 DEFINE_GUID(IID_IPortWavePci,
1183 0xb4c90a50L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1184 DEFINE_GUID(CLSID_PortWavePci,
1185 0xb4c90a54L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1186
1187 DECLARE_INTERFACE_(IPortWavePci, IPort)
1188 {
1189 DEFINE_ABSTRACT_UNKNOWN()
1190 DEFINE_ABSTRACT_PORT()
1191
1192 STDMETHOD_(VOID, Notify)(THIS_
1193 IN PSERVICEGROUP ServiceGroup) PURE;
1194
1195 STDMETHOD_(NTSTATUS, NewMasterDmaChannel)(THIS_
1196 OUT PDMACHANNEL* DmaChannel,
1197 IN PUNKNOWN OuterUnknown,
1198 IN POOL_TYPE PoolType,
1199 IN PRESOURCELIST ResourceList OPTIONAL,
1200 IN BOOLEAN ScatterGather,
1201 IN BOOLEAN Dma32BitAddresses,
1202 IN BOOLEAN Dma64BitAddresses,
1203 IN BOOLEAN IgnoreCount,
1204 IN DMA_WIDTH DmaWidth,
1205 IN DMA_SPEED DmaSpeed,
1206 IN ULONG MaximumLength,
1207 IN ULONG DmaPort) PURE;
1208 };
1209
1210 typedef IPortWavePci *PPORTWAVEPCI;
1211 #undef INTERFACE
1212
1213
1214 /* ===============================================================
1215 IMiniPort Interface
1216 */
1217
1218 DEFINE_GUID(IID_IMiniPort,
1219 0xb4c90a24L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1220
1221 #define DEFINE_ABSTRACT_MINIPORT() \
1222 STDMETHOD_(NTSTATUS, GetDescription)( THIS_ \
1223 OUT PPCFILTER_DESCRIPTOR* Description) PURE; \
1224 \
1225 STDMETHOD_(NTSTATUS, DataRangeIntersection)( THIS_ \
1226 IN ULONG PinId, \
1227 IN PKSDATARANGE DataRange, \
1228 IN PKSDATARANGE MatchingDataRange, \
1229 IN ULONG OutputBufferLength, \
1230 OUT PVOID ResultantFormat OPTIONAL, \
1231 OUT PULONG ResultantFormatLength) PURE;
1232
1233 #define IMP_IMiniport \
1234 STDMETHODIMP_(NTSTATUS) GetDescription( \
1235 OUT PPCFILTER_DESCRIPTOR* Description); \
1236 \
1237 STDMETHODIMP_(NTSTATUS) DataRangeIntersection( \
1238 IN ULONG PinId, \
1239 IN PKSDATARANGE DataRange, \
1240 IN PKSDATARANGE MatchingDataRange, \
1241 IN ULONG OutputBufferLength, \
1242 OUT PVOID ResultantFormat OPTIONAL, \
1243 OUT PULONG ResultantFormatLength);
1244
1245 DECLARE_INTERFACE_(IMiniport, IUnknown)
1246 {
1247 DEFINE_ABSTRACT_UNKNOWN()
1248 DEFINE_ABSTRACT_MINIPORT()
1249 };
1250
1251 typedef IMiniport *PMINIPORT;
1252
1253
1254 /* ===============================================================
1255 IMiniportMidiStream Interface
1256 */
1257 #undef INTERFACE
1258 #define INTERFACE IMiniportMidiStream
1259
1260 DEFINE_GUID(IID_IMiniportMidiStream,
1261 0xb4c90a42L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1262
1263 DECLARE_INTERFACE_(IMiniportMidiStream, IUnknown)
1264 {
1265 DEFINE_ABSTRACT_UNKNOWN()
1266
1267 STDMETHOD_(NTSTATUS,SetFormat)(THIS_
1268 IN PKSDATAFORMAT DataFormat)PURE;
1269
1270 STDMETHOD_(NTSTATUS,SetState)(THIS_
1271 IN KSSTATE State)PURE;
1272
1273 STDMETHOD_(NTSTATUS,Read)(THIS_
1274 IN PVOID BufferAddress,
1275 IN ULONG BufferLength,
1276 OUT PULONG BytesRead)PURE;
1277
1278 STDMETHOD_(NTSTATUS,Write)(THIS_
1279 IN PVOID BufferAddress,
1280 IN ULONG BytesToWrite,
1281 OUT PULONG BytesWritten)PURE;
1282 };
1283
1284 typedef IMiniportMidiStream* PMINIPORTMIDISTREAM;
1285 #undef INTERFACE
1286
1287 /* ===============================================================
1288 IMiniportMidi Interface
1289 */
1290 #undef INTERFACE
1291 #define INTERFACE IMiniportMidi
1292
1293 DEFINE_GUID(IID_IMiniportMidi,
1294 0xb4c90a41L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1295
1296 DECLARE_INTERFACE_(IMiniportMidi, IMiniport)
1297 {
1298 DEFINE_ABSTRACT_UNKNOWN()
1299 DEFINE_ABSTRACT_MINIPORT()
1300
1301 STDMETHOD_(NTSTATUS, Init)(THIS_
1302 IN PUNKNOWN UnknownAdapter,
1303 IN PRESOURCELIST ResourceList,
1304 IN PPORTMIDI Port,
1305 OUT PSERVICEGROUP* ServiceGroup) PURE;
1306
1307 STDMETHOD_(void, Service)(THIS) PURE;
1308
1309 STDMETHOD_(NTSTATUS, NewStream)(THIS_
1310 OUT PMINIPORTMIDISTREAM *Stream,
1311 IN PUNKNOWN OuterUnknown OPTIONAL,
1312 IN POOL_TYPE PoolType,
1313 IN ULONG Pin,
1314 IN BOOLEAN Capture,
1315 IN PKSDATAFORMAT DataFormat,
1316 OUT PSERVICEGROUP* ServiceGroup) PURE;
1317
1318 };
1319
1320 typedef IMiniportMidi *PMINIPORTMIDI;
1321 #undef INTERFACE
1322
1323 /* ===============================================================
1324 IMiniportDriverUart Interface
1325 */
1326
1327 DEFINE_GUID(IID_MiniportDriverUart,
1328 0xb4c90ae1L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1329 DEFINE_GUID(CLSID_MiniportDriverUart,
1330 0xb4c90ae1L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1331
1332 /* ===============================================================
1333 IPortTopology Interface
1334 */
1335 #if 0
1336 #define STATIC_IPortTopology \
1337 0xb4c90a30L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
1338 DEFINE_GUIDSTRUCT("0xB4C90A30-5791-11d0-86f9-00a0c911b544", IID_IPortTopology);
1339 #define IID_IPortTopology DEFINE_GUIDNAMED(IID_IPortTopology)
1340 #endif
1341
1342 #undef INTERFACE
1343 #define INTERFACE IPortTopology
1344
1345 DEFINE_GUID(IID_IPortTopology, 0xb4c90a30L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1346 DEFINE_GUID(CLSID_PortTopology, 0xb4c90a32L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1347
1348 #undef INTERFACE
1349 #define INTERFACE IPortTopology
1350
1351 DECLARE_INTERFACE_(IPortTopology, IPort)
1352 {
1353 DEFINE_ABSTRACT_UNKNOWN()
1354 DEFINE_ABSTRACT_PORT()
1355 };
1356
1357 typedef IPortTopology *PPORTTOPOLOGY;
1358
1359 #define IMP_IPortTopology IMP_IPort
1360
1361
1362 /* ===============================================================
1363 IMiniportTopology Interface
1364 */
1365
1366 #undef INTERFACE
1367 #define INTERFACE IMiniportTopology
1368
1369 DEFINE_GUID(IID_IMiniportTopology, 0xb4c90a31L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1370
1371 #undef INTERFACE
1372 #define INTERFACE IMiniportTopology
1373
1374 DECLARE_INTERFACE_(IMiniportTopology,IMiniport)
1375 {
1376 DEFINE_ABSTRACT_UNKNOWN()
1377 DEFINE_ABSTRACT_MINIPORT()
1378
1379 STDMETHOD_(NTSTATUS,Init)(THIS_
1380 IN PUNKNOWN UnknownAdapter,
1381 IN PRESOURCELIST ResourceList,
1382 IN PPORTTOPOLOGY Port)PURE;
1383 };
1384
1385 typedef IMiniportTopology *PMINIPORTTOPOLOGY;
1386
1387 /* ===============================================================
1388 IMiniportWaveCyclicStream Interface
1389 */
1390
1391 #undef INTERFACE
1392 #define INTERFACE IMiniportWaveCyclicStream
1393
1394 DEFINE_GUID(IID_IMiniportWaveCyclicStream,
1395 0xb4c90a28L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1396
1397 DECLARE_INTERFACE_(IMiniportWaveCyclicStream,IUnknown)
1398 {
1399 DEFINE_ABSTRACT_UNKNOWN()
1400
1401 STDMETHOD_(NTSTATUS,SetFormat)(THIS_
1402 IN PKSDATAFORMAT DataFormat)PURE;
1403
1404 STDMETHOD_(ULONG,SetNotificationFreq)(THIS_
1405 IN ULONG Interval,
1406 OUT PULONG FrameSize) PURE;
1407
1408 STDMETHOD_(NTSTATUS,SetState)(THIS_
1409 IN KSSTATE State) PURE;
1410
1411 STDMETHOD_(NTSTATUS,GetPosition)( THIS_
1412 OUT PULONG Position) PURE;
1413
1414 STDMETHOD_(NTSTATUS,NormalizePhysicalPosition)(THIS_
1415 IN OUT PLONGLONG PhysicalPosition) PURE;
1416
1417 STDMETHOD_(void, Silence)( THIS_
1418 IN PVOID Buffer,
1419 IN ULONG ByteCount) PURE;
1420 };
1421
1422 typedef IMiniportWaveCyclicStream *PMINIPORTWAVECYCLICSTREAM;
1423
1424 #define IMP_IMiniportWaveCyclicStream\
1425 STDMETHODIMP_(NTSTATUS) SetFormat\
1426 ( IN PKSDATAFORMAT DataFormat\
1427 );\
1428 STDMETHODIMP_(ULONG) SetNotificationFreq\
1429 ( IN ULONG Interval,\
1430 OUT PULONG FrameSize\
1431 );\
1432 STDMETHODIMP_(NTSTATUS) SetState\
1433 ( IN KSSTATE State\
1434 );\
1435 STDMETHODIMP_(NTSTATUS) GetPosition\
1436 ( OUT PULONG Position\
1437 );\
1438 STDMETHODIMP_(NTSTATUS) NormalizePhysicalPosition\
1439 ( IN OUT PLONGLONG PhysicalPosition\
1440 );\
1441 STDMETHODIMP_(void) Silence\
1442 ( IN PVOID Buffer,\
1443 IN ULONG ByteCount\
1444 )
1445
1446
1447 /* ===============================================================
1448 IMiniportWaveCyclic Interface
1449 */
1450 #undef INTERFACE
1451
1452 DEFINE_GUID(IID_IMiniportWaveCyclic,
1453 0xb4c90a27L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1454
1455 #define INTERFACE IMiniportWaveCyclic
1456
1457 DECLARE_INTERFACE_(IMiniportWaveCyclic, IMiniport)
1458 {
1459 DEFINE_ABSTRACT_UNKNOWN()
1460 DEFINE_ABSTRACT_MINIPORT()
1461
1462 STDMETHOD_(NTSTATUS, Init)(THIS_
1463 IN PUNKNOWN UnknownAdapter,
1464 IN PRESOURCELIST ResourceList,
1465 IN PPORTWAVECYCLIC Port) PURE;
1466
1467 STDMETHOD_(NTSTATUS, NewStream)(THIS_
1468 OUT PMINIPORTWAVECYCLICSTREAM *Stream,
1469 IN PUNKNOWN OuterUnknown OPTIONAL,
1470 IN POOL_TYPE PoolType,
1471 IN ULONG Pin,
1472 IN BOOLEAN Capture,
1473 IN PKSDATAFORMAT DataFormat,
1474 OUT PDMACHANNEL *DmaChannel,
1475 OUT PSERVICEGROUP *ServiceGroup) PURE;
1476 };
1477
1478 typedef IMiniportWaveCyclic *PMINIPORTWAVECYCLIC;
1479 #undef INTERFACE
1480
1481 #define IMP_IMiniportWaveCyclic\
1482 IMP_IMiniport;\
1483 STDMETHODIMP_(NTSTATUS) Init\
1484 ( IN PUNKNOWN UnknownAdapter,\
1485 IN PRESOURCELIST ResourceList,\
1486 IN PPORTWAVECYCLIC Port\
1487 );\
1488 STDMETHODIMP_(NTSTATUS) NewStream\
1489 ( OUT PMINIPORTWAVECYCLICSTREAM * Stream,\
1490 IN PUNKNOWN OuterUnknown OPTIONAL,\
1491 IN POOL_TYPE PoolType,\
1492 IN ULONG Pin,\
1493 IN BOOLEAN Capture,\
1494 IN PKSDATAFORMAT DataFormat,\
1495 OUT PDMACHANNEL * DmaChannel,\
1496 OUT PSERVICEGROUP * ServiceGroup\
1497 )
1498
1499
1500 /* ===============================================================
1501 IPortWavePciStream Interface
1502 */
1503 #undef INTERFACE
1504 #define INTERFACE IPortWavePciStream
1505
1506 DEFINE_GUID(IID_IPortWavePciStream, 0xb4c90a51L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1507
1508 DECLARE_INTERFACE_(IPortWavePciStream,IUnknown)
1509 {
1510 DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
1511
1512 STDMETHOD_(NTSTATUS,GetMapping)(THIS_
1513 IN PVOID Tag,
1514 OUT PPHYSICAL_ADDRESS PhysicalAddress,
1515 OUT PVOID * VirtualAddress,
1516 OUT PULONG ByteCount,
1517 OUT PULONG Flags)PURE;
1518
1519 STDMETHOD_(NTSTATUS,ReleaseMapping)(THIS_
1520 IN PVOID Tag)PURE;
1521
1522 STDMETHOD_(NTSTATUS,TerminatePacket)(THIS)PURE;
1523 };
1524
1525 typedef IPortWavePciStream *PPORTWAVEPCISTREAM;
1526
1527 /* ===============================================================
1528 IMiniportWavePciStream Interface
1529 */
1530 #undef INTERFACE
1531 #define INTERFACE IMiniportWavePciStream
1532
1533 DEFINE_GUID(IID_IMiniportWavePciStream, 0xb4c90a53L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1534
1535 DECLARE_INTERFACE_(IMiniportWavePciStream,IUnknown)
1536 {
1537 DEFINE_ABSTRACT_UNKNOWN()
1538
1539 STDMETHOD_(NTSTATUS,SetFormat)(THIS_
1540 IN PKSDATAFORMAT DataFormat)PURE;
1541
1542 STDMETHOD_(NTSTATUS,SetState)(THIS_
1543 IN KSSTATE State)PURE;
1544
1545 STDMETHOD_(NTSTATUS,GetPosition)(THIS_
1546 OUT PULONGLONG Position)PURE;
1547
1548 STDMETHOD_(NTSTATUS,NormalizePhysicalPosition)(THIS_
1549 IN OUT PLONGLONG PhysicalPosition)PURE;
1550
1551 STDMETHOD_(NTSTATUS,GetAllocatorFraming)(THIS_
1552 OUT PKSALLOCATOR_FRAMING AllocatorFraming) PURE;
1553
1554 STDMETHOD_(NTSTATUS,RevokeMappings)(THIS_
1555 IN PVOID FirstTag,
1556 IN PVOID LastTag,
1557 OUT PULONG MappingsRevoked)PURE;
1558
1559 STDMETHOD_(void,MappingAvailable)(THIS)PURE;
1560
1561 STDMETHOD_(void,Service)(THIS)PURE;
1562 };
1563
1564 typedef IMiniportWavePciStream *PMINIPORTWAVEPCISTREAM;
1565
1566 /* ===============================================================
1567 IMiniportWavePci Interface
1568 */
1569 #undef INTERFACE
1570 #define INTERFACE IMiniportWavePci
1571
1572 DEFINE_GUID(IID_IMiniportWavePci, 0xb4c90a52L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1573
1574 DECLARE_INTERFACE_(IMiniportWavePci,IMiniport)
1575 {
1576 DEFINE_ABSTRACT_UNKNOWN()
1577
1578 DEFINE_ABSTRACT_MINIPORT()
1579
1580 STDMETHOD_(NTSTATUS,Init)(THIS_
1581 IN PUNKNOWN UnknownAdapter,
1582 IN PRESOURCELIST ResourceList,
1583 IN PPORTWAVEPCI Port,
1584 OUT PSERVICEGROUP * ServiceGroup)PURE;
1585
1586 STDMETHOD_(NTSTATUS,NewStream)(THIS_
1587 OUT PMINIPORTWAVEPCISTREAM * Stream,
1588 IN PUNKNOWN OuterUnknown OPTIONAL,
1589 IN POOL_TYPE PoolType,
1590 IN PPORTWAVEPCISTREAM PortStream,
1591 IN ULONG Pin,
1592 IN BOOLEAN Capture,
1593 IN PKSDATAFORMAT DataFormat,
1594 OUT PDMACHANNEL * DmaChannel,
1595 OUT PSERVICEGROUP * ServiceGroup)PURE;
1596
1597 STDMETHOD_(void,Service)(THIS)PURE;
1598 };
1599
1600 typedef IMiniportWavePci *PMINIPORTWAVEPCI;
1601
1602
1603 #if !defined(DEFINE_ABSTRACT_MINIPORTWAVERTSTREAM)
1604
1605 #define DEFINE_ABSTRACT_MINIPORTWAVERTSTREAM() \
1606 STDMETHOD_(NTSTATUS,SetFormat) \
1607 ( THIS_ \
1608 IN PKSDATAFORMAT DataFormat \
1609 ) PURE; \
1610 STDMETHOD_(NTSTATUS,SetState) \
1611 ( THIS_ \
1612 IN KSSTATE State \
1613 ) PURE; \
1614 STDMETHOD_(NTSTATUS,GetPosition) \
1615 ( THIS_ \
1616 OUT PKSAUDIO_POSITION Position \
1617 ) PURE; \
1618 STDMETHOD_(NTSTATUS,AllocateAudioBuffer) \
1619 ( THIS_ \
1620 IN ULONG RequestedSize, \
1621 OUT PMDL *AudioBufferMdl, \
1622 OUT ULONG *ActualSize, \
1623 OUT ULONG *OffsetFromFirstPage, \
1624 OUT MEMORY_CACHING_TYPE *CacheType \
1625 ) PURE; \
1626 STDMETHOD_(VOID,FreeAudioBuffer) \
1627 ( THIS_ \
1628 IN PMDL AudioBufferMdl, \
1629 IN ULONG BufferSize \
1630 ) PURE; \
1631 STDMETHOD_(VOID,GetHWLatency) \
1632 ( THIS_ \
1633 OUT KSRTAUDIO_HWLATENCY *hwLatency \
1634 ) PURE; \
1635 STDMETHOD_(NTSTATUS,GetPositionRegister) \
1636 ( THIS_ \
1637 OUT KSRTAUDIO_HWREGISTER *Register \
1638 ) PURE; \
1639 STDMETHOD_(NTSTATUS,GetClockRegister) \
1640 ( THIS_ \
1641 OUT KSRTAUDIO_HWREGISTER *Register \
1642 ) PURE;
1643
1644 #endif
1645
1646
1647 /* ===============================================================
1648 IAdapterPowerManagement Interface
1649 */
1650
1651 #if (NTDDI_VERSION >= NTDDI_VISTA)
1652 /* ===============================================================
1653 IPortWaveRT Interface
1654 */
1655
1656 DEFINE_GUID(CLSID_PortWaveRT, 0xcc9be57a, 0xeb9e, 0x42b4, 0x94, 0xfc, 0xc, 0xad, 0x3d, 0xbc, 0xe7, 0xfa);
1657 DEFINE_GUID(IID_IPortWaveRT, 0x339ff909, 0x68a9, 0x4310, 0xb0, 0x9b, 0x27, 0x4e, 0x96, 0xee, 0x4c, 0xbd);
1658
1659 #undef INTERFACE
1660 #define INTERFACE IPortWaveRT
1661
1662 DECLARE_INTERFACE_(IPortWaveRT,IPort)
1663 {
1664 DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
1665
1666 DEFINE_ABSTRACT_PORT() // For IPort
1667 };
1668
1669 typedef IPortWaveRT *PPORTWAVERT;
1670
1671
1672 /* ===============================================================
1673 IPortWaveRTStream Interface
1674 */
1675
1676 #undef INTERFACE
1677 #define INTERFACE IPortWaveRTStream
1678
1679 DEFINE_GUID(IID_IPortWaveRTStream, 0x1809ce5a, 0x64bc, 0x4e62, 0xbd, 0x7d, 0x95, 0xbc, 0xe4, 0x3d, 0xe3, 0x93);
1680
1681 DECLARE_INTERFACE_(IPortWaveRTStream, IUnknown)
1682 {
1683 DEFINE_ABSTRACT_UNKNOWN()
1684
1685 STDMETHOD_(PMDL, AllocatePagesForMdl)
1686 ( THIS_
1687 IN PHYSICAL_ADDRESS HighAddress,
1688 IN SIZE_T TotalBytes
1689 ) PURE;
1690
1691 STDMETHOD_(PMDL, AllocateContiguousPagesForMdl)
1692 ( THIS_
1693 IN PHYSICAL_ADDRESS LowAddress,
1694 IN PHYSICAL_ADDRESS HighAddress,
1695 IN SIZE_T TotalBytes
1696 ) PURE;
1697
1698 STDMETHOD_(PVOID, MapAllocatedPages)
1699 ( THIS_
1700 IN PMDL MemoryDescriptorList,
1701 IN MEMORY_CACHING_TYPE CacheType
1702 ) PURE;
1703
1704 STDMETHOD_(VOID, UnmapAllocatedPages)
1705 ( THIS_
1706 IN PVOID BaseAddress,
1707 IN PMDL MemoryDescriptorList
1708 ) PURE;
1709
1710 STDMETHOD_(VOID, FreePagesFromMdl)
1711 ( THIS_
1712 IN PMDL MemoryDescriptorList
1713 ) PURE;
1714
1715 STDMETHOD_(ULONG, GetPhysicalPagesCount)
1716 ( THIS_
1717 IN PMDL MemoryDescriptorList
1718 ) PURE;
1719
1720 STDMETHOD_(PHYSICAL_ADDRESS, GetPhysicalPageAddress)
1721 ( THIS_
1722 IN PMDL MemoryDescriptorList,
1723 IN ULONG Index
1724 ) PURE;
1725 };
1726
1727 typedef IPortWaveRTStream *PPORTWAVERTSTREAM;
1728
1729
1730 /* ===============================================================
1731 IMiniportWaveRTStream Interface
1732 */
1733
1734 #undef INTERFACE
1735 #define INTERFACE IMiniportWaveRTStream
1736
1737 DEFINE_GUID(IID_IMiniportWaveRTStream, 0xac9ab, 0xfaab, 0x4f3d, 0x94, 0x55, 0x6f, 0xf8, 0x30, 0x6a, 0x74, 0xa0);
1738
1739 DECLARE_INTERFACE_(IMiniportWaveRTStream, IUnknown)
1740 {
1741 DEFINE_ABSTRACT_UNKNOWN()
1742 DEFINE_ABSTRACT_MINIPORTWAVERTSTREAM()
1743 };
1744
1745 typedef IMiniportWaveRTStream *PMINIPORTWAVERTSTREAM;
1746
1747
1748 /* ===============================================================
1749 IMiniportWaveRTStreamNotification Interface
1750 */
1751
1752 #undef INTERFACE
1753 #define INTERFACE IMiniportWaveRTStreamNotification
1754
1755 DEFINE_GUID(IID_IMiniportWaveRTStreamNotification, 0x23759128, 0x96f1, 0x423b, 0xab, 0x4d, 0x81, 0x63, 0x5b, 0xcf, 0x8c, 0xa1);
1756
1757 DECLARE_INTERFACE_(IMiniportWaveRTStreamNotification, IMiniportWaveRTStream)
1758 {
1759 DEFINE_ABSTRACT_UNKNOWN()
1760
1761 DEFINE_ABSTRACT_MINIPORTWAVERTSTREAM()
1762
1763 STDMETHOD_(NTSTATUS,AllocateBufferWithNotification)
1764 ( THIS_
1765 IN ULONG NotificationCount,
1766 IN ULONG RequestedSize,
1767 OUT PMDL *AudioBufferMdl,
1768 OUT ULONG *ActualSize,
1769 OUT ULONG *OffsetFromFirstPage,
1770 OUT MEMORY_CACHING_TYPE *CacheType
1771 ) PURE;
1772
1773 STDMETHOD_(VOID,FreeBufferWithNotification)
1774 ( THIS_
1775 IN PMDL AudioBufferMdl,
1776 IN ULONG BufferSize
1777 ) PURE;
1778
1779 STDMETHOD_(NTSTATUS,RegisterNotificationEvent)
1780 ( THIS_
1781 IN PKEVENT NotificationEvent
1782 ) PURE;
1783
1784 STDMETHOD_(NTSTATUS,UnregisterNotificationEvent)
1785 ( THIS_
1786 IN PKEVENT NotificationEvent
1787 ) PURE;
1788 };
1789
1790 /* ===============================================================
1791 IMiniportWaveRT Interface
1792 */
1793
1794 #undef INTERFACE
1795 #define INTERFACE IMiniportWaveRT
1796
1797 DEFINE_GUID(IID_IMiniportWaveRT, 0xf9fc4d6, 0x6061, 0x4f3c, 0xb1, 0xfc, 0x7, 0x5e, 0x35, 0xf7, 0x96, 0xa);
1798
1799 DECLARE_INTERFACE_(IMiniportWaveRT, IMiniport)
1800 {
1801 DEFINE_ABSTRACT_UNKNOWN()
1802
1803 DEFINE_ABSTRACT_MINIPORT()
1804
1805 STDMETHOD_(NTSTATUS,Init)
1806 ( THIS_
1807 IN PUNKNOWN UnknownAdapter,
1808 IN PRESOURCELIST ResourceList,
1809 IN PPORTWAVERT Port
1810 ) PURE;
1811
1812 STDMETHOD_(NTSTATUS,NewStream)
1813 ( THIS_
1814 OUT PMINIPORTWAVERTSTREAM * Stream,
1815 IN PPORTWAVERTSTREAM PortStream,
1816 IN ULONG Pin,
1817 IN BOOLEAN Capture,
1818 IN PKSDATAFORMAT DataFormat
1819 ) PURE;
1820
1821 STDMETHOD_(NTSTATUS,GetDeviceDescription)
1822 ( THIS_
1823 OUT PDEVICE_DESCRIPTION DeviceDescription
1824 ) PURE;
1825 };
1826
1827 typedef IMiniportWaveRT *PMINIPORTWAVERT;
1828
1829 #endif
1830
1831 /* ===============================================================
1832 IAdapterPowerManagement Interface
1833 */
1834
1835 #undef INTERFACE
1836 #define INTERFACE IAdapterPowerManagement
1837
1838 DEFINE_GUID(IID_IAdapterPowerManagement, 0x793417D0L, 0x35FE, 0x11D1, 0xAD, 0x08, 0x00, 0xA0, 0xC9, 0x0A, 0xB1, 0xB0);
1839
1840 DECLARE_INTERFACE_(IAdapterPowerManagement, IUnknown)
1841 {
1842 DEFINE_ABSTRACT_UNKNOWN()
1843
1844 STDMETHOD_(void,PowerChangeState)(THIS_
1845 IN POWER_STATE NewState) PURE;
1846
1847 STDMETHOD_(NTSTATUS,QueryPowerChangeState)(THIS_
1848 IN POWER_STATE NewStateQuery) PURE;
1849
1850 STDMETHOD_(NTSTATUS,QueryDeviceCapabilities)(THIS_
1851 IN PDEVICE_CAPABILITIES PowerDeviceCaps) PURE;
1852 };
1853
1854 #define IMP_IAdapterPowerManagement \
1855 STDMETHODIMP_(void) PowerChangeState \
1856 ( IN POWER_STATE NewState \
1857 ); \
1858 STDMETHODIMP_(NTSTATUS) QueryPowerChangeState \
1859 ( IN POWER_STATE NewStateQuery \
1860 ); \
1861 STDMETHODIMP_(NTSTATUS) QueryDeviceCapabilities \
1862 ( IN PDEVICE_CAPABILITIES PowerDeviceCaps \
1863 )
1864
1865 typedef IAdapterPowerManagement *PADAPTERPOWERMANAGEMENT;
1866
1867
1868 /* ===============================================================
1869 IPowerNotify Interface
1870 */
1871
1872 #undef INTERFACE
1873 #define INTERFACE IPowerNotify
1874
1875 DEFINE_GUID(IID_IPowerNotify, 0x3DD648B8L, 0x969F, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3);
1876
1877 DECLARE_INTERFACE_(IPowerNotify, IUnknown)
1878 {
1879 DEFINE_ABSTRACT_UNKNOWN()
1880
1881 STDMETHOD_(void, PowerChangeNotify)(THIS_
1882 IN POWER_STATE PowerState)PURE;
1883 };
1884
1885 typedef IPowerNotify *PPOWERNOTIFY;
1886
1887 #undef INTERFACE
1888
1889 /* ===============================================================
1890 IPinCount Interface
1891 */
1892 #if (NTDDI_VERSION >= NTDDI_WINXP)
1893
1894 #undef INTERFACE
1895 #define INTERFACE IPinCount
1896
1897 DEFINE_GUID(IID_IPinCount, 0x5dadb7dcL, 0xa2cb, 0x4540, 0xa4, 0xa8, 0x42, 0x5e, 0xe4, 0xae, 0x90, 0x51);
1898
1899 DECLARE_INTERFACE_(IPinCount, IUnknown)
1900 {
1901 DEFINE_ABSTRACT_UNKNOWN()
1902
1903 STDMETHOD_(void,PinCount)(THIS_
1904 IN ULONG PinId,
1905 IN OUT PULONG FilterNecessary,
1906 IN OUT PULONG FilterCurrent,
1907 IN OUT PULONG FilterPossible,
1908 IN OUT PULONG GlobalCurrent,
1909 IN OUT PULONG GlobalPossible) PURE;
1910 };
1911 typedef IPinCount *PPINCOUNT;
1912
1913 #undef INTERFACE
1914 #endif
1915
1916
1917 /* ===============================================================
1918 IPortEvents Interface
1919 */
1920
1921 #undef INTERFACE
1922 #define INTERFACE IPortEvents
1923
1924 DEFINE_GUID(IID_IPortEvents, 0xA80F29C4L, 0x5498, 0x11D2, 0x95, 0xD9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3);
1925 DECLARE_INTERFACE_(IPortEvents, IUnknown)
1926 {
1927 DEFINE_ABSTRACT_UNKNOWN()
1928
1929 STDMETHOD_(void,AddEventToEventList)(THIS_
1930 IN PKSEVENT_ENTRY EventEntry)PURE;
1931
1932 STDMETHOD_(void,GenerateEventList)(THIS_
1933 IN GUID* Set OPTIONAL,
1934 IN ULONG EventId,
1935 IN BOOL PinEvent,
1936 IN ULONG PinId,
1937 IN BOOL NodeEvent,
1938 IN ULONG NodeId)PURE;
1939 };
1940
1941 typedef IPortEvents *PPORTEVENTS;
1942
1943
1944 /* ===============================================================
1945 IDrmPort / IDrmPort2 Interfaces
1946 These are almost identical, except for the addition of two extra methods.
1947 */
1948
1949 #undef INTERFACE
1950 #define INTERFACE IDrmPort
1951
1952 #if (NTDDI_VERSION >= NTDDI_WINXP)
1953 DEFINE_GUID(IID_IDrmPort, 0x286D3DF8L, 0xCA22, 0x4E2E, 0xB9, 0xBC, 0x20, 0xB4, 0xF0, 0xE2, 0x01, 0xCE);
1954 #endif
1955
1956 #define DEFINE_ABSTRACT_DRMPORT() \
1957 STDMETHOD_(NTSTATUS,CreateContentMixed)(THIS_ \
1958 IN PULONG paContentId, \
1959 IN ULONG cContentId, \
1960 OUT PULONG pMixedContentId)PURE; \
1961 \
1962 STDMETHOD_(NTSTATUS,DestroyContent)(THIS_ \
1963 IN ULONG ContentId)PURE; \
1964 \
1965 STDMETHOD_(NTSTATUS,ForwardContentToFileObject)(THIS_ \
1966 IN ULONG ContentId, \
1967 IN PFILE_OBJECT FileObject)PURE; \
1968 \
1969 STDMETHOD_(NTSTATUS,ForwardContentToInterface)(THIS_ \
1970 IN ULONG ContentId, \
1971 IN PUNKNOWN pUnknown, \
1972 IN ULONG NumMethods)PURE; \
1973 \
1974 STDMETHOD_(NTSTATUS,GetContentRights)(THIS_ \
1975 IN ULONG ContentId, \
1976 OUT PDRMRIGHTS DrmRights)PURE;
1977
1978 DECLARE_INTERFACE_(IDrmPort, IUnknown)
1979 {
1980 DEFINE_ABSTRACT_UNKNOWN()
1981 DEFINE_ABSTRACT_DRMPORT()
1982 };
1983
1984 typedef IDrmPort *PDRMPORT;
1985
1986 /* ===============================================================
1987 IDrmPort2 Interface
1988 */
1989
1990 #undef INTERFACE
1991 #define INTERFACE IDrmPort2
1992
1993 #if (NTDDI_VERSION >= NTDDI_WINXP)
1994 DEFINE_GUID(IID_IDrmPort2, 0x1ACCE59CL, 0x7311, 0x4B6B, 0x9F, 0xBA, 0xCC, 0x3B, 0xA5, 0x9A, 0xCD, 0xCE);
1995 #endif
1996
1997 DECLARE_INTERFACE_(IDrmPort2, IDrmPort)
1998 {
1999 DEFINE_ABSTRACT_UNKNOWN()
2000 DEFINE_ABSTRACT_DRMPORT()
2001
2002 STDMETHOD_(NTSTATUS,AddContentHandlers)(THIS_
2003 IN ULONG ContentId,
2004 IN PVOID * paHandlers,
2005 IN ULONG NumHandlers)PURE;
2006
2007 STDMETHOD_(NTSTATUS,ForwardContentToDeviceObject)(THIS_
2008 IN ULONG ContentId,
2009 IN PVOID Reserved,
2010 IN PCDRMFORWARD DrmForward)PURE;
2011 };
2012
2013 typedef IDrmPort2 *PDRMPORT2;
2014
2015 /* ===============================================================
2016 IPortClsVersion Interface
2017 */
2018 #undef INTERFACE
2019 #define INTERFACE IPortClsVersion
2020
2021 #if (NTDDI_VERSION >= NTDDI_WINXP)
2022 DEFINE_GUID(IID_IPortClsVersion, 0x7D89A7BBL, 0x869B, 0x4567, 0x8D, 0xBE, 0x1E, 0x16, 0x8C, 0xC8, 0x53, 0xDE);
2023 #endif
2024
2025 DECLARE_INTERFACE_(IPortClsVersion, IUnknown)
2026 {
2027 DEFINE_ABSTRACT_UNKNOWN()
2028
2029 STDMETHOD_(DWORD, GetVersion)(THIS) PURE;
2030 };
2031
2032 #define IMP_IPortClsVersion \
2033 STDMETHODIMP_(DWORD) GetVersion(void);
2034
2035 typedef IPortClsVersion *PPORTCLSVERSION;
2036
2037 #undef INTERFACE
2038
2039 /* ===============================================================
2040 IDmaOperations Interface
2041 */
2042
2043 /* ===============================================================
2044 IPreFetchOffset Interface
2045 */
2046
2047
2048
2049 /* ===============================================================
2050 PortCls API Functions
2051 */
2052
2053 typedef NTSTATUS (NTAPI *PCPFNSTARTDEVICE)(
2054 IN PDEVICE_OBJECT DeviceObject,
2055 IN PIRP Irp,
2056 IN PRESOURCELIST ResourceList);
2057
2058 /* This is in NTDDK.H */
2059 /*
2060 typedef NTSTATUS (*PDRIVER_ADD_DEVICE)(
2061 IN struct _DRIVER_OBJECT* DriverObject,
2062 IN struct _DEVICE_OBJECT* PhysicalDeviceObject);
2063 */
2064
2065 PORTCLASSAPI NTSTATUS NTAPI
2066 PcAddAdapterDevice(
2067 IN PDRIVER_OBJECT DriverObject,
2068 IN PDEVICE_OBJECT PhysicalDeviceObject,
2069 IN PCPFNSTARTDEVICE StartDevice,
2070 IN ULONG MaxObjects,
2071 IN ULONG DeviceExtensionSize);
2072
2073 PORTCLASSAPI NTSTATUS NTAPI
2074 PcInitializeAdapterDriver(
2075 IN PDRIVER_OBJECT DriverObject,
2076 IN PUNICODE_STRING RegistryPathName,
2077 IN PDRIVER_ADD_DEVICE AddDevice);
2078
2079
2080 /* ===============================================================
2081 Factories (TODO: Move elsewhere)
2082 */
2083
2084 PORTCLASSAPI NTSTATUS NTAPI
2085 PcNewDmaChannel(
2086 OUT PDMACHANNEL* OutDmaChannel,
2087 IN PUNKNOWN OuterUnknown OPTIONAL,
2088 IN POOL_TYPE PoolType,
2089 IN PDEVICE_DESCRIPTION DeviceDescription,
2090 IN PDEVICE_OBJECT DeviceObject);
2091
2092 PORTCLASSAPI NTSTATUS NTAPI
2093 PcNewInterruptSync(
2094 OUT PINTERRUPTSYNC* OUtInterruptSync,
2095 IN PUNKNOWN OuterUnknown OPTIONAL,
2096 IN PRESOURCELIST ResourceList,
2097 IN ULONG ResourceIndex,
2098 IN INTERRUPTSYNCMODE Mode);
2099
2100 PORTCLASSAPI NTSTATUS NTAPI
2101 PcNewMiniport(
2102 OUT PMINIPORT* OutMiniport,
2103 IN REFCLSID ClassId);
2104
2105 PORTCLASSAPI NTSTATUS NTAPI
2106 PcNewPort(
2107 OUT PPORT* OutPort,
2108 IN REFCLSID ClassId);
2109
2110 PORTCLASSAPI NTSTATUS NTAPI
2111 PcNewRegistryKey(
2112 OUT PREGISTRYKEY* OutRegistryKey,
2113 IN PUNKNOWN OuterUnknown OPTIONAL,
2114 IN ULONG RegistryKeyType,
2115 IN ACCESS_MASK DesiredAccess,
2116 IN PVOID DeviceObject OPTIONAL,
2117 IN PVOID SubDevice OPTIONAL,
2118 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
2119 IN ULONG CreateOptions OPTIONAL,
2120 OUT PULONG Disposition OPTIONAL);
2121
2122 PORTCLASSAPI NTSTATUS NTAPI
2123 PcNewResourceList(
2124 OUT PRESOURCELIST* OutResourceList,
2125 IN PUNKNOWN OuterUnknown OPTIONAL,
2126 IN POOL_TYPE PoolType,
2127 IN PCM_RESOURCE_LIST TranslatedResources,
2128 IN PCM_RESOURCE_LIST UntranslatedResources);
2129
2130 PORTCLASSAPI NTSTATUS NTAPI
2131 PcNewResourceSublist(
2132 OUT PRESOURCELIST* OutResourceList,
2133 IN PUNKNOWN OuterUnknown OPTIONAL,
2134 IN POOL_TYPE PoolType,
2135 IN PRESOURCELIST ParentList,
2136 IN ULONG MaximumEntries);
2137
2138 PORTCLASSAPI NTSTATUS NTAPI
2139 PcNewServiceGroup(
2140 OUT PSERVICEGROUP* OutServiceGroup,
2141 IN PUNKNOWN OuterUnknown OPTIONAL);
2142
2143
2144 /* ===============================================================
2145 IRP Handling
2146 */
2147
2148 PORTCLASSAPI NTSTATUS NTAPI
2149 PcDispatchIrp(
2150 IN PDEVICE_OBJECT DeviceObject,
2151 IN PIRP Irp);
2152
2153 PORTCLASSAPI NTSTATUS NTAPI
2154 PcCompleteIrp(
2155 IN PDEVICE_OBJECT DeviceObject,
2156 IN PIRP Irp,
2157 IN NTSTATUS Status);
2158
2159 PORTCLASSAPI NTSTATUS NTAPI
2160 PcForwardIrpSynchronous(
2161 IN PDEVICE_OBJECT DeviceObject,
2162 IN PIRP Irp);
2163
2164
2165 /* ===============================================================
2166 Power Management
2167 */
2168
2169 PORTCLASSAPI NTSTATUS NTAPI
2170 PcRegisterAdapterPowerManagement(
2171 IN PUNKNOWN pUnknown,
2172 IN PVOID pvContext1);
2173
2174 PORTCLASSAPI NTSTATUS NTAPI
2175 PcRequestNewPowerState(
2176 IN PDEVICE_OBJECT pDeviceObject,
2177 IN DEVICE_POWER_STATE RequestedNewState);
2178
2179
2180 /* ===============================================================
2181 Properties
2182 */
2183
2184 PORTCLASSAPI NTSTATUS NTAPI
2185 PcGetDeviceProperty(
2186 IN PVOID DeviceObject,
2187 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
2188 IN ULONG BufferLength,
2189 OUT PVOID PropertyBuffer,
2190 OUT PULONG ResultLength);
2191
2192 PORTCLASSAPI NTSTATUS NTAPI
2193 PcCompletePendingPropertyRequest(
2194 IN PPCPROPERTY_REQUEST PropertyRequest,
2195 IN NTSTATUS NtStatus);
2196
2197
2198 /* ===============================================================
2199 I/O Timeouts
2200 */
2201
2202 PORTCLASSAPI NTSTATUS NTAPI
2203 PcRegisterIoTimeout(
2204 IN PDEVICE_OBJECT pDeviceObject,
2205 IN PIO_TIMER_ROUTINE pTimerRoutine,
2206 IN PVOID pContext);
2207
2208 PORTCLASSAPI NTSTATUS NTAPI
2209 PcUnregisterIoTimeout(
2210 IN PDEVICE_OBJECT pDeviceObject,
2211 IN PIO_TIMER_ROUTINE pTimerRoutine,
2212 IN PVOID pContext);
2213
2214
2215 /* ===============================================================
2216 Physical Connections
2217 */
2218
2219 PORTCLASSAPI NTSTATUS NTAPI
2220 PcRegisterPhysicalConnection(
2221 IN PDEVICE_OBJECT DeviceObject,
2222 IN PUNKNOWN FromUnknown,
2223 IN ULONG FromPin,
2224 IN PUNKNOWN ToUnknown,
2225 IN ULONG ToPin);
2226
2227 PORTCLASSAPI NTSTATUS NTAPI
2228 PcRegisterPhysicalConnectionFromExternal(
2229 IN PDEVICE_OBJECT DeviceObject,
2230 IN PUNICODE_STRING FromString,
2231 IN ULONG FromPin,
2232 IN PUNKNOWN ToUnknown,
2233 IN ULONG ToPin);
2234
2235 PORTCLASSAPI NTSTATUS NTAPI
2236 PcRegisterPhysicalConnectionToExternal(
2237 IN PDEVICE_OBJECT DeviceObject,
2238 IN PUNKNOWN FromUnknown,
2239 IN ULONG FromPin,
2240 IN PUNICODE_STRING ToString,
2241 IN ULONG ToPin);
2242
2243
2244 /* ===============================================================
2245 Misc
2246 */
2247
2248 PORTCLASSAPI ULONGLONG NTAPI
2249 PcGetTimeInterval(
2250 IN ULONGLONG Since);
2251
2252 PORTCLASSAPI NTSTATUS NTAPI
2253 PcRegisterSubdevice(
2254 IN PDEVICE_OBJECT DeviceObject,
2255 IN PWCHAR Name,
2256 IN PUNKNOWN Unknown);
2257
2258
2259 /* ===============================================================
2260 Digital Rights Management Functions
2261 Implemented in XP and above
2262 */
2263
2264 PORTCLASSAPI NTSTATUS NTAPI
2265 PcAddContentHandlers(
2266 IN ULONG ContentId,
2267 IN PVOID *paHandlers,
2268 IN ULONG NumHandlers);
2269
2270 PORTCLASSAPI NTSTATUS NTAPI
2271 PcCreateContentMixed(
2272 IN PULONG paContentId,
2273 IN ULONG cContentId,
2274 OUT PULONG pMixedContentId);
2275
2276 PORTCLASSAPI NTSTATUS NTAPI
2277 PcDestroyContent(
2278 IN ULONG ContentId);
2279
2280 PORTCLASSAPI NTSTATUS NTAPI
2281 PcForwardContentToDeviceObject(
2282 IN ULONG ContentId,
2283 IN PVOID Reserved,
2284 IN PCDRMFORWARD DrmForward);
2285
2286 PORTCLASSAPI NTSTATUS NTAPI
2287 PcForwardContentToFileObject(
2288 IN ULONG ContentId,
2289 IN PFILE_OBJECT FileObject);
2290
2291 PORTCLASSAPI NTSTATUS NTAPI
2292 PcForwardContentToInterface(
2293 IN ULONG ContentId,
2294 IN PUNKNOWN pUnknown,
2295 IN ULONG NumMethods);
2296
2297 PORTCLASSAPI NTSTATUS NTAPI
2298 PcGetContentRights(
2299 IN ULONG ContentId,
2300 OUT PDRMRIGHTS DrmRights);
2301
2302
2303 #endif