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