网站源码和模板,营销运营平台,网站建设网站服务流程,网页开发模板DeviceIoControl这个api我们用的不多#xff0c;可是非常重要#xff0c;有时会帮助我们实现一些特别的需求, 如获取硬件设备信息、与硬件设备通信#xff08;读写数据#xff09;等#xff0c;对比msdn#xff0c;以下我们详解一下这个api的使用方法#xff08;有什么错… 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 指定了一个操作该操作不须要输入数据那么这个參数设为NULLnInBufferSizelplnBuffer的sizelpOutBuffer:存放输出数据的buffer相同假设dwIoControlCode 指定了一个操作该操作不须要处理输出数据那么这个參数设为NULLnOutBufferSizehaha别说你不知道什么什么意思passlpBytesReturned实际输出数据的byteslpOverlappedIgnored; 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位訪问权限213位操作功能最后一个就是确定缓冲区别忘记上面DeviceIOControl中缓冲区的定义哦是怎样与I/O和文件系统数据缓冲区进行数据传递的方式详细取值查看msdn我们最经常使用的就是METHOD_BUFFERED Function codes 0-2047 are reserved for Microsoft; codes 2048-4095 are reserved for OEMs and IHVs. 我们能用的是20484095看下面一段这个宏经经常使用来定义IOCTLI/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://www.cnblogs.com/mfrbuaa/p/4265241.html