DeviceIoControl_deviceregist

DeviceIoControl_deviceregistDeviceIoControl这个api我们用的不多,但是很重要,有时会帮助我们实现一些特别的需求,如获取硬件设备信息、与硬件设备通信(读写数据)等,对照msdn,下面我们详细解释一下这个api的用法(有什么错误再所难免,各位不吝指教啊)。DeviceIoControl是用来控

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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, 
  DWORD dwIoControlCode, 
  LPVOID lpInBuffer, 
  DWORD nInBufferSize, 
  LPVOID lpOutBuffer, 
  DWORD nOutBufferSize, 
  LPDWORD lpBytesReturned, 
  LPOVERLAPPED lpOverlapped
);

哈哈,参数不少,而且还都很抽象,没关系,我们一个一个击破它

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

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

搞定hDevice!

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

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

nInBufferSizelplnBuffer的size

lpOutBuffer:存放输出数据的buffer,同样,如果dwIoControlCode 指定了一个操作,该操作不需要处理输出数据,那么这个参数设为NULL

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

lpBytesReturned实际输出数据的bytes

lpOverlappedIgnored; set to NULL.(Do you understand?)

下面来到第二个参数的详解,CTL_CODE的定义与应用:

CTL_CODE原型:

#define CTL_CODE(DeviceType, Function, Method, Access) ( ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) )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.

DeviceIoControl_deviceregist

 

援引微软定义的一个指令:锁卷

#define FSCTL_LOCK_VOLUME               CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  6, METHOD_BUFFERED, FILE_ANY_ACCESS)

Game over!

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/196439.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Java基础入门笔记03——用户交互Scanner类,程序三大结构,反编译,增强for,Java中没有goto

    Java基础入门笔记03——用户交互Scanner类,程序三大结构,反编译,增强for,Java中没有goto流程控制用户交互Scanner类实现程序和人的交互java.util.ScannerScanner 类 获取用户的输入next() 获取下一个字符nextLine()获取下一行next()以空格为结束符,但是一定要读取到有效字符才可以结束,也就是刚开始遇到的空格就会抛弃,而中间遇到空格才会停止next()不能得到带有空格的字符串package scanner;import java.util.Scanner;public class Demo01 { public

  • java中获取当前时间_java如何获得当前时间

    java中获取当前时间_java如何获得当前时间1、System.currentTimeMillis()获取标准时间可以使用System.currentTimeMillis()方法来获取,此方法优势是不受时区的影响,但是得到结果是时间戳的格式,如:1543105352845可以通过代码将时间戳转化为我们可以理解的格式:SimpleDateFormatformatter=newSimpleDateFormat(“yyyy-MM-dd’at’HH:mm:ssz”);Datedate=newDate(Syst..

  • MySQL数据库优化技巧大全

    MySQL数据库优化技巧大全

  • 高中必备学习软件_有那些免费好用的高中学习软件?[通俗易懂]

    高中必备学习软件_有那些免费好用的高中学习软件?[通俗易懂]刷题类1.猿题库记录一天时间app安卓1.爱今天2.timingIOS1.时间块2.atimelogger3.ihour4.nowthenfree专注类1.forest2.番茄todo背单词app这个感觉好多人都知道1.沪江开心词场2.扇贝单词3.百词斩4.知米背单词5.墨墨背单词6.不背单词7.单词日记8.易呗背单词听力方面app可可英语英语流利说每日英语听力沪江听力网易云的电台朗易思听缤…

  • 服务器维护中 verycd,强大的VeryCD服务器终于挂了…

    服务器维护中 verycd,强大的VeryCD服务器终于挂了…VeryCD.com是我喜欢的少数几个资源站点之一,也是一个浏览量非常大的网站。无法想象每个网友在上面Download自己喜爱的资源的时候VeryCD的那一排排主机承受着多大的压力与负载。VeryCD.com的首页设置的很有个性。每次你访问的时候都会在标题栏跟上一句富有哲理与人生韵味的格言或警句。所以有时候闷了,就闲来无事去刷它的主页。但是,今天下午一点钟左右试图登录VeryCD的时候发现开网页的…

  • 跨链协议ChainBridge简明教程【EVM/Substrate】「建议收藏」

    跨链协议ChainBridge简明教程【EVM/Substrate】「建议收藏」ChainBridge是一个可扩展的跨链通信协议,目前兼容EMV和Substrate链,支持两个不同的EVM区块链、或者一个EVM链与一个Substrate链之间的跨链桥接与通证转移,支持ERC20、ERC721等多种类型的通证的跨链转移,以及普通数据的跨链转移。在这个教程中,我们将介绍ChainBridge的基本构成和安装方法,并利用ChainBridge实现Substrate原生资产和以太坊ERC20/ERC721通证之间的跨链转移。用自己熟悉的语言学习以太坊开发:Java|Php|

发表回复

您的电子邮箱地址不会被公开。

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