• 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
    ", disk_geometry.Cylinders);			//柱面数量
    		printf("    介质类型: %d
    ", disk_geometry.MediaType);			//介质类型
    		printf("每柱面磁道数: %d
    ", disk_geometry.TracksPerCylinder);	//每柱面磁道数
    		printf("每磁道扇区数: %d
    ", disk_geometry.SectorsPerTrack);	//每磁道扇区数
    		printf("每扇区字节数: %d
    ", 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")
    }
    
  • 相关阅读:
    s3c2440 nand flash 拷贝实验
    DE270数字系统设计(4)基于Nios的LCD显示
    DE270数字系统设计实验(3)移位寄存器
    s3c2440启动时的内存拷贝过程分析
    s3c2440基本io/ports led点亮
    (转)X11/Xlib.h:没有该文件或目录
    NAND Flash读写技术
    Http中ContentType的取值讲解
    Json对象和Json字符串的区别
    table() function
  • 原文地址:https://www.cnblogs.com/sherlock-merlin/p/11090411.html
Copyright © 2020-2023  润新知