博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DeviceIOControl具体解释-各个击破
阅读量:7040 次
发布时间:2019-06-28

本文共 1911 字,大约阅读时间需要 6 分钟。

DeviceIoControl这个api我们用的不多,可是非常重要,有时会帮助我们实现一些特别的需求, 如获取硬件设备信息、与硬件设备通信(读写数据)等,对比msdn,以下我们详解一下这个api的使用方法(有什么错误再所难免,各位不吝不吝赐教啊)。

DeviceIoControl是用来控制我们指定设备的输入输出操作,使设备依照我们发的指令去工作。

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

BOOL DeviceIoControl(  HANDLE ,   DWORD ,   LPVOID ,   DWORD ,   LPVOID ,   DWORD ,   LPDWORD ,   LPOVERLAPPED );

哈哈,參数不少,并且还都非常抽象,没关系,我们一个一个击破它

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

  • HANDLE CreateFile(  LPCTSTR ,   DWORD ,   DWORD ,   LPSECURITY_ATTRIBUTES ,   DWORD ,   DWORD ,   HANDLE );

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

搞定hDevice!

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

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

lplnBuffer的size

:存放输出数据的buffer,相同,假设dwIoControlCode 指定了一个操作,该操作不须要处理输出数据,那么这个參数设为NULL

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

实际输出数据的bytes

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

以下来到第二个參数的具体解释,CTL_CODE的定义与应用:

CTL_CODE原型:

#define CTL_CODE(, , , ) (  (() << 16) | (() << 14) | (() << 2) | ())

能够看到,这个宏四个參数,自然是一个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!

转载地址:http://ifxal.baihongyu.com/

你可能感兴趣的文章
JavaScript 数据类型检测终极解决方案
查看>>
年赚百万游戏主播!玩转Python后:几行代码轻松“吃鸡” 附源码
查看>>
【python】使用简单的python语句编写爬虫 定时拿取信息并存入txt
查看>>
卡拉OK歌词原理和实现高仿Android网易云音乐
查看>>
那些被忽略的盒子模型小知识
查看>>
第三章 Redis 客户端的使用 Java版【Redis入门教程】
查看>>
ThreadPoolExecutor 核心源码解析
查看>>
CSS3 弹性布局快速入门
查看>>
上架被拒修改记录
查看>>
小编带着小白看springboot源码6
查看>>
javascript原型链
查看>>
Re: 从零开始的【comic spider】《最简单的实现》(上)
查看>>
Java 单例模式学习理解
查看>>
关于科技趋势和未来机会,这8本书告诉你答案
查看>>
ios创建可拖动的视图
查看>>
Python介绍与特点(自学python知识整理)
查看>>
加一度分享:解决竞价推广跳出率太高的方法
查看>>
Pixelmator Pro比肩Photoshop,专业的图像处理软件,是真的吗?
查看>>
Maven 项目中依赖的搜索顺序
查看>>
程序员的福利:Android_JNI整套视频分享
查看>>