Теперь я уже знаком с процессом DeviceIoControl (ioctl) и могу читать с диска последовательно 512 байт за раз.Доступ к необработанному диску в режиме произвольного доступа C++
Я создаю дескриптор из списка \. \ PhysicalDrive (s) и идентифицирую его с помощью команды IOCTL_STORAGE_QUERY_PROPERTY. Затем обработайте требуемое устройство для данных.
На данный момент, я могу читать его постепенно, создавая петлю, которая продвигает области считывания 1 сектор каждый раз с этим кодом (Qt C среда ++)
#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 работу даже такой случайный доступ? Я понимаю, что есть флаги Random Access для вызова CreateFile
, но после этого, что? Насколько мне известно, функция чтения по-прежнему не позволяет мне передавать какие-либо аргументы как «место назначения» или что-то в этом роде.
Например, в шестнадцатеричном редакторе HxD можно сразу подсчитать количество полных секторов на диске и перейти в определенный сектор в любое время. Мне нужна функция, аналогичная этой возможности.
Я собрал различные советы относительно того, как это может быть сделано, но я практически зашли в тупик здесь.
Любые идеи приветствуются.
[SetFilePointer] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa365541.aspx) –
вам нужно установить 'offset' и 'OffsetHigh' в' OVERLAPPED' и использовать этот 'OVERLAPPED' как последний параметр в' ReadFile' – RbMm
Я не вижу никакого Qt-кода в этом вопросе ... – MrEricSir