Guest User

Untitled

a guest
Nov 19th, 2017
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. #include <windows.h>
  2. #include <iostream.h>
  3. #include <winioctl.h>
  4. #include <string.h>
  5.  
  6. //关于Disk结构的定义
  7. struct Disk
  8. {
  9. HANDLE handle;
  10. DISK_GEOMETRY disk_info;
  11. };
  12.  
  13. static Disk physicDisk(char driverLetter);
  14.  
  15. int main(int argc, char* argv[])
  16. {
  17. Disk disk;
  18. char DriverLetter;
  19. cout << "请输入磁盘号:c/d/e/f" << endl;
  20. cin >> DriverLetter; // 选择要查看的磁盘
  21. disk = physicDisk(DriverLetter);
  22. return 0;
  23. }
  24.  
  25. static Disk physicDisk(char driverLetter)
  26. {
  27. Disk disk;
  28. _int64 sector;
  29. bool flag;
  30. HANDLE Floppy;
  31. flag = true;
  32. DISK_GEOMETRY* temp = new DISK_GEOMETRY;
  33. char device[9] = "\\\\.\\c:";
  34. device[4] = driverLetter;
  35.  
  36. Floppy = CreateFile(device,
  37. GENERIC_READ | GENERIC_WRITE,
  38. FILE_SHARE_READ | FILE_SHARE_WRITE,
  39. NULL,
  40. OPEN_EXISTING,
  41. FILE_FLAG_RANDOM_ACCESS | FILE_FLAG_NO_BUFFERING,
  42. NULL);
  43.  
  44.  
  45. if (GetLastError() == ERROR_ALREADY_EXISTS) // 如打开失败,返回错误代码
  46. {
  47. cout << "不能打开磁盘" << endl;
  48. cout << GetLastError() << endl;
  49. flag = false;
  50. return disk;
  51. }
  52.  
  53. DWORD bytereturned;
  54. BOOL Result;
  55. disk.handle = Floppy;
  56.  
  57. Result = DeviceIoControl(Floppy,
  58. IOCTL_DISK_GET_DRIVE_GEOMETRY,
  59. NULL,
  60. 0,
  61. temp,
  62. sizeof(*temp),
  63. &bytereturned,
  64. (LPOVERLAPPED)NULL);
  65.  
  66. if (!Result) // 如果失败,返回错误代码
  67. {
  68. cout << "打开失败" << endl;
  69. cout << "错误代码为:" << GetLastError() << endl;
  70. flag = false;
  71. return disk;
  72. }
  73.  
  74. disk.disk_info = *temp; // 输出整个物理磁盘的信息
  75.  
  76. cout << driverLetter << "盘有: " << endl;
  77. cout << "柱面数为:" << (unsigned long)disk.disk_info.Cylinders.QuadPart << endl;
  78. cout << "每柱面的磁道数为:" << disk.disk_info.TracksPerCylinder << endl;
  79. cout << "每磁道的扇区数为:" << disk.disk_info.SectorsPerTrack << endl;
  80. cout << "每扇区的字节数为:" << disk.disk_info.BytesPerSector << endl;
  81.  
  82. // 计算总扇区数
  83. sector = disk.disk_info.Cylinders.QuadPart* (disk.disk_info.TracksPerCylinder)* (disk.disk_info.SectorsPerTrack);
  84. // 计算总字节数
  85. double DiskSize = (double)sector *
  86. (disk.disk_info.BytesPerSector) /
  87. (1024 * 1024 * 1024);
  88. cout << driverLetter << "盘所在磁盘总共有" << (long)sector << "个扇区" << endl;
  89. cout << "磁盘大小为:" << DiskSize << "GB " << endl;
  90.  
  91. delete temp;
  92. return disk;
  93. }
Add Comment
Please, Sign In to add comment