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

filter.c
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/legacy/stream/filter.c
00005  * PURPOSE:         filter instance handling
00006  * PROGRAMMER:      Johannes Anderwald
00007  */
00008 
00009 
00010 #include "stream.h"
00011 
00012 
00013 NTSTATUS
00014 NTAPI
00015 StreamClassCreatePin(
00016     IN  PDEVICE_OBJECT DeviceObject,
00017     IN  PIRP Irp)
00018 {
00019     UNIMPLEMENTED
00020 
00021     Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
00022     Irp->IoStatus.Information = 0;
00023     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00024     return STATUS_NOT_IMPLEMENTED;
00025 }
00026 
00027 
00028 NTSTATUS
00029 NTAPI
00030 FilterDispatch_fnDeviceIoControl(
00031     PDEVICE_OBJECT DeviceObject,
00032     PIRP Irp)
00033 {
00034     DPRINT1("FilterDispatch Called\n");
00035 
00036     Irp->IoStatus.Status = STATUS_SUCCESS;
00037     Irp->IoStatus.Information = 0;
00038     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00039     return STATUS_SUCCESS;
00040 }
00041 
00042 
00043 NTSTATUS
00044 NTAPI
00045 FilterDispatch_fnClose(
00046     PDEVICE_OBJECT DeviceObject,
00047     PIRP Irp)
00048 {
00049     NTSTATUS Status = STATUS_SUCCESS;
00050     PSTREAM_DEVICE_EXTENSION DeviceExtension;
00051     HW_STREAM_REQUEST_BLOCK_EXT RequestBlock;
00052 
00053    /* Get device extension */
00054     DeviceExtension = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
00055 
00056     if (!DeviceExtension->DriverExtension->Data.FilterInstanceExtensionSize)
00057     {
00058         /* driver supports only one instance */
00059         if (DeviceExtension->InstanceCount)
00060         {
00061             /* there is already one instance open */
00062             return STATUS_UNSUCCESSFUL;
00063         }
00064     }
00065     else
00066     {
00067         /* driver supports more than one filter instance */
00068         RtlZeroMemory(&RequestBlock, sizeof(HW_STREAM_REQUEST_BLOCK_EXT));
00069 
00070         /* set up request block */
00071         RequestBlock.Block.Command = SRB_CLOSE_DEVICE_INSTANCE;
00072         RequestBlock.Block.HwDeviceExtension = DeviceExtension->DeviceExtension;
00073         RequestBlock.Block.Irp = Irp;
00074         KeInitializeEvent(&RequestBlock.Event, SynchronizationEvent, FALSE);
00075 
00076         /*FIXME SYNCHRONIZATION */
00077 
00078         /* Send the request */
00079         DeviceExtension->DriverExtension->Data.HwReceivePacket((PHW_STREAM_REQUEST_BLOCK)&RequestBlock);
00080         if (RequestBlock.Block.Status == STATUS_PENDING)
00081         {
00082             /* Wait for the request */
00083             KeWaitForSingleObject(&RequestBlock.Event, Executive, KernelMode, FALSE, NULL);
00084         }
00085     }
00086 
00087     /* Increment total instance count */
00088     InterlockedDecrement(&DeviceExtension->InstanceCount);
00089 
00090     Irp->IoStatus.Status = Status;
00091     Irp->IoStatus.Information = 0;
00092     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00093     return Status;
00094 }
00095 
00096 static KSDISPATCH_TABLE DispatchTable =
00097 {
00098     FilterDispatch_fnDeviceIoControl,
00099     KsDispatchInvalidDeviceRequest,
00100     KsDispatchInvalidDeviceRequest,
00101     KsDispatchInvalidDeviceRequest,
00102     FilterDispatch_fnClose,
00103     NULL,
00104     NULL,
00105     NULL,
00106     NULL,
00107     NULL
00108 };
00109 
00110 VOID
00111 RegisterDeviceInterfaces(
00112     IN PSTREAM_DEVICE_EXTENSION DeviceExtension)
00113 {
00114     ULONG Index;
00115     PHW_STREAM_INFORMATION StreamInformation;
00116     UNICODE_STRING SymbolicLink;
00117     NTSTATUS Status;
00118 
00119     /* Sanity check */
00120     ASSERT(DeviceExtension->StreamDescriptor);
00121     ASSERT(DeviceExtension->StreamDescriptorSize);
00122 
00123     /* Loop all stream descriptors and register device interfaces */
00124     StreamInformation = (PHW_STREAM_INFORMATION)&DeviceExtension->StreamDescriptor->StreamInfo;
00125 
00126     for(Index = 0; DeviceExtension->StreamDescriptor->StreamHeader.NumberOfStreams; Index++)
00127     {
00128         if (StreamInformation->Category)
00129         {
00130             /* Register device interface */
00131             Status = IoRegisterDeviceInterface(DeviceExtension->PhysicalDeviceObject,
00132                                                StreamInformation->Category,
00133                                                NULL, /* see bug 4566 */
00134                                                &SymbolicLink);
00135 
00136             if (NT_SUCCESS(Status))
00137             {
00138                 /* Activate device interface */
00139                 IoSetDeviceInterfaceState(&SymbolicLink, TRUE);
00140                 /* Release Symbolic Link */
00141                 RtlFreeUnicodeString(&SymbolicLink);
00142             }
00143         }
00144         StreamInformation = (PHW_STREAM_INFORMATION) (ULONG_PTR)StreamInformation + DeviceExtension->StreamDescriptor->StreamHeader.SizeOfHwStreamInformation;
00145     }
00146 
00147 }
00148 
00149 NTSTATUS
00150 InitializeFilterWithKs(
00151     IN PDEVICE_OBJECT DeviceObject,
00152     IN PIRP Irp)
00153 {
00154     NTSTATUS Status;
00155     PSTREAM_DEVICE_EXTENSION DeviceExtension;
00156     KSOBJECT_HEADER ObjectHeader;
00157     PKSOBJECT_CREATE_ITEM CreateItem;
00158     PIO_STACK_LOCATION IoStack;
00159     HW_STREAM_REQUEST_BLOCK_EXT RequestBlock;
00160     PVOID HwInstanceExtension = NULL;
00161 
00162    /* Get device extension */
00163     DeviceExtension = (PSTREAM_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
00164 
00165     if (!DeviceExtension->DriverExtension->Data.FilterInstanceExtensionSize)
00166     {
00167         /* driver supports only one instance */
00168         if (DeviceExtension->InstanceCount)
00169         {
00170             /* there is already one instance open */
00171             return STATUS_UNSUCCESSFUL;
00172         }
00173     }
00174     else
00175     {
00176         /* driver supports more than one filter instance */
00177         RtlZeroMemory(&RequestBlock, sizeof(HW_STREAM_REQUEST_BLOCK_EXT));
00178 
00179         /* allocate instance extension */
00180         HwInstanceExtension = ExAllocatePool(NonPagedPool, DeviceExtension->DriverExtension->Data.FilterInstanceExtensionSize);
00181         if (!HwInstanceExtension)
00182         {
00183             /* Not enough memory */
00184             return STATUS_INSUFFICIENT_RESOURCES;
00185         }
00186 
00187         /* Zero instance extension */
00188         RtlZeroMemory(HwInstanceExtension, DeviceExtension->DriverExtension->Data.FilterInstanceExtensionSize);
00189 
00190         /* set up request block */
00191         RequestBlock.Block.Command = SRB_OPEN_DEVICE_INSTANCE;
00192         RequestBlock.Block.HwDeviceExtension = DeviceExtension->DeviceExtension;
00193         RequestBlock.Block.Irp = Irp;
00194         RequestBlock.Block.HwInstanceExtension = HwInstanceExtension;
00195         KeInitializeEvent(&RequestBlock.Event, SynchronizationEvent, FALSE);
00196 
00197         /*FIXME SYNCHRONIZATION */
00198 
00199         /* Send the request */
00200         DeviceExtension->DriverExtension->Data.HwReceivePacket((PHW_STREAM_REQUEST_BLOCK)&RequestBlock);
00201         if (RequestBlock.Block.Status == STATUS_PENDING)
00202         {
00203             /* Wait for the request */
00204             KeWaitForSingleObject(&RequestBlock.Event, Executive, KernelMode, FALSE, NULL);
00205         }
00206         /* Check for success */
00207         if (!NT_SUCCESS(RequestBlock.Block.Status))
00208         {
00209             /* Resource is not available */
00210             ExFreePool(HwInstanceExtension);
00211             return RequestBlock.Block.Status;
00212         }
00213     }
00214 
00215     /* Allocate create item */
00216     CreateItem = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
00217     if (!CreateItem)
00218     {
00219         /* not enough memory */
00220         return STATUS_INSUFFICIENT_RESOURCES;
00221     }
00222 
00223     /* Zero create item */
00224     RtlZeroMemory(CreateItem, sizeof(KSOBJECT_CREATE_ITEM));
00225     /* Initialize createitem */
00226     RtlInitUnicodeString(&CreateItem->ObjectClass, KSSTRING_Pin);
00227     CreateItem->Create = StreamClassCreatePin;
00228 
00229     /* Get current irp stack location */
00230     IoStack = IoGetCurrentIrpStackLocation(Irp);
00231     /* Create Ks streaming object header */
00232     Status = KsAllocateObjectHeader(&ObjectHeader, 1, CreateItem, Irp, &DispatchTable);
00233     if (!NT_SUCCESS(Status))
00234     {
00235         /* Failed to create header */
00236         ExFreePool(CreateItem);
00237         if (HwInstanceExtension)
00238         {
00239             /* free instance buffer */
00240             ExFreePool(HwInstanceExtension);
00241         }
00242         return Status;
00243     }
00244 
00245     /* Store instance buffer in file object context */
00246     IoStack->FileObject->FsContext2 = HwInstanceExtension;
00247 
00248     /* Increment total instance count */
00249     InterlockedIncrement(&DeviceExtension->InstanceCount);
00250 
00251     /* Register device stream interfaces */
00252     RegisterDeviceInterfaces(DeviceExtension);
00253 
00254     /* Return result */
00255     return Status;
00256 
00257 }
00258 
00259 NTSTATUS
00260 NTAPI
00261 StreamClassCreateFilter(
00262     IN  PDEVICE_OBJECT DeviceObject,
00263     IN  PIRP Irp)
00264 {
00265     NTSTATUS Status;
00266     DPRINT1("StreamClassCreateFilter Called\n");
00267 
00268     /* Init filter */
00269     Status = InitializeFilterWithKs(DeviceObject, Irp);
00270 
00271     Irp->IoStatus.Status = Status;
00272     Irp->IoStatus.Information = 0;
00273     IoCompleteRequest(Irp, IO_NO_INCREMENT);
00274     return Status;
00275 }
00276 
00277 
00278 

Generated on Fri May 25 2012 04:22:52 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.