如何获得HDD支持的ATA标准?

时间:2016-09-17 13:05:51

标签: c++ windows driver hardware hard-drive

如何获得HDD支持的ATA标准?我使用的是C ++,WINAPI。我无法使用WMI。

我看过这些ATA标准:http://www.quepublishing.com/articles/article.aspx?p=2028834&seqNum=2

我已在我的项目中使用此结构:https://msdn.microsoft.com/en-us/library/windows/hardware/ff559006(v=vs.85).aspx,但没有关于支持的ATA标准的信息。

我正在寻找任何程序解决方案,我认为如果需要我可以用其他语言写入文件支持的标准,然后用c ++读取它们。

1 个答案:

答案 0 :(得分:1)

您可以将IDENTIFY_DEVICE_DATA ATA命令发送到HDD并检索irb.h结构,其中包含有关HDD的信息。 它需要来自WDK(Windows驱动程序工具包)的BOOL getAtaCompliance() { DWORD dwBytes; BOOL bResult; CONST UINT bufferSize = 512; CONST BYTE identifyDataCommandId = 0xEC; UCHAR identifyDataBuffer[bufferSize + sizeof(ATA_PASS_THROUGH_EX)] = { 0 }; ATA_PASS_THROUGH_EX & PTE = *(ATA_PASS_THROUGH_EX *) identifyDataBuffer; PTE.Length = sizeof(PTE); PTE.TimeOutValue = 10; PTE.DataTransferLength = 512; PTE.DataBufferOffset = sizeof(ATA_PASS_THROUGH_EX); IDEREGS * ideRegs = (IDEREGS *) PTE.CurrentTaskFile; ideRegs->bCommandReg = identifyDataCommandId; ideRegs->bSectorCountReg = 1; PTE.AtaFlags = ATA_FLAGS_DATA_IN | ATA_FLAGS_DRDY_REQUIRED; bResult = DeviceIoControl(hDevice, IOCTL_ATA_PASS_THROUGH, &PTE, sizeof(identifyDataBuffer), &PTE, sizeof(identifyDataBuffer), &dwBytes, 0); if (bResult == FALSE) { std::cout << "Oops, something went wrong, error code: " << GetLastError() << std::endl; return bResult; } WORD *data = (WORD *)(identifyDataBuffer + sizeof(ATA_PASS_THROUGH_EX)); int16_t ataSupportBits = data[80]; return bResult; } 库包含。

{{1}}

ataSupportBits将包含16位支持的ATA标准。 来自Information technology - AT Attachment 8 - ATA/ATAPI Command Set (ATA8-ACS)

word #80, ATA/ATAPI Compliance bitmap