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

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

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