ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

propertyhandler.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.