Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenfilter.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
1.7.6.1
|