IOCTL_DISK_GET_DRIVE_GEOMETRY: 获取磁盘参数

c++实现:

#include <Windows.h>
#include <winioctl.h>
#include <stdio.h> int main()
{
HANDLE hDev = CreateFile("\\\\.\\G:",
GENERIC_READ,
FILE_SHARE_READ,
0,
OPEN_EXISTING,
0,
0); if (hDev != INVALID_HANDLE_VALUE)
{
DISK_GEOMETRY disk_geometry;
DeviceIoControl(hDev, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, &disk_geometry, sizeof(disk_geometry), NULL, NULL);
printf(" 柱面数量: %d\n", disk_geometry.Cylinders); //柱面数量
printf(" 介质类型: %d\n", disk_geometry.MediaType); //介质类型
printf("每柱面磁道数: %d\n", disk_geometry.TracksPerCylinder); //每柱面磁道数
printf("每磁道扇区数: %d\n", disk_geometry.SectorsPerTrack); //每磁道扇区数
printf("每扇区字节数: %d\n", disk_geometry.BytesPerSector); //每扇区字节数 CloseHandle(hDev);
}
}

golang实现:

type DISK_GEOMETRY struct {
Cylinders int64
MediaType int32
TracksPerCylinder int32
SectorsPerTrack int32
BytesPerSector int32
} func getHdev(letter byte) int {
deviceName := "\\\\.\\" + string(letter) + ":" kernel32 := syscall.NewLazyDLL("kernel32.dll")
CreateFile := kernel32.NewProc("CreateFileA") hDev, _, _ := CreateFile.Call(BytePtr([]byte(deviceName)), uintptr(0x80000000), uintptr(1), 0, uintptr(3), 0, 0)
return int(hDev)
} func getDiskGeometry(hDev int) {
const IOCTL_DISK_GET_DRIVE_GEOMETRY = 0x70000 var read = 0
disk_geometry := DISK_GEOMETRY{} kernel32 := syscall.NewLazyDLL("kernel32.dll")
DeviceIoControl := kernel32.NewProc("DeviceIoControl") DeviceIoControl.Call(uintptr(hDev), uintptr(IOCTL_DISK_GET_DRIVE_GEOMETRY), 0, 0, uintptr(unsafe.Pointer(&disk_geometry)), 24, uintptr(unsafe.Pointer(&read)), 0)
fmt.Println(" 柱面数量:", disk_geometry.Cylinders) //柱面数量
fmt.Println(" 介质类型:", disk_geometry.MediaType) //介质类型
fmt.Println("每柱面磁道数:", disk_geometry.TracksPerCylinder) //每柱面磁道数
fmt.Println("每磁道扇区数:", disk_geometry.SectorsPerTrack) //每磁道扇区数
fmt.Println("每扇区字节数:", disk_geometry.BytesPerSector) //每扇区字节数 fmt.Println(" 总容量:", (disk_geometry.Cylinders*int64(disk_geometry.TracksPerCylinder)*int64(disk_geometry.SectorsPerTrack)*int64(disk_geometry.BytesPerSector))/1024/1024, "MB")
}

IOCTL_DISK_GET_DRIVE_GEOMETRY的更多相关文章

  1. 实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序

    P.bhw98 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 9pt; PADDING-BOTTOM: 0px; MARGIN: 10px 0 ...

  2. CreateFile,ReadFile等API详解(或者说MSDN的翻译)

    一.*****CreateFile***** 这个函数可以创建或打开一个对象的句柄,凭借此句柄就可以控制这些对象:控制台对象.通信资源对象.目录对象(只能打开).磁盘设备对象.文件对象.邮槽对象.管道 ...

  3. 实战DeviceIoControl 之四:获取硬盘的详细信息

    Q 用IOCTL_DISK_GET_DRIVE_GEOMETRY或IOCTL_STORAGE_GET_MEDIA_TYPES_EX只能得到很少的磁盘参数,我想获得包括硬盘序列号在内的更加详细的信息,有 ...

  4. 实战DeviceIoControl 之五:列举已安装的存储设备

    Q 前几次我们讨论的都是设备名比较清楚的情况,有了设备名(路径),就可以直接调用CreateFile打开设备,进行它所支持的I/O操作了.如果事先并不能确切知道设备名,如何去访问设备呢? A 访问设备 ...

  5. 实战DeviceIoControl 之三:制作磁盘镜像文件

    Q DOS命令DISKCOPY给我很深的印象,现在也有许多"克隆"软件,可以对磁盘进行全盘复制.我想,要制作磁盘镜像文件,DeviceIoControl应该很有用武之地吧? A 是 ...

  6. 实战DeviceIoControl 之二:获取软盘/硬盘/光盘的参数

    Q 在MSDN的那个demo中,将设备名换成"A:"取A盘参数,先用资源管理器读一下盘,再运行这个程序可以成功,但换一张盘后就失败:换成"CDROM0"取CDR ...

  7. 实战DeviceIoControl 之一:通过API访问设备驱动程序

    Q 在NT/2000/XP中,我想用VC编写应用程序访问硬件设备,如获取磁盘参数.读写绝对扇区数据.测试光驱实际速度等,该从哪里入手呢? A 在NT/2000/XP中,应用程序可以通过API函数Dev ...

  8. [14]Windows内核情景分析 --- 文件系统

    文件系统 一台机器上可以安装很多物理介质来存放资料(如磁盘.光盘.软盘.U盘等).各种物理介质千差万别,都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制.应用程序要 ...

  9. CreateFile DeviceIoControl dwIoControlCode——应用程序与驱动程序通信

    在“进程内存管理器中”的一个Ring0,Ring3层通信问题,之前也见过这样的代码,这次拆分出来详细总结一下. 先通过CreateFile函数得到设备句柄,CreateFile函数原型: HANDLE ...

随机推荐

  1. Linux引导过程!(重点)

    1.开机自检:服务器开机后,将根据主板BIOS (基本输入系统),中的设置对CPU .内存.显卡.键盘等设备进行初步检测,并初始化部分硬件. 2.MBR 引导:当从本机硬盘中启动系统时,首先根据硬盘中 ...

  2. A letter for NW RDMA configuration

    Dear : If you have to use EMC NW NDMA to backup oracle database and want to see what happen when bac ...

  3. js加密(十)csti.cn md5

    1. http://www.csti.cn/index.htm 2. 登录密码加密 3. 加密js: var hexcase = 0; var b64pad = ""; var c ...

  4. 用C语言写一个Helloworld_实现第一步编译运行

    编写第一个hello world 创建helloworld.c // 程序头文件 #include <stdio.h> // 主入口函数 int main(int arc, char* a ...

  5. HTTP关键词收集

    [HTTP协议][客户端][服务器端][HTTPS][Web服务器][域名][DNS][IP地址][虚拟服务器][虚拟主机][中转服务器][HTTP/1.1规范][域名解析][Web托管服务][代理] ...

  6. PaperReading20200220

    CanChen ggchen@mail.ustc.edu.cn Recently I am occupied with something else so today I am going to sh ...

  7. 解题报告:luogu P1516 青蛙的约会

    题目链接:P1516 青蛙的约会 考察拓欧与推式子\(qwq\). 题意翻译? 求满足 \[\begin{cases}md+x\equiv t\pmod{l}\\nd+y\equiv t\pmod{l ...

  8. 「NOIP2011」观光公交

    传送门 Luogu 解题思路 有点麻烦,幸好 \(O(n^2)\) 能过... 贪心地想一想,我们如果要用加速器,肯定是要选择车上人数最多的时段加速. 但是我们就会面临这样的情况: 加速了,带来了增益 ...

  9. Model Validation 和测试Post参数

    using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentM ...

  10. js左右选项移动

    <!--网页代码--><div class="modal" id="modal-primary7"> <div class=&qu ...