如何获取硬盘支持哪些ATA标准?
How to get what ATA Standards are supported by 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++ 读取它们。
您可以向硬盘发送0xEC
ATA 命令并检索IDENTIFY_DEVICE_DATA
结构,其中包含有关您的硬盘的信息。
它需要 irb.h
来自 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;
}
ataSupportBits 将包含有关支持的 ATA 标准的 16 位。
来自 Information technology - AT Attachment 8 - ATA/ATAPI Command Set (ATA8-ACS)
如何获取硬盘支持的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++ 读取它们。
您可以向硬盘发送0xEC
ATA 命令并检索IDENTIFY_DEVICE_DATA
结构,其中包含有关您的硬盘的信息。
它需要 irb.h
来自 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;
}
ataSupportBits 将包含有关支持的 ATA 标准的 16 位。 来自 Information technology - AT Attachment 8 - ATA/ATAPI Command Set (ATA8-ACS)