DeviceIOControl详解-各个击破
2016-04-19 13:13
399 查看
DeviceIoControl这个api我们用的不多,但是很重要,有时会帮助我们实现一些特别的需求, 如获取硬件设备信息、与硬件设备通信(读写数据)等,对照msdn,下面我们详细解释一下这个api的用法(有什么错误再所难免,各位不吝指教啊)。
DeviceIoControl是用来控制我们指定设备的输入输出操作,使设备按照我们发的指令去工作。
DeviceIoControl是kernel32中的函数,需要包含的头文件是winbase.h,先看函数原型
哈哈,参数不少,而且还都很抽象,没关系,我们一个一个击破它
来到第一个参数,hDevice,当然是要操作的设备的句柄了,这个句柄需要通过CreateFile的返回值中获取,对于createfile这里只做一个粗略的解释:
参数:要打开的文件名,访问权限,共享模式,安全属性,文件存在与不存在时的文件创建模式,文件属性设定(隐藏、只读、压缩、指定为系统文件等),文件副本句柄。要说明的是第一个参数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原型:
可以看到,这个宏四个参数,自然是一个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是用来控制我们指定设备的输入输出操作,使设备按照我们发的指令去工作。
DeviceIoControl是kernel32中的函数,需要包含的头文件是winbase.h,先看函数原型
<strong>BOOL DeviceIoControl( HANDLE</strong> <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">hDevice</a></em><strong>, DWORD</strong> <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">dwIoControlCode</a></em><strong>, LPVOID</strong> <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">lpInBuffer</a></em><strong>, DWORD</strong> <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">nInBufferSize</a></em><strong>, LPVOID </strong><em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">lpOutBuffer</a></em><strong>, DWORD</strong> <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">nOutBufferSize</a></em><strong>, LPDWORD</strong> <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">lpBytesReturned</a></em><strong>, LPOVERLAPPED</strong> <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">lpOverlapped</a></em> <strong>);</strong>
哈哈,参数不少,而且还都很抽象,没关系,我们一个一个击破它
来到第一个参数,hDevice,当然是要操作的设备的句柄了,这个句柄需要通过CreateFile的返回值中获取,对于createfile这里只做一个粗略的解释:
<strong>HANDLE CreateFile( LPCTSTR</strong> <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;"&g 4000 t;lpFileName</a></em><strong>, DWORD</strong> <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">dwDesiredAccess</a></em><strong>, DWORD</strong> <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">dwShareMode</a></em><strong>, LPSECURITY_ATTRIBUTES</strong> <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">lpSecurityAttributes</a></em><strong>, DWORD</strong> <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">dwCreationDisposition</a></em><strong>, DWORD</strong> <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">dwFlagsAndAttributes</a></em><strong>, HANDLE</strong> <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">hTemplateFile</a></em> <strong>);</strong>
参数:要打开的文件名,访问权限,共享模式,安全属性,文件存在与不存在时的文件创建模式,文件属性设定(隐藏、只读、压缩、指定为系统文件等),文件副本句柄。要说明的是第一个参数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原型:
<strong>#define CTL_CODE(</strong><em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">DeviceType</a></em>, <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">Function</a></em>, <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">Method</a></em>, <em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">Access</a></em><strong>) ( ((</strong><em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">DeviceType</a></em><strong>) << 16) | ((</strong><em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">Access</a></em><strong>) << 14) | ((</strong><em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">Function</a></em><strong>) << 2) | (</strong><em><a target=_blank class="synParam" href="http://blog.csdn.net/gis_wudi/article/details/6639739" style="color: rgb(51, 102, 153); text-decoration: none;">Method</a></em><strong>) )</strong>
可以看到,这个宏四个参数,自然是一个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!
相关文章推荐
- Oracle Hint的用法
- 让PS可以保存为ICO格式
- 仙剑三-诉衷情.旖旎情
- LeetCode 305. Number of Islands II(小岛)
- 在Ubuntu的系统中怎样将应用程序加入到開始菜单中
- Pydev下载地址
- maven安装本地jar到仓库
- js 函数定义三种方式
- fzuoj 2218 Simple String Problem(状态压缩dp)
- WITH (NOLOCK) table hint equivalent for MySQL
- 系统重启
- git
- POJ-1192 最优连通子集(树形DP入门+模板)
- 文件压缩与解压缩(哈夫曼编码压缩方式)
- [RFC1867] HTML中基于表单的文件上传
- Android自定义Notification并没有那么简单
- iOS Json解析框架之MJExtension使用详解
- 【教程】基于FlashBuilder创建的FLEX项目使用教程精简版
- hdu 1863 畅通工程 最小生成树
- CSS3实现32种基本图形