如何读取D盘的起始扇区地址和结束扇区地址

cppzhentan 2009-02-04 03:37:22
如何读取D盘的起始扇区地址和结束扇区地址?在不读取MBR的情况下还有API可用吗?或者DeviceIoControl可以读取D盘的起始扇区和结束扇区吗
...全文
892 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
cppzhentan 2009-02-05
  • 打赏
  • 举报
回复
付上代码(其他检查错误信息就不贴了,直接贴中心代码)

DWORD dwOutByte; // DeviceIoControl 读取的字节数
DISK_GEOMETRY diskGeometry;

// 读取每扇区字节数
BOOL bDeviceRet = DeviceIoControl(m_hDriver, IOCTL_DISK_GET_DRIVE_GEOMETRY,
NULL, 0, &diskGeometry, sizeof(DISK_GEOMETRY), &dwOutByte, NULL);

// 每扇区字节数
dwSectorByte = diskGeometry.BytesPerSector;

// 读取分区大小和偏移量
PARTITION_INFORMATION partInfo;
bDeviceRet = DeviceIoControl(m_hDriver, IOCTL_DISK_GET_PARTITION_INFO,
NULL, 0, &partInfo, sizeof(PARTITION_INFORMATION), &dwOutByte, NULL);

LONGLONG lPartitionSize = partInfo.PartitionLength.QuadPart; // 分区的大小
LONGLONG lOffset = partInfo.StartingOffset.QuadPart; // 偏移

// StartingOffset 除以每扇区字节数就是开始扇区;
// PartitionLength 除以每扇区字节数就是扇区总数。
lPartBegin = lOffset / dwSectorByte;
lPartEnd = lPartitionSize / dwSectorByte;

// 开始扇区加上扇区总数再减去1就是结束扇区。
lPartEnd += lOffset;
lPartEnd -= 1;
cppzhentan 2009-02-05
  • 打赏
  • 举报
回复
整个硬盘是250GB
C盘50G, D盘50G

整个硬盘的总大小PartitionLength.QuadPart是250000000000
整个硬盘的偏移StartingOffset.QuadPart是0
计算出整个硬盘的开始扇区是0, 结束扇区是488281249

C盘的总大小是52427902464
C盘偏移是32256
计算出的C盘开始扇区是63, 结束扇区是102430502

D盘的总大小是QuadPart 52427902464
D盘偏移是QuadPart 52427966976
计算出的D盘开始扇区102398373, 结束扇区是52530365222(超出了整个硬盘的总扇区)
一条晚起的虫 2009-02-05
  • 打赏
  • 举报
回复
Up KeSummer
codewarrior 函数可用
cppzhentan 2009-02-05
  • 打赏
  • 举报
回复
UP谢谢你,继续跟帖,我调试下它们的值
cnzdgs 2009-02-05
  • 打赏
  • 举报
回复
你的硬盘容量是多少?C、D盘分别是多大?
调试看一下获取到的StartingOffset、PartitionLength、BytesPerSector分别是多少。

有问题请继续跟帖,不要用私聊的方式。
cnzdgs 2009-02-05
  • 打赏
  • 举报
回复
开始扇区加上扇区总数再减去1就是结束扇区。
cppzhentan 2009-02-05
  • 打赏
  • 举报
回复
自己UP下
wutaihua 2009-02-05
  • 打赏
  • 举报
回复
文章有很多,关于硬盘分区表的格式的,可以百度搜索下,这篇也是
http://www.xici.net/b759610/d51053163.htm
wutaihua 2009-02-05
  • 打赏
  • 举报
回复
楼主,瑞星公司有篇文章,是详细介绍硬盘分区表的
http://it.rising.com.cn/Channels/Safety/SysSafety/Other/2002-10-25/1035525780d232.shtml

如果楼主知道了具体的位置,那么可以通过9楼的办法,来读取相应的硬盘数据,我做过类似的东西。
vcPlayer 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 coding_hello 的回复:]
学习。扇区的长度和偏移有了,用户态下怎么用这两个信息直接读取物理磁盘的数据呢?
[/Quote]

磁盘也是一种“文件”,你可以像下面这样来访问(具体参数参见MSDN):
HANDLE hDisk = CreateFile(_T("\\\\.\\D:"), ...);
ReadFile(hDisk, ...);
野男孩 2009-02-05
  • 打赏
  • 举报
回复
学习。扇区的长度和偏移有了,用户态下怎么用这两个信息直接读取物理磁盘的数据呢?
cppzhentan 2009-02-05
  • 打赏
  • 举报
回复
UP
谢谢,问题解决了,结贴
cnzdgs 2009-02-05
  • 打赏
  • 举报
回复
D盘的总大小是QuadPart 52427902464
D盘偏移是QuadPart 52427966976
总扇区数应该是832188928
开始扇区应该是832189952
结束扇区是1664378879

lPartEnd += lOffset;
这行代码错了,应该是:
lPartEnd += lPartBegin;
会思考的草 2009-02-04
  • 打赏
  • 举报
回复
BOOL CLogicalPartition::GetDiskGeometry()
{
CHAR szPath[255] = {0};
BOOL bResult = FALSE;
DWORD dwOutBytes = 0;

if(m_hDrive == INVALID_HANDLE_VALUE)
{
return FALSE;
}

sprintf(szPath, "%c:\\", m_chDriveLetter);

ZeroMemory(&m_DiskInfo, sizeof(DISK_GEOMETRY));
if(GetDriveType(szPath)== DRIVE_CDROM)
{
//用IOCTL_CDROM_GET_DRIVE_GEOMETRY取光盘参数
bResult = DeviceIoControl(
m_hDrive,
IOCTL_CDROM_GET_DRIVE_GEOMETRY,
NULL,
0,
&m_DiskInfo,
sizeof(DISK_GEOMETRY),
&dwOutBytes,
NULL
);
}
else
{
//用IOCTL_DISK_GET_DRIVE_GEOMETRY取磁盘参数
bResult = DeviceIoControl(
m_hDrive,
IOCTL_DISK_GET_DRIVE_GEOMETRY,
NULL,
0,
&m_DiskInfo,
sizeof(DISK_GEOMETRY),
&dwOutBytes,
NULL
);
}
return bResult;
}
cnzdgs 2009-02-04
  • 打赏
  • 举报
回复
StartingOffset除以每扇区字节数就是开始扇区;
PartitionLength除以每扇区字节数就是扇区总数。
cnzdgs 2009-02-04
  • 打赏
  • 举报
回复
同上,打开\\.\D:,用IOCTL_DISK_GET_PARTITION_INFO可以获得该盘的开始位置和长度(都是以字节为单位),再转换成扇区。
KeSummer 2009-02-04
  • 打赏
  • 举报
回复
IOCTL_DISK_GET_DRIVE_GEOMETRY获取扇区字节数
IOCTL_DISK_GET_PARTITION_INFO 获取分区的大小和偏移,这样除以扇区字节数就得出了第一扇区和最后一扇区的序号。
KeSummer 2009-02-04
  • 打赏
  • 举报
回复
IOCTL_DISK_GET_DRIVE_GEOMETRY
和 IOCTL_DISK_GET_PARTITION_INFO
试试~~
cppzhentan 2009-02-04
  • 打赏
  • 举报
回复
自己UP

2,641

社区成员

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

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