首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取硬盘支持的ATA标准?

如何获取硬盘支持的ATA标准?
EN

Stack Overflow用户
提问于 2016-09-17 21:05:51
回答 1查看 518关注 0票数 0

如何获取硬盘支持的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++读取它们。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-01 18:17:59

您可以向硬盘发送0xEC ATA命令并检索IDENTIFY_DEVICE_DATA structure,其中包含有关硬盘的信息。它需要WDK (Windows Driver Kit)中包含irb.h库。

代码语言:javascript
复制
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)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39547166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档