IOCTL_DISK_GET_DRIVE_GEOMETRY

2769 단어
IOCTL_DISK_GET_DRIVE_GEOMETRY:디스크 매개변수 가져오기
 
c++ 구현:
#include 
#include 
#include 

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")
}

좋은 웹페이지 즐겨찾기