| 269 | _Function_class_(DRIVER_DISPATCH) |
| 270 | _Dispatch_type_(IRP_MJ_DEVICE_CONTROL) |
| 271 | static NTSTATUS DriverControl(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp) |
| 272 | { |
| 273 | UNREFERENCED_PARAMETER(DeviceObject); |
| 274 | |
| 275 | PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp); |
| 276 | |
| 277 | IOCTL_INFO RequestInfo; |
| 278 | RequestInfo.ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode; |
| 279 | switch (EXTRACT_CTL_METHOD(RequestInfo.ControlCode)) { |
| 280 | case METHOD_BUFFERED: { |
| 281 | RequestInfo.InputBuffer = Irp->AssociatedIrp.SystemBuffer; |
| 282 | RequestInfo.OutputBuffer = Irp->AssociatedIrp.SystemBuffer; |
| 283 | RequestInfo.InputBufferSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength; |
| 284 | RequestInfo.OutputBufferSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; |
| 285 | Irp->IoStatus.Status = CallIoctlDispatcher(&RequestInfo, &Irp->IoStatus.Information); |
| 286 | break; |
| 287 | } |
| 288 | case METHOD_NEITHER: { |
| 289 | RequestInfo.InputBuffer = IrpStack->Parameters.DeviceIoControl.Type3InputBuffer; |
| 290 | RequestInfo.OutputBuffer = Irp->UserBuffer; |
| 291 | RequestInfo.InputBufferSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength; |
| 292 | RequestInfo.OutputBufferSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; |
| 293 | Irp->IoStatus.Status = CallIoctlDispatcher(&RequestInfo, &Irp->IoStatus.Information); |
| 294 | break; |
| 295 | } |
| 296 | case METHOD_IN_DIRECT: |
| 297 | case METHOD_OUT_DIRECT: { |
| 298 | RequestInfo.InputBuffer = Irp->AssociatedIrp.SystemBuffer; |
| 299 | RequestInfo.OutputBuffer = Irp->MdlAddress ? MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority) : NULL; |
| 300 | RequestInfo.InputBufferSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength; |
| 301 | RequestInfo.OutputBufferSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; |
| 302 | Irp->IoStatus.Status = CallIoctlDispatcher(&RequestInfo, &Irp->IoStatus.Information); |
| 303 | break; |
| 304 | } |
| 305 | default: { |
| 306 | Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; |
| 307 | KdPrint(("[Kernel-Bridge]: Unknown method of IRP!\r\n")); |
| 308 | } |
| 309 | } |
| 310 | |
| 311 | NTSTATUS Status = Irp->IoStatus.Status; |
| 312 | IoCompleteRequest(Irp, IO_NO_INCREMENT); |
| 313 | |
| 314 | return Status; |
| 315 | } |
| 316 | |
| 317 | _Function_class_(DRIVER_DISPATCH) |
| 318 | _Dispatch_type_(IRP_MJ_CREATE) |
nothing calls this directly
no test coverage detected