IOCTL_DISK_GET_DRIVE_GEOMETRY
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的更多相关文章
- 实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序
P.bhw98 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 9pt; PADDING-BOTTOM: 0px; MARGIN: 10px 0 ...
- CreateFile,ReadFile等API详解(或者说MSDN的翻译)
一.*****CreateFile***** 这个函数可以创建或打开一个对象的句柄,凭借此句柄就可以控制这些对象:控制台对象.通信资源对象.目录对象(只能打开).磁盘设备对象.文件对象.邮槽对象.管道 ...
- 实战DeviceIoControl 之四:获取硬盘的详细信息
Q 用IOCTL_DISK_GET_DRIVE_GEOMETRY或IOCTL_STORAGE_GET_MEDIA_TYPES_EX只能得到很少的磁盘参数,我想获得包括硬盘序列号在内的更加详细的信息,有 ...
- 实战DeviceIoControl 之五:列举已安装的存储设备
Q 前几次我们讨论的都是设备名比较清楚的情况,有了设备名(路径),就可以直接调用CreateFile打开设备,进行它所支持的I/O操作了.如果事先并不能确切知道设备名,如何去访问设备呢? A 访问设备 ...
- 实战DeviceIoControl 之三:制作磁盘镜像文件
Q DOS命令DISKCOPY给我很深的印象,现在也有许多"克隆"软件,可以对磁盘进行全盘复制.我想,要制作磁盘镜像文件,DeviceIoControl应该很有用武之地吧? A 是 ...
- 实战DeviceIoControl 之二:获取软盘/硬盘/光盘的参数
Q 在MSDN的那个demo中,将设备名换成"A:"取A盘参数,先用资源管理器读一下盘,再运行这个程序可以成功,但换一张盘后就失败:换成"CDROM0"取CDR ...
- 实战DeviceIoControl 之一:通过API访问设备驱动程序
Q 在NT/2000/XP中,我想用VC编写应用程序访问硬件设备,如获取磁盘参数.读写绝对扇区数据.测试光驱实际速度等,该从哪里入手呢? A 在NT/2000/XP中,应用程序可以通过API函数Dev ...
- [14]Windows内核情景分析 --- 文件系统
文件系统 一台机器上可以安装很多物理介质来存放资料(如磁盘.光盘.软盘.U盘等).各种物理介质千差万别,都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制.应用程序要 ...
- CreateFile DeviceIoControl dwIoControlCode——应用程序与驱动程序通信
在“进程内存管理器中”的一个Ring0,Ring3层通信问题,之前也见过这样的代码,这次拆分出来详细总结一下. 先通过CreateFile函数得到设备句柄,CreateFile函数原型: HANDLE ...
随机推荐
- C++中的随机数
事情的开始是这样的,在大二的时候,写了几种排序算法,为了测试,就要为数组(或者容器)赋予一些随机初值,自然就用到了C/C++中的随机函数. 当时为了调用简单,将随机数赋值的过程写到了一个单独的函数里, ...
- Linux进程通信方式
参考:https://www.cnblogs.com/yangykaifa/p/7295863.html
- 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 ...
- wdcp升级php5.8到php7.1.12后安装gitlab
.安装依赖包 sudo yum install -y curl policycoreutils-python openssh-server cronie .使用清华大学开源软件镜像源安装 vim /e ...
- window进行缩放时左侧菜单高度随之变化
window.onresize = function(){ $(); }
- 手写MQ框架(四)-使用netty改造梳理
一.背景 书接上文手写MQ框架(三)-客户端实现,前面通过web的形式实现了mq的服务端和客户端,现在计划使用netty来改造一下.前段时间学习了一下netty的使用(https://www.w3cs ...
- 让Nutz支持最快的模板引擎Smarty4j
Smarty4j是一个开源的模板引擎.没错,它就是著名的php模板引擎之Java移植版. 它特点就是将模板文件或者字符串编译成java类直接执行,所以效率比一般的模板解释的方式处理要快.它发展较晚,所 ...
- redis配置文件中常用配置详解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/suprezheng/article/de ...
- pgsql 查询jsonb中包含某个键值对的表记录
pgsql 查询jsonb中包含某个键值对的表记录 表名 table_name ,字段 combos 类型为 jsonb 可为空,示例内容如下, $arr_combos = [ ['id' => ...
- SciPy 统计
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...