c++ - 如何使用 ATA 命令读取磁盘的特定扇区?

标签 c++ winapi hard-drive sata

我想在 vc++ 中使用 ATA 命令读取磁盘的特定扇区(MBR 扇区)。我是 VC++ 的新手,所以在使用 DeviceIoControl 向磁盘发送命令时遇到问题。我提供了一个代码,我用它来使用命令 Read Sector(s)(0x20) 读出一个扇区。

  BOOL status = FALSE;
 PATA_PASS_THROUGH_EX pATAData;
DWORD dataSize = sizeof(ATA_PASS_THROUGH_EX) + 512;
BYTE Buffer[sizeof(ATA_PASS_THROUGH_EX) + 512];
DWORD bytescopied = 0;

    pATAData = (ATA_PASS_THROUGH_EX*)Buffer;

    ZeroMemory(pATAData,dataSize); // clears the buffer

    pATAData->Length = sizeof(ATA_PASS_THROUGH_EX);
    pATAData->DataBufferOffset = sizeof(ATA_PASS_THROUGH_EX);
    pATAData->DataTransferLength = 512;
    pATAData->TimeOutValue = 2;

    pATAData->CurrentTaskFile[1] = 0x01;
    pATAData->CurrentTaskFile[2] = 0x00;
    pATAData->CurrentTaskFile[3] = 0x00;
    pATAData->CurrentTaskFile[4] = 0x00;
    pATAData->AtaFlags =ATA_FLAGS_DATA_IN;

    pATAData->CurrentTaskFile[6] = 0x20; // command Read Sector(s)(0x20)
    /* sends the command to the device, **hDevice** is device handle*/
    status = DeviceIoControl(hDevice, IOCTL_ATA_PASS_THROUGH, pATAData, dataSize,Buffer, dataSize, &bytescopied, NULL );

我不能理解这段代码有什么问题以及我在这里缺少什么,但它不起作用。 我在这里缺少什么?如果 PATA_PASS_THROUGH_EX 结构的参数有问题,请告知如何读取第一个扇区 (MBR)。

最佳答案

谢谢大家的帮助。我得到了解决方案。我没有注意到的一点点事情。那就是 Ata Flags。我必须发送多个标志。例如。

pATAData->ataFlags = ATA_FLAGS_48BIT_COMMAND | ATA_FLAGS_DRDY_REQUIRED | ATA_FLAGS_DATA_IN

并且还在 PreviousTaskFile[6] 中发送 ATA 命令操作码。 需要注意的几件事是 HDD的 block 大小是多少?它可能超过 512 字节,特别是如果它是一个大磁盘,如 (1TB...4TB)。因此,您需要相应地调整尺寸。您可以通过执行 EC identify ATA 命令查看大小,然后查看生成的数据结构。

关于c++ - 如何使用 ATA 命令读取磁盘的特定扇区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30116092/

相关文章:

c++ - C++ 中的数字模式

delphi - Ctrl+-(Ctrl+连字符-减号)作为快捷键?

python - 磁盘寻道时间测量方法

c++ - 更高效地写入硬盘

c++ - 根据模板参数调用不同的函数c++

c++ - 是否存在 static_warning?

c# - C++ Windows 应用程序的 Visual Studio 替代品

c++ - 为 Windows 编译的 Qt 是 Low Level 的 win api

C++ BitBlt 显示棋盘和偏色

windows - 在 Windows 上确定磁盘几何结构