(转)DeviceIOControl详解[通俗易懂]

(转)DeviceIOControl详解[通俗易懂]http://blog.csdn.net/gis_wudi/article/details/6639739DeviceIoControl这个api我们用的不多,但是很重要,有时会帮助我们实现一些特别

大家好,又见面了,我是你们的朋友全栈君。

http://blog.csdn.net/gis_wudi/article/details/6639739

  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!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155631.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • bWAPP练习

    bWAPP练习简介虚拟机下载地址: https://www.vulnhub.com/entry/bwapp-bee-box-v16,53/如果你想自己去部署环境:https://sourceforge.net/projects/bwapp/files/bee-box/bWAPP包含有100多个漏洞,包括OWASPTop10安全风险,很爽的PHPweb靶机。登录username:bee pas…

    2022年9月24日
    2
  • Oracle新建索引、删除索引和查看索引

    Oracle新建索引、删除索引和查看索引1、创建索引createindex索引名on表名(列名);2、删除索引dropindex索引名;3、创建组合索引createindex索引名on表名(列名1,列名2,列名3,…);查看目标表中已添加的索引–在数据库中查找表名select*fromuser_tableswheretable_namelike‘tablename%’;–查看该表的所有索引select*fromall_indexeswheretable_name=‘tablen

    2025年9月1日
    3
  • 如何利用计算机模拟分子生物学,分子生物学软件教学的经验浅谈.doc

    如何利用计算机模拟分子生物学,分子生物学软件教学的经验浅谈.doc分子生物学软件教学的经验浅谈分子生物学软件教学的经验浅谈摘要:分子生物学是生命科学和生物技术的基础学科,其教学尤其是实验教学得到了各个高等院校的普遍重视,但是对于应用性强的分子生物学软件的教学却长期以来受到忽视。笔者首次在厦门大学的夏季短学期中开设《分子生物学常用软件的应用》课程已有五余年,本文总结了分子生物学软件教学的经验,提出教学改进的建议,阐述了软件应用与实验设计的必要联系,为生物医学类学科…

    2022年7月11日
    20
  • 高手入门STM32总结+学习步骤

    高手入门STM32总结+学习步骤一、入门总结1.1为什么要把时间花在“犹豫”上?每当我们在入门之前(ARM是这样,DSP也一样),总会有很多疑问,会有很多顾虑。我们渴望知道学习STM32前景如何?需要啥基础?难不难?适不适合我?但是什么时候能心潮澎湃地、相当着急地开始学STM32?日子在一天一天过去!你开始行动了吗?没有行动的思索,永远都不可能入门!把这些时间用来看书吧,效果能好一万倍。大家可能是从51单片机过来的,回想一…

    2025年9月7日
    6
  • js编写HTML通过document.cookie写入不了cookie的问题[通俗易懂]

    js编写HTML通过document.cookie写入不了cookie的问题[通俗易懂]js中通过document.cookie写入不了cookie的问题使用VScode编写HTML应用cookie进行存储,发现编写无法读取到cookie的内容,即未能实现cookie存储。作为新手问题,可以考虑这个原因:只有当用在服务器或者本地的服务器中的时候,才能使用这个方法写入cookie,所以VScode没有使用服务器方式?这个原因可以通过方案一尝试解决:打开VScode,点击左侧扩展,输入liveserver,点击安装即可;安装成功后再VS界面右下角可以看到相应提示

    2022年7月16日
    64
  • js中数组反向、排序reverse、sort

    js中数组反向、排序reverse、sort全栈工程师开发手册(作者:栾鹏)js系列教程1-数组操作全解js中数组反向、排序数组反向使用reverse函数,数组排序使用sort函数,排序函数可以传入比较函数,也可以修改数组圆形,自定义添加排序函数代码如下:names.reverse();//数组取反names.sort();

    2022年5月8日
    110

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号