- Add CLSIDs for Miniport drivers
[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 #include <ks.h>
138 #include <ksmedia.h>
139 #include <punknown.h>
140 #include <drmk.h>
141
142 #ifdef __cplusplus
143 extern "C"
144 {
145 #include <wdm.h>
146 }
147 #else
148 #include <wdm.h>
149 #endif
150
151 #ifndef PC_NO_IMPORTS
152 #define PORTCLASSAPI EXTERN_C __declspec(dllimport)
153 #else
154 #define PORTCLASSAPI EXTERN_C
155 #endif
156
157 /* TODO */
158 #define PCFILTER_NODE ((ULONG) -1)
159
160 /* HACK */
161 /* typedef PVOID CM_RESOURCE_TYPE; */
162
163 #define PORT_CLASS_DEVICE_EXTENSION_SIZE ( 64 * sizeof(ULONG_PTR) )
164
165
166 DEFINE_GUID(CLSID_MiniportDriverFmSynth, 0xb4c90ae0L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
167 DEFINE_GUID(CLSID_MiniportDriverFmSynthWithVol, 0xe5a3c139L, 0xf0f2, 0x11d1, 0x81, 0xaf, 0x00, 0x60, 0x08, 0x33, 0x16, 0xc1);
168
169 /* ===============================================================
170 Event Item Flags - TODO
171 */
172 #define PCEVENT_ITEM_FLAG_ENABLE KSEVENT_TYPE_ENABLE
173 #define PCEVENT_ITEM_FLAG_ONESHOT KSEVENT_TYPE_ONESHOT
174 #define PCEVENT_ITEM_FLAG_BASICSUPPORT KSEVENT_TYPE_BASICSUPPORT
175
176
177 /* ===============================================================
178 Event Verbs - TODO
179 */
180 #define PCEVENT_VERB_NONE 0
181 #define PCEVENT_VERB_ADD 1
182 #define PCEVENT_VERB_REMOVE 2
183 #define PCEVENT_VERB_SUPPORT 4
184
185
186 /* ===============================================================
187 Method Item Flags - TODO
188 */
189 #define PCMETHOD_ITEM_FLAG_NONE KSMETHOD_TYPE_NONE
190 #define PCMETHOD_ITEM_FLAG_READ KSMETHOD_TYPE_READ
191 #define PCMETHOD_ITEM_FLAG_WRITE KSMETHOD_TYPE_WRITE
192 #define PCMETHOD_ITEM_FLAG_MODIFY KSMETHOD_TYPE_MODIFY
193 #define PCMETHOD_ITEM_FLAG_SOURCE KSMETHOD_TYPE_SOURCE
194
195
196 /* ===============================================================
197 Method Verbs - TODO
198 */
199 #define PCMETHOD_ITEM_FLAG_BASICSUPPORT KSMETHOD_TYPE_BASICSUPPORT
200 #define PCMETHOD_ITEM_FLAG_SEND
201 #define PCMETHOD_ITEM_FLAG_SETSUPPORT
202
203
204 /* ===============================================================
205 Versions
206 IoIsWdmVersionAvailable may also be used by older drivers.
207 */
208
209 enum
210 {
211 kVersionInvalid = -1,
212
213 kVersionWin98,
214 kVersionWin98SE,
215 kVersionWin2K,
216 kVersionWin98SE_QFE2,
217 kVersionWin2K_SP2,
218 kVersionWinME,
219 kVersionWin98SE_QFE3,
220 kVersionWinME_QFE1,
221 kVersionWinXP,
222 kVersionWinXPSP1,
223 kVersionWinServer2003,
224 kVersionWin2K_UAAQFE, /* These support IUnregister* interface */
225 kVersionWinXP_UAAQFE,
226 kVersionWinServer2003_UAAQFE
227 };
228
229 /* ===============================================================
230 Properties
231 */
232
233 struct _PCPROPERTY_REQUEST;
234
235 typedef NTSTATUS (*PCPFNPROPERTY_HANDLER)(
236 IN struct _PCPROPERTY_REQUEST* PropertyRequest);
237
238 typedef struct _PCPROPERTY_ITEM
239 {
240 const GUID* Set;
241 ULONG Id;
242 ULONG Flags;
243 PCPFNPROPERTY_HANDLER Handler;
244 } PCPROPERTY_ITEM, *PPCPROPERTY_ITEM;
245
246 typedef struct _PCPROPERTY_REQUEST
247 {
248 PUNKNOWN MajorTarget;
249 PUNKNOWN MinorTarget;
250 ULONG Node;
251 const PCPROPERTY_ITEM* PropertyItem;
252 ULONG Verb;
253 ULONG InstanceSize;
254 PVOID Instance;
255 ULONG ValueSize;
256 PVOID Value;
257 PIRP Irp;
258 } PCPROPERTY_REQUEST, *PPCPROPERTY_REQUEST;
259
260 #define PCPROPERTY_ITEM_FLAG_DEFAULTVALUES KSPROPERTY_TYPE_DEFAULTVALUES
261 #define PCPROPERTY_ITEM_FLAG_GET KSPROPERTY_TYPE_GET
262 #define PCPROPERTY_ITEM_FLAG_SET KSPROPERTY_TYPE_SET
263 #define PCPROPERTY_ITEM_FLAG_BASICSUPPORT KSPROPERTY_TYPE_BASICSUPPORT
264 #define PCPROPERTY_ITEM_FLAG_SERIALIZESIZE KSPROPERTY_TYPE_SERIALIZESIZE
265 #define PCPROPERTY_ITEM_FLAG_SERIALIZERAW KSPROPERTY_TYPE_SERIALIZERAW
266 #define PCPROPERTY_ITEM_FLAG_UNSERIALIZERAW KSPROPERTY_TYPE_UNSERIALIZERAW
267 #define PCPROPERTY_ITEM_FLAG_SERIALIZE ( PCPROPERTY_ITEM_FLAG_SERIALIZERAW \
268 | PCPROPERTY_ITEM_FLAG_UNSERIALIZERAW \
269 | PCPROPERTY_ITEM_FLAG_SERIALIZESIZE)
270
271
272 struct _PCEVENT_REQUEST;
273
274 typedef NTSTATUS (*PCPFNEVENT_HANDLER)(
275 IN struct _PCEVENT_REQUEST* EventRequest);
276
277 typedef struct _PCEVENT_ITEM
278 {
279 const GUID* Set;
280 ULONG Id;
281 ULONG Flags;
282 PCPFNEVENT_HANDLER Handler;
283 } PCEVENT_ITEM, *PPCEVENT_ITEM;
284
285 typedef struct _PCEVENT_REQUEST
286 {
287 PUNKNOWN MajorTarget;
288 PUNKNOWN MinorTarget;
289 ULONG Node;
290 const PCEVENT_ITEM* EventItem;
291 PKSEVENT_ENTRY EventEntry;
292 ULONG Verb;
293 PIRP Irp;
294 } PCEVENT_REQUEST, *PPCEVENT_REQUEST;
295
296
297
298 struct _PCMETHOD_REQUEST;
299
300 typedef NTSTATUS (*PCPFNMETHOD_HANDLER)(
301 IN struct _PCMETHOD_REQUEST* MethodRequest);
302
303 typedef struct _PCMETHOD_ITEM
304 {
305 const GUID* Set;
306 ULONG Id;
307 ULONG Flags;
308 PCPFNMETHOD_HANDLER Handler;
309 } PCMETHOD_ITEM, *PPCMETHOD_ITEM;
310
311 typedef struct _PCMETHOD_REQUEST
312 {
313 PUNKNOWN MajorTarget;
314 PUNKNOWN MinorTarget;
315 ULONG Node;
316 const PCMETHOD_ITEM* MethodItem;
317 ULONG Verb;
318 } PCMETHOD_REQUEST, *PPCMETHOD_REQUEST;
319
320
321 /* ===============================================================
322 Structures (unsorted)
323 */
324
325 typedef struct
326 {
327 ULONG PropertyItemSize;
328 ULONG PropertyCount;
329 const PCPROPERTY_ITEM* Properties;
330 ULONG MethodItemSize;
331 ULONG MethodCount;
332 const PCMETHOD_ITEM* Methods;
333 ULONG EventItemSize;
334 ULONG EventCount;
335 const PCEVENT_ITEM* Events;
336 ULONG Reserved;
337 } PCAUTOMATION_TABLE, *PPCAUTOMATION_TABLE;
338
339 typedef struct
340 {
341 ULONG FromNode;
342 ULONG FromNodePin;
343 ULONG ToNode;
344 ULONG ToNodePin;
345 } PCCONNECTION_DESCRIPTOR, *PPCCONNECTIONDESCRIPTOR;
346
347 typedef struct
348 {
349 ULONG MaxGlobalInstanceCount;
350 ULONG MaxFilterInstanceCount;
351 ULONG MinFilterInstanceCount;
352 const PCAUTOMATION_TABLE* AutomationTable;
353 KSPIN_DESCRIPTOR KsPinDescriptor;
354 } PCPIN_DESCRIPTOR, *PPCPIN_DESCRIPTOR;
355
356 typedef struct
357 {
358 ULONG Flags;
359 const PCAUTOMATION_TABLE* AutomationTable;
360 const GUID* Type;
361 const GUID* Name;
362 } PCNODE_DESCRIPTOR, *PPCNODE_DESCRIPTOR;
363
364 typedef struct
365 {
366 ULONG Version;
367 const PCAUTOMATION_TABLE* AutomationTable;
368 ULONG PinSize;
369 ULONG PinCount;
370 const PCPIN_DESCRIPTOR* Pins;
371 ULONG NodeSize;
372 ULONG NodeCount;
373 const PCNODE_DESCRIPTOR* Nodes;
374 ULONG ConnectionCount;
375 const PCCONNECTION_DESCRIPTOR* Connections;
376 ULONG CategoryCount;
377 const GUID* Categories;
378 } PCFILTER_DESCRIPTOR, *PPCFILTER_DESCRIPTOR;
379
380
381 /* ===============================================================
382 IResourceList Interface
383 */
384
385 #undef INTERFACE
386 #define INTERFACE IResourceList
387
388 DEFINE_GUID(IID_IResourceList, 0x22C6AC60L, 0x851B, 0x11D0, 0x9A, 0x7F, 0x00, 0xAA, 0x00, 0x38, 0xAC, 0xFE);
389
390 DECLARE_INTERFACE_(IResourceList, IUnknown)
391 {
392 DEFINE_ABSTRACT_UNKNOWN()
393
394 STDMETHOD_(ULONG, NumberOfEntries)( THIS ) PURE;
395
396 STDMETHOD_(ULONG, NumberOfEntriesOfType)( THIS_
397 IN CM_RESOURCE_TYPE Type) PURE;
398
399 STDMETHOD_(PCM_PARTIAL_RESOURCE_DESCRIPTOR, FindTranslatedEntry)( THIS_
400 IN CM_RESOURCE_TYPE Type,
401 IN ULONG Index) PURE;
402
403 STDMETHOD_(PCM_PARTIAL_RESOURCE_DESCRIPTOR, FindUntranslatedEntry)( THIS_
404 IN CM_RESOURCE_TYPE Type,
405 IN ULONG Index) PURE;
406
407 STDMETHOD_(NTSTATUS, AddEntry)( THIS_
408 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Translated,
409 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Untranslated) PURE;
410
411 STDMETHOD_(NTSTATUS, AddEntryFromParent)( THIS_
412 IN IResourceList* Parent,
413 IN CM_RESOURCE_TYPE Type,
414 IN ULONG Index) PURE;
415
416 STDMETHOD_(PCM_RESOURCE_LIST, TranslatedList)( THIS ) PURE;
417 STDMETHOD_(PCM_RESOURCE_LIST, UntranslatedList)( THIS ) PURE;
418 };
419
420 #define IMP_IResourceList \
421 STDMETHODIMP_(ULONG) NumberOfEntries(void); \
422 \
423 STDMETHODIMP_(ULONG) NumberOfEntriesOfType( \
424 IN CM_RESOURCE_TYPE Type); \
425 \
426 STDMETHODIMP_(PCM_PARTIAL_RESOURCE_DESCRIPTOR) FindTranslatedEntry( \
427 IN CM_RESOURCE_TYPE Type, \
428 IN ULONG Index); \
429 \
430 STDMETHODIMP_(PCM_PARTIAL_RESOURCE_DESCRIPTOR) FindUntranslatedEntry( \
431 IN CM_RESOURCE_TYPE Type, \
432 IN ULONG Index); \
433 \
434 STDMETHODIMP_(NTSTATUS) AddEntry( \
435 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Translated, \
436 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Untranslated); \
437 \
438 STDMETHODIMP_(NTSTATUS) AddEntryFromParent( \
439 IN IResourceList* Parent, \
440 IN CM_RESOURCE_TYPE Type, \
441 IN ULONG Index); \
442 \
443 STDMETHODIMP_(PCM_RESOURCE_LIST) TranslatedList(void); \
444 STDMETHODIMP_(PCM_RESOURCE_LIST) UntranslatedList(void);
445
446 typedef IResourceList *PRESOURCELIST;
447
448 #define NumberOfPorts() \
449 NumberOfEntriesOfType(CmResourceTypePort)
450
451 #define FindTranslatedPort(n) \
452 FindTranslatedEntry(CmResourceTypePort, (n))
453
454 #define FindUntranslatedPort(n) \
455 FindUntranslatedEntry(CmResourceTypePort, (n))
456
457 #define AddPortFromParent(p, n) \
458 AddEntryFromParent((p), CmResourceTypePort, (n))
459
460 #define NumberOfInterrupts() \
461 NumberOfEntriesOfType(CmResourceTypeInterrupt)
462
463 #define FindTranslatedInterrupt(n) \
464 FindTranslatedEntry(CmResourceTypeInterrupt, (n))
465
466 #define FindUntranslatedInterrupt(n) \
467 FindUntranslatedEntry(CmResourceTypeInterrupt, (n))
468
469 #define AddInterruptFromParent(p, n) \
470 AddEntryFromParent((p), CmResourceTypeInterrupt, (n))
471
472 #define NumberOfMemories() \
473 NumberOfEntriesOfType(CmResourceTypeMemory)
474
475 #define FindTranslatedMemory(n) \
476 FindTranslatedEntry(CmResourceTypeMemory, (n))
477
478 #define FindUntranslatedMemory(n) \
479 FindUntranslatedEntry(CmResourceTypeMemory, (n))
480
481 #define AddMemoryFromParent(p, n) \
482 AddEntryFromParent((p), CmResourceTypeMemory, (n))
483
484 #define NumberOfDmas() \
485 NumberOfEntriesOfType(CmResourceTypeDma)
486
487 #define FindTranslatedDma(n) \
488 FindTranslatedEntry(CmResourceTypeDma, (n))
489
490 #define FindUntranslatedDma(n) \
491 FindUntranslatedEntry(CmResourceTypeDma, (n))
492
493 #define AddDmaFromParent(p, n) \
494 AddEntryFromParent((p), CmResourceTypeInterrupt, (n))
495
496 #define NumberOfDeviceSpecifics() \
497 NumberOfEntriesOfType(CmResourceTypeDeviceSpecific)
498
499 #define FindTranslatedDeviceSpecific(n) \
500 FindTranslatedEntry(CmResourceTypeDeviceSpecific, (n))
501
502 #define FindUntranslatedDeviceSpecific(n) \
503 FindUntranslatedEntry(CmResourceTypeDeviceSpecific, (n))
504
505 #define AddDeviceSpecificFromParent(p, n) \
506 AddEntryFromParent((p), CmResourceTypeDeviceSpecific, (n))
507
508 #define NumberOfBusNumbers() \
509 NumberOfEntriesOfType(CmResourceTypeBusNumber)
510
511 #define FindTranslatedBusNumber(n) \
512 FindTranslatedEntry(CmResourceTypeBusNumber, (n))
513
514 #define FindUntranslatedBusNumber(n) \
515 FindUntranslatedEntry(CmResourceTypeBusNumber, (n))
516
517 #define AddBusNumberFromParent(p, n) \
518 AddEntryFromParent((p), CmResourceTypeBusNumber, (n))
519
520 #define NumberOfDevicePrivates() \
521 NumberOfEntriesOfType(CmResourceTypeDevicePrivate)
522
523 #define FindTranslatedDevicePrivate(n) \
524 FindTranslatedEntry(CmResourceTypeDevicePrivate, (n))
525
526 #define FindUntranslatedDevicePrivate(n) \
527 FindUntranslatedEntry(CmResourceTypeDevicePrivate, (n))
528
529 #define AddDevicePrivateFromParent(p, n) \
530 AddEntryFromParent((p), CmResourceTypeDevicePrivate, (n))
531
532 #define NumberOfAssignedResources() \
533 NumberOfEntriesOfType(CmResourceTypeAssignedResource)
534
535 #define FindTranslatedAssignedResource(n) \
536 FindTranslatedEntry(CmResourceTypeAssignedResource, (n))
537
538 #define FindUntranslatedAssignedResource(n) \
539 FindUntranslatedEntry(CmResourceTypeAssignedResource, (n))
540
541 #define AddAssignedResourceFromParent(p, n) \
542 AddEntryFromParent((p), CmResourceTypeAssignedResource, (n))
543
544 #define NumberOfSubAllocateFroms() \
545 NumberOfEntriesOfType(CmResourceTypeSubAllocateFrom)
546
547 #define FindTranslatedSubAllocateFrom(n) \
548 FindTranslatedEntry(CmResourceTypeSubAllocateFrom, (n))
549
550 #define FindUntranslatedSubAllocateFrom(n) \
551 FindUntranslatedEntry(CmResourceTypeSubAllocateFrom, (n))
552
553 #define AddSubAllocateFromFromParent(p, n) \
554 AddEntryFromParent((p), CmResourceTypeSubAllocateFrom, (n))
555
556 #undef INTERFACE
557
558
559 /* ===============================================================
560 IServiceSink Interface
561 */
562
563 DECLARE_INTERFACE_(IServiceSink, IUnknown)
564 {
565 DEFINE_ABSTRACT_UNKNOWN()
566 STDMETHOD_(void, RequestService)( THIS ) PURE;
567 };
568
569 #define IMP_IServiceSink \
570 STDMETHODIMP_(void) RequestService(void);
571
572 typedef IServiceSink *PSERVICESINK;
573
574
575 /* ===============================================================
576 IServiceGroup Interface
577 */
578
579 DECLARE_INTERFACE_(IServiceGroup, IUnknown)
580 {
581 DEFINE_ABSTRACT_UNKNOWN()
582
583 STDMETHOD_(void, RequestService)( THIS ) PURE; /* IServiceSink */
584
585 STDMETHOD_(NTSTATUS, AddMember)( THIS_
586 IN PSERVICESINK pServiceSink) PURE;
587
588 STDMETHOD_(void, RemoveMember)( THIS_
589 IN PSERVICESINK pServiceSink) PURE;
590
591 STDMETHOD_(void, SupportDelayedService)( THIS ) PURE;
592
593 STDMETHOD_(void, RequestDelayedService)( THIS_
594 IN ULONGLONG ullDelay) PURE;
595
596 STDMETHOD_(void, CancelDelayedService)( THIS ) PURE;
597 };
598
599 #define IMP_IServiceGroup \
600 IMP_IServiceSink; \
601 \
602 STDMETHODIMP_(NTSTATUS) AddMember( \
603 IN PSERVICESINK pServiceSink); \
604 \
605 STDMETHODIMP_(void) RemoveMember( \
606 IN PSERVICESINK pServiceSink); \
607 \
608 STDMETHODIMP_(void) SupportDelayedService(void); \
609 \
610 STDMETHODIMP_(void) RequestDelayedService( \
611 IN ULONGLONG ullDelay); \
612 \
613 STDMETHODIMP_(void) CancelDelayedService(void);
614
615 typedef IServiceGroup *PSERVICEGROUP;
616
617
618 /* ===============================================================
619 IDmaChannel Interface
620 */
621
622 #define DEFINE_ABSTRACT_DMACHANNEL() \
623 STDMETHOD_(NTSTATUS, AllocateBuffer)( THIS_ \
624 IN ULONG BufferSize, \
625 IN PPHYSICAL_ADDRESS PhysicalAddressConstraint OPTIONAL) PURE; \
626 \
627 STDMETHOD_(void, FreeBuffer)( THIS ) PURE; \
628 STDMETHOD_(ULONG, TransferCount)( THIS ) PURE; \
629 STDMETHOD_(ULONG, MaximumBufferSize)( THIS ) PURE; \
630 STDMETHOD_(ULONG, AllocatedBufferSize)( THIS ) PURE; \
631 STDMETHOD_(ULONG, BufferSize)( THIS ) PURE; \
632 \
633 STDMETHOD_(void, SetBufferSize)( THIS_ \
634 IN ULONG BufferSize) PURE; \
635 \
636 STDMETHOD_(PVOID, SystemAddress)( THIS ) PURE; \
637 STDMETHOD_(PHYSICAL_ADDRESS, PhysicalAddress)( THIS ) PURE; \
638 STDMETHOD_(PADAPTER_OBJECT, GetAdapterObject)( THIS ) PURE; \
639 \
640 STDMETHOD_(void, CopyTo)( THIS_ \
641 IN PVOID Destination, \
642 IN PVOID Source, \
643 IN ULONG ByteCount) PURE; \
644 \
645 STDMETHOD_(void, CopyFrom)( THIS_ \
646 IN PVOID Destination, \
647 IN PVOID Source, \
648 IN ULONG ByteCount) PURE;
649
650 #define IMP_IDmaChannel() \
651 STDMETHODIMP_(NTSTATUS) AllocateBuffer( \
652 IN ULONG BufferSize, \
653 IN PPHYSICAL_ADDRESS PhysicalAddressConstraint OPTIONAL); \
654 \
655 STDMETHODIMP_(void) FreeBuffer(void); \
656 STDMETHODIMP_(ULONG) TransferCount(void); \
657 STDMETHODIMP_(ULONG) MaximumBufferSize(void); \
658 STDMETHODIMP_(ULONG) AllocatedBufferSize(void); \
659 STDMETHODIMP_(ULONG) BufferSize(void); \
660 \
661 STDMETHODIMP_(void) SetBufferSize)( \
662 IN ULONG BufferSize); \
663 \
664 STDMETHODIMP_(PVOID) SystemAddress(void); \
665 STDMETHODIMP_(PHYSICAL_ADDRESS) PhysicalAddress(void); \
666 STDMETHODIMP_(PADAPTER_OBJECT) GetAdapterObject(void); \
667 \
668 STDMETHODIMP_(void) CopyTo( \
669 IN PVOID Destination, \
670 IN PVOID Source, \
671 IN ULONG ByteCount); \
672 \
673 STDMETHODIMP_(void) CopyFrom( \
674 IN PVOID Destination, \
675 IN PVOID Source, \
676 IN ULONG ByteCount);
677
678 DECLARE_INTERFACE_(IDmaChannel, IUnknown)
679 {
680 DEFINE_ABSTRACT_UNKNOWN()
681 DEFINE_ABSTRACT_DMACHANNEL()
682 };
683
684 typedef IDmaChannel *PDMACHANNEL;
685
686
687 /* ===============================================================
688 IDmaChannelSlave Interface
689 */
690
691 #define DEFINE_ABSTRACT_DMACHANNELSLAVE() \
692 STDMETHOD_(NTSTATUS, Start)( THIS_ \
693 IN ULONG MapSize, \
694 IN BOOLEAN WriteToDevice) PURE; \
695 \
696 STDMETHOD_(NTSTATUS, Stop)( THIS ) PURE; \
697 STDMETHOD_(NTSTATUS, ReadCounter)( THIS ) PURE; \
698 \
699 STDMETHOD_(NTSTATUS, WaitForTC)( THIS_ \
700 ULONG Timeout) PURE;
701
702 #define IMP_IDmaChannelSlave \
703 STDMETHODIMP_(NTSTATUS) Start( \
704 IN ULONG MapSize, \
705 IN BOOLEAN WriteToDevice); \
706 \
707 STDMETHODIMP_(NTSTATUS) Stop(void); \
708 STDMETHODIMP_(NTSTATUS) ReadCounter)(void); \
709 \
710 STDMETHODIMP_(NTSTATUS, WaitForTC)( \
711 ULONG Timeout);
712
713 DECLARE_INTERFACE_(IDmaChannelSlave, IDmaChannel)
714 {
715 DEFINE_ABSTRACT_UNKNOWN()
716 DEFINE_ABSTRACT_DMACHANNEL()
717 DEFINE_ABSTRACT_DMACHANNELSLAVE()
718 };
719
720 typedef IDmaChannelSlave *PDMACHANNELSLAVE;
721
722
723 /* ===============================================================
724 IInterruptSync Interface
725 */
726
727 typedef enum
728 {
729 InterruptSyncModeNormal = 1,
730 InterruptSyncModeAll,
731 InterruptSyncModeRepeat
732 } INTERRUPTSYNCMODE;
733
734 struct IInterruptSync;
735
736 typedef NTSTATUS (*PINTERRUPTSYNCROUTINE)(
737 IN struct IInterruptSync* InterruptSync,
738 IN PVOID DynamicContext);
739
740 DECLARE_INTERFACE_(IInterruptSync, IUnknown)
741 {
742 DEFINE_ABSTRACT_UNKNOWN()
743
744 STDMETHOD_(NTSTATUS, CallSynchronizedRoutine)( THIS_
745 IN PINTERRUPTSYNCROUTINE Routine,
746 IN PVOID DynamicContext) PURE;
747
748 STDMETHOD_(PKINTERRUPT, GetKInterrupt)( THIS ) PURE;
749 STDMETHOD_(NTSTATUS, Connect)( THIS ) PURE;
750 STDMETHOD_(void, Disconnect)( THIS ) PURE;
751
752 STDMETHOD_(NTSTATUS, RegisterServiceRoutine)( THIS_
753 IN PINTERRUPTSYNCROUTINE Routine,
754 IN PVOID DynamicContext,
755 IN BOOLEAN First) PURE;
756 };
757
758 #define IMP_IInterruptSync \
759 STDMETHODIMP_(NTSTATUS, CallSynchronizedRoutine)( \
760 IN PINTERRUPTSYNCROUTINE Routine, \
761 IN PVOID DynamicContext); \
762 \
763 STDMETHODIMP_(PKINTERRUPT, GetKInterrupt)(void); \
764 STDMETHODIMP_(NTSTATUS, Connect)(void); \
765 STDMETHODIMP_(void, Disconnect)(void); \
766 \
767 STDMETHODIMP_(NTSTATUS, RegisterServiceRoutine)( \
768 IN PINTERRUPTSYNCROUTINE Routine, \
769 IN PVOID DynamicContext, \
770 IN BOOLEAN First);
771
772 typedef IInterruptSync *PINTERRUPTSYNC;
773
774
775 /* ===============================================================
776 IRegistryKey Interface
777 */
778
779 DEFINE_GUID(IID_IRegistryKey, 0xE8DA4302l, 0xF304, 0x11D0, 0x95, 0x8B, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3);
780
781 DECLARE_INTERFACE_(IRegistryKey, IUnknown)
782 {
783 DEFINE_ABSTRACT_UNKNOWN()
784
785 STDMETHOD_(NTSTATUS, QueryKey)( THIS_
786 IN KEY_INFORMATION_CLASS KeyInformationClass,
787 OUT PVOID KeyInformation,
788 IN ULONG Length,
789 OUT PULONG ResultLength) PURE;
790
791 STDMETHOD_(NTSTATUS, EnumerateKey)( THIS_
792 IN ULONG Index,
793 IN KEY_INFORMATION_CLASS KeyInformationClass,
794 OUT PVOID KeyInformation,
795 IN ULONG Length,
796 OUT PULONG ResultLength) PURE;
797
798 STDMETHOD_(NTSTATUS, QueryValueKey)( THIS_
799 IN PUNICODE_STRING ValueName,
800 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
801 OUT PVOID KeyValueInformation,
802 IN ULONG Length,
803 OUT PULONG ResultLength) PURE;
804
805 STDMETHOD_(NTSTATUS, EnumerateValueKey)( THIS_
806 IN ULONG Index,
807 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
808 OUT PVOID KeyValueInformation,
809 IN ULONG Length,
810 OUT PULONG ResultLength) PURE;
811
812 STDMETHOD_(NTSTATUS, SetValueKey)( THIS_
813 IN PUNICODE_STRING ValueName OPTIONAL,
814 IN ULONG Type,
815 IN PVOID Data,
816 IN ULONG DataSize) PURE;
817
818 STDMETHOD_(NTSTATUS, QueryRegistryValues)( THIS_
819 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
820 IN PVOID Context OPTIONAL) PURE;
821
822 STDMETHOD_(NTSTATUS, NewSubKey)( THIS_
823 OUT IRegistryKey** RegistrySubKey,
824 IN PUNKNOWN OuterUnknown,
825 IN ACCESS_MASK DesiredAccess,
826 IN PUNICODE_STRING SubKeyName,
827 IN ULONG CreateOptions,
828 OUT PULONG Disposition OPTIONAL) PURE;
829
830 STDMETHOD_(NTSTATUS, DeleteKey)( THIS ) PURE;
831 };
832
833 #define IMP_IRegistryKey \
834 STDMETHODIMP_(NTSTATUS) QueryKey( \
835 IN KEY_INFORMATION_CLASS KeyInformationClass, \
836 OUT PVOID KeyInformation, \
837 IN ULONG Length, \
838 OUT PULONG ResultLength); \
839 \
840 STDMETHODIMP_(NTSTATUS) EnumerateKey( \
841 IN ULONG Index, \
842 IN KEY_INFORMATION_CLASS KeyInformationClass, \
843 OUT PVOID KeyInformation, \
844 IN ULONG Length, \
845 OUT PULONG ResultLength); \
846 \
847 STDMETHODIMP_(NTSTATUS) QueryValueKey( \
848 IN PUNICODE_STRING ValueName, \
849 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, \
850 OUT PVOID KeyValueInformation, \
851 IN ULONG Length, \
852 OUT PULONG ResultLength); \
853 \
854 STDMETHODIMP_(NTSTATUS) EnumerateValueKey( \
855 IN ULONG Index, \
856 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, \
857 OUT PVOID KeyValueInformation, \
858 IN ULONG Length, \
859 OUT PULONG ResultLength); \
860 \
861 STDMETHODIMP_(NTSTATUS) SetValueKey( \
862 IN PUNICODE_STRING ValueName OPTIONAL, \
863 IN ULONG Type, \
864 IN PVOID Data, \
865 IN ULONG DataSize); \
866 \
867 STDMETHODIMP_(NTSTATUS) QueryRegistryValues( \
868 IN PRTL_QUERY_REGISTRY_TABLE QueryTable, \
869 IN PVOID Context OPTIONAL); \
870 \
871 STDMETHODIMP_(NTSTATUS) NewSubKey( \
872 OUT IRegistryKey** RegistrySubKey, \
873 IN PUNKNOWN OuterUnknown, \
874 IN ACCESS_MASK DesiredAccess, \
875 IN PUNICODE_STRING SubKeyName, \
876 IN ULONG CreateOptions, \
877 OUT PULONG Disposition OPTIONAL); \
878 \
879 STDMETHODIMP_(NTSTATUS) DeleteKey(void);
880
881 typedef IRegistryKey *PREGISTRYKEY;
882
883
884 /* ===============================================================
885 IMusicTechnology Interface
886 */
887
888 DECLARE_INTERFACE_(IMusicTechnology, IUnknown)
889 {
890 DEFINE_ABSTRACT_UNKNOWN()
891
892 STDMETHOD_(NTSTATUS, SetTechnology)( THIS_
893 IN const GUID* Technology) PURE;
894 };
895
896 #define IMP_IMusicTechnology \
897 STDMETHODIMP_(NTSTATUS) SetTechnology( \
898 IN const GUID* Technology);
899
900 typedef IMusicTechnology *PMUSICTECHNOLOGY;
901
902
903 /* ===============================================================
904 IPort Interface
905 */
906
907 #if 0
908 #define STATIC_IPort 0xb4c90a25L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
909 DEFINE_GUIDSTRUCT("0xB4C90A25-5791-11d0-86f9-00a0c911b544", IID_IPort);
910 #define IID_IPort DEFINE_GUIDNAMED(IID_IPort)
911 #endif
912 DEFINE_GUID(IID_IPort,
913 0xb4c90a25L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
914
915 #define DEFINE_ABSTRACT_PORT() \
916 STDMETHOD_(NTSTATUS, Init)( THIS_ \
917 IN PDEVICE_OBJECT DeviceObject, \
918 IN PIRP Irp, \
919 IN PUNKNOWN UnknownMiniport, \
920 IN PUNKNOWN UnknownAdapter OPTIONAL, \
921 IN PRESOURCELIST ResourceList) PURE; \
922 \
923 STDMETHOD_(NTSTATUS, GetDeviceProperty)( THIS_ \
924 IN DEVICE_REGISTRY_PROPERTY DeviceProperty, \
925 IN ULONG BufferLength, \
926 OUT PVOID PropertyBuffer, \
927 OUT PULONG ResultLength) PURE; \
928 \
929 STDMETHOD_(NTSTATUS, NewRegistryKey)( THIS_ \
930 OUT PREGISTRYKEY* OutRegistryKey, \
931 IN PUNKNOWN OuterUnknown OPTIONAL, \
932 IN ULONG RegistryKeyType, \
933 IN ACCESS_MASK DesiredAccess, \
934 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, \
935 IN ULONG CreateOptiona OPTIONAL, \
936 OUT PULONG Disposition OPTIONAL) PURE;
937
938 #define IMP_IPort() \
939 STDMETHODIMP_(NTSTATUS) Init( \
940 IN PDEVICE_OBJECT DeviceObject, \
941 IN PIRP Irp, \
942 IN PUNKNOWN UnknownMiniport, \
943 IN PUNKNOWN UnknownAdapter OPTIONAL, \
944 IN PRESOURCELIST ResourceList); \
945 \
946 STDMETHODIMP_(NTSTATUS) GetDeviceProperty( \
947 IN DEVICE_REGISTRY_PROPERTY DeviceProperty, \
948 IN ULONG BufferLength, \
949 OUT PVOID PropertyBuffer, \
950 OUT PULONG ResultLength); \
951 \
952 STDMETHODIMP_(NTSTATUS) NewRegistryKey( \
953 OUT PREGISTRYKEY* OutRegistryKey, \
954 IN PUNKNOWN OuterUnknown OPTIONAL, \
955 IN ULONG RegistryKeyType, \
956 IN ACCESS_MASK DesiredAccess, \
957 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, \
958 IN ULONG CreateOptiona OPTIONAL, \
959 OUT PULONG Disposition OPTIONAL);
960
961 DECLARE_INTERFACE_(IPort, IUnknown)
962 {
963 DEFINE_ABSTRACT_UNKNOWN()
964 DEFINE_ABSTRACT_PORT()
965 };
966
967 typedef IPort *PPORT;
968
969
970 /* ===============================================================
971 IPortMidi Interface
972 */
973
974 #if 0
975 #define STATIC_IID_IPortMidi \
976 0xb4c90a43L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
977 DEFINE_GUIDSTRUCT("0xB4C90A43-5791-11d0-86f9-00a0c911b544", IID_IPortMidi);
978 #define IID_IPortMidi DEFINE_GUIDNAMED(IID_IPortMidi)
979 #endif
980
981 DEFINE_GUID(IID_IPortMidi,
982 0xb4c90a40L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
983 DEFINE_GUID(CLSID_PortMidi,
984 0xb4c90a43L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
985
986 DECLARE_INTERFACE_(IPortMidi, IPort)
987 {
988 DEFINE_ABSTRACT_UNKNOWN()
989 DEFINE_ABSTRACT_PORT()
990
991 STDMETHOD_(VOID, Notify)(THIS_
992 IN PSERVICEGROUP ServiceGroup OPTIONAL) PURE;
993
994 STDMETHOD_(NTSTATUS, RegisterServiceGroup)(THIS_
995 IN PSERVICEGROUP ServiceGroup) PURE;
996 };
997
998 typedef IPortMidi *PPORTMIDI;
999
1000 #define IMP_IPortMidi() \
1001 STDMETHODIMP_(VOID) Notify( \
1002 IN PSERVICEGROUP ServiceGroup OPTIONAL); \
1003 \
1004 STDMETHODIMP_(NTSTATUS) RegisterServiceGroup( \
1005 IN PSERVICEGROUP ServiceGroup);
1006
1007 #undef INTERFACE
1008
1009 /* ===============================================================
1010 IPortWaveCyclic Interface
1011 */
1012
1013 DEFINE_GUID(IID_IPortWaveCyclic,
1014 0xb4c90a26L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1015 DEFINE_GUID(CLSID_PortWaveCyclic,
1016 0xb4c90a2aL, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1017
1018 #define INTERFACE IPortWaveCyclic
1019
1020 DECLARE_INTERFACE_(IPortWaveCyclic, IPort)
1021 {
1022 STDMETHOD_(NTSTATUS, QueryInterface)(THIS_
1023 REFIID InterfaceId,
1024 PVOID* Interface
1025 ) PURE;
1026 STDMETHOD_(ULONG,AddRef)(THIS) PURE;
1027 STDMETHOD_(ULONG,Release)(THIS) PURE;
1028
1029
1030 STDMETHOD_(NTSTATUS,Init)(THIS_
1031 IN PDEVICE_OBJECT DeviceObject,
1032 IN PIRP Irp,
1033 IN PUNKNOWN UnknownMiniport,
1034 IN PUNKNOWN UnknownAdapter OPTIONAL,
1035 IN PRESOURCELIST ResourceList
1036 ) PURE;
1037 STDMETHOD_(NTSTATUS,GetDeviceProperty)(THIS_
1038 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
1039 IN ULONG BufferLength,
1040 OUT PVOID PropertyBuffer,
1041 OUT PULONG ResultLength
1042 ) PURE;
1043 STDMETHOD_(NTSTATUS,NewRegistryKey)(THIS_
1044 OUT PREGISTRYKEY * OutRegistryKey,
1045 IN PUNKNOWN OuterUnknown,
1046 IN ULONG RegistryKeyType,
1047 IN ACCESS_MASK DesiredAccess,
1048 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
1049 IN ULONG CreateOptions OPTIONAL,
1050 OUT PULONG Disposition OPTIONAL
1051 ) PURE;
1052
1053 STDMETHOD_(VOID, Notify)(THIS_
1054 IN PSERVICEGROUP ServiceGroup) PURE;
1055
1056
1057 STDMETHOD_(NTSTATUS, NewMasterDmaChannel)(THIS_
1058 OUT PDMACHANNEL* DmaChannel,
1059 IN PUNKNOWN OuterUnknown,
1060 IN PRESOURCELIST ResourceList OPTIONAL,
1061 IN ULONG MaximumLength,
1062 IN BOOL Dma32BitAddresses,
1063 IN BOOL Dma64BitAddresses,
1064 IN DMA_WIDTH DmaWidth,
1065 IN DMA_SPEED DmaSpeed) PURE;
1066
1067 STDMETHOD_(NTSTATUS, NewSlaveDmaChannel)(THIS_
1068 OUT PDMACHANNELSLAVE* DmaChannel,
1069 IN PUNKNOWN OuterUnknown,
1070 IN PRESOURCELIST ResourceList OPTIONAL,
1071 IN ULONG DmaIndex,
1072 IN ULONG MaximumLength,
1073 IN BOOL DemandMode,
1074 IN DMA_SPEED DmaSpeed) PURE;
1075
1076
1077 };
1078
1079 typedef IPortWaveCyclic *PPORTWAVECYCLIC;
1080
1081 #undef INTERFACE
1082 /* ===============================================================
1083 IPortWavePci Interface
1084 */
1085
1086 #if 0
1087 #define STATIC_IID_IPortWavePci \
1088 0xb4c90a50L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
1089 DEFINE_GUIDSTRUCT("0xB4C90A50-5791-11d0-86f9-00a0c911b544", IID_IPortWavePci);
1090 #define IID_IPortWavePci DEFINE_GUIDNAMED(IID_IPortWavePci)
1091 #endif
1092
1093 DEFINE_GUID(IID_IPortWavePci,
1094 0xb4c90a50L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1095 DEFINE_GUID(CLSID_PortWavePci,
1096 0xb4c90a54L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1097
1098 DECLARE_INTERFACE_(IPortWavePci, IPort)
1099 {
1100 DEFINE_ABSTRACT_UNKNOWN()
1101 DEFINE_ABSTRACT_PORT()
1102
1103 STDMETHOD_(NTSTATUS, NewMasterDmaChannel)(THIS_
1104 OUT PDMACHANNEL* DmaChannel,
1105 IN PUNKNOWN OuterUnknown,
1106 IN POOL_TYPE PoolType,
1107 IN PRESOURCELIST ResourceList OPTIONAL,
1108 IN BOOL ScatterGather,
1109 IN BOOL Dma32BitAddresses,
1110 IN BOOL Dma64BitAddresses,
1111 IN DMA_WIDTH DmaWidth,
1112 IN DMA_SPEED DmaSpeed,
1113 IN ULONG MaximumLength,
1114 IN ULONG DmaPort) PURE;
1115
1116 STDMETHOD_(VOID, Notify)(THIS_
1117 IN PSERVICEGROUP ServiceGroup) PURE;
1118 };
1119
1120 /* TODO ... */
1121
1122
1123 /* ===============================================================
1124 IPortWavePciStream Interface
1125 */
1126
1127 #define STATIC_IPortWavePciStream \
1128 0xb4c90a51L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
1129
1130 DEFINE_GUID(IID_IPortWavePciStream, 0xb4c90a51L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1131
1132 /* ... */
1133
1134
1135
1136 /* ===============================================================
1137 IMiniPort Interface
1138 */
1139
1140 DEFINE_GUID(IID_IMiniPort,
1141 0xb4c90a24L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1142
1143 #define DEFINE_ABSTRACT_MINIPORT() \
1144 STDMETHOD_(NTSTATUS, GetDescription)( THIS_ \
1145 OUT PPCFILTER_DESCRIPTOR* Description) PURE; \
1146 \
1147 STDMETHOD_(NTSTATUS, DataRangeIntersection)( THIS_ \
1148 IN ULONG PinId, \
1149 IN PKSDATARANGE DataRange, \
1150 IN PKSDATARANGE MatchingDataRange, \
1151 IN ULONG OutputBufferLength, \
1152 OUT PVOID ResultantFormat OPTIONAL, \
1153 OUT PULONG ResultantFormatLength) PURE;
1154
1155 #define IMP_IMiniport \
1156 STDMETHODIMP_(NTSTATUS) GetDescription( \
1157 OUT PPCFILTER_DESCRIPTOR* Description); \
1158 \
1159 STDMETHODIMP_(NTSTATUS) DataRangeIntersection( \
1160 IN ULONG PinId, \
1161 IN PKSDATARANGE DataRange, \
1162 IN PKSDATARANGE MatchingDataRange, \
1163 IN ULONG OutputBufferLength, \
1164 OUT PVOID ResultantFormat OPTIONAL, \
1165 OUT PULONG ResultantFormatLength);
1166
1167 DECLARE_INTERFACE_(IMiniport, IUnknown)
1168 {
1169 DEFINE_ABSTRACT_UNKNOWN()
1170 DEFINE_ABSTRACT_MINIPORT()
1171 };
1172
1173 typedef IMiniport *PMINIPORT;
1174
1175
1176 /* ===============================================================
1177 IMiniportMidiStream Interface
1178 */
1179
1180 DECLARE_INTERFACE_(IMiniportMidiStream, IUnknown)
1181 {
1182 /* TODO - Read, SetFormat, SetState, Write */
1183 };
1184
1185 typedef IMiniportMidiStream* PMINIPORTMIDISTREAM;
1186
1187
1188 /* ===============================================================
1189 IMiniportMidi Interface
1190 */
1191
1192 DECLARE_INTERFACE_(IMiniportMidi, IMiniport)
1193 {
1194 STDMETHOD_(NTSTATUS, Init)(THIS_
1195 IN PUNKNOWN UnknownAdapter,
1196 IN PRESOURCELIST ResourceList,
1197 IN PPORTMIDI Port,
1198 OUT PSERVICEGROUP* ServiceGroup) PURE;
1199
1200 STDMETHOD_(NTSTATUS, NewStream)(THIS_
1201 OUT PMINIPORTMIDISTREAM Stream,
1202 IN PUNKNOWN OuterUnknown OPTIONAL,
1203 IN POOL_TYPE PoolType,
1204 IN ULONG Pin,
1205 IN BOOLEAN Capture,
1206 IN PKSDATAFORMAT DataFormat,
1207 OUT PSERVICEGROUP* ServiceGroup) PURE;
1208
1209 STDMETHOD_(void, Service)(THIS) PURE;
1210 };
1211
1212 /* TODO ... */
1213
1214
1215 /* ===============================================================
1216 IMiniportDriverUart Interface
1217 */
1218
1219 DEFINE_GUID(IID_MiniportDriverUart,
1220 0xb4c90ae1L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1221 DEFINE_GUID(CLSID_MiniportDriverUart,
1222 0xb4c90ae1L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1223
1224 /* ===============================================================
1225 IPortTopology Interface
1226 */
1227 #if 0
1228 #define STATIC_IPortTopology \
1229 0xb4c90a30L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44
1230 DEFINE_GUIDSTRUCT("0xB4C90A30-5791-11d0-86f9-00a0c911b544", IID_IPortTopology);
1231 #define IID_IPortTopology DEFINE_GUIDNAMED(IID_IPortTopology)
1232 #endif
1233
1234 DEFINE_GUID(IID_IPortTopology,
1235 0xb4c90a30L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1236 DEFINE_GUID(CLSID_PortTopology,
1237 0xb4c90a32L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1238
1239 DECLARE_INTERFACE_(IPortTopology, IPort)
1240 {
1241 DEFINE_ABSTRACT_UNKNOWN()
1242 DEFINE_ABSTRACT_PORT()
1243 };
1244
1245 typedef IPortTopology *PPORTTOPOLOGY;
1246
1247 #define IMP_IPortTopology IMP_IPort
1248
1249
1250 /* ===============================================================
1251 IMiniportTopology Interface
1252 */
1253
1254 /* ===============================================================
1255 IMiniportWaveCyclicStream Interface
1256 */
1257
1258 DECLARE_INTERFACE_(IMiniportWaveCyclicStream,IUnknown)
1259 {
1260 DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
1261
1262 STDMETHOD_(NTSTATUS,SetFormat)(THIS_
1263 IN PKSDATAFORMAT DataFormat)PURE;
1264
1265 STDMETHOD_(ULONG,SetNotificationFreq)(THIS_
1266 IN ULONG Interval,
1267 OUT PULONG FrameSize) PURE;
1268
1269 STDMETHOD_(NTSTATUS,SetState)(THIS_
1270 IN KSSTATE State) PURE;
1271
1272 STDMETHOD_(NTSTATUS,GetPosition)( THIS_
1273 OUT PULONG Position) PURE;
1274
1275 STDMETHOD_(NTSTATUS,NormalizePhysicalPosition)(THIS_
1276 IN OUT PLONGLONG PhysicalPosition) PURE;
1277
1278 STDMETHOD_(void, Silence)( THIS_
1279 IN PVOID Buffer,
1280 IN ULONG ByteCount) PURE;
1281 };
1282
1283 typedef IMiniportWaveCyclicStream *PMINIPORTWAVECYCLICSTREAM;
1284
1285 /* ===============================================================
1286 IMiniportWaveCyclic Interface
1287 */
1288 #undef INTERFACE
1289
1290 DEFINE_GUID(IID_IMiniportWaveCyclic,
1291 0xb4c90a27L, 0x5791, 0x11d0, 0x86, 0xf9, 0x00, 0xa0, 0xc9, 0x11, 0xb5, 0x44);
1292
1293 #define INTERFACE IMiniportWaveCyclic
1294
1295 DECLARE_INTERFACE_(IMiniportWaveCyclic, IMiniport)
1296 {
1297 STDMETHOD_(NTSTATUS, QueryInterface)(THIS_
1298 REFIID InterfaceId,
1299 PVOID* Interface
1300 ) PURE;
1301 STDMETHOD_(ULONG,AddRef)(THIS) PURE;
1302 STDMETHOD_(ULONG,Release)(THIS) PURE;
1303
1304
1305 DEFINE_ABSTRACT_MINIPORT()
1306
1307 STDMETHOD_(NTSTATUS, Init)(THIS_
1308 IN PUNKNOWN UnknownAdapter,
1309 IN PRESOURCELIST ResourceList,
1310 IN PPORTWAVECYCLIC Port) PURE;
1311
1312 STDMETHOD_(NTSTATUS, NewStream)(THIS_
1313 OUT PMINIPORTWAVECYCLICSTREAM *Stream,
1314 IN PUNKNOWN OuterUnknown OPTIONAL,
1315 IN POOL_TYPE PoolType,
1316 IN ULONG Pin,
1317 IN BOOL Capture,
1318 IN PKSDATAFORMAT DataFormat,
1319 OUT PDMACHANNEL *DmaChannel,
1320 OUT PSERVICEGROUP *ServiceGroup) PURE;
1321 };
1322
1323 typedef IMiniportWaveCyclic *PMINIPORTWAVECYCLIC;
1324 #undef INTERFACE
1325
1326 /* ===============================================================
1327 IMiniportWavePciStream Interface
1328 */
1329
1330 /* ===============================================================
1331 IMiniportWavePci Interface
1332 */
1333
1334 /* ===============================================================
1335 IAdapterPowerManagement Interface
1336 */
1337
1338 DECLARE_INTERFACE_(IAdapterPowerManagement, IUnknown)
1339 {
1340 };
1341
1342 #define IMP_IAdapterPowerManagement
1343
1344 /* ===============================================================
1345 IPowerNotify Interface
1346 */
1347
1348 /* ===============================================================
1349 IPinCount Interface
1350 */
1351
1352 /* ===============================================================
1353 IPortEvents Interface
1354 */
1355
1356 DECLARE_INTERFACE_(IPortEvents, IUnknown)
1357 {
1358 DEFINE_ABSTRACT_UNKNOWN()
1359 /* TODO */
1360 };
1361
1362 typedef IPortEvents *PPORTEVENTS;
1363
1364
1365 /* ===============================================================
1366 IDrmPort / IDrmPort2 Interfaces
1367 These are almost identical, except for the addition of two extra methods.
1368 */
1369
1370 #define DEFINE_ABSTRACT_DRMPORT()
1371 /* TODO */
1372
1373 DECLARE_INTERFACE_(IDrmPort, IUnknown)
1374 {
1375 DEFINE_ABSTRACT_UNKNOWN()
1376 DEFINE_ABSTRACT_DRMPORT()
1377 };
1378
1379 typedef IDrmPort *PDRMPORT;
1380
1381 /* TODO */
1382
1383
1384 /* ===============================================================
1385 IPortClsVersion Interface
1386 */
1387
1388 DECLARE_INTERFACE_(IPortClsVersion, IUnknown)
1389 {
1390 STDMETHOD_(DWORD, GetVersion)(THIS) PURE;
1391 };
1392
1393 #define IMP_IPortClsVersion \
1394 STDMETHODIMP_(DWORD) GetVersion(void);
1395
1396 typedef IPortClsVersion *PPORTCLSVERSION;
1397
1398
1399 /* ===============================================================
1400 IDmaOperations Interface
1401 */
1402
1403 /* ===============================================================
1404 IPreFetchOffset Interface
1405 */
1406
1407
1408
1409 /* ===============================================================
1410 PortCls API Functions
1411 */
1412
1413 typedef NTSTATUS (*PCPFNSTARTDEVICE)(
1414 IN PDEVICE_OBJECT DeviceObject,
1415 IN PIRP Irp,
1416 IN PRESOURCELIST ResourceList);
1417
1418 /* This is in NTDDK.H */
1419 /*
1420 typedef NTSTATUS (*PDRIVER_ADD_DEVICE)(
1421 IN struct _DRIVER_OBJECT* DriverObject,
1422 IN struct _DEVICE_OBJECT* PhysicalDeviceObject);
1423 */
1424
1425 PORTCLASSAPI NTSTATUS NTAPI
1426 PcAddAdapterDevice(
1427 IN PDRIVER_OBJECT DriverObject,
1428 IN PDEVICE_OBJECT PhysicalDeviceObject,
1429 IN PCPFNSTARTDEVICE StartDevice,
1430 IN ULONG MaxObjects,
1431 IN ULONG DeviceExtensionSize);
1432
1433 PORTCLASSAPI NTSTATUS NTAPI
1434 PcInitializeAdapterDriver(
1435 IN PDRIVER_OBJECT DriverObject,
1436 IN PUNICODE_STRING RegistryPathName,
1437 IN PDRIVER_ADD_DEVICE AddDevice);
1438
1439
1440 /* ===============================================================
1441 Factories (TODO: Move elsewhere)
1442 */
1443
1444 PORTCLASSAPI NTSTATUS NTAPI
1445 PcNewDmaChannel(
1446 OUT PDMACHANNEL* OutDmaChannel,
1447 IN PUNKNOWN OuterUnknown OPTIONAL,
1448 IN POOL_TYPE PoolType,
1449 IN PDEVICE_DESCRIPTION DeviceDescription,
1450 IN PDEVICE_OBJECT DeviceObject);
1451
1452 PORTCLASSAPI NTSTATUS NTAPI
1453 PcNewInterruptSync(
1454 OUT PINTERRUPTSYNC* OUtInterruptSync,
1455 IN PUNKNOWN OuterUnknown OPTIONAL,
1456 IN PRESOURCELIST ResourceList,
1457 IN ULONG ResourceIndex,
1458 IN INTERRUPTSYNCMODE Mode);
1459
1460 PORTCLASSAPI NTSTATUS NTAPI
1461 PcNewMiniport(
1462 OUT PMINIPORT* OutMiniport,
1463 IN REFCLSID ClassId);
1464
1465 PORTCLASSAPI NTSTATUS NTAPI
1466 PcNewPort(
1467 OUT PPORT* OutPort,
1468 IN REFCLSID ClassId);
1469
1470 PORTCLASSAPI NTSTATUS NTAPI
1471 PcNewRegistryKey(
1472 OUT PREGISTRYKEY* OutRegistryKey,
1473 IN PUNKNOWN OuterUnknown OPTIONAL,
1474 IN ULONG RegistryKeyType,
1475 IN ACCESS_MASK DesiredAccess,
1476 IN PVOID DeviceObject OPTIONAL,
1477 IN PVOID SubDevice OPTIONAL,
1478 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
1479 IN ULONG CreateOptions OPTIONAL,
1480 OUT PULONG Disposition OPTIONAL);
1481
1482 PORTCLASSAPI NTSTATUS NTAPI
1483 PcNewResourceList(
1484 OUT PRESOURCELIST* OutResourceList,
1485 IN PUNKNOWN OuterUnknown OPTIONAL,
1486 IN POOL_TYPE PoolType,
1487 IN PCM_RESOURCE_LIST TranslatedResources,
1488 IN PCM_RESOURCE_LIST UntranslatedResources);
1489
1490 PORTCLASSAPI NTSTATUS NTAPI
1491 PcNewResourceSublist(
1492 OUT PRESOURCELIST* OutResourceList,
1493 IN PUNKNOWN OuterUnknown OPTIONAL,
1494 IN POOL_TYPE PoolType,
1495 IN PRESOURCELIST ParentList,
1496 IN ULONG MaximumEntries);
1497
1498 PORTCLASSAPI NTSTATUS NTAPI
1499 PcNewServiceGroup(
1500 OUT PSERVICEGROUP* OutServiceGroup,
1501 IN PUNKNOWN OuterUnknown OPTIONAL);
1502
1503
1504 /* ===============================================================
1505 IRP Handling
1506 */
1507
1508 PORTCLASSAPI NTSTATUS NTAPI
1509 PcDispatchIrp(
1510 IN PDEVICE_OBJECT DeviceObject,
1511 IN PIRP Irp);
1512
1513 PORTCLASSAPI NTSTATUS NTAPI
1514 PcCompleteIrp(
1515 IN PDEVICE_OBJECT DeviceObject,
1516 IN PIRP Irp,
1517 IN NTSTATUS Status);
1518
1519 PORTCLASSAPI NTSTATUS NTAPI
1520 PcForwardIrpSynchronous(
1521 IN PDEVICE_OBJECT DeviceObject,
1522 IN PIRP Irp);
1523
1524
1525 /* ===============================================================
1526 Power Management
1527 */
1528
1529 PORTCLASSAPI NTSTATUS NTAPI
1530 PcRegisterAdapterPowerManagement(
1531 IN PUNKNOWN pUnknown,
1532 IN PVOID pvContext1);
1533
1534 PORTCLASSAPI NTSTATUS NTAPI
1535 PcRequestNewPowerState(
1536 IN PDEVICE_OBJECT pDeviceObject,
1537 IN DEVICE_POWER_STATE RequestedNewState);
1538
1539
1540 /* ===============================================================
1541 Properties
1542 */
1543
1544 PORTCLASSAPI NTSTATUS NTAPI
1545 PcGetDeviceProperty(
1546 IN PVOID DeviceObject,
1547 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
1548 IN ULONG BufferLength,
1549 OUT PVOID PropertyBuffer,
1550 OUT PULONG ResultLength);
1551
1552 PORTCLASSAPI NTSTATUS NTAPI
1553 PcCompletePendingPropertyRequest(
1554 IN PPCPROPERTY_REQUEST PropertyRequest,
1555 IN NTSTATUS NtStatus);
1556
1557
1558 /* ===============================================================
1559 I/O Timeouts
1560 */
1561
1562 PORTCLASSAPI NTSTATUS NTAPI
1563 PcRegisterIoTimeout(
1564 IN PDEVICE_OBJECT pDeviceObject,
1565 IN PIO_TIMER_ROUTINE pTimerRoutine,
1566 IN PVOID pContext);
1567
1568 PORTCLASSAPI NTSTATUS NTAPI
1569 PcUnregisterIoTimeout(
1570 IN PDEVICE_OBJECT pDeviceObject,
1571 IN PIO_TIMER_ROUTINE pTimerRoutine,
1572 IN PVOID pContext);
1573
1574
1575 /* ===============================================================
1576 Physical Connections
1577 */
1578
1579 PORTCLASSAPI NTSTATUS NTAPI
1580 PcRegisterPhysicalConnection(
1581 IN PDEVICE_OBJECT DeviceObject,
1582 IN PUNKNOWN FromUnknown,
1583 IN ULONG FromPin,
1584 IN PUNKNOWN ToUnknown,
1585 IN ULONG ToPin);
1586
1587 PORTCLASSAPI NTSTATUS NTAPI
1588 PcRegisterPhysicalConnectionFromExternal(
1589 IN PDEVICE_OBJECT DeviceObject,
1590 IN PUNICODE_STRING FromString,
1591 IN ULONG FromPin,
1592 IN PUNKNOWN ToUnknown,
1593 IN ULONG ToPin);
1594
1595 PORTCLASSAPI NTSTATUS NTAPI
1596 PcRegisterPhysicalConnectionToExternal(
1597 IN PDEVICE_OBJECT DeviceObject,
1598 IN PUNKNOWN FromUnknown,
1599 IN ULONG FromPin,
1600 IN PUNICODE_STRING ToString,
1601 IN ULONG ToPin);
1602
1603
1604 /* ===============================================================
1605 Misc
1606 */
1607
1608 PORTCLASSAPI ULONGLONG NTAPI
1609 PcGetTimeInterval(
1610 IN ULONGLONG Since);
1611
1612 PORTCLASSAPI NTSTATUS NTAPI
1613 PcRegisterSubdevice(
1614 IN PDEVICE_OBJECT DeviceObject,
1615 IN PWCHAR Name,
1616 IN PUNKNOWN Unknown);
1617
1618
1619 /* ===============================================================
1620 Digital Rights Management Functions
1621 Implemented in XP and above
1622 */
1623
1624 PORTCLASSAPI NTSTATUS NTAPI
1625 PcAddContentHandlers(
1626 IN ULONG ContentId,
1627 IN PVOID *paHandlers,
1628 IN ULONG NumHandlers);
1629
1630 PORTCLASSAPI NTSTATUS NTAPI
1631 PcCreateContentMixed(
1632 IN PULONG paContentId,
1633 IN ULONG cContentId,
1634 OUT PULONG pMixedContentId);
1635
1636 PORTCLASSAPI NTSTATUS NTAPI
1637 PcDestroyContent(
1638 IN ULONG ContentId);
1639
1640 PORTCLASSAPI NTSTATUS NTAPI
1641 PcForwardContentToDeviceObject(
1642 IN ULONG ContentId,
1643 IN PVOID Reserved,
1644 IN PCDRMFORWARD DrmForward);
1645
1646 PORTCLASSAPI NTSTATUS NTAPI
1647 PcForwardContentToFileObject(
1648 IN ULONG ContentId,
1649 IN PFILE_OBJECT FileObject);
1650
1651 PORTCLASSAPI NTSTATUS NTAPI
1652 PcForwardContentToInterface(
1653 IN ULONG ContentId,
1654 IN PUNKNOWN pUnknown,
1655 IN ULONG NumMethods);
1656
1657 PORTCLASSAPI NTSTATUS NTAPI
1658 PcGetContentRights(
1659 IN ULONG ContentId,
1660 OUT PDRMRIGHTS DrmRights);
1661
1662
1663 #endif