(
device: *mut DEVICE_OBJECT,
irp: *mut IRP,
major: u8,
)
| 358 | } |
| 359 | |
| 360 | extern "C" fn dispatch_callback<T: DeviceOperations>( |
| 361 | device: *mut DEVICE_OBJECT, |
| 362 | irp: *mut IRP, |
| 363 | major: u8, |
| 364 | ) -> NTSTATUS { |
| 365 | let device = unsafe { Device::from_raw(device) }; |
| 366 | let data: &mut T = device.data_mut(); |
| 367 | let request = unsafe { IoRequest::from_raw(irp) }; |
| 368 | |
| 369 | let result = match major as _ { |
| 370 | IRP_MJ_CREATE => data.create(&device, request), |
| 371 | IRP_MJ_CLOSE => data.close(&device, request), |
| 372 | IRP_MJ_CLEANUP => data.cleanup(&device, request), |
| 373 | IRP_MJ_READ => { |
| 374 | let read_request = ReadRequest { inner: request }; |
| 375 | |
| 376 | data.read(&device, read_request) |
| 377 | } |
| 378 | IRP_MJ_WRITE => { |
| 379 | let write_request = WriteRequest { inner: request }; |
| 380 | |
| 381 | data.write(&device, write_request) |
| 382 | } |
| 383 | IRP_MJ_DEVICE_CONTROL => { |
| 384 | let control_request = IoControlRequest { inner: request }; |
| 385 | |
| 386 | if device.device_type() == control_request.control_code().device_type() { |
| 387 | data.ioctl(&device, control_request) |
| 388 | } else { |
| 389 | Err(RequestError( |
| 390 | Error::INVALID_PARAMETER, |
| 391 | control_request.into(), |
| 392 | )) |
| 393 | } |
| 394 | } |
| 395 | _ => Err(RequestError(Error::INVALID_PARAMETER, request)), |
| 396 | }; |
| 397 | |
| 398 | device.into_raw(); |
| 399 | |
| 400 | match result { |
| 401 | Ok(Completion::Complete(size, request)) => { |
| 402 | request.complete(Ok(size)); |
| 403 | STATUS_SUCCESS |
| 404 | } |
| 405 | Err(RequestError(e, request)) => { |
| 406 | let status = e.to_ntstatus(); |
| 407 | request.complete(Err(e)); |
| 408 | status |
| 409 | } |
| 410 | } |
| 411 | } |
| 412 | |
| 413 | extern "C" fn release_callback<T: DeviceOperations>(device: *mut DEVICE_OBJECT) { |
| 414 | unsafe { |
nothing calls this directly
no test coverage detected