必威体育Betway必威体育官网
当前位置:首页 > IT技术

DeviceIOControl读写硬盘设备

时间:2019-08-30 06:42:10来源:IT技术作者:seo实验室小编阅读:53次「手机版」
 

deviceiocontrol

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!

相关阅读

固态硬盘容量小 ? 360云盘免费扩容36T

几年以前,碍于厂商对成本的限制,一块同容量的固态硬盘比机械硬盘贵了很多,曾经装机配上一块固态硬盘,也是标准发烧友的配置。现如今固

固态硬盘哪个牌子好?选购游戏硬盘一定要看这几点

对于很多游戏爱好者来说,固态硬盘能将你的游戏加载等待时间缩短一半以上,甚至在你一边复制文件一边听歌一边浏览各种文件也仍旧顺畅

硬盘安装Linux(ubuntu,centos)

硬盘安装Linux(ubuntu,centos) 硬盘安装Linux使用硬盘安装Linux最大的好处不只是方便,是快速。之前使用U盘安装,很慢,没有记录具

什么叫硬盘的4K对齐?4K对齐是什么意思?

我在等你,也在等我自己,等我能够为你遮风挡雨 大家都知道4K对齐的好处就是:不但会极大的提高数据写入和读取速度,还会减少固态硬盘不

磁盘的概念、软盘和硬盘

计算机的存储器主要分为两类: 内部存储器:主要指内存,存储信息速度快,断电后存储内容全部丢失 外部存储器:主要指磁盘,存储信息不受断电

分享到:

栏目导航

推荐阅读

热门阅读