ReactOS  0.4.15-dev-4872-g8a3db97
port_dmus.cpp
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: ReactOS Kernel Streaming
4  * FILE: drivers/wdm/audio/backpln/portcls/port_dmus.cpp
5  * PURPOSE: DirectMusic Port driver
6  * PROGRAMMER: Johannes Anderwald
7  */
8 
9 #include "private.hpp"
10 
11 #ifndef YDEBUG
12 #define NDEBUG
13 #endif
14 
15 #include <debug.h>
16 
17 class CPortDMus : public CUnknownImpl<IPortDMus, ISubdevice>
18 {
19 public:
21 
24  CPortDMus(IUnknown *OuterUnknown){}
25  virtual ~CPortDMus(){}
26 
27 protected:
28 
30  IMiniportDMus * m_pMiniport;
31  IMiniportMidi * m_pMiniportMidi;
37 
40 
41  friend VOID GetDMusMiniport(IN IPortDMus * iface, IN PMINIPORTDMUS * Miniport, IN PMINIPORTMIDI * MidiMiniport);
42 
43 };
44 
45 static GUID InterfaceGuids[3] =
46 {
47  {
49  0x6994AD04, 0x93EF, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
50  },
51  {
53  0x65E8773E, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
54  },
55  {
57  0x65E8773D, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
58  }
59 };
60 
61 DEFINE_KSPROPERTY_TOPOLOGYSET(PortFilterDMusTopologySet, TopologyPropertyHandler);
63 
64 KSPROPERTY_SET PortDMusPropertySet[] =
65 {
66  {
68  sizeof(PortFilterDMusTopologySet) / sizeof(KSPROPERTY_ITEM),
69  (const KSPROPERTY_ITEM*)&PortFilterDMusTopologySet,
70  0,
71  NULL
72  },
73  {
75  sizeof(PortFilterDMusPinSet) / sizeof(KSPROPERTY_ITEM),
76  (const KSPROPERTY_ITEM*)&PortFilterDMusPinSet,
77  0,
78  NULL
79  }
80 };
81 
82 
83 //---------------------------------------------------------------
84 // IUnknown interface functions
85 //
86 
88 NTAPI
90  IN REFIID refiid,
91  OUT PVOID* Output)
92 {
94 
95  if (IsEqualGUIDAligned(refiid, IID_IPortDMus) ||
96  IsEqualGUIDAligned(refiid, IID_IPortMidi) ||
97  IsEqualGUIDAligned(refiid, IID_IPort) ||
99  {
100  *Output = PVOID(PUNKNOWN((IPortDMus*)this));
101  PUNKNOWN(*Output)->AddRef();
102  return STATUS_SUCCESS;
103  }
104  else if (IsEqualGUIDAligned(refiid, IID_ISubdevice))
105  {
106  *Output = PVOID(PSUBDEVICE(this));
107  PUNKNOWN(*Output)->AddRef();
108  return STATUS_SUCCESS;
109  }
110  else if (IsEqualGUIDAligned(refiid, IID_IDrmPort) ||
111  IsEqualGUIDAligned(refiid, IID_IDrmPort2))
112  {
113  return NewIDrmPort((PDRMPORT2*)Output);
114  }
115  else if (IsEqualGUIDAligned(refiid, IID_IPortClsVersion))
116  {
118  }
119  else if (IsEqualGUIDAligned(refiid, IID_IUnregisterSubdevice))
120  {
122  }
123  else if (IsEqualGUIDAligned(refiid, IID_IUnregisterPhysicalConnection))
124  {
126  }
127 
129  {
130  DPRINT("IPortMidi_fnQueryInterface no interface!!! iface %S\n", GuidString.Buffer);
132  }
133  return STATUS_UNSUCCESSFUL;
134 }
135 
136 //---------------------------------------------------------------
137 // IPort interface functions
138 //
139 
140 NTSTATUS
141 NTAPI
142 CPortDMus::GetDeviceProperty(
143  IN DEVICE_REGISTRY_PROPERTY DeviceRegistryProperty,
147 {
149 
150  if (!m_bInitialized)
151  {
152  DPRINT("IPortDMus_fnNewRegistryKey called w/o initialized\n");
153  return STATUS_UNSUCCESSFUL;
154  }
155 
157 }
158 
159 NTSTATUS
160 NTAPI
163  IN PIRP Irp,
164  IN PUNKNOWN UnknownMiniport,
165  IN PUNKNOWN UnknownAdapter OPTIONAL,
167 {
168  IMiniportDMus * Miniport = NULL;
169  IMiniportMidi * MidiMiniport = NULL;
171  PSERVICEGROUP ServiceGroup = NULL;
173  PPOWERNOTIFY PowerNotify;
174 
176 
177  if (m_bInitialized)
178  {
179  DPRINT("IPortDMus_Init called again\n");
180  return STATUS_SUCCESS;
181  }
182 
183  Status = UnknownMiniport->QueryInterface(IID_IMiniportDMus, (PVOID*)&Miniport);
184  if (!NT_SUCCESS(Status))
185  {
186  // check for legacy interface
187  Status = UnknownMiniport->QueryInterface(IID_IMiniportMidi, (PVOID*)&MidiMiniport);
188  if (!NT_SUCCESS(Status))
189  {
190  DPRINT("IPortDMus_Init called with invalid IMiniport adapter\n");
192  }
193  }
194 
195  // Initialize port object
196  m_pMiniport = Miniport;
197  m_pMiniportMidi = MidiMiniport;
200 
201  if (Miniport)
202  {
203  // initialize IMiniportDMus
204  Status = Miniport->Init(UnknownAdapter, ResourceList, this, &ServiceGroup);
205  if (!NT_SUCCESS(Status))
206  {
207  DPRINT("IMiniportDMus_Init failed with %x\n", Status);
209  return Status;
210  }
211 
212  // get the miniport device descriptor
213  Status = Miniport->GetDescription(&m_pDescriptor);
214  if (!NT_SUCCESS(Status))
215  {
216  DPRINT("failed to get description\n");
217  Miniport->Release();
219  return Status;
220  }
221 
222  // increment reference on miniport adapter
223  Miniport->AddRef();
224 
225  }
226  else
227  {
228  // initialize IMiniportMidi
229  Status = MidiMiniport->Init(UnknownAdapter, ResourceList, (IPortMidi*)this, &ServiceGroup);
230  if (!NT_SUCCESS(Status))
231  {
232  DPRINT("IMiniportMidi_Init failed with %x\n", Status);
234  return Status;
235  }
236 
237  // get the miniport device descriptor
238  Status = MidiMiniport->GetDescription(&m_pDescriptor);
239  if (!NT_SUCCESS(Status))
240  {
241  DPRINT("failed to get description\n");
242  MidiMiniport->Release();
244  return Status;
245  }
246 
247  // increment reference on miniport adapter
248  MidiMiniport->AddRef();
249  }
250 
251  // create the subdevice descriptor
253  3,
255  0,
256  NULL,
257  2,
259  0,
260  0,
261  0,
262  NULL,
263  0,
264  NULL,
265  m_pDescriptor);
266 
267  if (!NT_SUCCESS(Status))
268  {
269  DPRINT("Failed to create descriptor\n");
270 
271  if (Miniport)
272  Miniport->Release();
273  else
274  MidiMiniport->Release();
275 
277  return Status;
278  }
279 
280  if (m_ServiceGroup == NULL && ServiceGroup)
281  {
282  // register service group
283  m_ServiceGroup = ServiceGroup;
284  }
285 
286  // check if it supports IPinCount interface
287  Status = UnknownMiniport->QueryInterface(IID_IPinCount, (PVOID*)&PinCount);
288  if (NT_SUCCESS(Status))
289  {
290  // store IPinCount interface
292  }
293 
294  // does the Miniport adapter support IPowerNotify interface*/
295  Status = UnknownMiniport->QueryInterface(IID_IPowerNotify, (PVOID*)&PowerNotify);
296  if (NT_SUCCESS(Status))
297  {
298  // store reference
299  m_pPowerNotify = PowerNotify;
300  }
301 
302  return STATUS_SUCCESS;
303 }
304 
305 
306 NTSTATUS
307 NTAPI
308 CPortDMus::NewRegistryKey(
309  OUT PREGISTRYKEY *OutRegistryKey,
310  IN PUNKNOWN OuterUnknown OPTIONAL,
311  IN ULONG RegistryKeyType,
316 {
318 
319  if (!m_bInitialized)
320  {
321  DPRINT("IPortDMus_fnNewRegistryKey called w/o initialized\n");
322  return STATUS_UNSUCCESSFUL;
323  }
324 
325  return PcNewRegistryKey(OutRegistryKey,
326  OuterUnknown,
327  RegistryKeyType,
330  (ISubdevice*)this,
333  Disposition);
334 }
335 
336 VOID
337 NTAPI
339  IN PSERVICEGROUP ServiceGroup OPTIONAL)
340 {
341  if (ServiceGroup)
342  {
343  ServiceGroup->RequestService ();
344  return;
345  }
346 
348 
349  // notify miniport service group
350  m_ServiceGroup->RequestService();
351 
352  // notify stream miniport service group
353  if (m_Filter)
354  {
355  m_Filter->NotifyPins();
356  }
357 }
358 
359 VOID
360 NTAPI
361 CPortDMus::RegisterServiceGroup(
362  IN PSERVICEGROUP ServiceGroup)
363 {
365 
366  m_ServiceGroup = ServiceGroup;
367 
368  ServiceGroup->AddMember(PSERVICESINK(this));
369 }
370 //---------------------------------------------------------------
371 // ISubdevice interface
372 //
373 
374 NTSTATUS
375 NTAPI
376 CPortDMus::NewIrpTarget(
377  OUT struct IIrpTarget **OutTarget,
378  IN PCWSTR Name,
382  IN PIRP Irp,
383  IN KSOBJECT_CREATE *CreateObject)
384 {
387 
388  DPRINT("ISubDevice_NewIrpTarget this %p\n", this);
389 
390  if (m_Filter)
391  {
392  *OutTarget = (IIrpTarget*)m_Filter;
393  return STATUS_SUCCESS;
394  }
395 
396 
398  if (!NT_SUCCESS(Status))
399  {
400  return Status;
401  }
402 
403  Status = Filter->Init(PPORTDMUS(this));
404  if (!NT_SUCCESS(Status))
405  {
406  Filter->Release();
407  return Status;
408  }
409 
410  *OutTarget = (IIrpTarget*)Filter;
411  return Status;
412 }
413 
414 NTSTATUS
415 NTAPI
416 CPortDMus::ReleaseChildren()
417 {
419  return STATUS_UNSUCCESSFUL;
420 }
421 
422 NTSTATUS
423 NTAPI
426 {
427  DPRINT("ISubDevice_GetDescriptor this %p\n", this);
429  return STATUS_SUCCESS;
430 }
431 
432 NTSTATUS
433 NTAPI
434 CPortDMus::DataRangeIntersection(
435  IN ULONG PinId,
436  IN PKSDATARANGE DataRange,
437  IN PKSDATARANGE MatchingDataRange,
439  OUT PVOID ResultantFormat OPTIONAL,
440  OUT PULONG ResultantFormatLength)
441 {
442  DPRINT("ISubDevice_DataRangeIntersection this %p\n", this);
443 
444  if (m_pMiniport)
445  {
446  return m_pMiniport->DataRangeIntersection (PinId, DataRange, MatchingDataRange, OutputBufferLength, ResultantFormat, ResultantFormatLength);
447  }
448 
449  return STATUS_UNSUCCESSFUL;
450 }
451 
452 NTSTATUS
453 NTAPI
454 CPortDMus::PowerChangeNotify(
456 {
457  if (m_pPowerNotify)
458  {
459  m_pPowerNotify->PowerChangeNotify(PowerState);
460  }
461 
462  return STATUS_SUCCESS;
463 }
464 
465 
466 NTSTATUS
467 NTAPI
469  IN ULONG PinId,
470  IN OUT PULONG FilterNecessary,
471  IN OUT PULONG FilterCurrent,
472  IN OUT PULONG FilterPossible,
473  IN OUT PULONG GlobalCurrent,
474  IN OUT PULONG GlobalPossible)
475 {
476  if (m_pPinCount)
477  {
478  m_pPinCount->PinCount(PinId, FilterNecessary, FilterCurrent, FilterPossible, GlobalCurrent, GlobalPossible);
479  return STATUS_SUCCESS;
480  }
481 
482  // FIXME
483  // scan filter descriptor
484 
485  return STATUS_UNSUCCESSFUL;
486 }
487 
488 
489 
490 NTSTATUS
492  OUT PPORT* OutPort)
493 {
496  if (!Port)
498 
499  Status = Port->QueryInterface(IID_IPort, (PVOID*)OutPort);
500 
501  if (!NT_SUCCESS(Status))
502  {
503  delete Port;
504  }
505 
506  DPRINT("NewPortDMus %p Status %u\n", Port, Status);
507  return Status;
508 
509 }
510 
511 
512 
513 VOID
515  IN IPortDMus * iface,
516  IN PMINIPORTDMUS * Miniport,
517  IN PMINIPORTMIDI * MidiMiniport)
518 {
519  CPortDMus * This = (CPortDMus*)iface;
520 
521  *Miniport = This->m_pMiniport;
522  *MidiMiniport = This->m_pMiniportMidi;
523 }
IServiceGroup * PSERVICEGROUP
Definition: portcls.h:614
DEVICE_REGISTRY_PROPERTY
Definition: iotypes.h:1194
BOOL WINAPI SHIM_OBJ_NAME() Notify(DWORD fdwReason, PVOID ptr)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
CPortDMus(IUnknown *OuterUnknown)
Definition: port_dmus.cpp:24
IN CINT OUT PVOID IN ULONG OUT PULONG ReturnLength
Definition: dumpinfo.c:39
static PWSTR GuidString
Definition: apphelp.c:93
NTSTATUS NTAPI PinPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data)
CPPORT Port[4]
Definition: headless.c:35
const uint16_t * PCWSTR
Definition: typedefs.h:57
#define IN
Definition: typedefs.h:39
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
Definition: wdfdevice.h:3767
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
Definition: wdfdevice.h:2654
#define REFIID
Definition: guiddef.h:118
IPortFilterDMus * PPORTFILTERDMUS
Definition: interfaces.hpp:837
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:339
BOOL m_bInitialized
Definition: port_dmus.cpp:29
KSPROPERTY_SET PortDMusPropertySet[]
Definition: port_dmus.cpp:64
IPinCount * PPINCOUNT
Definition: portcls.h:2090
#define TRUE
Definition: types.h:120
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
IUnknown * PUNKNOWN
Definition: com_apitest.h:45
#define TAG_PORTCLASS
Definition: private.hpp:24
virtual ~CPortDMus()
Definition: port_dmus.cpp:25
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS NewPortFilterDMus(OUT PPORTFILTERDMUS *OutFilter)
PPCFILTER_DESCRIPTOR m_pDescriptor
Definition: port_dmus.cpp:38
static GUID InterfaceGuids[3]
Definition: port_dmus.cpp:45
IServiceSink * PSERVICESINK
Definition: portcls.h:569
return pList GetDescriptor(Index)
IPortDMus * PPORTDMUS
Definition: dmusicks.h:167
IUnregisterSubdevice * PUNREGISTERSUBDEVICE
Definition: portcls.h:633
BOOL Init(PUSERCONNECT UserCon)
Definition: dllmain.c:385
_In_ const GUID _In_ ULONG PinCount
Definition: strmini.h:504
_Must_inspect_result_ _In_ WDFIORESREQLIST _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFIORESLIST * ResourceList
Definition: wdfresource.h:304
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Reserved_ ULONG _In_opt_ PUNICODE_STRING _In_ ULONG _Out_opt_ PULONG Disposition
Definition: cmfuncs.h:50
STDMETHODIMP QueryInterface(REFIID InterfaceId, PVOID *Interface)
Definition: port_dmus.cpp:89
#define PC_ASSERT(exp)
Definition: private.hpp:26
#define IsEqualGUIDAligned(guid1, guid2)
Definition: wdm.template.h:235
_In_ WDFREQUEST _In_ size_t OutputBufferLength
Definition: wdfio.h:318
friend VOID GetDMusMiniport(IN IPortDMus *iface, IN PMINIPORTDMUS *Miniport, IN PMINIPORTMIDI *MidiMiniport)
Definition: port_dmus.cpp:514
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
DEVICE_OBJECT * m_pDeviceObject
Definition: port_dmus.cpp:32
#define FALSE
Definition: types.h:117
_In_ PIRP Irp
Definition: csq.h:116
unsigned int BOOL
Definition: ntddk_ex.h:94
_Must_inspect_result_ _In_opt_ PFLT_FILTER Filter
Definition: fltkernel.h:1801
#define STDMETHODIMP
Definition: basetyps.h:43
IPort * PPORT
Definition: portcls.h:1103
NTSTATUS NTAPI PcCreateSubdeviceDescriptor(OUT SUBDEVICE_DESCRIPTOR **OutSubdeviceDescriptor, IN ULONG InterfaceCount, IN GUID *InterfaceGuids, IN ULONG IdentifierCount, IN KSIDENTIFIER *Identifier, IN ULONG FilterPropertiesCount, IN KSPROPERTY_SET *FilterProperties, IN ULONG Unknown1, IN ULONG Unknown2, IN ULONG PinPropertiesCount, IN KSPROPERTY_SET *PinProperties, IN ULONG EventSetCount, IN KSEVENT_SET *EventSet, IN PPCFILTER_DESCRIPTOR FilterDescription)
Definition: undoc.cpp:730
NTSTATUS NTAPI IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_REGISTRY_PROPERTY DeviceProperty, IN ULONG BufferLength, OUT PVOID PropertyBuffer, OUT PULONG ResultLength)
Definition: pnpmgr.c:1952
void * PVOID
Definition: retypes.h:9
IUnregisterPhysicalConnection * PUNREGISTERPHYSICALCONNECTION
Definition: portcls.h:675
IMiniportMidi * m_pMiniportMidi
Definition: port_dmus.cpp:31
#define KSPROPSETID_Topology
Definition: ks.h:842
Status
Definition: gdiplustypes.h:24
PPORTFILTERDMUS m_Filter
Definition: port_dmus.cpp:36
IRegistryKey * PREGISTRYKEY
Definition: portcls.h:1009
IDrmPort2 * PDRMPORT2
Definition: portcls.h:2226
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
INT POOL_TYPE
Definition: typedefs.h:78
const GUID IID_IUnknown
PPOWERNOTIFY m_pPowerNotify
Definition: port_dmus.cpp:35
nsrefcnt Release()
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
NTSTATUS NTAPI TopologyPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data)
#define PC_ASSERT_IRQL_EQUAL(x)
Definition: private.hpp:31
ULONG AddRef()
PSUBDEVICE_DESCRIPTOR m_SubDeviceDescriptor
Definition: port_dmus.cpp:39
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
NTSTATUS NewPortDMus(OUT PPORT *OutPort)
Definition: port_dmus.cpp:491
NTSTATUS NTAPI PcNewRegistryKey(OUT PREGISTRYKEY *OutRegistryKey, IN PUNKNOWN OuterUnknown OPTIONAL, IN ULONG RegistryKeyType, IN ACCESS_MASK DesiredAccess, IN PVOID DeviceObject OPTIONAL, IN PVOID SubDevice OPTIONAL, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN ULONG CreateOptions OPTIONAL, OUT PULONG Disposition OPTIONAL)
Definition: registry.cpp:268
Definition: arc.h:85
NTSTATUS NTAPI NewIUnregisterSubdevice(OUT PUNREGISTERSUBDEVICE *OutDevice)
Definition: unregister.cpp:122
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ ULONG _Out_ PVOID PropertyBuffer
Definition: wdfdevice.h:4431
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
PPINCOUNT m_pPinCount
Definition: port_dmus.cpp:34
_Must_inspect_result_ _In_opt_ WDFKEY _In_ PCUNICODE_STRING _In_ ACCESS_MASK _In_ ULONG CreateOptions
Definition: wdfregistry.h:112
IResourceList * PRESOURCELIST
Definition: portcls.h:442
VOID GetDMusMiniport(IN IPortDMus *iface, IN PMINIPORTDMUS *Miniport, IN PMINIPORTMIDI *MidiMiniport)
Definition: port_dmus.cpp:514
ISubdevice * PSUBDEVICE
Definition: interfaces.hpp:305
IN PVOID IN PVOID IN USHORT IN USHORT IN PINTERFACE Interface
Definition: pci.h:361
NTSTATUS NewPortClsVersion(OUT PPORTCLSVERSION *OutVersion)
Definition: version.cpp:71
IMiniportDMus * PMINIPORTDMUS
Definition: dmusicks.h:209
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ WDF_DEVICE_POWER_STATE PowerState
Definition: wdfdevice.h:3032
NTSYSAPI NTSTATUS WINAPI RtlStringFromGUID(REFGUID, PUNICODE_STRING)
#define KSPROPSETID_Pin
Definition: ks.h:617
IMiniportMidi * PMINIPORTMIDI
Definition: portcls.h:1376
unsigned int * PULONG
Definition: retypes.h:1
#define NULL
Definition: types.h:112
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
IPowerNotify * PPOWERNOTIFY
Definition: portcls.h:2057
DEFINE_KSPROPERTY_TOPOLOGYSET(PortFilterDMusTopologySet, TopologyPropertyHandler)
#define OUT
Definition: typedefs.h:40
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ _Strict_type_match_ POOL_TYPE PoolType
Definition: wdfdevice.h:3810
unsigned int ULONG
Definition: retypes.h:1
#define UNIMPLEMENTED
Definition: debug.h:115
NTSTATUS NTAPI NewIUnregisterPhysicalConnection(OUT PUNREGISTERPHYSICALCONNECTION *OutConnection)
Definition: connection.cpp:128
#define STATUS_SUCCESS
Definition: shellext.h:65
#define DPRINT
Definition: sndvol32.h:71
NTSTATUS NewIDrmPort(OUT PDRMPORT2 *OutPort)
Definition: drm_port.cpp:125
DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PortFilterDMusPinSet, PinPropertyHandler, PinPropertyHandler, PinPropertyHandler)
nsrefcnt AddRef()
ULONG ACCESS_MASK
Definition: nt_native.h:40
IMiniportDMus * m_pMiniport
Definition: port_dmus.cpp:30
PSERVICEGROUP m_ServiceGroup
Definition: port_dmus.cpp:33
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
IPortClsVersion * PPORTCLSVERSION
Definition: portcls.h:2263