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

Posted

技术标签:

【中文标题】如何获取 HDD 支持的 ATA 标准?【英文标题】:How to get what ATA Standards are supported by HDD? 【发布时间】:2017-01-25 14:35:54 【问题描述】:

如何获得 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】:

您可以发送0xEC ATA 命令到硬盘并检索IDENTIFY_DEVICE_DATA 结构,其中包含有关您的硬盘的信息。 它需要包含来自 WDK(Windows 驱动程序工具包)的 irb.h 库。

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)

【讨论】:

以上是关于如何获取 HDD 支持的 ATA 标准?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# .NET 中读取 HDD S.M.A.R.T 寄存器并获取该寄存器的所有相关值?

机械硬盘简介

1.硬盘了解

使用终端在 OSx 上获取主 HDD 串行

如何在 Android 上获取和修改元数据以支持音频文件?

如何从 XMLHttpRequest 获取进度