【发布时间】:2017-05-11 20:59:32
【问题描述】:
现在,我已经熟悉了 DeviceIoControl (ioctl) 进程,并且可以按顺序从磁盘读取,一次读取 512 个字节。
我从 \.\PhysicalDrive(s) 列表中创建一个句柄,并通过 IOCTL_STORAGE_QUERY_PROPERTY 命令识别它。然后处理所需设备的数据。
此时,我可以通过创建一个循环来逐步读取它,每次使用此代码(Qt C++ 环境)推进读取区域 1 扇区
#include <minwindef.h>
#include <devioctl.h>
#include <ntdddisk.h>
#include <ntddscsi.h>
#include <ioapiset.h>
#include <fileapi.h>
#include <handleapi.h>
#include <winbase.h>
...
HANDLE devHandle = NULL;
devHandle = CreateFile(charArray, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0 ,NULL);
unsigned long secCount = 0;
while(true)
{
bSuccess = ReadFile(devHandle, lpSecBuf, 512, &dwRead, NULL);
if (bSuccess & (dwRead < 512))
{
qDebug()<<"EOF";
break;
}
if(!bSuccess)
{
qDebug()<<"No data could be read from the device.";
break;
}
if(bSuccess && dwRead>0)
{
qDebug()<<"Sector "<<secCount<<" data : "<<lpSecBuf;
}
secCount++;
}
按顺序执行此操作意味着我必须一个接一个地遍历扇区,计数,直到达到我想要访问的扇区号。而且这在性能上并不是很理想。
如果我想直接访问特定区域,例如“转到 45535 扇区并读取 512 个字节”,该怎么办? IOCTL 操作甚至允许像这样的随机访问吗?我知道CreateFile 调用有随机访问标志,但在那之后,怎么办?就我所见,读取函数仍然不允许我将任何参数作为“目标”或类似的东西传递。
例如,HxD十六进制编辑器可以立即统计磁盘中的总扇区数,并且可以随时转到某个扇区。我需要的功能和这个能力差不多。
我收集了有关如何完成此操作的各种提示,但我在这里实际上陷入了僵局。
欢迎提出任何想法。
【问题讨论】:
-
您需要在
OVERLAPPED中设置offset和OffsetHigh,并将此OVERLAPPED用作ReadFile中的最后一个参数 -
我在这个问题中没有看到任何 Qt 代码...