2016-09-17 28 views
0

ATAの取得方法HDDでサポートされている規格はありますか?私はC++、WINAPIを使用しています。 WMIは使用できません。サポートATA規格に関する情報がhttps://msdn.microsoft.com/en-us/library/windows/hardware/ff559006(v=vs.85).aspxを、しかし:私はすでに私のプロジェクトでは、この構造体を使用していhttp://www.quepublishing.com/articles/article.aspx?p=2028834&seqNum=2HDDでサポートされているATA規格を取得する方法は?

は、私はこれらのATA規格ミーンません。

私は任意のprogrammソリューションを探していますが、必要に応じて、他の言語でサポートされているファイルに書き込んでから、C++で読み込むことができます。

答えて

1

0xEC ATAコマンドをHDDに送信し、IDENTIFY_DEVICE_DATA構造体を取得して、HDDに関する情報を取得することができます。 ライブラリにはWDK(Windows Driver Kit)の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)から

word #80, ATA/ATAPI Compliance bitmap

関連する問題