ReactOS 0.4.15-dev-6661-gcc6e444
propertyhandler.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/propertyhandler.cpp
5 * PURPOSE: Pin property handler
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
24 IN ISubdevice *SubDevice)
25{
26 KSPIN_CINSTANCES * Instances;
28 ULONG FilterNecessary, FilterCurrent, FilterPossible, GlobalCurrent, GlobalPossible;
30
31 if (Pin->PinId >= Descriptor->Factory.PinDescriptorCount)
32 {
33 IoStatus->Information = 0;
36 }
37
38 Instances = (KSPIN_CINSTANCES*)Data;
39
40 // check if the miniport supports the IPinCount interface
41 Status = SubDevice->PinCount(Pin->PinId, &FilterNecessary, &FilterCurrent, &FilterPossible, &GlobalCurrent, &GlobalPossible);
42
43 if (NT_SUCCESS(Status))
44 {
45 if (Global)
46 {
47 Instances->PossibleCount = GlobalPossible;
48 Instances->CurrentCount = GlobalCurrent;
49 }
50 else
51 {
52 Instances->PossibleCount = FilterPossible;
53 Instances->CurrentCount = FilterCurrent;
54 }
55 }
56 else
57 {
58 if (Global)
59 Instances->PossibleCount = Descriptor->Factory.Instances[Pin->PinId].MaxGlobalInstanceCount;
60 else
61 Instances->PossibleCount = Descriptor->Factory.Instances[Pin->PinId].MaxFilterInstanceCount;
62
63 Instances->CurrentCount = Descriptor->Factory.Instances[Pin->PinId].CurrentPinInstanceCount;
64 }
65
66 IoStatus->Information = sizeof(KSPIN_CINSTANCES);
67 IoStatus->Status = STATUS_SUCCESS;
68 return STATUS_SUCCESS;
69}
70
77 IN ISubdevice *SubDevice)
78{
81 ULONG FilterNecessary, FilterCurrent, FilterPossible, GlobalCurrent, GlobalPossible;
83
84 if (Pin->PinId >= Descriptor->Factory.PinDescriptorCount)
85 {
86 IoStatus->Information = 0;
89 }
90
92
93
94 // check if the miniport supports the IPinCount interface
95 Status = SubDevice->PinCount(Pin->PinId, &FilterNecessary, &FilterCurrent, &FilterPossible, &GlobalCurrent, &GlobalPossible);
96
97 if (NT_SUCCESS(Status))
98 {
99 *Result = FilterNecessary;
100 }
101 else
102 {
103 *Result = Descriptor->Factory.Instances[Pin->PinId].MinFilterInstanceCount;
104 }
105
106 IoStatus->Information = sizeof(ULONG);
107 IoStatus->Status = STATUS_SUCCESS;
108 return STATUS_SUCCESS;
109}
110
118 IN ISubdevice *SubDevice)
119{
121 PKSMULTIPLE_ITEM MultipleItem;
122 PKSDATARANGE DataRange;
125
126 // Access parameters
127 MultipleItem = (PKSMULTIPLE_ITEM)(Pin + 1);
128 DataRange = (PKSDATARANGE)(MultipleItem + 1);
129
130 for(Index = 0; Index < MultipleItem->Count; Index++)
131 {
132 // Call miniport's proprietary handler
133 PC_ASSERT(Descriptor->Factory.KsPinDescriptor[Pin->PinId].DataRangesCount);
134 PC_ASSERT(Descriptor->Factory.KsPinDescriptor[Pin->PinId].DataRanges[0]);
135 Status = SubDevice->DataRangeIntersection(Pin->PinId, DataRange, (PKSDATARANGE)Descriptor->Factory.KsPinDescriptor[Pin->PinId].DataRanges[0],
137
138 if (Status == STATUS_SUCCESS)
139 {
140 IoStatus->Information = Length;
141 break;
142 }
143 DataRange = (PKSDATARANGE)((PUCHAR)DataRange + DataRange->FormatSize);
144 }
145
146 IoStatus->Status = Status;
147 return Status;
148}
149
154 IN ULONG RequestLength,
158{
161 //PKSPIN_PHYSICALCONNECTION Connection;
163
164 // get pin
166
167 if (RequestLength < sizeof(KSP_PIN))
168 {
169 // input buffer must be at least sizeof KSP_PIN
170 DPRINT("input length too small\n");
172 }
173
174 if (IsListEmpty(&Descriptor->PhysicalConnectionList))
175 {
176 DPRINT("no connection\n");
177 return STATUS_NOT_FOUND;
178 }
179
180 // get first item
181 Entry = Descriptor->PhysicalConnectionList.Flink;
182
183 do
184 {
186
187 if (ConEntry->FromPin == Pin->PinId)
188 {
189 //Connection = (PKSPIN_PHYSICALCONNECTION)Data;
190 DPRINT("FoundEntry %S Size %u\n", ConEntry->Connection.SymbolicLinkName, ConEntry->Connection.Size);
191 IoStatus->Information = ConEntry->Connection.Size;
192
193 if (!DataLength)
194 {
195 IoStatus->Information = ConEntry->Connection.Size;
196 return STATUS_MORE_ENTRIES;
197 }
198
199 if (DataLength < ConEntry->Connection.Size)
200 {
202 }
203
204 RtlMoveMemory(Data, &ConEntry->Connection, ConEntry->Connection.Size);
205 return STATUS_SUCCESS;
206 }
207
208 // move to next item
209 Entry = Entry->Flink;
210 }while(Entry != &Descriptor->PhysicalConnectionList);
211
212 IoStatus->Information = 0;
213 return STATUS_NOT_FOUND;
214}
215
217NTAPI
219 IN PIRP Irp,
222{
223 PIO_STACK_LOCATION IoStack;
224 //PKSOBJECT_CREATE_ITEM CreateItem;
226 IIrpTarget * IrpTarget;
227 IPort *Port;
228 ISubdevice *SubDevice;
230
232
233 Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
235
236 // get current irp stack
238
239 // get dispatch context
240 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext;
241
242 // Get the IrpTarget
243 IrpTarget = DispatchContext->Target;
244 PC_ASSERT(IrpTarget);
245
246 // Get the parent
247 Status = IrpTarget->QueryInterface(IID_IPort, (PVOID*)&Port);
248 if (!NT_SUCCESS(Status))
249 {
250 DPRINT("Failed to obtain IPort interface from filter\n");
251 Irp->IoStatus.Information = 0;
252 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
253 return STATUS_UNSUCCESSFUL;
254 }
255
256 // Get private ISubdevice interface
257 Status = Port->QueryInterface(IID_ISubdevice, (PVOID*)&SubDevice);
258 if (!NT_SUCCESS(Status))
259 {
260 DPRINT("Failed to obtain ISubdevice interface from port driver\n");
262 while(TRUE);
263 }
264
265 // get current stack location
267
268 switch(Request->Id)
269 {
279 Status = KsPinPropertyHandler(Irp, Request, Data, Descriptor->Factory.PinDescriptorCount, Descriptor->Factory.KsPinDescriptor);
280 break;
282 Status = HandlePropertyInstances(&Irp->IoStatus, Request, Data, Descriptor, TRUE, SubDevice);
283 break;
285 Status = HandlePropertyInstances(&Irp->IoStatus, Request, Data, Descriptor, FALSE, SubDevice);
286 break;
289 break;
290
292 Status = HandleDataIntersection(&Irp->IoStatus, Request, Data, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Descriptor, SubDevice);
293 break;
295 Status = HandlePhysicalConnection(&Irp->IoStatus, Request, IoStack->Parameters.DeviceIoControl.InputBufferLength, Data, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Descriptor);
296 break;
300 break;
301 default:
304 }
305
306 // Release reference
307 Port->Release();
308
309 // Release subdevice reference
310 SubDevice->Release();
311
312 return Status;
313}
314
316NTAPI
318 IN PIRP Irp,
321{
323
324 Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp);
325
327}
struct PHYSICAL_CONNECTION_ENTRY * PPHYSICAL_CONNECTION_ENTRY
struct SUBDEVICE_DESCRIPTOR * PSUBDEVICE_DESCRIPTOR
LONG NTSTATUS
Definition: precomp.h:26
#define UNIMPLEMENTED
Definition: debug.h:115
_In_ ULONG _In_opt_ WDFREQUEST _In_opt_ PVOID _In_ size_t _In_ PVOID _In_ size_t _Out_ size_t * DataLength
Definition: cdrom.h:1444
KSDDKAPI NTSTATUS NTAPI KsPinPropertyHandler(IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID Data, IN ULONG DescriptorsCount, IN const KSPIN_DESCRIPTOR *Descriptor)
Definition: connectivity.c:666
_In_ PIRP Irp
Definition: csq.h:116
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
KSDDKAPI NTSTATUS NTAPI KsTopologyPropertyHandler(IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID Data, IN const KSTOPOLOGY *Topology)
Definition: topology.c:144
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
IN PDCB IN VBO IN ULONG IN BOOLEAN Pin
Definition: fatprocs.h:427
unsigned int BOOL
Definition: ntddk_ex.h:94
Status
Definition: gdiplustypes.h:25
CPPORT Port[4]
Definition: headless.c:35
NTSYSAPI void WINAPI DbgBreakPoint(void)
struct KSP_PIN * PKSP_PIN
@ KSPROPERTY_PIN_COMMUNICATION
Definition: ks.h:632
@ KSPROPERTY_PIN_CATEGORY
Definition: ks.h:636
@ KSPROPERTY_PIN_DATAINTERSECTION
Definition: ks.h:629
@ KSPROPERTY_PIN_NECESSARYINSTANCES
Definition: ks.h:634
@ KSPROPERTY_PIN_GLOBALCINSTANCES
Definition: ks.h:633
@ KSPROPERTY_PIN_CINSTANCES
Definition: ks.h:625
@ KSPROPERTY_PIN_MEDIUMS
Definition: ks.h:631
@ KSPROPERTY_PIN_NAME
Definition: ks.h:637
@ KSPROPERTY_PIN_PROPOSEDATAFORMAT
Definition: ks.h:639
@ KSPROPERTY_PIN_CONSTRAINEDDATARANGES
Definition: ks.h:638
@ KSPROPERTY_PIN_DATARANGES
Definition: ks.h:628
@ KSPROPERTY_PIN_PHYSICALCONNECTION
Definition: ks.h:635
@ KSPROPERTY_PIN_CTYPES
Definition: ks.h:626
@ KSPROPERTY_PIN_DATAFLOW
Definition: ks.h:627
@ KSPROPERTY_PIN_INTERFACES
Definition: ks.h:630
union KSDATAFORMAT * PKSDATARANGE
struct KSMULTIPLE_ITEM * PKSMULTIPLE_ITEM
UNICODE_STRING Global
Definition: symlink.c:37
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
Definition: mxum.h:159
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define STATUS_NO_MATCH
Definition: ntstatus.h:751
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:239
struct DISPATCH_CONTEXT * PDISPATCH_CONTEXT
#define PC_ASSERT(exp)
Definition: private.hpp:26
NTSTATUS NTAPI PinPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data)
NTSTATUS HandlePhysicalConnection(IN PIO_STATUS_BLOCK IoStatus, IN PKSIDENTIFIER Request, IN ULONG RequestLength, IN OUT PVOID Data, IN ULONG DataLength, IN PSUBDEVICE_DESCRIPTOR Descriptor)
NTSTATUS HandlePropertyInstances(IN PIO_STATUS_BLOCK IoStatus, IN PKSIDENTIFIER Request, IN OUT PVOID Data, IN PSUBDEVICE_DESCRIPTOR Descriptor, IN BOOL Global, IN ISubdevice *SubDevice)
NTSTATUS NTAPI TopologyPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data)
NTSTATUS HandleDataIntersection(IN PIO_STATUS_BLOCK IoStatus, IN PKSIDENTIFIER Request, IN OUT PVOID Data, IN ULONG DataLength, IN PSUBDEVICE_DESCRIPTOR Descriptor, IN ISubdevice *SubDevice)
NTSTATUS HandleNecessaryPropertyInstances(IN PIO_STATUS_BLOCK IoStatus, IN PKSIDENTIFIER Request, IN OUT PVOID Data, IN PSUBDEVICE_DESCRIPTOR Descriptor, IN ISubdevice *SubDevice)
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_NOT_FOUND
Definition: shellext.h:72
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define DPRINT
Definition: sndvol32.h:71
base of all file and directory entries
Definition: entries.h:83
ULONG Count
Definition: ks.h:1980
ULONG CurrentCount
Definition: ks.h:652
ULONG PossibleCount
Definition: ks.h:651
WCHAR SymbolicLinkName[1]
Definition: ks.h:658
Definition: ks.h:642
Definition: interfaces.hpp:180
KSPIN_PHYSICALCONNECTION Connection
Definition: interfaces.hpp:183
ULONG FromPin
Definition: interfaces.hpp:182
PFILE_OBJECT FileObject
Definition: iotypes.h:3169
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:3128
Definition: typedefs.h:120
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
#define IN
Definition: typedefs.h:39
#define RtlMoveMemory(Destination, Source, Length)
Definition: typedefs.h:264
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#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_MORE_ENTRIES
Definition: udferr_usr.h:124
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ UCHAR _In_ UCHAR _In_ ULONG _In_ WDFCONTEXT _Inout_ PIRP _In_ WDFCONTEXT DispatchContext
Definition: wdfdevice.h:1708
_In_ WDFREQUEST Request
Definition: wdfdevice.h:547
_Must_inspect_result_ _In_ WDFIORESLIST _In_ PIO_RESOURCE_DESCRIPTOR Descriptor
Definition: wdfresource.h:342
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2793