aboutsummaryrefslogtreecommitdiff
path: root/src/device_object.rs
diff options
context:
space:
mode:
authorpravic <[email protected]>2016-04-12 16:39:37 +0300
committerpravic <[email protected]>2016-04-12 16:39:37 +0300
commit28ff216899e95a6a9756bcbe580f28ed8ce61228 (patch)
treebbf00e3c5f3b440db5ddb3f86b6d3a893349cee0 /src/device_object.rs
parentgit ignore (diff)
downloadwinapi-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.rs99
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>;