IOCTL_DISK_GET_DRIVE_GEOMETRY: 获取磁盘参数

c++实现:

  1. #include <Windows.h>
  2. #include <winioctl.h>
  3. #include <stdio.h>
  4.  
  5. int main()
  6. {
  7. HANDLE hDev = CreateFile("\\\\.\\G:",
  8. GENERIC_READ,
  9. FILE_SHARE_READ,
  10. 0,
  11. OPEN_EXISTING,
  12. 0,
  13. 0);
  14.  
  15. if (hDev != INVALID_HANDLE_VALUE)
  16. {
  17. DISK_GEOMETRY disk_geometry;
  18. DeviceIoControl(hDev, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, &disk_geometry, sizeof(disk_geometry), NULL, NULL);
  19. printf(" 柱面数量: %d\n", disk_geometry.Cylinders); //柱面数量
  20. printf(" 介质类型: %d\n", disk_geometry.MediaType); //介质类型
  21. printf("每柱面磁道数: %d\n", disk_geometry.TracksPerCylinder); //每柱面磁道数
  22. printf("每磁道扇区数: %d\n", disk_geometry.SectorsPerTrack); //每磁道扇区数
  23. printf("每扇区字节数: %d\n", disk_geometry.BytesPerSector); //每扇区字节数
  24.  
  25. CloseHandle(hDev);
  26. }
  27. }

golang实现:

  1. type DISK_GEOMETRY struct {
  2. Cylinders int64
  3. MediaType int32
  4. TracksPerCylinder int32
  5. SectorsPerTrack int32
  6. BytesPerSector int32
  7. }
  8.  
  9. func getHdev(letter byte) int {
  10. deviceName := "\\\\.\\" + string(letter) + ":"
  11.  
  12. kernel32 := syscall.NewLazyDLL("kernel32.dll")
  13. CreateFile := kernel32.NewProc("CreateFileA")
  14.  
  15. hDev, _, _ := CreateFile.Call(BytePtr([]byte(deviceName)), uintptr(0x80000000), uintptr(1), 0, uintptr(3), 0, 0)
  16. return int(hDev)
  17. }
  18.  
  19. func getDiskGeometry(hDev int) {
  20. const IOCTL_DISK_GET_DRIVE_GEOMETRY = 0x70000
  21.  
  22. var read = 0
  23. disk_geometry := DISK_GEOMETRY{}
  24.  
  25. kernel32 := syscall.NewLazyDLL("kernel32.dll")
  26. DeviceIoControl := kernel32.NewProc("DeviceIoControl")
  27.  
  28. DeviceIoControl.Call(uintptr(hDev), uintptr(IOCTL_DISK_GET_DRIVE_GEOMETRY), 0, 0, uintptr(unsafe.Pointer(&disk_geometry)), 24, uintptr(unsafe.Pointer(&read)), 0)
  29. fmt.Println(" 柱面数量:", disk_geometry.Cylinders) //柱面数量
  30. fmt.Println(" 介质类型:", disk_geometry.MediaType) //介质类型
  31. fmt.Println("每柱面磁道数:", disk_geometry.TracksPerCylinder) //每柱面磁道数
  32. fmt.Println("每磁道扇区数:", disk_geometry.SectorsPerTrack) //每磁道扇区数
  33. fmt.Println("每扇区字节数:", disk_geometry.BytesPerSector) //每扇区字节数
  34.  
  35. fmt.Println(" 总容量:", (disk_geometry.Cylinders*int64(disk_geometry.TracksPerCylinder)*int64(disk_geometry.SectorsPerTrack)*int64(disk_geometry.BytesPerSector))/1024/1024, "MB")
  36. }

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. C++中的随机数

    事情的开始是这样的,在大二的时候,写了几种排序算法,为了测试,就要为数组(或者容器)赋予一些随机初值,自然就用到了C/C++中的随机函数. 当时为了调用简单,将随机数赋值的过程写到了一个单独的函数里, ...

  2. Linux进程通信方式

    参考:https://www.cnblogs.com/yangykaifa/p/7295863.html

  3. Day3-B-Round Marriage CodeForces-981F

    It's marriage season in Ringland! Ringland has a form of a circle's boundary of length LL. There are ...

  4. wdcp升级php5.8到php7.1.12后安装gitlab

    .安装依赖包 sudo yum install -y curl policycoreutils-python openssh-server cronie .使用清华大学开源软件镜像源安装 vim /e ...

  5. window进行缩放时左侧菜单高度随之变化

    window.onresize = function(){ $(); }

  6. 手写MQ框架(四)-使用netty改造梳理

    一.背景 书接上文手写MQ框架(三)-客户端实现,前面通过web的形式实现了mq的服务端和客户端,现在计划使用netty来改造一下.前段时间学习了一下netty的使用(https://www.w3cs ...

  7. 让Nutz支持最快的模板引擎Smarty4j

    Smarty4j是一个开源的模板引擎.没错,它就是著名的php模板引擎之Java移植版. 它特点就是将模板文件或者字符串编译成java类直接执行,所以效率比一般的模板解释的方式处理要快.它发展较晚,所 ...

  8. redis配置文件中常用配置详解

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/suprezheng/article/de ...

  9. pgsql 查询jsonb中包含某个键值对的表记录

    pgsql 查询jsonb中包含某个键值对的表记录 表名 table_name ,字段 combos 类型为 jsonb 可为空,示例内容如下, $arr_combos = [ ['id' => ...

  10. SciPy 统计

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...