DeviceIoControl这个api我们用的不多,但是很重要,有时会帮助我们实现一些特别的需求, 如获取硬件设备信息、与硬件设备通信(读写数据)等,对照msdn,下面我们详细解释一下这个api的用法(有什么错误再所难免,各位不吝指教啊)。
DeviceIoControl是用来控制我们指定设备的输入输出操作,使设备按照我们发的指令去工作。

DeviceIoControl是kernel32中的函数,需要包含的头文件是winbase.h,先看函数原型

BOOL DeviceIoControl(
HANDLE hDevice,
DWORD dwIoControlCode,
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped
);
哈哈,参数不少,而且还都很抽象,没关系,我们一个一个击破它

来到第一个参数,hDevice,当然是要操作的设备的句柄了,这个句柄需要通过CreateFile的返回值中获取,对于createfile这里只做一个粗略的解释:

HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
参数:要打开的文件名,访问权限,共享模式,安全属性,文件存在与不存在时的文件创建模式,文件属性设定(隐藏、只读、压缩、指定为系统文件等),文件副本句柄。要说明的是第一个参数lpFileName,是设备的名称或者是和设备关连的驱动的名称,一般用\.\DeviceName的形式,比如要打开逻辑驱动盘A就用\.\a,也可以用\.\PhysicalDevice0,\.\PhsycalDebive1来指定物理驱动器,\.\PhysicalDevice0表示本机的物理驱动器0(一般是主硬盘),从而来获取硬盘的序列号、模块名、扇区数、磁头数等相关信息

搞定hDevice!

dwIoControlCode: 当然就是控制设备的指令了,指令怎么来是个问题,微软已经定义好了很多种操作,在winioctl.h文件中,但最终都是通过CTL_CODE宏来实现的,其实这就是一种通信协议。CTL_CODE的具体用法在最后来介绍。

lpInBuffer: 设备操控请求数据的缓冲区基址,如果dwIoControlCode 指定了一个操作,该操作不需要输入数据,那么这个参数设为NULL

nInBufferSize:lplnBuffer的size

lpOutBuffer:存放输出数据的buffer,同样,如果dwIoControlCode 指定了一个操作,该操作不需要处理输出数据,那么这个参数设为NULL

nOutBufferSize:haha,别说你不知道什么什么意思,pass

lpBytesReturned:实际输出数据的bytes

lpOverlapped:Ignored; set to NULL.(Are you understand?)

下面来到第二个参数的详解,CTL_CODE的定义与应用:

CTL_CODE原型:

define CTL_CODE(DeviceType, Function, Method, Access) (

((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)
)
可以看到,这个宏四个参数,自然是一个32位分成了4部分,高16位存储设备类型( 这里不列举了,看msdn哦),14~15位访问权限,2~13位操作功能,最后一个就是确定缓冲区(别忘记上面DeviceIOControl中缓冲区的定义哦)是如何与I/O和文件系统数据缓冲区进行数据传递的方式(具体取值查看msdn)我们最常用的就是METHOD_BUFFERED

Function codes 0-2047 are reserved for Microsoft; codes 2048-4095 are reserved for OEMs and IHVs. (我们能用的是2048~4095)

看以下一段:

这个宏经常用来定义IOCTL(I/O控制)和FSCTL(文件系统控制)功能控制代码,所有的IOCTLs必须通过这种方式定义,以确保这些指令能被Microsoft,以及其他的硬件厂商通信接口所识别

The following illustration shows the format of the resulting IOCTL.

援引微软定义的一个指令:锁卷

define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)

Game over!

DeviceIOControl读写硬盘设备相关推荐

  1. Linux中如何读写硬盘上指定物理扇区

    读指定物理扇区: dd  if=<源设备>  of=<输出设备或文件>   skip=<指定扇区值>  bs=512 count=1 写指定物理扇区: dd   i ...

  2. Linux CentOS 8(磁盘设备与硬盘设备的概述与管理)

    Linux CentOS 8(磁盘设备与硬盘设备的概述与管理) 目录 一.项目介绍 二.相关概念 2.1 磁盘设备 2.2 磁盘的接口 2.3 硬盘的设备名称 2.4 文件系统 2.5 RAID独立冗 ...

  3. Python 直接读写硬盘扇区数据

    可能你会认为, 使用Python读物理硬盘是一件复杂的任务, 需要调用较深的操作系统API. 目录 基础知识 读取磁盘数据 写入磁盘数据 读写单个磁盘分区 需要注意的是, Python似乎并没有读取磁 ...

  4. vc下读写硬盘的操作

    <span style="font-size:18px;color:#cc0000;"> </span><p><span style=&q ...

  5. Python 读写硬盘、U盘扇区数据的方法

    Python似乎并没有读取磁盘方面的库, 但可以直接用内置打开文件的open()函数. 下篇:Python 数据恢复实战 - 恢复U盘中的chk文件,以及误删的文件 目录 基础知识 读取磁盘数据 写入 ...

  6. linux添加硬盘分区设置柱面,linux 下添加新硬盘设备和硬盘分区格式化挂载使用磁盘配额限制...

    磁盘管理 1.查看硬盘设备信息 fdisk -l 2.磁盘分区.格式化.挂载使用 1).查看硬盘信息:fdisk -l [root@localhost ~]# fdisk -l Disk /dev/s ...

  7. Linux下按扇区读写块设备,Linux下按扇区读写块设备

    本文介绍Linux下按扇区读写块设备(示例TF卡),实际应用是在Android系统上,主要方法如下: 1.找到sdcard的挂载点,在android2.1系统下应该为/dev/block/mmcblk ...

  8. linux磁盘第一个扇区分析,[转]Linux中如何读写硬盘上指定物理扇区

    读指定物理扇区: dd  if=  of=   skip=  bs=512 count=1 写指定物理扇区: dd   if=   of=   seek=  bs=512 count=1 实例: 我们 ...

  9. 苹果电脑硬盘读写软件有哪些?Tuxera NTFS2023mac读写硬盘软件

    格式化是将硬盘重置到初始状态或者是转换硬盘格式所需的一项重要步骤,格式化可以解决大部分用户遇到的硬盘问题,不过在进行格式化之前,大家需要提前了解格式化的具体注意事项,以避免不必要的损失.下面本文就来着 ...

最新文章

  1. 矢量图面层和线层相交得到相交后的线层文件(gis相交)
  2. 热门 | Google Brain前员工深度盘点2017人工智能和深度学习各大动态
  3. 【Java】LeetCode 20 有效的括号 (运用数据结构:栈 解题)
  4. 风险项目投资选择与管理
  5. ar linux 删除模块_Linux基础命令---ar
  6. kafka comsumer
  7. Grpc+Grpc Gateway实践一 介绍与环境安装
  8. Android Settings中显示自定义dialog
  9. Mybatis解析(面试题)
  10. HTTP缓存策略 304
  11. 微信蓝牙协议一:协议文档查阅方法和空中数据解析示例
  12. LeetCode.206. Reverse Linked List(反转有序链表)C++ and PYTHON
  13. 视频教程-cURL实战教程-PHP
  14. secoclient-linux-64 安装与卸载
  15. 【Mind+ 玩转Maixduino系列0】工欲善其事必先利其器
  16. 收美之鸿蒙灵戒,顺网神戒之鸿蒙
  17. 从0基础学习Python(17)[面向对象三大特征[多态]]
  18. VUE优秀UI组件库(PC和Mobile)
  19. 你的设计应该「所见即所得」
  20. 宇宙无敌之Map集合讲解

热门文章

  1. appium1.15.1-IOS真机自动化环境配置WDA
  2. 17组-政务一体化数据平台接口说明
  3. Bind9:配置 DNS 授权服务器和 DNS 缓存服务器
  4. 中国第一台台式计算机,中国第一台计算机诞生在什么时候?
  5. html使用js加边框样式,JavaScript怎么给div加边框?
  6. STM(wch)32F103ZET6(c8t6)学习笔记
  7. React脚手架应用(创建脚手架、代理配置、ajax相关、组件通信)(四)
  8. 【全站首发】最详细的jetbrains space使用方法
  9. 嵌入式开发神器—SourceInsight 4的使用教程(附安装包)
  10. 每天学点5G-5G UPF