Решено: см. комментарии ниже. Должно быть прочитано количество байт, кратное 512 (или размеру сектора диска).
Я пытаюсь прочитать с моего основного диска (этот диск является SSD-диском, и операционная система хранится на этом диске), но функция продолжает давать сбой и считывает 0 байт. Я запускаю эту программу от имени администратора.
Вот мой код:
int main() {
char a[100];
HANDLE hMainDisk = CreateFile("\\\\.\\PhysicalDrive0", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hMainDisk == INVALID_HANDLE_VALUE) {
std::cout << "ERROR: Main disk could not be found.\n"; //This is not printed.
}
unsigned char data[1000];
BOOL succeeded = ReadFile(hMainDisk, bootloaderData, 1000, &numBytesRead, 0);
DWORD error = GetLastError();
CloseHandle(hMainDisk);
if (numBytesRead != 1000) {
std::cout << "ERROR: Less than 1,000 bytes were read. Only " << numBytesRead << " bytes were read\n"; //This is printed.
}
if (succeeded == FALSE) {
std::cout << "ERROR: Main disk read failed.\n"; //This is also printed
}
if (error == ERROR_INVALID_USER_BUFFER || error == ERROR_NOT_ENOUGH_MEMORY) {
std::cout << "ERROR: Too many IO requests.\n"; //This is not printed
}
std::cin >> a;
return 0;
}
FO_NO_INTERMEDIATE_BUFFERING
. размер буфера - должен быть кратен размеру сектора тома. 1000 это плохая цена - person RbMm   schedule 13.06.2018GetFileInformationByHandleEx(hMainDisk, FileAlignmentInfo, &fai, sizeof(fai))
или черезNtQueryInformationFile
сFileAlignmentInformation
и размером сектора, скажем,IOCTL_DISK_GET_DRIVE_GEOMETRY
- выровнять буфер и прочитать несколько секторов - person RbMm   schedule 13.06.2018