DeviceIOControl详解-各个击破

article/2025/10/14 18:27:16

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这里只做一个粗略的解释:

  • HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile
    );  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

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.

 

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

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

Game over!


http://chatgpt.dhexx.cn/article/OvyS9Hm2.shtml

相关文章

DeviceIoControl 函数详细解析

前言&#xff1a; 最近需要对Windows中的设备进行编程操作&#xff0c;其中涉及到非常重要的函数DeviceIoControl&#xff0c;在使用的时候也比较的复杂&#xff0c;国内这一块中文资料比较少&#xff0c;在学习之余顺便将其翻译出来&#xff0c;以供参考&#xff0c;如有错误&…

操作系统原理(一)——自举过程

操作系统&#xff0c;这个名词每个人都不会陌生&#xff0c;但又总觉得似乎没有了解很深&#xff0c;这一系列博客将会从零开始强化你对操作系统的认知。 1. 什么是操作系统&#xff1f; 答&#xff1a;操作系统是介于硬件与用户&#xff08;也就是程序和人&#xff09;之间的…

【操作系统基础知识 一】操作系统基本原理

学生时代没有好好学习操作系统&#xff0c;悔不当初&#xff0c;现在重新捡起来看看&#xff0c;才发现日常有很多事情都可以解释了&#xff0c;例如为什么Linux快&#xff01;并发是什么&#xff1f;操作系统到底干啥活&#xff0c;这篇blog是王道的学习笔记&#xff1a; 操作…

操作系统原理,进程的基本状态,运行态,就绪态,等待态与转换模型,进程的其他状态,创建,终止,挂起与转换模型,Linux进程状态模型示例

操作系统原理&#xff0c;进程的基本状态&#xff0c;运行态&#xff0c;就绪态&#xff0c;等待态与转换模型&#xff0c;进程的其他状态&#xff0c;创建&#xff0c;终止&#xff0c;挂起与转换模型&#xff0c;Linux进程状态模型示例 一、进程的三种基本状态&#xff1a; …

Linux操作系统基础原理

计算机系统 1.计算机体系层次 计算机自身是由众多电子元器件构成&#xff0c;硬件本身提供给用户的接口十分底层复杂&#xff0c;使用很不方便。在硬件之上的操作系统将硬件接口抽象封装为比较直观&#xff0c;用户容易调用的接口&#xff1b;用户开发应用程序&#xff0c;通过…

操作系统原理实验——实验一 Linux基本操作

1、实验目的 &#xff08;1&#xff09;熟悉Linux下的基本操作&#xff0c;学会使用各种Shell命令去操作Linux&#xff0c;对Linux有一个感性认识。 &#xff08;2&#xff09;学会使用vi编辑器编辑简单的C语言程序&#xff0c;并能对其编译和调试。 2、实验预备内容 &#…

Linux 操作系统原理 — 操作系统的本质

目录 文章目录 目录操作系统的起源操作系统和高级编程语言使硬件抽象化操作系统的起源 在操作系统尚不存在的年代,人们通过各种按钮来控制计算机,这一过程非常麻烦。于是,有人开发出了仅仅具有加载和运行功能的监控程序(Supervisor),这就是操作系统的原型。 通过监控程…

操作系统原理之多进程、多线程与并发

文章目录 (1)什么是进程&#xff1f;(2)进程的状态(3)OS何时介入进程调度&#xff1f;(4)多进程的意义(5)并行和并发(6)进程间通信(7)死锁(8)什么是线程&#xff1f;(9)多线程的意义(10)进程和线程的区别(11)Java线程和OS线程的关系 提示&#xff1a;以下是本篇文章正文内容&am…

【考研复习】《操作系统原理》孟庆昌等编著课后习题+答案——第二章

前言 此书在最后的附录B中&#xff0c;有给出部分重难点部分的参考答案。会在最后放上图片。如果想要此书习题答案&#xff0c;可点以下链接&#xff1a;为一个压缩包&#xff0c;以图片形式&#xff0c;习题图片按章节排序&#xff0c;答案图片按书页排序。 《操作系统原理…

操作系统原理——第六章:页面置换算法

文章目录 1. 功能与目标2. 实验设置与评价方法3. 局部页面置换算法3.1 最优页面置换算法&#xff08;OPT&#xff0c;optimal&#xff09;3.2 先进先出算法&#xff08;FIFO&#xff09;3.3 最近最久未使用算法&#xff08;LRU&#xff0c;Least Recently Used&#xff09;3.4 …

操作系统原理模拟实验(基于C/C++模拟处理机调度、存储管理和文件系统)

目录 引言一、处理机调度模拟1、下载链接2、目的与要求3、截图示例 二、存储管理模拟动态分区分配1、下载链接2、目的与要求3、截图示例 分页存储地址转换1、下载链接2、目的与要求3、截图示例 三、文件系统模拟1、下载链接2、目的与要求3、截图示例 引言 包含多个实验的完整源…

操作系统原理总结

转载&#xff1a;https://blog.csdn.net/yanglingwell/article/details/53745758 操作系统原理总结 made by 杨领well (yanglingwellsina.com) 一、基础知识点 1. 操作系统的资源管理技术 资源管理解决物理资源数量不足和合理分配资源这两个问题。 操作系统虚拟机为用户提供…

操作系统原理:覆盖技术、交换技术、虚拟内存概要

随着时间的推移&#xff0c;程序不断地更新&#xff0c;规模不断增长&#xff0c;运行的时候可能会发现内存会越来越不够用。所以希望一个容量大&#xff0c;更快&#xff0c;更便宜&#xff0c;数据不易丢失的存储器。 首先想到的就是硬盘&#xff0c;所以在硬盘的基础上建立了…

操作系统原理、实现与实践课后习题参考答案(已完结)

习题二–系统接口 通向操作系统内核的大门 1.调用fork()的父子进程执行“同样”的代码&#xff0c;如何理解”同样“&#xff1f; 答&#xff1a; fork()函数为系统调用&#xff0c;用于创建进程。创建的进程与原来进程几乎完全相同. 一个进程调用fork&#xff08;&#xff09…

操作系统原理1-3章答案 黑新宏 胡元义主编

第1章引论 一、单项选择题 1.A 2. C 3. D 4. A 5.A 6. C 7. C 8. D 9. C 10.C 11. D 12.A 13.C 14.D 15.D 16.C 17.D 18.C 19.B 20.C 21.D 22.D 23.C 24.B 25.C 26.B 二、判断题 1.错误 2. 错误 3.错误 4. 错误 5.错误 6.错误 7.正确 8.错误 9.错误 10.错误 11.正确 12.错误 1…

操作系统原理:文件系统、磁盘调度

目录 一、相关概念 二、文件的分配 三、空闲空间列表 四、多磁盘管理-RAID 五、磁盘调度 一、相关概念 文件系统是一种用于持久性存储的系统抽象。硬盘属于持久性存储介质的一种。管理文件系统例如硬盘&#xff0c;需要管理文件块&#xff0c;哪一块属于哪一…

Linux的操作系统原理详解

Linux的操作系统原理详解 ///插播一条&#xff1a;我自己在今年年初录制了一套还比较系统的入门单片机教程&#xff0c;想要的同学找我拿/// 1.操作系统基本概念 操作系统是一个基本程序的集合&#xff0c;在这个集合中&#xff0c;最重要的程序称为内核&#xff08;Kernel&a…

操作系统原理

操作系统原理 第一章第二章第三章第四章第五章第六章总结 第一章 计算机系统组成部分&#xff1a; 硬件 应用程序 操作系统 用户操作系统的作用&#xff1a; 1.操作系统是管理计算机硬件的程序&#xff0c;为应用程序提供基础并充当计算机用户和计算机硬件的中介。 2.操作系统…

操作系统基本原理

操作系统的类型与结构 操作系统是计算机系统中最基本的系统软件&#xff0c;它既管理计算机系统的软、硬件资源&#xff0c;又控制程序的执行。操作系统的基本类型有&#xff1a;批处理操作系统、分时操作系统和实时操作系统。从资源管理的角度看&#xff0c;操作系统主要是对处…