Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygendispatcher.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/dispatcher.c 00005 * PURPOSE: portcls generic dispatcher 00006 * PROGRAMMER: Johannes Anderwald 00007 */ 00008 00009 00010 #include "private.hpp" 00011 00012 NTSTATUS 00013 NTAPI 00014 Dispatch_fnDeviceIoControl( 00015 PDEVICE_OBJECT DeviceObject, 00016 PIRP Irp) 00017 { 00018 PIO_STACK_LOCATION IoStack; 00019 PDISPATCH_CONTEXT DispatchContext; 00020 00021 // get current irp stack 00022 IoStack = IoGetCurrentIrpStackLocation(Irp); 00023 00024 // get dispatch context 00025 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 00026 00027 // let IrpTarget handle request 00028 return DispatchContext->Target->DeviceIoControl(DeviceObject, Irp); 00029 } 00030 00031 NTSTATUS 00032 NTAPI 00033 Dispatch_fnRead( 00034 PDEVICE_OBJECT DeviceObject, 00035 PIRP Irp) 00036 { 00037 PIO_STACK_LOCATION IoStack; 00038 PDISPATCH_CONTEXT DispatchContext; 00039 00040 // get current irp stack 00041 IoStack = IoGetCurrentIrpStackLocation(Irp); 00042 00043 // get dispatch context 00044 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 00045 00046 00047 // let IrpTarget handle request 00048 return DispatchContext->Target->Read(DeviceObject, Irp); 00049 } 00050 00051 NTSTATUS 00052 NTAPI 00053 Dispatch_fnWrite( 00054 PDEVICE_OBJECT DeviceObject, 00055 PIRP Irp) 00056 { 00057 PIO_STACK_LOCATION IoStack; 00058 PDISPATCH_CONTEXT DispatchContext; 00059 00060 // get current irp stack 00061 IoStack = IoGetCurrentIrpStackLocation(Irp); 00062 00063 // get dispatch context 00064 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 00065 00066 00067 // let IrpTarget handle request 00068 return DispatchContext->Target->Write(DeviceObject, Irp); 00069 } 00070 00071 NTSTATUS 00072 NTAPI 00073 Dispatch_fnFlush( 00074 PDEVICE_OBJECT DeviceObject, 00075 PIRP Irp) 00076 { 00077 PIO_STACK_LOCATION IoStack; 00078 PDISPATCH_CONTEXT DispatchContext; 00079 00080 // get current irp stack 00081 IoStack = IoGetCurrentIrpStackLocation(Irp); 00082 00083 // get dispatch context 00084 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 00085 00086 00087 // let IrpTarget handle request 00088 return DispatchContext->Target->Flush(DeviceObject, Irp); 00089 } 00090 00091 NTSTATUS 00092 NTAPI 00093 Dispatch_fnClose( 00094 PDEVICE_OBJECT DeviceObject, 00095 PIRP Irp) 00096 { 00097 PIO_STACK_LOCATION IoStack; 00098 PDISPATCH_CONTEXT DispatchContext; 00099 NTSTATUS Status; 00100 00101 // get current irp stack 00102 IoStack = IoGetCurrentIrpStackLocation(Irp); 00103 // get dispatch context 00104 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 00105 00106 // let IrpTarget handle request 00107 Status = DispatchContext->Target->Close(DeviceObject, Irp); 00108 00109 if (NT_SUCCESS(Status)) 00110 { 00111 KsFreeObjectHeader(DispatchContext->ObjectHeader); 00112 FreeItem(DispatchContext, TAG_PORTCLASS); 00113 } 00114 // done 00115 return Status; 00116 } 00117 00118 NTSTATUS 00119 NTAPI 00120 Dispatch_fnQuerySecurity( 00121 PDEVICE_OBJECT DeviceObject, 00122 PIRP Irp) 00123 { 00124 PIO_STACK_LOCATION IoStack; 00125 PDISPATCH_CONTEXT DispatchContext; 00126 00127 // get current irp stack 00128 IoStack = IoGetCurrentIrpStackLocation(Irp); 00129 00130 // get dispatch context 00131 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 00132 00133 00134 // let IrpTarget handle request 00135 return DispatchContext->Target->QuerySecurity(DeviceObject, Irp); 00136 } 00137 00138 NTSTATUS 00139 NTAPI 00140 Dispatch_fnSetSecurity( 00141 PDEVICE_OBJECT DeviceObject, 00142 PIRP Irp) 00143 { 00144 PIO_STACK_LOCATION IoStack; 00145 PDISPATCH_CONTEXT DispatchContext; 00146 00147 // get current irp stack 00148 IoStack = IoGetCurrentIrpStackLocation(Irp); 00149 00150 // get dispatch context 00151 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 00152 00153 // let IrpTarget handle request 00154 return DispatchContext->Target->SetSecurity(DeviceObject, Irp); 00155 } 00156 00157 BOOLEAN 00158 NTAPI 00159 Dispatch_fnFastDeviceIoControl( 00160 PFILE_OBJECT FileObject, 00161 BOOLEAN Wait, 00162 PVOID InputBuffer, 00163 ULONG InputBufferLength, 00164 PVOID OutputBuffer, 00165 ULONG OutputBufferLength, 00166 ULONG IoControlCode, 00167 PIO_STATUS_BLOCK IoStatus, 00168 PDEVICE_OBJECT DeviceObject) 00169 { 00170 PDISPATCH_CONTEXT DispatchContext; 00171 00172 // get dispatch context 00173 DispatchContext = (PDISPATCH_CONTEXT)FileObject->FsContext; 00174 00175 // let IrpTarget handle request 00176 return DispatchContext->Target->FastDeviceIoControl(FileObject, Wait, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength, IoControlCode, IoStatus, DeviceObject); 00177 } 00178 00179 00180 BOOLEAN 00181 NTAPI 00182 Dispatch_fnFastRead( 00183 PFILE_OBJECT FileObject, 00184 PLARGE_INTEGER FileOffset, 00185 ULONG Length, 00186 BOOLEAN Wait, 00187 ULONG LockKey, 00188 PVOID Buffer, 00189 PIO_STATUS_BLOCK IoStatus, 00190 PDEVICE_OBJECT DeviceObject) 00191 { 00192 PDISPATCH_CONTEXT DispatchContext; 00193 00194 // get dispatch context 00195 DispatchContext = (PDISPATCH_CONTEXT)FileObject->FsContext; 00196 00197 // let IrpTarget handle request 00198 return DispatchContext->Target->FastRead(FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject); 00199 } 00200 00201 BOOLEAN 00202 NTAPI 00203 Dispatch_fnFastWrite( 00204 PFILE_OBJECT FileObject, 00205 PLARGE_INTEGER FileOffset, 00206 ULONG Length, 00207 BOOLEAN Wait, 00208 ULONG LockKey, 00209 PVOID Buffer, 00210 PIO_STATUS_BLOCK IoStatus, 00211 PDEVICE_OBJECT DeviceObject) 00212 { 00213 PDISPATCH_CONTEXT DispatchContext; 00214 00215 // get dispatch context 00216 DispatchContext = (PDISPATCH_CONTEXT)FileObject->FsContext; 00217 // let IrpTarget handle request 00218 return DispatchContext->Target->FastWrite(FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject); 00219 } 00220 00221 static KSDISPATCH_TABLE DispatchTable = 00222 { 00223 Dispatch_fnDeviceIoControl, 00224 Dispatch_fnRead, 00225 Dispatch_fnWrite, 00226 Dispatch_fnFlush, 00227 Dispatch_fnClose, 00228 Dispatch_fnQuerySecurity, 00229 Dispatch_fnSetSecurity, 00230 Dispatch_fnFastDeviceIoControl, 00231 Dispatch_fnFastRead, 00232 Dispatch_fnFastWrite, 00233 }; 00234 00235 NTSTATUS 00236 NTAPI 00237 NewDispatchObject( 00238 IN PIRP Irp, 00239 IN IIrpTarget * Target, 00240 IN ULONG CreateItemCount, 00241 IN PKSOBJECT_CREATE_ITEM CreateItem) 00242 { 00243 NTSTATUS Status; 00244 KSOBJECT_HEADER ObjectHeader; 00245 PIO_STACK_LOCATION IoStack; 00246 PDISPATCH_CONTEXT DispatchContext; 00247 00248 // get current irp stack location 00249 IoStack = IoGetCurrentIrpStackLocation(Irp); 00250 00251 DispatchContext = (PDISPATCH_CONTEXT)AllocateItem(NonPagedPool, sizeof(DISPATCH_CONTEXT), TAG_PORTCLASS); 00252 if (!DispatchContext) 00253 return STATUS_INSUFFICIENT_RESOURCES; 00254 00255 // allocate object header 00256 Status = KsAllocateObjectHeader(&ObjectHeader, CreateItemCount, CreateItem, Irp, &DispatchTable); 00257 00258 if (!NT_SUCCESS(Status)) 00259 { 00260 // free dispatch context 00261 FreeItem(DispatchContext, TAG_PORTCLASS); 00262 // done 00263 return Status; 00264 } 00265 00266 // initialize dispatch context 00267 DispatchContext->ObjectHeader = ObjectHeader; 00268 DispatchContext->Target = Target; 00269 DispatchContext->CreateItem = CreateItem; 00270 00271 // store dispatch context 00272 IoStack->FileObject->FsContext = DispatchContext; 00273 00274 DPRINT("KsAllocateObjectHeader result %x Target %p Context %p\n", Status, Target, DispatchContext); 00275 return Status; 00276 } 00277 Generated on Sat May 26 2012 04:27:06 for ReactOS by
1.7.6.1
|