ReactOS 0.4.15-dev-7934-g1dc8d80
pin_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/pin_wavert.cpp
5 * PURPOSE: WaveRT IRP Audio Pin
6 * PROGRAMMER: Johannes Anderwald
7 */
8
9#include "private.hpp"
10
11#define NDEBUG
12#include <debug.h>
13
14class CPortPinWaveRT : public CUnknownImpl<IPortPinWaveRT>
15{
16public:
18
20 CPortPinWaveRT(IUnknown *OuterUnknown){}
21 virtual ~CPortPinWaveRT(){}
22
23protected:
24
25 IPortWaveRT * m_Port;
26 IPortFilterWaveRT * m_Filter;
27 KSPIN_DESCRIPTOR * m_KsPinDescriptor;
34
38
39 IIrpQueue * m_IrpQueue;
40
42
46
48
51
57
58};
59
60typedef struct
61{
66
67//==================================================================================================================================
68
72 IN REFIID refiid,
74{
75 DPRINT("IServiceSink_fnQueryInterface entered\n");
76
77 if (IsEqualGUIDAligned(refiid, IID_IIrpTarget) ||
79 {
80 *Output = PVOID(PUNKNOWN((IIrpTarget*)this));
81 PUNKNOWN(*Output)->AddRef();
82 return STATUS_SUCCESS;
83 }
85}
86
87//==================================================================================================================================
88
91CPortPinWaveRT::NewIrpTarget(
92 OUT struct IIrpTarget **OutTarget,
97 IN PIRP Irp,
98 IN KSOBJECT_CREATE *CreateObject)
99{
101 return STATUS_UNSUCCESSFUL;
102}
103
105NTAPI
107 IN PIRP Irp)
108{
112 PIO_STACK_LOCATION IoStack;
113
115
116 DPRINT("IPortPinWave_HandleKsProperty entered\n");
117
118 if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSPROPERTY))
119 {
120 Irp->IoStatus.Information = 0;
121 Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
124 }
125
126 Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer;
127
129 {
131 {
132 PKSSTATE State = (PKSSTATE)Irp->UserBuffer;
133
134 if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(KSSTATE))
135 {
136 Irp->IoStatus.Information = sizeof(KSSTATE);
137 Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
140 }
141
142 if (Property->Flags & KSPROPERTY_TYPE_SET)
143 {
145 Irp->IoStatus.Information = 0;
146
147 if (m_Stream)
148 {
149 Status = m_Stream->SetState(*State);
150
151 DPRINT("Setting state %u %x\n", *State, Status);
152 if (NT_SUCCESS(Status))
153 {
154 m_State = *State;
155 }
156 }
157 Irp->IoStatus.Status = Status;
159 return Status;
160 }
161 else if (Property->Flags & KSPROPERTY_TYPE_GET)
162 {
163 *State = m_State;
164 Irp->IoStatus.Information = sizeof(KSSTATE);
165 Irp->IoStatus.Status = STATUS_SUCCESS;
167 return STATUS_SUCCESS;
168 }
169 }
171 {
174 {
175 PKSDATAFORMAT NewDataFormat;
177 {
178 Irp->IoStatus.Information = DataFormat->FormatSize;
179 Irp->IoStatus.Status = STATUS_SUCCESS;
181 return STATUS_SUCCESS;
182 }
183
184 NewDataFormat = (PKSDATAFORMAT)AllocateItem(NonPagedPool, DataFormat->FormatSize, TAG_PORTCLASS);
185 if (!NewDataFormat)
186 {
187 Irp->IoStatus.Information = 0;
188 Irp->IoStatus.Status = STATUS_NO_MEMORY;
190 return STATUS_NO_MEMORY;
191 }
192 RtlMoveMemory(NewDataFormat, DataFormat, DataFormat->FormatSize);
193
194 if (m_Stream)
195 {
196#if 0
198 ASSERT(NewDataFormat->FormatSize == sizeof(KSDATAFORMAT_WAVEFORMATEX));
202
204#endif
205 DPRINT("NewDataFormat: Channels %u Bits %u Samples %u\n", ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.nChannels,
206 ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.wBitsPerSample,
207 ((PKSDATAFORMAT_WAVEFORMATEX)NewDataFormat)->WaveFormatEx.nSamplesPerSec);
208
209 Status = m_Stream->SetFormat(NewDataFormat);
210 if (NT_SUCCESS(Status))
211 {
212 if (m_Format)
214
215 m_Format = NewDataFormat;
216 Irp->IoStatus.Information = DataFormat->FormatSize;
217 Irp->IoStatus.Status = STATUS_SUCCESS;
219 return STATUS_SUCCESS;
220 }
221 }
222 DPRINT("Failed to set format\n");
223 Irp->IoStatus.Information = 0;
224 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
226 return STATUS_UNSUCCESSFUL;
227 }
228 else if (Property->Flags & KSPROPERTY_TYPE_GET)
229 {
230 if (!m_Format)
231 {
232 DPRINT("No format\n");
233 Irp->IoStatus.Information = 0;
234 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
236 return STATUS_UNSUCCESSFUL;
237 }
238 if (m_Format->FormatSize > IoStack->Parameters.DeviceIoControl.OutputBufferLength)
239 {
240 Irp->IoStatus.Information = m_Format->FormatSize;
241 Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
244 }
245
247 Irp->IoStatus.Information = DataFormat->FormatSize;
248 Irp->IoStatus.Status = STATUS_SUCCESS;
250 return STATUS_SUCCESS;
251 }
252 }
253
254 }
256 DPRINT("Unhandled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags);
258
259 Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
260 Irp->IoStatus.Information = 0;
263}
264
266NTAPI
268 IN PIRP Irp)
269{
270 DPRINT("IPortPinWaveRT_HandleKsStream entered State %u Stream %p is UNIMPLEMENTED\n", m_State, m_Stream);
271
272 return STATUS_PENDING;
273}
274
276NTAPI
277CPortPinWaveRT::DeviceIoControl(
279 IN PIRP Irp)
280{
281 PIO_STACK_LOCATION IoStack;
282
284
285 switch (IoStack->Parameters.DeviceIoControl.IoControlCode)
286 {
288 return HandleKsProperty(Irp);
289
291 /* FIXME UNIMPLEMENTED */
293 break;
294
296 /* FIXME UNIMPLEMENTED */
298 break;
299
300 case IOCTL_KS_HANDSHAKE:
301 /* FIXME UNIMPLEMENTED */
303 break;
304
305 case IOCTL_KS_METHOD:
306 /* FIXME UNIMPLEMENTED */
309
311 /* FIXME UNIMPLEMENTED */
313 break;
314
317 return HandleKsStream(Irp);
318
319 default:
321 }
322
323 Irp->IoStatus.Information = 0;
324 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
326
327 return STATUS_UNSUCCESSFUL;
328}
329
331NTAPI
332CPortPinWaveRT::Read(
334 IN PIRP Irp)
335{
337}
338
340NTAPI
341CPortPinWaveRT::Write(
343 IN PIRP Irp)
344{
346}
347
349NTAPI
350CPortPinWaveRT::Flush(
352 IN PIRP Irp)
353{
355}
356
357VOID
358NTAPI
362{
365 ISubdevice *ISubDevice;
369
370 This = (CPortPinWaveRT*)Ctx->Pin;
371
372 if (This->m_Stream)
373 {
374 if (This->m_State != KSSTATE_STOP)
375 {
376 This->m_Stream->SetState(KSSTATE_STOP);
378 }
379 }
380
381 Status = This->m_Port->QueryInterface(IID_ISubdevice, (PVOID*)&ISubDevice);
382 if (NT_SUCCESS(Status))
383 {
384 Status = ISubDevice->GetDescriptor(&Descriptor);
385 if (NT_SUCCESS(Status))
386 {
387 Descriptor->Factory.Instances[This->m_ConnectDetails->PinId].CurrentPinInstanceCount--;
388 }
389 ISubDevice->Release();
390 }
391
392 if (This->m_Format)
393 {
394 FreeItem(This->m_Format, TAG_PORTCLASS);
395 This->m_Format = NULL;
396 }
397
398 if (This->m_IrpQueue)
399 {
400 This->m_IrpQueue->Release();
401 }
402
403 // complete the irp
404 Ctx->Irp->IoStatus.Information = 0;
407
408 // free the work item
410
411 // free work item ctx
413
414 if (This->m_Stream)
415 {
416 Stream = This->m_Stream;
417 This->m_Stream = NULL;
418 DPRINT("Closing stream at Irql %u\n", KeGetCurrentIrql());
419 Stream->Release();
420 }
421}
422
424NTAPI
425CPortPinWaveRT::Close(
427 IN PIRP Irp)
428{
430
431 if (m_Stream)
432 {
434 if (!Ctx)
435 {
436 DPRINT("Failed to allocate stream context\n");
437 goto cleanup;
438 }
439
441 if (!Ctx->WorkItem)
442 {
443 DPRINT("Failed to allocate work item\n");
444 goto cleanup;
445 }
446
447 Ctx->Irp = Irp;
448 Ctx->Pin = this;
449
451 Irp->IoStatus.Information = 0;
452 Irp->IoStatus.Status = STATUS_PENDING;
453
454 // defer work item
456 // Return result
457 return STATUS_PENDING;
458 }
459
460 Irp->IoStatus.Information = 0;
461 Irp->IoStatus.Status = STATUS_SUCCESS;
463
464 return STATUS_SUCCESS;
465
466cleanup:
467
468 if (Ctx)
470
471 Irp->IoStatus.Information = 0;
472 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
474 return STATUS_UNSUCCESSFUL;
475
476}
477
479NTAPI
480CPortPinWaveRT::QuerySecurity(
482 IN PIRP Irp)
483{
485}
486
488NTAPI
489CPortPinWaveRT::SetSecurity(
491 IN PIRP Irp)
492{
494}
495
497NTAPI
498CPortPinWaveRT::FastDeviceIoControl(
506 OUT PIO_STATUS_BLOCK StatusBlock,
508{
509 return FALSE;
510}
511
513NTAPI
514CPortPinWaveRT::FastRead(
521 OUT PIO_STATUS_BLOCK StatusBlock,
523{
524 return FALSE;
525}
526
528NTAPI
529CPortPinWaveRT::FastWrite(
536 OUT PIO_STATUS_BLOCK StatusBlock,
538{
539 return FALSE;
540}
541
543NTAPI
544CPortPinWaveRT::Init(
547 IN KSPIN_CONNECT * ConnectDetails,
548 IN KSPIN_DESCRIPTOR * KsPinDescriptor,
550{
554 KSRTAUDIO_HWLATENCY Latency;
555
556 Port->AddRef();
557 Filter->AddRef();
558
559 m_Port = Port;
561 m_KsPinDescriptor = KsPinDescriptor;
562 m_ConnectDetails = ConnectDetails;
564
565 DataFormat = (PKSDATAFORMAT)(ConnectDetails + 1);
566
567 DPRINT("CPortPinWaveRT::Init entered\n");
568
570 if (!m_Format)
572
574
576 if (!NT_SUCCESS(Status))
577 {
578 goto cleanup;
579 }
580
581 Status = m_IrpQueue->Init(ConnectDetails, KsPinDescriptor, 0, 0, FALSE);
582 if (!NT_SUCCESS(Status))
583 {
584 goto cleanup;
585 }
586
588 if (!NT_SUCCESS(Status))
589 {
590 goto cleanup;
591 }
592
593 if (KsPinDescriptor->Communication == KSPIN_COMMUNICATION_SINK && KsPinDescriptor->DataFlow == KSPIN_DATAFLOW_IN)
594 {
595 Capture = FALSE;
596 }
597 else if (KsPinDescriptor->Communication == KSPIN_COMMUNICATION_SINK && KsPinDescriptor->DataFlow == KSPIN_DATAFLOW_OUT)
598 {
599 Capture = TRUE;
600 }
601 else
602 {
603 DPRINT("Unexpected Communication %u DataFlow %u\n", KsPinDescriptor->Communication, KsPinDescriptor->DataFlow);
604 KeBugCheck(0);
605 while(TRUE);
606 }
607
608 Status = m_Miniport->NewStream(&m_Stream, m_PortStream, ConnectDetails->PinId, Capture, m_Format);
609 DPRINT("CPortPinWaveRT::Init Status %x\n", Status);
610
611 if (!NT_SUCCESS(Status))
612 goto cleanup;
613
614 m_Stream->GetHWLatency(&Latency);
615 // delay of 10 millisec
616 m_Delay = Int32x32To64(10, -10000);
617
618 Status = m_Stream->AllocateAudioBuffer(16384 * 11, &m_Mdl, &m_CommonBufferSize, &m_CommonBufferOffset, &m_CacheType);
619 if (!NT_SUCCESS(Status))
620 {
621 DPRINT("AllocateAudioBuffer failed with %x\n", Status);
622 goto cleanup;
623 }
624
626 if (!m_CommonBuffer)
627 {
628 DPRINT("Failed to get system address %x\n", Status);
630 m_Mdl = NULL;
631 goto cleanup;
632 }
633
634 DPRINT("Setting state to acquire %x\n", m_Stream->SetState(KSSTATE_ACQUIRE));
635 DPRINT("Setting state to pause %x\n", m_Stream->SetState(KSSTATE_PAUSE));
637 return STATUS_SUCCESS;
638
639cleanup:
640 if (m_IrpQueue)
641 {
642 m_IrpQueue->Release();
644 }
645
646 if (m_Format)
647 {
649 m_Format = NULL;
650 }
651
652 if (m_Stream)
653 {
654 m_Stream->Release();
655 m_Stream = NULL;
656 }
657 else
658 {
659 if (m_PortStream)
660 {
661 m_PortStream->Release();
663 }
664
665 }
666 return Status;
667}
668
671 OUT IPortPinWaveRT ** OutPin)
672{
674
676 if (!This)
678
679 This->AddRef();
680
681 // store result
682 *OutPin = (PPORTPINWAVERT)This;
683
684 return STATUS_SUCCESS;
685}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
unsigned char BOOLEAN
IPortWaveRT * PPORTWAVERT
Definition: interfaces.hpp:681
IPortPinWaveRT * PPORTPINWAVERT
Definition: interfaces.hpp:724
IPortFilterWaveRT * PPORTFILTERWAVERT
Definition: interfaces.hpp:694
LONG NTSTATUS
Definition: precomp.h:26
#define STDMETHODIMP
Definition: basetyps.h:43
const GUID IID_IUnknown
VOID NTAPI KeStallExecutionProcessor(IN ULONG MicroSeconds)
Definition: ntoskrnl.c:81
#define UNIMPLEMENTED
Definition: debug.h:115
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
Definition: bug.c:1431
struct _Capture Capture
Definition: capture.h:24
_In_ PFCB _In_ LONGLONG FileOffset
Definition: cdprocs.h:160
Definition: bufpool.h:45
KSSTATE m_State
Definition: pin_wavert.cpp:31
PVOID m_CommonBuffer
Definition: pin_wavert.cpp:35
ULONG m_PostCompleted
Definition: pin_wavert.cpp:45
ULONG m_TotalPackets
Definition: pin_wavert.cpp:43
ULONG m_CommonBufferSize
Definition: pin_wavert.cpp:36
PMINIPORTWAVERT m_Miniport
Definition: pin_wavert.cpp:28
friend VOID NTAPI CloseStreamRoutine(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
Definition: pin_wavert.cpp:359
PMINIPORTWAVERTSTREAM m_Stream
Definition: pin_wavert.cpp:29
CPortPinWaveRT(IUnknown *OuterUnknown)
Definition: pin_wavert.cpp:20
NTSTATUS NTAPI HandleKsStream(IN PIRP Irp)
Definition: pin_wavert.cpp:267
ULONG m_PreCompleted
Definition: pin_wavert.cpp:44
ULONGLONG m_Delay
Definition: pin_wavert.cpp:47
virtual ~CPortPinWaveRT()
Definition: pin_wavert.cpp:21
IPortFilterWaveRT * m_Filter
Definition: pin_wavert.cpp:26
PPORTWAVERTSTREAM m_PortStream
Definition: pin_wavert.cpp:30
STDMETHODIMP QueryInterface(REFIID InterfaceId, PVOID *Interface)
Definition: pin_wavert.cpp:71
IIrpQueue * m_IrpQueue
Definition: pin_wavert.cpp:39
ULONG m_CommonBufferOffset
Definition: pin_wavert.cpp:37
MEMORY_CACHING_TYPE m_CacheType
Definition: pin_wavert.cpp:49
VOID NTAPI SetStreamState(IN KSSTATE State)
KSPIN_DESCRIPTOR * m_KsPinDescriptor
Definition: pin_wavert.cpp:27
PKSDATAFORMAT m_Format
Definition: pin_wavert.cpp:32
IPortWaveRT * m_Port
Definition: pin_wavert.cpp:25
KSPIN_CONNECT * m_ConnectDetails
Definition: pin_wavert.cpp:33
friend VOID NTAPI SetStreamWorkerRoutine(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
NTSTATUS NTAPI HandleKsProperty(IN PIRP Irp)
Definition: pin_wavert.cpp:106
IUnknown * PUNKNOWN
Definition: com_apitest.h:45
_In_ PIRP Irp
Definition: csq.h:116
KSDATAFORMAT * PKSDATAFORMAT
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
static void cleanup(void)
Definition: main.c:1335
KSDDKAPI NTSTATUS NTAPI KsDispatchInvalidDeviceRequest(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1189
KSDDKAPI NTSTATUS NTAPI KsDefaultDeviceIoCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1205
#define KSPROPERTY_TYPE_SET
Definition: dmksctrl.h:43
struct KSIDENTIFIER * PKSPROPERTY
#define KSPROPERTY_TYPE_GET
Definition: dmksctrl.h:42
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define NonPagedPool
Definition: env_spec_w32.h:307
IN PLARGE_INTEGER IN ULONG IN BOOLEAN IN ULONG LockKey
Definition: fatprocs.h:2665
unsigned int BOOL
Definition: ntddk_ex.h:94
_Must_inspect_result_ _In_opt_ PFLT_FILTER Filter
Definition: fltkernel.h:1801
#define IoFreeMdl
Definition: fxmdl.h:89
Status
Definition: gdiplustypes.h:25
CPPORT Port[4]
Definition: headless.c:35
@ Unknown
Definition: i8042prt.h:114
NTSYSAPI NTSTATUS WINAPI RtlStringFromGUID(REFGUID, PUNICODE_STRING)
ULONG AddRef()
ULONG Release()
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
Definition: iowork.c:40
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
Definition: iowork.c:64
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
Definition: iowork.c:75
IoMarkIrpPending(Irp)
NTSTATUS NTAPI NewIrpQueue(IN IIrpQueue **Queue)
Definition: irpstream.cpp:864
@ KSPROPERTY_CONNECTION_DATAFORMAT
Definition: ks.h:351
@ KSPROPERTY_CONNECTION_STATE
Definition: ks.h:349
#define IOCTL_KS_RESET_STATE
Definition: ks.h:145
#define IOCTL_KS_METHOD
Definition: ks.h:136
#define IOCTL_KS_PROPERTY
Definition: ks.h:127
enum KSSTATE * PKSSTATE
KSSTATE
Definition: ks.h:1214
@ KSSTATE_ACQUIRE
Definition: ks.h:1216
@ KSSTATE_PAUSE
Definition: ks.h:1217
@ KSSTATE_STOP
Definition: ks.h:1215
@ KSPIN_DATAFLOW_IN
Definition: ks.h:1249
@ KSPIN_DATAFLOW_OUT
Definition: ks.h:1250
#define KSPROPSETID_Connection
Definition: ks.h:346
@ KSPIN_COMMUNICATION_SINK
Definition: ks.h:1255
#define IOCTL_KS_READ_STREAM
Definition: ks.h:142
#define IOCTL_KS_ENABLE_EVENT
Definition: ks.h:130
#define IOCTL_KS_WRITE_STREAM
Definition: ks.h:139
#define IOCTL_KS_DISABLE_EVENT
Definition: ks.h:133
PVOID AllocateItem(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes)
Definition: misc.c:29
VOID FreeItem(IN PVOID Item)
Definition: misc.c:37
#define KSDATAFORMAT_SUBTYPE_PCM
Definition: ksmedia.h:1021
#define KSDATAFORMAT_TYPE_AUDIO
Definition: ksmedia.h:983
#define KSDATAFORMAT_SPECIFIER_WAVEFORMATEX
Definition: ksmedia.h:1031
if(dx< 0)
Definition: linetemp.h:194
#define ASSERT(a)
Definition: mode.c:44
@ NormalPagePriority
Definition: imports.h:56
static PWSTR GuidString
Definition: apphelp.c:93
static IStream Stream
Definition: htmldoc.c:1115
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define Int32x32To64(a, b)
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define IoCompleteRequest
Definition: irp.c:1240
#define STATUS_PENDING
Definition: ntstatus.h:82
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:239
NTSTATUS NewPortPinWaveRT(OUT IPortPinWaveRT **OutPin)
Definition: pin_wavert.cpp:670
VOID NTAPI CloseStreamRoutine(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
Definition: pin_wavert.cpp:359
struct SETSTREAM_CONTEXT * PSETSTREAM_CONTEXT
PMINIPORTWAVERT GetWaveRTMiniport(IN IPortWaveRT *iface)
NTSTATUS NewPortWaveRTStream(PPORTWAVERTSTREAM *OutStream)
IMiniportWaveRT * PMINIPORTWAVERT
Definition: portcls.h:1983
IMiniportWaveRTStream * PMINIPORTWAVERTSTREAM
Definition: portcls.h:1865
IPortWaveRTStream * PPORTWAVERTSTREAM
Definition: portcls.h:1847
struct CLOSESTREAM_CONTEXT * PCLOSESTREAM_CONTEXT
#define TAG_PORTCLASS
Definition: private.hpp:24
#define REFIID
Definition: guiddef.h:118
@ Output
Definition: arc.h:85
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define DPRINT
Definition: sndvol32.h:71
PIO_WORKITEM WorkItem
Definition: private.hpp:424
CPortPinWaveRT * Pin
Definition: pin_wavert.cpp:62
struct _IO_STACK_LOCATION::@1564::@1565 DeviceIoControl
union _IO_STACK_LOCATION::@1564 Parameters
IO_STATUS_BLOCK IoStatus
const uint16_t * PCWSTR
Definition: typedefs.h:57
#define UNIMPLEMENTED_ONCE
Definition: typedefs.h:30
INT POOL_TYPE
Definition: typedefs.h:78
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
#define IN
Definition: typedefs.h:39
#define RtlMoveMemory(Destination, Source, Length)
Definition: typedefs.h:264
uint32_t ULONG
Definition: typedefs.h:59
uint64_t ULONGLONG
Definition: typedefs.h:67
#define OUT
Definition: typedefs.h:40
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ _Strict_type_match_ POOL_TYPE PoolType
Definition: wdfdevice.h:3815
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
Definition: wdfdevice.h:550
_In_ WDFDPC _In_ BOOLEAN Wait
Definition: wdfdpc.h:170
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE Interface
Definition: wdffdo.h:465
_In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
Definition: wdfio.h:325
_In_ WDFREQUEST _In_ size_t OutputBufferLength
Definition: wdfio.h:320
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
Definition: wdfio.h:322
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
Definition: wdfiotarget.h:863
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
Definition: wdfiotarget.h:953
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:342
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
Definition: wdfworkitem.h:115
#define IsEqualGUIDAligned(guid1, guid2)
Definition: wdm.template.h:235
@ DelayedWorkQueue
Definition: extypes.h:190
#define IO_NO_INCREMENT
Definition: iotypes.h:598
* PFILE_OBJECT
Definition: iotypes.h:1998
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
enum _MEMORY_CACHING_TYPE MEMORY_CACHING_TYPE