zoukankan      html  css  js  c++  java
  • 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")
    }
    
  • 相关阅读:
    IL汇编语言介绍(译)
    开源搜索框架Lucene学习系列
    【转】autoHeight为true的时候,autoScroll为true就不起作用了
    [转]反注册 Regsvr32命令应用大全
    [转]sun.misc.BASE64Encoder找不到的解决方法
    mysql数据库导入导出
    【转】MySQL 与MS SQL Server数据库使用多表关联Update时语法的区别
    CRT detected that the application wrote to memory after end of heap buffer
    魔兽争霸窗口化
    GROUP_CONCAT函数
  • 原文地址:https://www.cnblogs.com/sherlock-merlin/p/11090411.html
Copyright © 2011-2022 走看看