vc控制台程序如何获取整个硬盘的扇区数?

taoym101   2010-6-10 20:23 楼主
就是在win32 console程序下,通过什么方式可以获取硬盘的总扇区数?
api函数? 转为16位模式调int 13?

另外就是对硬盘的直接读写除了createfile(),还有其他什么方式吗?

回复评论 (12)

any response?????
点赞  2010-6-10 20:47
最近的问题一直没人回答哦!!
点赞  2010-6-11 09:15
帮你顶顶
点赞  2010-6-11 09:45

  1. #include
  2. #include
  3. #include

  4. BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
  5. {
  6.   HANDLE hDevice;               // handle to the drive to be examined
  7.   BOOL bResult;                 // results flag
  8.   DWORD junk;                   // discard results

  9.   hDevice = CreateFile(TEXT("\\\\.\\PhysicalDrive0"),  // drive
  10.                     0,                // no access to the drive
  11.                     FILE_SHARE_READ | // share mode
  12.                     FILE_SHARE_WRITE,
  13.                     NULL,             // default security attributes
  14.                     OPEN_EXISTING,    // disposition
  15.                     0,                // file attributes
  16.                     NULL);            // do not copy file attributes

  17.   if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
  18.   {
  19.     return (FALSE);
  20.   }

  21.   bResult = DeviceIoControl(hDevice,  // device to be queried
  22.       IOCTL_DISK_GET_DRIVE_GEOMETRY,  // operation to perform
  23.                              NULL, 0, // no input buffer
  24.                             pdg, sizeof(*pdg),     // output buffer
  25.                             &junk,                 // # bytes returned
  26.                             (LPOVERLAPPED) NULL);  // synchronous I/O

  27.   CloseHandle(hDevice);

  28.   return (bResult);
  29. }

  30. int main(int argc, char *argv[])
  31. {
  32.   DISK_GEOMETRY pdg;            // disk drive geometry structure
  33.   BOOL bResult;                 // generic results flag
  34.   ULONGLONG DiskSize;           // size of the drive, in bytes

  35.   bResult = GetDriveGeometry (&pdg);

  36.   if (bResult)
  37.   {
  38.     printf("Cylinders = %I64d\n", pdg.Cylinders);
  39.     printf("Tracks/cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
  40.     printf("Sectors/track = %ld\n", (ULONG) pdg.SectorsPerTrack);
  41.     printf("Bytes/sector = %ld\n", (ULONG) pdg.BytesPerSector);

  42.     DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
  43.       (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
  44.     printf("Disk size = %I64d (Bytes) = %I64d (Gb)\n", DiskSize,
  45.            DiskSize / (1024 * 1024 * 1024));
  46.   }
  47.   else
  48.   {
  49.     printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());
  50.   }

  51.   return ((int)bResult);
  52. }
点赞  2010-6-11 10:57
mark!
留下脚印
点赞  2010-6-11 11:20
zwfgdlc的代码我看过,不个那样获取的CHS值都是对的,但算出来的总扇区数(三数相乘)却 不正确,用diskgen查了哈,算出来的扇区始终比 dgen显示的总扇区小一些。
我在想可以用什么函数直接获取  总扇区数 。eg :  IOCTL_DISK_GET_DRIVE_GEOMETR_EX这个值,不个正遇到编译错误,正在修改………………
点赞  2010-6-14 18:18
看来必须用  IOCTL_DISK_GET_DRIVE_GEOMETR_EX啊,获取的总字节数/512 才为实际的扇区数,
CHS计算出的结果始终要小些,
哪位大侠知道原因哦!!!???
点赞  2010-6-15 21:05
貌似是 int 13h 扩展的问题吧。

不管怎样, 比较一下两个 IOCTL code 的说明吧。
点赞  2010-6-16 08:23
这个得自己分析分区表,我写的程序就是如此分析的。除了给我们使用的扇区外。前面还有一些系统扇区。diskgenius分析的确实包含了这部分。
点赞  2010-6-16 08:43
引用: 引用 9 楼 wutaihua 的回复:

这个得自己分析分区表,我写的程序就是如此分析的。除了给我们使用的扇区外。前面还有一些系统扇区。diskgenius分析的确实包含了这部分。

那diskgen是如何读取扇区的?writefile()?还是写的驱动哦?
点赞  2010-6-16 23:16
另外就是 如何 读写 硬盘 的最后几个扇区 的内容?
我用了 setfilepointer(),结果始终无法读取硬盘最后的一些扇区。
始终只能读取前面的一些扇区。
setFilePointer()里我用了两个参数,移动字节的高低三十二位

谁知道 原因哦
点赞  2010-6-16 23:19
另外就是 如何 读写 硬盘 的最后几个扇区 的内容?
我用了 setfilepointer(),结果始终无法读取硬盘最后的一些扇区。
始终只能读取前面的一些扇区。
setFilePointer()里我用了两个参数,移动字节的高低三十二位

谁知道 原因哦
点赞  2010-6-17 18:12
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复