前言:

最近需要对Windows中的设备进行编程操作,其中涉及到非常重要的函数DeviceIoControl,在使用的时候也比较的复杂,国内这一块中文资料比较少,在学习之余顺便将其翻译出来,以供参考,如有错误,欢迎指正。lcb0281@163点com

MSDN原文地址:DeviceIoControl function

DeviceIoControl 将控制代码直接发送到指定的设备驱动程序,使相应的设备执行相应的操作。

句法:

BOOL WINAPI DeviceIoControl(_In_        HANDLE       hDevice,_In_        DWORD        dwIoControlCode,_In_opt_    LPVOID       lpInBuffer,_In_        DWORD        nInBufferSize,_Out_opt_   LPVOID       lpOutBuffer,_In_        DWORD        nOutBufferSize,_Out_opt_   LPDWORD      lpBytesReturned,_Inout_opt_ LPOVERLAPPED lpOverlapped
);

参数:

hDevice [in]
    需要执行操作的设备句柄。该设备通常是卷,目录,文件或流,使用 CreateFile 函数打开获取设备句柄。具体的见备注
dwIoControlCode [in]
    操作的控制代码,该值标识要执行的特定操作以及执行该操作的设备的类型,有关控制代码的列表,请参考备注。每个控制代码的文档都提供了lpInBuffernInBufferSizelpOutBuffernOutBufferSize参数的使用细节。
lpInBuffer [in, optional]
    (可选)指向输入缓冲区的指针。这些数据的格式取决于dwIoControlCode参数的值。如果dwIoControlCode指定不需要输入数据的操作,则此参数可以为NULL。
nInBufferSize [in]
    输入缓冲区以字节为单位的大小。单位为字节。
lpOutBuffer [out, optional]
    (可选)指向输出缓冲区的指针。这些数据的格式取决于dwIoControlCode参数的值。如果dwIoControlCode指定不返回数据的操作,则此参数可以为NULL。
nOutBufferSize [in]
    输出缓冲区以字节为单位的大小。单位为字节。
lpBytesReturned [out, optional]
    (可选)指向一个变量的指针,该变量接收存储在输出缓冲区中的数据的大小。如果输出缓冲区太小,无法接收任何数据,则GetLastError返回ERROR_INSUFFICIENT_BUFFER,错误代码122(0x7a),此时lpBytesReturned是零。
    如果输出缓冲区太小而无法保存所有数据,但可以保存一些条目,某些驱动程序将返回尽可能多的数据,在这种情况下,调用失败,GetLastError返回ERROR_MORE_DATA,错误代码234lpBytesReturned指示接收到的数据量。您的应用程序应该再次使用相同的操作调用DeviceIoControl,指定一个新的起点。
    如果lpOverlapped为NULL,则lpBytesReturned不能为NULL。 即使操作没有返回输出数据并且lpOutBuffer为NULL,DeviceIoControl也会使用lpBytesReturned。在这样的操作之后,lpBytesReturned的值是没有意义的。
    如果lpOverlapped不为NULL,则lpBytesReturned可以为NULL。 如果此参数不为NULL并且操作返回数据,则在重叠操作完成之前,lpBytesReturned是无意义的。要检索返回的字节数,请调用GetOverlappedResult,如果hDevice与I / O完成端口相关联,则可以检索通过调用GetQueuedCompletionStatus返回的字节数。
lpOverlapped [in, out, optional]
    (可选)指向OVERLAPPED结构的指针,
  如果在未指定FILE_FLAG_OVERLAPPED的情况下打开hDevice,则忽略lpOverlapped
  如果使用FILE_FLAG_OVERLAPPED标志打开hDevice,则该操作将作为重叠(异步)操作执行。在这种情况下,lpOverlapped必须指向包含事件对象句柄的有效OVERLAPPED结构。 否则,该功能将以不可预知的方式失败。
    对于重叠操作,DeviceIoControl会立即返回,并在操作完成时通知事件对象。 否则,该功能在操作完成或发生错误之前不会返回。

返回值:
    如果操作成功完成,DeviceIoControl将返回一个非零值。

如果操作失败或正在等待,则DeviceIoControl返回零。 要获得扩展的错误信息,请调用GetLastError。

备注:
    要检索设备句柄,必须使用设备名称或与设备关联的驱动程序名称来调用CreateFile函数。 要指定设备名称,请使用以下格式:
  \\.\DeviceName

DeviceIoControl可以接受特定设备的句柄。 对于硬盘来说,可能为以下几种形式:

对于物理驱动器x,形式为 \\.\PhysicalDriveX ,编号从0开始,例如:

名称 含义
\\.\PhysicalDrive0   打开第一个物理驱动器
\\.\PhysicalDrive1 打开第二个物理驱动器

对于逻辑分区(卷),形式为 \\.\X: ,例如:

名称                          含义
\\.\A:  打开A盘(软驱)
\\.\C: 打开C盘(磁盘逻辑分区)

调用CreateFile打开设备驱动程序的句柄时,应指定FILE_SHARE_READFILE_SHARE_WRITE访问标志。但是,当您打开通信资源(如串行端口)时,必须指定独占访问权限。 打开设备句柄时使用其他CreateFile参数,如下所示:
     (a)fdwCreate参数必须指定OPEN_EXISTING
     (b)hTemplateFile参数必须为NULL。

(c)fdwAttrsAndFlags参数可指定FILE_FLAG_OVERLAPPED,以指示返回的句柄可用于重叠(异步)I / O操作。

有关支持的控制代码列表,请参阅以下主题:
    Communications Control Codes
    Device Management Control Codes
    Directory Management Control Codes
    Disk Management Control Codes
    File Management Control Codes
    Power Management Control Codes
    Volume Management Control Codes

实例:
    有关使用DeviceIoControl的示例,请参阅调用DeviceIoControl。

其他链接:

CreateEvent
    CreateFile
    Device Input and Output Control (IOCTL)
    GetOverlappedResult
    GetQueuedCompletionStatus

OVERLAPPED

Wen Lee

2018.04.28

 

DeviceIoControl 函数详细解析相关推荐

  1. c语言的point函数,C语言中friend友元函数详细解析

    C语言中friend友元函数详细解析 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字frien ...

  2. c r语言中rank函数,R语言rank函数详细解析

    R语言rank函数详细解析 发布于 2016-01-04 16:26:04 | 557 次阅读 | 评论: 0 | 来源: PHPERZ R 数据统计分析语言R是用于统计分析.绘图的语言和操作环境.R ...

  3. findContours函数详细解析

    1: image, cnts, hierarchy = cv2.findContours(a,b,c)//寻找图形中的轮廓 传入的参数:a:传入的图像(二值化图像)b:轮廓的检索模式,一般是检测外轮廓 ...

  4. CreateFile 函数详细解析

    前言:     在Windows编程中CreateFile函数是用得非常多的,由于它的参数比较多比较复杂,在使用的时候容易出现问题,在学习了MSDN的官方文档后打算将其原文翻译出来,以供参考,如有错误 ...

  5. python lambda函数详细解析(据说面试90%的人经常遇到)

    1 作用:通常是用来在python中创建匿名函数的 2 格式: lambda 参数[,参数] : 表达式 3 注意: 这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本 ...

  6. Php 魔术函数性能,php常用的魔术函数详细解析

    1.__construct() 实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用. 2.__destruct() 当删除一 ...

  7. r语言rank降序_R语言rank函数详细解析

    1.rank函数是什么 rank相关文档[1]可以译为"返回原数组(?)中各个元素排序(?)后的秩次(?)",表面上看确实可以得到次序,但对数组.排序.秩次交待不清. 2.rank ...

  8. Python关于strftime函数详细解析 附实战代码

    目录 前言 1. strftime函数 2. 实战 前言 项目中的python web中,时间都用到了这个函数 深挖了一下基本的知识点以及实战中的书写 主要参考的知识点有: Python time s ...

  9. AcceptEx()函数详细解析

    服务器要做的最普通的事情之一就是接受来自客户端的连接请求.在套接字上使用重叠I/O接受连接的惟一API就是AcceptEx()函数[注一].有趣的是,通常的同步接受函数accept()的返回值是一个新 ...

最新文章

  1. C++:随笔7---运算符重载
  2. 全球及中国新能源汽车电机市场未来发展方向与投资潜力研究报告2022版
  3. visual basic.net 2019-判断null,is null
  4. “让Keras更酷一些!”:层中层与mask
  5. css 设置背景图片模糊,内容不模糊
  6. OneAPM Cloud Test——系统性能监控神器
  7. 配置 --- 将本地项目部署到阿里云上
  8. 在 ASP.NET Core 中使用 Serilog 使用 Fluentd 将日志写入 Elasticsearch
  9. python正则表达式面试_Python面试 Re-正则表达式
  10. pycharm 2020 版取消鼠标悬停显示说明文档的方法
  11. 网口监视报文工具_真是神器!这款网络排查工具!
  12. DotNet Core 2.0部署后外网IP访问
  13. 很好的c++和Python混合编程文章
  14. 网络安全工程师面试题整理
  15. Windows误删文件如何恢复(Shift+Delete、清空回收站)
  16. 计算机音乐蜗牛与黄鹂鸟,音乐教材《蜗牛与黄鹂鸟》教案
  17. Tomcat NIO、APR 对比
  18. ADB使用及日志分析
  19. 微信小程序文件下载及在线打开指定文档,解压Zip格式压缩包
  20. Wireshark malformed packet

热门文章

  1. 如何判断组之间是否有显著性差异?
  2. 平常写代码注意的细节part7(网络编程)P620-P635
  3. glPushMatrix和glPopMatrix
  4. 周杰伦 牛仔很忙 10月10日首播
  5. PID算法的一点改进思路
  6. Attention is all you need文章翻译
  7. itoa 头文件 linux,【整理】Linux内核中的atoi,itoa等函数
  8. 2022资料员-岗位技能(资料员)理论题库及在线模拟考试
  9. 单目相机标定(使用OpenCV)
  10. 1亿数字中找出重复次数TopN的问题