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

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

另外就是对硬盘的直接读写除了createfile(),还有其他什么方式吗?
...全文
391 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jeckjeck 2010-07-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 guangmingdeshenju 的回复:]

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

谁知道 原因哦
[/Quote]
这是我读取我500G硬盘最后两字节的代码,可以成功读取,你比较一下细节,看哪些跟你不一样。
DWORD dwBytes;
BYTE Buffer[4096]={};
LONG FilePointerHi = 0x74;
SetFilePointer(hDevice,(LONG)0x70afda00,&FilePointerHi,FILE_BEGIN);
ReadFile(hDevice, Buffer, 512*2, &dwBytes, NULL);

看了你的描述,我估计你的问题出在处理64位长整型的低32位的问题上,当你不用高32位时,SetFilePointer将低32当符号型整型处理,那样就只能表示到(+2^31 -1),大于此范围请用上高32位(即参数lpDistanceToMoveHigh
)哪怕是传入&0,这样低32位才会被当做64位的低32位对待(文字表达功底稍差,相信你意会了:))

我的关键问题:我在取硬盘总扇区数时也遇到跟你一样的问题,winHex显示的和我用CHS算出来的不一致,不知你现在解决没有,请赐教,先谢了。
guangmingdeshenju 2010-06-17
  • 打赏
  • 举报
回复
另外就是 如何 读写 硬盘 的最后几个扇区 的内容?
我用了 setfilepointer(),结果始终无法读取硬盘最后的一些扇区。
始终只能读取前面的一些扇区。
setFilePointer()里我用了两个参数,移动字节的高低三十二位

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

谁知道 原因哦
guangmingdeshenju 2010-06-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wutaihua 的回复:]

这个得自己分析分区表,我写的程序就是如此分析的。除了给我们使用的扇区外。前面还有一些系统扇区。diskgenius分析的确实包含了这部分。
[/Quote]
那diskgen是如何读取扇区的?writefile()?还是写的驱动哦?
wutaihua 2010-06-16
  • 打赏
  • 举报
回复
这个得自己分析分区表,我写的程序就是如此分析的。除了给我们使用的扇区外。前面还有一些系统扇区。diskgenius分析的确实包含了这部分。
fly4free 2010-06-16
  • 打赏
  • 举报
回复
貌似是 int 13h 扩展的问题吧。

不管怎样, 比较一下两个 IOCTL code 的说明吧。
guangmingdeshenju 2010-06-15
  • 打赏
  • 举报
回复
看来必须用 IOCTL_DISK_GET_DRIVE_GEOMETR_EX啊,获取的总字节数/512 才为实际的扇区数,
CHS计算出的结果始终要小些,
哪位大侠知道原因哦!!!???
guangmingdeshenju 2010-06-14
  • 打赏
  • 举报
回复
zwfgdlc的代码我看过,不个那样获取的CHS值都是对的,但算出来的总扇区数(三数相乘)却 不正确,用diskgen查了哈,算出来的扇区始终比 dgen显示的总扇区小一些。
我在想可以用什么函数直接获取 总扇区数 。eg : IOCTL_DISK_GET_DRIVE_GEOMETR_EX这个值,不个正遇到编译错误,正在修改………………
shenyi0106 2010-06-11
  • 打赏
  • 举报
回复
mark!
留下脚印
zwfgdlc 2010-06-11
  • 打赏
  • 举报
回复

#include <windows.h>
#include <winioctl.h>
#include <stdio.h>

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

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

if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
{
return (FALSE);
}

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

CloseHandle(hDevice);

return (bResult);
}

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

bResult = GetDriveGeometry (&pdg);

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

DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
(ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
printf("Disk size = %I64d (Bytes) = %I64d (Gb)\n", DiskSize,
DiskSize / (1024 * 1024 * 1024));
}
else
{
printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());
}

return ((int)bResult);
}
悟迟 2010-06-11
  • 打赏
  • 举报
回复
帮你顶顶
guangmingdeshenju 2010-06-11
  • 打赏
  • 举报
回复
最近的问题一直没人回答哦!!
guangmingdeshenju 2010-06-10
  • 打赏
  • 举报
回复
any response?????

6,125

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧