Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenpropertyhandler.cpp
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Kernel Streaming 00004 * FILE: drivers/wdm/audio/backpln/portcls/propertyhandler.cpp 00005 * PURPOSE: Pin property handler 00006 * PROGRAMMER: Johannes Anderwald 00007 */ 00008 00009 #include "private.hpp" 00010 00011 NTSTATUS 00012 HandlePropertyInstances( 00013 IN PIO_STATUS_BLOCK IoStatus, 00014 IN PKSIDENTIFIER Request, 00015 IN OUT PVOID Data, 00016 IN PSUBDEVICE_DESCRIPTOR Descriptor, 00017 IN BOOL Global, 00018 IN ISubdevice *SubDevice) 00019 { 00020 KSPIN_CINSTANCES * Instances; 00021 KSP_PIN * Pin = (KSP_PIN*)Request; 00022 ULONG FilterNecessary, FilterCurrent, FilterPossible, GlobalCurrent, GlobalPossible; 00023 NTSTATUS Status; 00024 00025 if (Pin->PinId >= Descriptor->Factory.PinDescriptorCount) 00026 { 00027 IoStatus->Information = 0; 00028 IoStatus->Status = STATUS_INVALID_PARAMETER; 00029 return STATUS_INVALID_PARAMETER; 00030 } 00031 00032 Instances = (KSPIN_CINSTANCES*)Data; 00033 00034 // check if the miniport supports the IPinCount interface 00035 Status = SubDevice->PinCount(Pin->PinId, &FilterNecessary, &FilterCurrent, &FilterPossible, &GlobalCurrent, &GlobalPossible); 00036 00037 if (NT_SUCCESS(Status)) 00038 { 00039 if (Global) 00040 { 00041 Instances->PossibleCount = GlobalPossible; 00042 Instances->CurrentCount = GlobalCurrent; 00043 } 00044 else 00045 { 00046 Instances->PossibleCount = FilterPossible; 00047 Instances->CurrentCount = FilterCurrent; 00048 } 00049 } 00050 else 00051 { 00052 if (Global) 00053 Instances->PossibleCount = Descriptor->Factory.Instances[Pin->PinId].MaxGlobalInstanceCount; 00054 else 00055 Instances->PossibleCount = Descriptor->Factory.Instances[Pin->PinId].MaxFilterInstanceCount; 00056 00057 Instances->CurrentCount = Descriptor->Factory.Instances[Pin->PinId].CurrentPinInstanceCount; 00058 } 00059 00060 IoStatus->Information = sizeof(KSPIN_CINSTANCES); 00061 IoStatus->Status = STATUS_SUCCESS; 00062 return STATUS_SUCCESS; 00063 } 00064 00065 NTSTATUS 00066 HandleNecessaryPropertyInstances( 00067 IN PIO_STATUS_BLOCK IoStatus, 00068 IN PKSIDENTIFIER Request, 00069 IN OUT PVOID Data, 00070 IN PSUBDEVICE_DESCRIPTOR Descriptor, 00071 IN ISubdevice *SubDevice) 00072 { 00073 PULONG Result; 00074 KSP_PIN * Pin = (KSP_PIN*)Request; 00075 ULONG FilterNecessary, FilterCurrent, FilterPossible, GlobalCurrent, GlobalPossible; 00076 NTSTATUS Status; 00077 00078 if (Pin->PinId >= Descriptor->Factory.PinDescriptorCount) 00079 { 00080 IoStatus->Information = 0; 00081 IoStatus->Status = STATUS_INVALID_PARAMETER; 00082 return STATUS_INVALID_PARAMETER; 00083 } 00084 00085 Result = (PULONG)Data; 00086 00087 00088 // check if the miniport supports the IPinCount interface 00089 Status = SubDevice->PinCount(Pin->PinId, &FilterNecessary, &FilterCurrent, &FilterPossible, &GlobalCurrent, &GlobalPossible); 00090 00091 if (NT_SUCCESS(Status)) 00092 { 00093 *Result = FilterNecessary; 00094 } 00095 else 00096 { 00097 *Result = Descriptor->Factory.Instances[Pin->PinId].MinFilterInstanceCount; 00098 } 00099 00100 IoStatus->Information = sizeof(ULONG); 00101 IoStatus->Status = STATUS_SUCCESS; 00102 return STATUS_SUCCESS; 00103 } 00104 00105 NTSTATUS 00106 HandleDataIntersection( 00107 IN PIO_STATUS_BLOCK IoStatus, 00108 IN PKSIDENTIFIER Request, 00109 IN OUT PVOID Data, 00110 IN ULONG DataLength, 00111 IN PSUBDEVICE_DESCRIPTOR Descriptor, 00112 IN ISubdevice *SubDevice) 00113 { 00114 KSP_PIN * Pin = (KSP_PIN*)Request; 00115 PKSMULTIPLE_ITEM MultipleItem; 00116 PKSDATARANGE DataRange; 00117 NTSTATUS Status = STATUS_NO_MATCH; 00118 ULONG Index, Length; 00119 00120 // Access parameters 00121 MultipleItem = (PKSMULTIPLE_ITEM)(Pin + 1); 00122 DataRange = (PKSDATARANGE)(MultipleItem + 1); 00123 00124 for(Index = 0; Index < MultipleItem->Count; Index++) 00125 { 00126 // Call miniport's properitary handler 00127 PC_ASSERT(Descriptor->Factory.KsPinDescriptor[Pin->PinId].DataRangesCount); 00128 PC_ASSERT(Descriptor->Factory.KsPinDescriptor[Pin->PinId].DataRanges[0]); 00129 Status = SubDevice->DataRangeIntersection(Pin->PinId, DataRange, (PKSDATARANGE)Descriptor->Factory.KsPinDescriptor[Pin->PinId].DataRanges[0], 00130 DataLength, Data, &Length); 00131 00132 if (Status == STATUS_SUCCESS) 00133 { 00134 IoStatus->Information = Length; 00135 break; 00136 } 00137 DataRange = (PKSDATARANGE)((PUCHAR)DataRange + DataRange->FormatSize); 00138 } 00139 00140 IoStatus->Status = Status; 00141 return Status; 00142 } 00143 00144 NTSTATUS 00145 HandlePhysicalConnection( 00146 IN PIO_STATUS_BLOCK IoStatus, 00147 IN PKSIDENTIFIER Request, 00148 IN ULONG RequestLength, 00149 IN OUT PVOID Data, 00150 IN ULONG DataLength, 00151 IN PSUBDEVICE_DESCRIPTOR Descriptor) 00152 { 00153 PKSP_PIN Pin; 00154 PLIST_ENTRY Entry; 00155 //PKSPIN_PHYSICALCONNECTION Connection; 00156 PPHYSICAL_CONNECTION_ENTRY ConEntry; 00157 00158 // get pin 00159 Pin = (PKSP_PIN)Request; 00160 00161 if (RequestLength < sizeof(KSP_PIN)) 00162 { 00163 // input buffer must be at least sizeof KSP_PIN 00164 DPRINT("input length too small\n"); 00165 return STATUS_INVALID_PARAMETER; 00166 } 00167 00168 if (IsListEmpty(&Descriptor->PhysicalConnectionList)) 00169 { 00170 DPRINT("no connection\n"); 00171 return STATUS_NOT_FOUND; 00172 } 00173 00174 // get first item 00175 Entry = Descriptor->PhysicalConnectionList.Flink; 00176 00177 do 00178 { 00179 ConEntry = (PPHYSICAL_CONNECTION_ENTRY)CONTAINING_RECORD(Entry, PHYSICAL_CONNECTION_ENTRY, Entry); 00180 00181 if (ConEntry->FromPin == Pin->PinId) 00182 { 00183 //Connection = (PKSPIN_PHYSICALCONNECTION)Data; 00184 DPRINT("FoundEntry %S Size %u\n", ConEntry->Connection.SymbolicLinkName, ConEntry->Connection.Size); 00185 IoStatus->Information = ConEntry->Connection.Size; 00186 00187 if (!DataLength) 00188 { 00189 IoStatus->Information = ConEntry->Connection.Size; 00190 return STATUS_MORE_ENTRIES; 00191 } 00192 00193 if (DataLength < ConEntry->Connection.Size) 00194 { 00195 return STATUS_BUFFER_TOO_SMALL; 00196 } 00197 00198 RtlMoveMemory(Data, &ConEntry->Connection, ConEntry->Connection.Size); 00199 return STATUS_SUCCESS; 00200 } 00201 00202 // move to next item 00203 Entry = Entry->Flink; 00204 }while(Entry != &Descriptor->PhysicalConnectionList); 00205 00206 IoStatus->Information = 0; 00207 return STATUS_NOT_FOUND; 00208 } 00209 00210 NTSTATUS 00211 NTAPI 00212 PinPropertyHandler( 00213 IN PIRP Irp, 00214 IN PKSIDENTIFIER Request, 00215 IN OUT PVOID Data) 00216 { 00217 PIO_STACK_LOCATION IoStack; 00218 //PKSOBJECT_CREATE_ITEM CreateItem; 00219 PSUBDEVICE_DESCRIPTOR Descriptor; 00220 IIrpTarget * IrpTarget; 00221 IPort *Port; 00222 ISubdevice *SubDevice; 00223 PDISPATCH_CONTEXT DispatchContext; 00224 00225 NTSTATUS Status = STATUS_UNSUCCESSFUL; 00226 00227 Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp); 00228 PC_ASSERT(Descriptor); 00229 00230 // get current irp stack 00231 IoStack = IoGetCurrentIrpStackLocation(Irp); 00232 00233 // get dispatch context 00234 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 00235 00236 // Get the IrpTarget 00237 IrpTarget = DispatchContext->Target; 00238 PC_ASSERT(IrpTarget); 00239 00240 // Get the parent 00241 Status = IrpTarget->QueryInterface(IID_IPort, (PVOID*)&Port); 00242 if (!NT_SUCCESS(Status)) 00243 { 00244 DPRINT("Failed to obtain IPort interface from filter\n"); 00245 Irp->IoStatus.Information = 0; 00246 Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; 00247 return STATUS_UNSUCCESSFUL; 00248 } 00249 00250 // Get private ISubdevice interface 00251 Status = Port->QueryInterface(IID_ISubdevice, (PVOID*)&SubDevice); 00252 if (!NT_SUCCESS(Status)) 00253 { 00254 DPRINT("Failed to obtain ISubdevice interface from port driver\n"); 00255 DbgBreakPoint(); 00256 while(TRUE); 00257 } 00258 00259 // get current stack location 00260 IoStack = IoGetCurrentIrpStackLocation(Irp); 00261 00262 switch(Request->Id) 00263 { 00264 case KSPROPERTY_PIN_CTYPES: 00265 case KSPROPERTY_PIN_DATAFLOW: 00266 case KSPROPERTY_PIN_DATARANGES: 00267 case KSPROPERTY_PIN_INTERFACES: 00268 case KSPROPERTY_PIN_MEDIUMS: 00269 case KSPROPERTY_PIN_COMMUNICATION: 00270 case KSPROPERTY_PIN_CATEGORY: 00271 case KSPROPERTY_PIN_NAME: 00272 case KSPROPERTY_PIN_PROPOSEDATAFORMAT: 00273 Status = KsPinPropertyHandler(Irp, Request, Data, Descriptor->Factory.PinDescriptorCount, Descriptor->Factory.KsPinDescriptor); 00274 break; 00275 case KSPROPERTY_PIN_GLOBALCINSTANCES: 00276 Status = HandlePropertyInstances(&Irp->IoStatus, Request, Data, Descriptor, TRUE, SubDevice); 00277 break; 00278 case KSPROPERTY_PIN_CINSTANCES: 00279 Status = HandlePropertyInstances(&Irp->IoStatus, Request, Data, Descriptor, FALSE, SubDevice); 00280 break; 00281 case KSPROPERTY_PIN_NECESSARYINSTANCES: 00282 Status = HandleNecessaryPropertyInstances(&Irp->IoStatus, Request, Data, Descriptor, SubDevice); 00283 break; 00284 00285 case KSPROPERTY_PIN_DATAINTERSECTION: 00286 Status = HandleDataIntersection(&Irp->IoStatus, Request, Data, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Descriptor, SubDevice); 00287 break; 00288 case KSPROPERTY_PIN_PHYSICALCONNECTION: 00289 Status = HandlePhysicalConnection(&Irp->IoStatus, Request, IoStack->Parameters.DeviceIoControl.InputBufferLength, Data, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Descriptor); 00290 break; 00291 case KSPROPERTY_PIN_CONSTRAINEDDATARANGES: 00292 UNIMPLEMENTED 00293 Status = STATUS_NOT_IMPLEMENTED; 00294 break; 00295 default: 00296 UNIMPLEMENTED 00297 Status = STATUS_UNSUCCESSFUL; 00298 } 00299 00300 // Release reference 00301 Port->Release(); 00302 00303 // Release subdevice reference 00304 SubDevice->Release(); 00305 00306 return Status; 00307 } 00308 00309 NTSTATUS 00310 NTAPI 00311 TopologyPropertyHandler( 00312 IN PIRP Irp, 00313 IN PKSIDENTIFIER Request, 00314 IN OUT PVOID Data) 00315 { 00316 PSUBDEVICE_DESCRIPTOR Descriptor; 00317 00318 Descriptor = (PSUBDEVICE_DESCRIPTOR)KSPROPERTY_ITEM_IRP_STORAGE(Irp); 00319 00320 return KsTopologyPropertyHandler(Irp, Request, Data, Descriptor->Topology); 00321 } Generated on Sat May 26 2012 04:27:11 for ReactOS by
1.7.6.1
|