2016-09-17 78 views
0

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

我meen这些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命令到HDD并检索IDENTIFY_DEVICE_DATA结构,其中包含有关您的HDD的信息。 它要求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位。 From Information technology - AT Attachment 8 - ATA/ATAPI Command Set (ATA8-ACS)

word #80, ATA/ATAPI Compliance bitmap

相关问题