1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS Kernel Streaming 4 * FILE: drivers/wdm/audio/backpln/portcls/dispatcher.c 5 * PURPOSE: portcls generic dispatcher 6 * PROGRAMMER: Johannes Anderwald 7 */ 8 9 #include "private.hpp" 10 11 #define NDEBUG 12 #include <debug.h> 13 14 NTSTATUS 15 NTAPI 16 Dispatch_fnDeviceIoControl( 17 PDEVICE_OBJECT DeviceObject, 18 PIRP Irp) 19 { 20 PIO_STACK_LOCATION IoStack; 21 PDISPATCH_CONTEXT DispatchContext; 22 23 // get current irp stack 24 IoStack = IoGetCurrentIrpStackLocation(Irp); 25 26 // get dispatch context 27 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 28 29 // let IrpTarget handle request 30 return DispatchContext->Target->DeviceIoControl(DeviceObject, Irp); 31 } 32 33 NTSTATUS 34 NTAPI 35 Dispatch_fnRead( 36 PDEVICE_OBJECT DeviceObject, 37 PIRP Irp) 38 { 39 PIO_STACK_LOCATION IoStack; 40 PDISPATCH_CONTEXT DispatchContext; 41 42 // get current irp stack 43 IoStack = IoGetCurrentIrpStackLocation(Irp); 44 45 // get dispatch context 46 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 47 48 // let IrpTarget handle request 49 return DispatchContext->Target->Read(DeviceObject, Irp); 50 } 51 52 NTSTATUS 53 NTAPI 54 Dispatch_fnWrite( 55 PDEVICE_OBJECT DeviceObject, 56 PIRP Irp) 57 { 58 PIO_STACK_LOCATION IoStack; 59 PDISPATCH_CONTEXT DispatchContext; 60 61 // get current irp stack 62 IoStack = IoGetCurrentIrpStackLocation(Irp); 63 64 // get dispatch context 65 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 66 67 // let IrpTarget handle request 68 return DispatchContext->Target->Write(DeviceObject, Irp); 69 } 70 71 NTSTATUS 72 NTAPI 73 Dispatch_fnFlush( 74 PDEVICE_OBJECT DeviceObject, 75 PIRP Irp) 76 { 77 PIO_STACK_LOCATION IoStack; 78 PDISPATCH_CONTEXT DispatchContext; 79 80 // get current irp stack 81 IoStack = IoGetCurrentIrpStackLocation(Irp); 82 83 // get dispatch context 84 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 85 86 // let IrpTarget handle request 87 return DispatchContext->Target->Flush(DeviceObject, Irp); 88 } 89 90 NTSTATUS 91 NTAPI 92 Dispatch_fnClose( 93 PDEVICE_OBJECT DeviceObject, 94 PIRP Irp) 95 { 96 PIO_STACK_LOCATION IoStack; 97 PDISPATCH_CONTEXT DispatchContext; 98 NTSTATUS Status; 99 100 // get current irp stack 101 IoStack = IoGetCurrentIrpStackLocation(Irp); 102 // get dispatch context 103 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 104 105 // let IrpTarget handle request 106 Status = DispatchContext->Target->Close(DeviceObject, Irp); 107 108 if (NT_SUCCESS(Status)) 109 { 110 KsFreeObjectHeader(DispatchContext->ObjectHeader); 111 FreeItem(DispatchContext, TAG_PORTCLASS); 112 } 113 // done 114 return Status; 115 } 116 117 NTSTATUS 118 NTAPI 119 Dispatch_fnQuerySecurity( 120 PDEVICE_OBJECT DeviceObject, 121 PIRP Irp) 122 { 123 PIO_STACK_LOCATION IoStack; 124 PDISPATCH_CONTEXT DispatchContext; 125 126 // get current irp stack 127 IoStack = IoGetCurrentIrpStackLocation(Irp); 128 129 // get dispatch context 130 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 131 132 // let IrpTarget handle request 133 return DispatchContext->Target->QuerySecurity(DeviceObject, Irp); 134 } 135 136 NTSTATUS 137 NTAPI 138 Dispatch_fnSetSecurity( 139 PDEVICE_OBJECT DeviceObject, 140 PIRP Irp) 141 { 142 PIO_STACK_LOCATION IoStack; 143 PDISPATCH_CONTEXT DispatchContext; 144 145 // get current irp stack 146 IoStack = IoGetCurrentIrpStackLocation(Irp); 147 148 // get dispatch context 149 DispatchContext = (PDISPATCH_CONTEXT)IoStack->FileObject->FsContext; 150 151 // let IrpTarget handle request 152 return DispatchContext->Target->SetSecurity(DeviceObject, Irp); 153 } 154 155 BOOLEAN 156 NTAPI 157 Dispatch_fnFastDeviceIoControl( 158 PFILE_OBJECT FileObject, 159 BOOLEAN Wait, 160 PVOID InputBuffer, 161 ULONG InputBufferLength, 162 PVOID OutputBuffer, 163 ULONG OutputBufferLength, 164 ULONG IoControlCode, 165 PIO_STATUS_BLOCK IoStatus, 166 PDEVICE_OBJECT DeviceObject) 167 { 168 PDISPATCH_CONTEXT DispatchContext; 169 170 // get dispatch context 171 DispatchContext = (PDISPATCH_CONTEXT)FileObject->FsContext; 172 173 // let IrpTarget handle request 174 return DispatchContext->Target->FastDeviceIoControl(FileObject, Wait, InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength, IoControlCode, IoStatus, DeviceObject); 175 } 176 177 BOOLEAN 178 NTAPI 179 Dispatch_fnFastRead( 180 PFILE_OBJECT FileObject, 181 PLARGE_INTEGER FileOffset, 182 ULONG Length, 183 BOOLEAN Wait, 184 ULONG LockKey, 185 PVOID Buffer, 186 PIO_STATUS_BLOCK IoStatus, 187 PDEVICE_OBJECT DeviceObject) 188 { 189 PDISPATCH_CONTEXT DispatchContext; 190 191 // get dispatch context 192 DispatchContext = (PDISPATCH_CONTEXT)FileObject->FsContext; 193 194 // let IrpTarget handle request 195 return DispatchContext->Target->FastRead(FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject); 196 } 197 198 BOOLEAN 199 NTAPI 200 Dispatch_fnFastWrite( 201 PFILE_OBJECT FileObject, 202 PLARGE_INTEGER FileOffset, 203 ULONG Length, 204 BOOLEAN Wait, 205 ULONG LockKey, 206 PVOID Buffer, 207 PIO_STATUS_BLOCK IoStatus, 208 PDEVICE_OBJECT DeviceObject) 209 { 210 PDISPATCH_CONTEXT DispatchContext; 211 212 // get dispatch context 213 DispatchContext = (PDISPATCH_CONTEXT)FileObject->FsContext; 214 // let IrpTarget handle request 215 return DispatchContext->Target->FastWrite(FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject); 216 } 217 218 static KSDISPATCH_TABLE DispatchTable = 219 { 220 Dispatch_fnDeviceIoControl, 221 Dispatch_fnRead, 222 Dispatch_fnWrite, 223 Dispatch_fnFlush, 224 Dispatch_fnClose, 225 Dispatch_fnQuerySecurity, 226 Dispatch_fnSetSecurity, 227 Dispatch_fnFastDeviceIoControl, 228 Dispatch_fnFastRead, 229 Dispatch_fnFastWrite, 230 }; 231 232 NTSTATUS 233 NTAPI 234 NewDispatchObject( 235 IN PIRP Irp, 236 IN IIrpTarget * Target, 237 IN ULONG CreateItemCount, 238 IN PKSOBJECT_CREATE_ITEM CreateItem) 239 { 240 NTSTATUS Status; 241 KSOBJECT_HEADER ObjectHeader; 242 PIO_STACK_LOCATION IoStack; 243 PDISPATCH_CONTEXT DispatchContext; 244 245 // get current irp stack location 246 IoStack = IoGetCurrentIrpStackLocation(Irp); 247 248 DispatchContext = (PDISPATCH_CONTEXT)AllocateItem(NonPagedPool, sizeof(DISPATCH_CONTEXT), TAG_PORTCLASS); 249 if (!DispatchContext) 250 return STATUS_INSUFFICIENT_RESOURCES; 251 252 // allocate object header 253 Status = KsAllocateObjectHeader(&ObjectHeader, CreateItemCount, CreateItem, Irp, &DispatchTable); 254 255 if (!NT_SUCCESS(Status)) 256 { 257 // free dispatch context 258 FreeItem(DispatchContext, TAG_PORTCLASS); 259 // done 260 return Status; 261 } 262 263 // initialize dispatch context 264 DispatchContext->ObjectHeader = ObjectHeader; 265 DispatchContext->Target = Target; 266 DispatchContext->CreateItem = CreateItem; 267 268 // store dispatch context 269 IoStack->FileObject->FsContext = DispatchContext; 270 271 DPRINT("KsAllocateObjectHeader result %x Target %p Context %p\n", Status, Target, DispatchContext); 272 return Status; 273 } 274