QT(C++)DeviceIoControl()函数的相关使用

article/2025/10/14 15:58:57

Microsoft官网中有这个函数的介绍,对,仅仅就是介绍,有时候官网的查询结果也就只能看看……

在我写过的一个软件中,我曾经多次使用该函数获取相关结果,现将我的使用经验分享给大家!


DeviceIoControl()函数将控制代码直接发送到指定的设备驱动,使相应的设备执行指定的操作。函数原型如下:

BOOL DeviceIoControl(HANDLE hDevice,               //设备句柄DWORD dwIoControlCode,        //欲执行操作类型LPVOID lpInBuffer,            //操作输入的数据缓冲区,不需要输入数据时可为NULLDWORD nInBufferSize,          //输入缓冲区的大小,不需要输入数据时可为0LPVOID lpOutBuffer,           //接收操作返回数据的缓冲区,没有数据输出时可为NULLDWORD nOutBufferSize,         //接收缓冲区的大小,没有数据输出时可为0LPDWORD lpBytesReturned,      //实际返回数据的大小,没有数据输出时可为NULLLPOVERLAPPER lpOverlapped     //忽略此项,直接设置成NULL
);

返回值非0表示函数使用成功;0表示失败,失败信息可以通过GetLastError()函数获得。


(1)对非系统盘加锁、解锁

DeviceIoControl(file, FSCTL_LOCK_VOLUME, NULL, 0, NULL, 0, NULL, NULL);DeviceIoControl(file, FSCTL_UNLOCK_VOLUME, NULL, 0, NULL, 0, NULL, NULL);//这里的非系统盘指的是U盘,系统盘加锁是不会成功的,因为操作系统本身时刻都对系统盘有操作。//file如果是驱动器句柄,那么就是将整个驱动器锁起来;如果是驱动器的某个分盘句柄,则将这个分盘锁起来。

(2)获取磁盘所在的物理驱动器号

string PhysicalDrive = "\\\\.\\PhysicalDrive";        STORAGE_DEVICE_NUMBER Number;DeviceIoControl(file, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &Number, sizeof(Number), NULL, (LPOVERLAPPED)NULL);PhysicalDrive += to_string(Number.DeviceNumber);  //这里使用PhysicalDrive是为了后续方便直接获取驱动器句柄,获取驱动器句柄的CreateFile()函数中的第一个参数便是类似 \\.\PhysicalDrive0 的参数
//详情可以查阅Microsoft官网CreateFile关于物理驱动器句柄的获取//file为磁盘句柄//Number的DeviceNumber返回的便是当前磁盘所在的驱动器号

(3)获取磁盘总字节数

GET_LENGTH_INFORMATION available;DeviceIoControl(file, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &available, sizeof(available), 0, NULL);UINT64 DiskSize = available.Length.QuadPart;//file为磁盘(驱动器)句柄,获取对应类别的总字节数//DiskSize则为磁盘总字节数//为什么会使用这种方法获取磁盘总字节数呢?
//使用过DiskGenius的朋友会发现 柱面数 × 磁道数 × 扇区数 × 每扇区字节数 != 磁盘总字节数
//这是因为有多余的字节数并不能凑够一个柱面,所以通过正常的获取磁头数等信息并不能正确获取总字节数//获取了总字节数后,便可以通过(4)的函数获取每个扇区的字节数,从而计算整个磁盘的扇区总数

(4)获取磁盘的磁头数、柱面数、扇区数、每扇区字节数

DISK_GEOMETRY pdg;DeviceIoControl(DiskHandle, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, &pdg, sizeof(pdg), NULL, (LPOVERLAPPED)NULL);//DiskHandle可以为磁盘句柄、驱动器句柄,则此函数获取对应的数据//pdg.Cylinders.QuadPart为柱面数
//pdg.TracksPerCylinder为每个柱面磁道数
//pdg.SectorsPerTrack为每个磁道扇区数
//pdg.BytesPerSector为每个扇区的字节数//用此方法得出的 柱面数 × 磁道数 × 扇区数 × 每扇区字节数 = 总字节数,一般研究这种情况下的数据
//特殊情况区别对待
//此时的总字节数会比实际字节数少,实际字节数可以用(3)的方法获取
//此方法主要是获取磁盘(驱动器)的标准数据//实际总扇区数 = (3)获取的总字节数 / 每扇区字节数

在我写过的软件中,这四种方法都使用过,读者可以根据需要复制代码,请仔细理解每个方法中的注释内容!

最后,有帮助的话可以给我一丢丢赞赏嚯!(记得备注CSDN,我会更有动力更新文章嚯!)


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

相关文章

应用程序与驱动程序通信 DeviceIoControl

本文为转载,参考链接地址 https://blog.csdn.net/li_wen01/article/details/80137566 https://www.cnblogs.com/lsh123/p/7354573.html DeviceIoControl 将控制代码直接发送到指定的设备驱动程序,使相应的设备执行相应的操作。 这种通信方式&#xff…

IO设备控制操作--DeviceIoControl

1.除了ReadFile和WirteFile以外,应用程序还可以通过另外一个API DeviceIoControl 操作设备。DeviceIoControl内部会使操作系统创建一个IRP_MJ_DEVICE_CONTROL类型的IRP,然后操作系统会将这个IRP转发到派遣函数中。 2.I/O控制码(IOCTL&#xf…

DeviceIoControl获取硬盘信息

参考:DeviceIoControl 函数详细解析 BOOL WINAPI DeviceIoControl(_In_ HANDLE hDevice,_In_ DWORD dwIoControlCode,_In_opt_ LPVOID lpInBuffer,_In_ DWORD nInBufferSize,_Out_opt_ LPVOID lpOutBuf…

windows driver - DeviceIoControl 用法

原文地址:https://www.cnblogs.com/lsh123/p/7354573.html 之前写过一篇关于通过DeviceIoControl函数来使应用程序与驱动程序通信的博客,这次再通过这个完整的代码来简要疏通总结一下。 这种通信方式,就是驱动程序和应用程序自定义一种IO控制…

@ControllerAdvice 用法

ControllerAdvice 用法 顾名思义,ControllerAdvice就是Controller 的增强版。ControllerAdvice主要用来处理全局数据,一般搭配ExceptionHandler、ModelAttribute以及InitBinder使用。 全局异常处理 ControllerAdvice最常见的使用场景就是全局异常处理…

驱动开发:应用DeviceIoContro模板精讲

在笔者上一篇文章《驱动开发:应用DeviceIoContro开发模板》简单为大家介绍了如何使用DeviceIoContro模板快速创建一个驱动开发通信案例,但是该案例过于简单也无法独立加载运行,本章将继续延申这个知识点,通过封装一套标准通用模板…

驱动开发:应用DeviceIoContro开发模板

内核中执行代码后需要将结果动态显示给应用层的用户,DeviceIoControl 是直接发送控制代码到指定的设备驱动程序,使相应的移动设备以执行相应的操作的函数,如下代码是一个经典的驱动开发模板框架,在开发经典驱动时会用到的一个通用…

deviceiocontrol(deviceiocontrol函数)

如何用DeviceIOControl读取并口信息 应用程序和驱动程序的通信过程是:应用程序使用CreateFile函数打开设备,然后用DeviceIoControl与驱动程序进行通信,包括读和写两种操作。还可以用ReadFile读数据用WriteFile写数据。操作完毕时用CloseHandl…

DeviceIOControl详解-各个击破

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

DeviceIoControl 函数详细解析

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

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

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

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

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

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

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

Linux操作系统基础原理

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

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

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

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

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

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

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

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

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

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

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