diff options
| author | pravic <[email protected]> | 2016-04-12 16:39:37 +0300 |
|---|---|---|
| committer | pravic <[email protected]> | 2016-04-12 16:39:37 +0300 |
| commit | 28ff216899e95a6a9756bcbe580f28ed8ce61228 (patch) | |
| tree | bbf00e3c5f3b440db5ddb3f86b6d3a893349cee0 /src/device_object.rs | |
| parent | git ignore (diff) | |
| download | winapi-kmd-rs-28ff216899e95a6a9756bcbe580f28ed8ce61228.tar.xz winapi-kmd-rs-28ff216899e95a6a9756bcbe580f28ed8ce61228.zip | |
Windows Kernel-Mode library
Diffstat (limited to 'src/device_object.rs')
| -rw-r--r-- | src/device_object.rs | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/device_object.rs b/src/device_object.rs new file mode 100644 index 0000000..f4cbf39 --- /dev/null +++ b/src/device_object.rs @@ -0,0 +1,99 @@ +//! Device Object. + +use ::{NTSTATUS, UNICODE_STRING}; +use ::driver_object::DRIVER_OBJECT; +use ::irp::{IRP, PIRP}; +use ::dpc::KDPC; +use ::event::KEVENT; +use ::object::*; +use ::PVOID; + +extern "system" +{ + pub fn IoCreateDevice(DriverObject: &mut DRIVER_OBJECT, DeviceExtensionSize: u32, DeviceName: *const UNICODE_STRING, + DeviceType: u32, DeviceCharacteristics: u32, Exclusive: bool, DeviceObject: *mut*mut DEVICE_OBJECT) -> NTSTATUS; + + pub fn IoDeleteDevice(DeviceObject: &mut DEVICE_OBJECT) -> NTSTATUS; + pub fn IoCreateSymbolicLink(SymbolicLinkName: &UNICODE_STRING, DeviceName: &UNICODE_STRING) -> NTSTATUS; + pub fn IoDeleteSymbolicLink(SymbolicLinkName: &UNICODE_STRING) -> NTSTATUS; +} + +/// Device object flags. +#[repr(C)] +pub enum DEVICE_FLAGS { + NONE = 0, + DO_VERIFY_VOLUME = 0x00000002, + DO_BUFFERED_IO = 0x00000004, + DO_EXCLUSIVE = 0x00000008, + DO_DIRECT_IO = 0x00000010, + DO_MAP_IO_BUFFER = 0x00000020, + DO_DEVICE_HAS_NAME = 0x00000040, + DO_DEVICE_INITIALIZING = 0x00000080, + DO_SYSTEM_BOOT_PARTITION = 0x00000100, + DO_LONG_TERM_REQUESTS = 0x00000200, + DO_NEVER_LAST_DEVICE = 0x00000400, + DO_SHUTDOWN_REGISTERED = 0x00000800, + DO_BUS_ENUMERATED_DEVICE = 0x00001000, + DO_POWER_PAGABLE = 0x00002000, + DO_POWER_INRUSH = 0x00004000, + DO_POWER_NOOP = 0x00008000, + DO_LOW_PRIORITY_FILESYSTEM = 0x00010000, + DO_XIP = 0x00020000 +} + +/// The `DEVICE_OBJECT` structure is used by the operating system to represent a device object. +#[repr(C)] +pub struct DEVICE_OBJECT +{ + pub Type: u16, + pub Size: u16, + pub ReferenceCount: i32, + pub DriverObject: *const DRIVER_OBJECT, + pub NextDevice: *mut DEVICE_OBJECT, + pub AttachedDevice: *mut DEVICE_OBJECT, + pub CurrentIrp: *const IRP, + pub Timer: *mut u8, + pub Flags: u32, + pub Characteristics: u32, + pub Vpb: *mut u8, + pub DeviceExtension: *mut u8, + pub DeviceType: u32, + pub StackSize: u8, + pub Queue: *mut WAIT_CONTEXT_BLOCK, + pub AlignmentRequirement: u32, + pub DeviceQueue: KDEVICE_QUEUE, + pub Dpc: KDPC, + pub ActiveThreadCount: u32, + pub SecurityDescriptor: *const u8, + pub DeviceLock: KEVENT, + pub SectorSize: u16, + pub Spare1: u16, + pub DeviceObjectExtension: *mut DEVOBJ_EXTENSION, + pub Reserved: *const u8, +} + +/// Device object extension structure. +#[repr(C)] +pub struct DEVOBJ_EXTENSION +{ + Type: u16, + Size: u16, + DeviceObject: *mut DEVICE_OBJECT, + PowerFlags: u32, + Dope: *mut u8, + ExtensionFlags: u32, + DeviceNode: *mut u8, + AttachedTo: *mut DEVICE_OBJECT, + StartIoCount: i32, + StartIoKey: i32, + StartIoFlags: u32, + Vpb: *mut u8, +} + +pub type PDEVICE_OBJECT = *mut DEVICE_OBJECT; + +pub type PDRIVER_CANCEL = Option<extern "system" fn (DeviceObject: PDEVICE_OBJECT, Irp: PIRP)>; + +pub type PDRIVER_DISPATCH = Option<extern "system" fn (DeviceObject: &mut DEVICE_OBJECT, Irp: &mut IRP) -> NTSTATUS>; + +pub type PIO_COMPLETION_ROUTINE = Option<extern "system" fn (DeviceObject: PDEVICE_OBJECT, Irp: PIRP, Context: PVOID) -> NTSTATUS>; |