ReactOS  0.4.14-dev-52-g6116262
port_wavert.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_wavert.cpp
5  * PURPOSE: WaveRT 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 CPortWaveRT : public IPortWaveRT,
18  public IPortEvents,
19  public ISubdevice
20 {
21 public:
23 
25  {
27  return m_Ref;
28  }
30  {
32 
33  if (!m_Ref)
34  {
35  delete this;
36  return 0;
37  }
38  return m_Ref;
39  }
43  CPortWaveRT(IUnknown *OuterUnknown) {}
44  virtual ~CPortWaveRT() {}
45 
46 protected:
47 
56  IPortFilterWaveRT * m_Filter;
57 
58  friend PMINIPORTWAVERT GetWaveRTMiniport(IN IPortWaveRT* iface);
60 
62 };
63 
64 static GUID InterfaceGuids[3] =
65 {
66  {
68  0x6994AD04, 0x93EF, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
69  },
70  {
72  0x65E8773EL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
73  },
74  {
76  0x65E8773DL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
77  }
78 };
79 
80 DEFINE_KSPROPERTY_TOPOLOGYSET(PortFilterWaveRTTopologySet, TopologyPropertyHandler);
82 
83 KSPROPERTY_SET WaveRTPropertySet[] =
84 {
85  {
87  sizeof(PortFilterWaveRTTopologySet) / sizeof(KSPROPERTY_ITEM),
88  (const KSPROPERTY_ITEM*)&PortFilterWaveRTTopologySet,
89  0,
90  NULL
91  },
92  {
94  sizeof(PortFilterWaveRTPinSet) / sizeof(KSPROPERTY_ITEM),
95  (const KSPROPERTY_ITEM*)&PortFilterWaveRTPinSet,
96  0,
97  NULL
98  }
99 };
100 
101 //KSEVENTSETID_LoopedStreaming, Type = KSEVENT_LOOPEDSTREAMING_POSITION
102 //KSEVENTSETID_Connection, Type = KSEVENT_CONNECTION_ENDOFSTREAM,
103 
104 
105 
106 //---------------------------------------------------------------
107 // IPortEvents
108 //
109 
110 void
111 NTAPI
112 CPortWaveRT::AddEventToEventList(
113  IN PKSEVENT_ENTRY EventEntry)
114 {
116 }
117 
118 
119 void
120 NTAPI
121 CPortWaveRT::GenerateEventList(
122  IN GUID* Set OPTIONAL,
123  IN ULONG EventId,
124  IN BOOL PinEvent,
125  IN ULONG PinId,
126  IN BOOL NodeEvent,
127  IN ULONG NodeId)
128 {
130 }
131 
132 //---------------------------------------------------------------
133 // IUnknown interface functions
134 //
135 
136 NTSTATUS
137 NTAPI
139  IN REFIID refiid,
140  OUT PVOID* Output)
141 {
143 
144  if (IsEqualGUIDAligned(refiid, IID_IPortWaveRT) ||
146  {
147  *Output = PVOID(PPORTWAVERT(this));
148  PUNKNOWN(*Output)->AddRef();
149  return STATUS_SUCCESS;
150  }
151  else if (IsEqualGUIDAligned(refiid, IID_IPortEvents))
152  {
153  *Output = PVOID(PPORTEVENTS(this));
154  PUNKNOWN(*Output)->AddRef();
155  return STATUS_SUCCESS;
156  }
157  else if (IsEqualGUIDAligned(refiid, IID_ISubdevice))
158  {
159  *Output = PVOID(PSUBDEVICE(this));
160  PUNKNOWN(*Output)->AddRef();
161  return STATUS_SUCCESS;
162  }
163  else if (IsEqualGUIDAligned(refiid, IID_IPortClsVersion))
164  {
166  }
167  else if (IsEqualGUIDAligned(refiid, IID_IDrmPort) ||
168  IsEqualGUIDAligned(refiid, IID_IDrmPort2))
169  {
170  return NewIDrmPort((PDRMPORT2*)Output);
171  }
172  else if (IsEqualGUIDAligned(refiid, IID_IUnregisterSubdevice))
173  {
175  }
176  else if (IsEqualGUIDAligned(refiid, IID_IUnregisterPhysicalConnection))
177  {
179  }
180 
182  {
183  DPRINT("IPortWaveRT_fnQueryInterface no interface!!! iface %S\n", GuidString.Buffer);
185  }
186 
187  return STATUS_UNSUCCESSFUL;
188 }
189 //---------------------------------------------------------------
190 // IPort interface functions
191 //
192 
193 NTSTATUS
194 NTAPI
195 CPortWaveRT::GetDeviceProperty(
196  IN DEVICE_REGISTRY_PROPERTY DeviceRegistryProperty,
198  OUT PVOID PropertyBuffer,
200 {
202 
203  if (!m_bInitialized)
204  {
205  DPRINT("IPortWaveRT_fnNewRegistryKey called w/o initialized\n");
206  return STATUS_UNSUCCESSFUL;
207  }
208 
209  return IoGetDeviceProperty(m_pDeviceObject, DeviceRegistryProperty, BufferLength, PropertyBuffer, ReturnLength);
210 }
211 
212 NTSTATUS
213 NTAPI
216  IN PIRP Irp,
217  IN PUNKNOWN UnknownMiniport,
218  IN PUNKNOWN UnknownAdapter OPTIONAL,
220 {
221  IMiniportWaveRT * Miniport;
224  PPOWERNOTIFY PowerNotify;
225 
226  DPRINT("IPortWaveRT_Init entered %p\n", this);
228 
229  if (m_bInitialized)
230  {
231  DPRINT("IPortWaveRT_Init called again\n");
232  return STATUS_SUCCESS;
233  }
234 
235  Status = UnknownMiniport->QueryInterface(IID_IMiniportWaveRT, (PVOID*)&Miniport);
236  if (!NT_SUCCESS(Status))
237  {
238  DPRINT("IPortWaveRT_Init called with invalid IMiniport adapter\n");
240  }
241 
242  // Initialize port object
243  m_pMiniport = Miniport;
247 
248  // increment reference on miniport adapter
249  Miniport->AddRef();
250 
251  Status = Miniport->Init(UnknownAdapter, ResourceList, this);
252  if (!NT_SUCCESS(Status))
253  {
254  DPRINT("IMiniportWaveRT_Init failed with %x\n", Status);
255  Miniport->Release();
257  return Status;
258  }
259 
260 
261  // get the miniport device descriptor
262  Status = Miniport->GetDescription(&m_pDescriptor);
263  if (!NT_SUCCESS(Status))
264  {
265  DPRINT("failed to get description\n");
266  Miniport->Release();
268  return Status;
269  }
270 
271  // create the subdevice descriptor
273  3,
275  0,
276  NULL,
277  2,
279  0,
280  0,
281  0,
282  NULL,
283  0,
284  NULL,
285  m_pDescriptor);
286 
287  if (!NT_SUCCESS(Status))
288  {
289  DPRINT("PcCreateSubdeviceDescriptor failed with %x\n", Status);
290  Miniport->Release();
292  return Status;
293  }
294 
295  // check if it supports IPinCount interface
296  Status = UnknownMiniport->QueryInterface(IID_IPinCount, (PVOID*)&PinCount);
297  if (NT_SUCCESS(Status))
298  {
299  // store IPinCount interface
301  }
302 
303  // does the Miniport adapter support IPowerNotify interface*/
304  Status = UnknownMiniport->QueryInterface(IID_IPowerNotify, (PVOID*)&PowerNotify);
305  if (NT_SUCCESS(Status))
306  {
307  // store reference
308  m_pPowerNotify = PowerNotify;
309  }
310 
311  // increment reference on resource list
312  ResourceList->AddRef();
313 
314 
315  DPRINT("IPortWaveRT successfully initialized\n");
316  return STATUS_SUCCESS;
317 }
318 
319 
320 NTSTATUS
321 NTAPI
322 CPortWaveRT::NewRegistryKey(
323  OUT PREGISTRYKEY *OutRegistryKey,
324  IN PUNKNOWN OuterUnknown OPTIONAL,
325  IN ULONG RegistryKeyType,
330 {
332 
333  if (!m_bInitialized)
334  {
335  DPRINT("IPortWaveRT_fnNewRegistryKey called w/o initialized\n");
336  return STATUS_UNSUCCESSFUL;
337  }
338  return PcNewRegistryKey(OutRegistryKey, OuterUnknown, RegistryKeyType, DesiredAccess, m_pDeviceObject, (ISubdevice*)this, ObjectAttributes, CreateOptions, Disposition);
339 }
340 //---------------------------------------------------------------
341 // ISubdevice interface
342 //
343 
344 NTSTATUS
345 NTAPI
346 CPortWaveRT::NewIrpTarget(
347  OUT struct IIrpTarget **OutTarget,
348  IN PCWSTR Name,
352  IN PIRP Irp,
353  IN KSOBJECT_CREATE *CreateObject)
354 {
356  IPortFilterWaveRT * Filter;
357 
358  DPRINT("ISubDevice_NewIrpTarget this %p\n", this);
359 
360  if (m_Filter)
361  {
362  *OutTarget = (IIrpTarget*)m_Filter;
363  return STATUS_SUCCESS;
364  }
365 
366 
368  if (!NT_SUCCESS(Status))
369  {
370  return Status;
371  }
372 
373  Status = Filter->Init(this);
374  if (!NT_SUCCESS(Status))
375  {
376  Filter->Release();
377  return Status;
378  }
379 
380  *OutTarget = (IIrpTarget*)Filter;
381  m_Filter = Filter;
382  return Status;
383 }
384 
385 NTSTATUS
386 NTAPI
387 CPortWaveRT::ReleaseChildren()
388 {
390  return STATUS_UNSUCCESSFUL;
391 }
392 
393 NTSTATUS
394 NTAPI
395 CPortWaveRT::GetDescriptor(
397 {
399 
401 
402  DPRINT("ISubDevice_GetDescriptor this %p desc %p\n", this, m_SubDeviceDescriptor);
403  return STATUS_SUCCESS;
404 }
405 
406 NTSTATUS
407 NTAPI
408 CPortWaveRT::DataRangeIntersection(
409  IN ULONG PinId,
410  IN PKSDATARANGE DataRange,
411  IN PKSDATARANGE MatchingDataRange,
413  OUT PVOID ResultantFormat OPTIONAL,
414  OUT PULONG ResultantFormatLength)
415 {
416  DPRINT("ISubDevice_DataRangeIntersection this %p\n", this);
417 
418  if (m_pMiniport)
419  {
420  return m_pMiniport->DataRangeIntersection (PinId, DataRange, MatchingDataRange, OutputBufferLength, ResultantFormat, ResultantFormatLength);
421  }
422 
423  return STATUS_UNSUCCESSFUL;
424 }
425 
426 NTSTATUS
427 NTAPI
428 CPortWaveRT::PowerChangeNotify(
430 {
431  if (m_pPowerNotify)
432  {
433  m_pPowerNotify->PowerChangeNotify(PowerState);
434  }
435 
436  return STATUS_SUCCESS;
437 }
438 
439 NTSTATUS
440 NTAPI
442  IN ULONG PinId,
443  IN OUT PULONG FilterNecessary,
444  IN OUT PULONG FilterCurrent,
445  IN OUT PULONG FilterPossible,
446  IN OUT PULONG GlobalCurrent,
447  IN OUT PULONG GlobalPossible)
448 {
449  if (m_pPinCount)
450  {
451  m_pPinCount->PinCount(PinId, FilterNecessary, FilterCurrent, FilterPossible, GlobalCurrent, GlobalPossible);
452  return STATUS_SUCCESS;
453  }
454 
455  // FIXME
456  // scan filter descriptor
457 
458  return STATUS_UNSUCCESSFUL;
459 }
460 
464  IN IPortWaveRT* iface)
465 {
466  CPortWaveRT * This = (CPortWaveRT *)iface;
467  return This->m_pMiniport;
468 }
469 
472  PPORTWAVERT iface)
473 {
474  CPortWaveRT * This = (CPortWaveRT *)iface;
475  return This->m_pDeviceObject;
476 }
477 
478 //---------------------------------------------------------------
479 // IPortWaveRT constructor
480 //
481 
482 
483 NTSTATUS
485  OUT PPORT* OutPort)
486 {
487  CPortWaveRT * Port;
489 
491  if (!Port)
493 
494  Status = Port->QueryInterface(IID_IPort, (PVOID*)OutPort);
495 
496  if (!NT_SUCCESS(Status))
497  {
498  delete Port;
499  }
500 
501  DPRINT("NewPortWaveRT %p Status %u\n", Port, Status);
502  return Status;
503 }
504 
DEVICE_REGISTRY_PROPERTY
Definition: iotypes.h:1154
IPortEvents * PPORTEVENTS
Definition: portcls.h:2065
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
IPortFilterWaveRT * m_Filter
Definition: port_wavert.cpp:56
PPCFILTER_DESCRIPTOR m_pDescriptor
Definition: port_wavert.cpp:54
IN CINT OUT PVOID IN ULONG OUT PULONG ReturnLength
Definition: dumpinfo.c:39
static PWSTR GuidString
Definition: apphelp.c:91
NTSTATUS NTAPI PinPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data)
CPPORT Port[4]
Definition: headless.c:34
const uint16_t * PCWSTR
Definition: typedefs.h:55
#define IN
Definition: typedefs.h:38
IPortWaveRT * PPORTWAVERT
Definition: interfaces.hpp:682
#define REFIID
Definition: guiddef.h:118
#define TRUE
Definition: types.h:120
_In_ UCHAR _In_ POWER_STATE PowerState
Definition: pofuncs.h:42
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define PC_ASSERT(exp)
Definition: usbehci.h:17
_In_ BOOLEAN Release
Definition: classpnp.h:929
BOOL m_bInitialized
Definition: port_wavert.cpp:48
IPinCount * PPINCOUNT
Definition: portcls.h:2036
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
IUnknown * PUNKNOWN
Definition: com_apitest.h:45
#define TAG_PORTCLASS
Definition: private.hpp:24
LONG NTSTATUS
Definition: precomp.h:26
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ ULONG _In_ ULONG _In_ ULONG OutputBufferLength
Definition: fltkernel.h:1374
PRESOURCELIST m_pResourceList
Definition: port_wavert.cpp:51
IUnregisterSubdevice * PUNREGISTERSUBDEVICE
Definition: portcls.h:633
BOOL Init(PUSERCONNECT UserCon)
Definition: dllmain.c:385
_In_ const GUID _In_ ULONG PinCount
Definition: strmini.h:504
const MUI_LANGUAGE_RESOURCE ResourceList[]
Definition: muilanguages.h:414
virtual ~CPortWaveRT()
Definition: port_wavert.cpp:44
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Reserved_ ULONG _In_opt_ PUNICODE_STRING _In_ ULONG _Out_opt_ PULONG Disposition
Definition: cmfuncs.h:50
IMiniportWaveRT * PMINIPORTWAVERT
Definition: portcls.h:1927
static BOOL Set
Definition: pageheap.c:10
#define IsEqualGUIDAligned(guid1, guid2)
Definition: wdm.template.h:233
DEFINE_KSPROPERTY_TOPOLOGYSET(PortFilterWaveRTTopologySet, TopologyPropertyHandler)
DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PortFilterWaveRTPinSet, PinPropertyHandler, PinPropertyHandler, PinPropertyHandler)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
NTSTATUS NewPortWaveRT(OUT PPORT *OutPort)
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
_In_ ULONG BufferLength
Definition: usbdlib.h:225
_Must_inspect_result_ _In_opt_ PFLT_FILTER Filter
Definition: fltkernel.h:1802
NTSTATUS NewPortFilterWaveRT(OUT IPortFilterWaveRT **OutFilter)
#define STDMETHODIMP
Definition: basetyps.h:43
IPort * PPORT
Definition: portcls.h:1093
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
smooth NULL
Definition: ftsmooth.c:416
PDEVICE_OBJECT m_pDeviceObject
Definition: port_wavert.cpp:49
NTSTATUS NTAPI IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_REGISTRY_PROPERTY DeviceProperty, IN ULONG BufferLength, OUT PVOID PropertyBuffer, OUT PULONG ResultLength)
Definition: pnpmgr.c:4228
void DPRINT(...)
Definition: polytest.cpp:61
void * PVOID
Definition: retypes.h:9
PPINCOUNT m_pPinCount
Definition: port_wavert.cpp:52
friend PDEVICE_OBJECT GetDeviceObjectFromPortWaveRT(PPORTWAVERT iface)
IUnregisterPhysicalConnection * PUNREGISTERPHYSICALCONNECTION
Definition: portcls.h:675
#define KSPROPSETID_Topology
Definition: ks.h:842
CPortWaveRT(IUnknown *OuterUnknown)
Definition: port_wavert.cpp:43
IN PVOID IN PVOID IN USHORT IN USHORT IN PINTERFACE Interface
Definition: pci.h:359
IRegistryKey * PREGISTRYKEY
Definition: portcls.h:999
IDrmPort2 * PDRMPORT2
Definition: portcls.h:2172
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
INT POOL_TYPE
Definition: typedefs.h:76
const GUID IID_IUnknown
nsrefcnt Release()
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE _In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Out_ PIO_STATUS_BLOCK _In_opt_ PLARGE_INTEGER _In_ ULONG _In_ ULONG _In_ ULONG _In_ ULONG CreateOptions
Definition: fltkernel.h:1230
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()
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
KSPROPERTY_SET WaveRTPropertySet[]
Definition: port_wavert.cpp:83
static const WCHAR L[]
Definition: oid.c:1250
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:281
#define InterlockedDecrement
Definition: armddk.h:52
Definition: arc.h:85
friend PMINIPORTWAVERT GetWaveRTMiniport(IN IPortWaveRT *iface)
NTSTATUS NTAPI NewIUnregisterSubdevice(OUT PUNREGISTERSUBDEVICE *OutDevice)
Definition: unregister.cpp:143
STDMETHODIMP QueryInterface(REFIID InterfaceId, PVOID *Interface)
NTSYSAPI NTSTATUS WINAPI RtlStringFromGUID(REFGUID, PUNICODE_STRING)
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
PDEVICE_OBJECT GetDeviceObjectFromPortWaveRT(PPORTWAVERT iface)
PPOWERNOTIFY m_pPowerNotify
Definition: port_wavert.cpp:53
Status
Definition: gdiplustypes.h:24
IResourceList * PRESOURCELIST
Definition: portcls.h:442
IN PDEVICE_OBJECT DeviceObject
Definition: fatprocs.h:1560
ISubdevice * PSUBDEVICE
Definition: interfaces.hpp:305
#define InterlockedIncrement
Definition: armddk.h:53
static GUID InterfaceGuids[3]
Definition: port_wavert.cpp:64
NTSTATUS NewPortClsVersion(OUT PPORTCLSVERSION *OutVersion)
Definition: version.cpp:93
STDMETHODIMP_(ULONG) Release()
Definition: port_wavert.cpp:29
_In_ PIO_STACK_LOCATION _Inout_ PFILE_OBJECT _Inout_ PVCB _Outptr_result_maybenull_ PDCB _In_ PDCB _In_ PDIRENT _In_ ULONG _In_ ULONG _In_ PUNICODE_STRING _In_ PACCESS_MASK DesiredAccess
Definition: create.c:4157
#define KSPROPSETID_Pin
Definition: ks.h:617
unsigned int * PULONG
Definition: retypes.h:1
PMINIPORTWAVERT GetWaveRTMiniport(IN IPortWaveRT *iface)
PSUBDEVICE_DESCRIPTOR m_SubDeviceDescriptor
Definition: port_wavert.cpp:55
static ULONG WINAPI AddRef(IStream *iface)
Definition: clist.c:90
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
IPowerNotify * PPOWERNOTIFY
Definition: portcls.h:2003
#define OUT
Definition: typedefs.h:39
STDMETHODIMP_(ULONG) AddRef()
Definition: port_wavert.cpp:24
unsigned int ULONG
Definition: retypes.h:1
#define UNIMPLEMENTED
Definition: debug.h:114
NTSTATUS NTAPI NewIUnregisterPhysicalConnection(OUT PUNREGISTERPHYSICALCONNECTION *OutConnection)
Definition: connection.cpp:148
struct _KSEVENT_ENTRY * PKSEVENT_ENTRY
Definition: ks.h:2101
NTSTATUS NewIDrmPort(OUT PDRMPORT2 *OutPort)
Definition: drm_port.cpp:145
return STATUS_SUCCESS
Definition: btrfs.c:2966
_Must_inspect_result_ _In_ FLT_CONTEXT_TYPE _In_ SIZE_T _In_ POOL_TYPE PoolType
Definition: fltkernel.h:1444
PMINIPORTWAVERT m_pMiniport
Definition: port_wavert.cpp:50
nsrefcnt AddRef()
ULONG ACCESS_MASK
Definition: nt_native.h:40
_In_ PSTORAGE_PROPERTY_ID _Outptr_ PSTORAGE_DESCRIPTOR_HEADER * Descriptor
Definition: classpnp.h:966
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
IPortClsVersion * PPORTCLSVERSION
Definition: portcls.h:2209