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