MCPcopy Create free account
hub / github.com/StephanvanSchaik/windows-kernel-rs / dispatch_callback

Function dispatch_callback

windows-kernel-rs/src/device.rs:360–411  ·  view source on GitHub ↗
(
    device: *mut DEVICE_OBJECT,
    irp: *mut IRP,
    major: u8,
)

Source from the content-addressed store, hash-verified

358}
359
360extern "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
413extern "C" fn release_callback<T: DeviceOperations>(device: *mut DEVICE_OBJECT) {
414 unsafe {

Callers

nothing calls this directly

Calls 14

RequestErrorClass · 0.85
data_mutMethod · 0.80
control_codeMethod · 0.80
into_rawMethod · 0.80
completeMethod · 0.80
to_ntstatusMethod · 0.80
createMethod · 0.45
closeMethod · 0.45
cleanupMethod · 0.45
readMethod · 0.45
writeMethod · 0.45
device_typeMethod · 0.45

Tested by

no test coverage detected