2012-10-17 108 views
0

我試圖識別使用ATA_PASS_THROUGH_EX的設備。ATA命令設備IDENTIFY

當我看到輸出緩衝區時,它包含所有無效數據。有人能幫助我,我做錯了什麼?

#include <Windows.h> 
#include <ntddscsi.h> 
#include <iostream> 

void main() { 
    WCHAR *fileName = (WCHAR *) "\\.\PhysicalDrive0"; 
    HANDLE handle = CreateFile(
     fileName, 
     GENERIC_READ | GENERIC_WRITE, //IOCTL_ATA_PASS_THROUGH requires read-write 
     FILE_SHARE_READ, 
     NULL,   //no security attributes 
     OPEN_EXISTING, 
     0,    //flags and attributes 
     NULL    //no template file 
    ); 


    ATA_PASS_THROUGH_EX inputBuffer; 
    inputBuffer.Length = sizeof(ATA_PASS_THROUGH_EX); 
    inputBuffer.AtaFlags = ATA_FLAGS_DATA_IN; 
    inputBuffer.DataTransferLength = 0; 
    inputBuffer.DataBufferOffset = 0; 

    IDEREGS *ir = (IDEREGS *) inputBuffer.CurrentTaskFile; 
    ir->bCommandReg = 0xEC; //identify device 
    ir->bSectorCountReg = 1; 

    unsigned int inputBufferSize = sizeof(ATA_PASS_THROUGH_EX); 

    UINT8 outputBuffer[512]; 
    UINT32 outputBufferSize = 512; 
    LPDWORD bytesReturned = 0; 

    DeviceIoControl(handle, IOCTL_ATA_PASS_THROUGH_DIRECT, &inputBuffer, inputBufferSize, &outputBuffer, outputBufferSize, bytesReturned, NULL); 

    DWORD error = GetLastError(); 

    std::cout << outputBuffer << std::endl; 
    system("pause"); 
} 

更新: 當我檢查該誤差值,它是5,這意味着它是訪問衝突。我在管理模式下運行。難道我做錯了什麼?

-Nick

+0

我從這裏這個代碼.. http://stackoverflow.com/questions/5070987/sending-ata-commands-directly-to-device-in-windows?rq=1 – Nick

+0

句柄是不是產生的?因此,有些東西肯定是錯的。 – Nick

+0

你從不檢查'CreateFile()'的返回值。那次電話會議後的「處理」是什麼? –

回答

1

我做這個使用代碼,看起來像這樣:

int foo() 
{ 
    int iRet(0); 

    // Open handle to disk. 
    HANDLE hDevice(::CreateFileW(L"\\\\.\\PhysicalDrive0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL)); 
    if(hDevice == INVALID_HANDLE_VALUE) 
    { 
     std::wcout << L"CreateFileW(" << sPath << L") failed. LastError: " << GetLastError() << std::endl; 
     return -1; 
    } 

    // 
    // Use IOCTL_ATA_PASS_THROUGH 
    // 
    std::vector<UCHAR> vBuffer(sizeof(ATA_PASS_THROUGH_EX) + sizeof(IDENTIFY_DEVICE_DATA), 0); 
    PATA_PASS_THROUGH_EX pATARequest(reinterpret_cast<PATA_PASS_THROUGH_EX>(&vBuffer[0])); 
    pATARequest->AtaFlags = ATA_FLAGS_DATA_IN | ATA_FLAGS_DRDY_REQUIRED; 
    pATARequest->Length = sizeof(ATA_PASS_THROUGH_EX); 
    pATARequest->DataBufferOffset = sizeof(ATA_PASS_THROUGH_EX); 
    pATARequest->DataTransferLength = sizeof(IDENTIFY_DEVICE_DATA); 
    pATARequest->TimeOutValue = 2; 
    pATARequest->CurrentTaskFile[6] = ID_CMD; 

    ULONG ulBytesRead; 
    if(DeviceIoControl(hDevice, IOCTL_ATA_PASS_THROUGH, 
     &vBuffer[0], ULONG(vBuffer.size()), 
     &vBuffer[0], ULONG(vBuffer.size()), 
     &ulBytesRead, NULL) == FALSE) 
    { 
     std::cout << "DeviceIoControl(IOCTL_ATA_PASS_THROUGH) failed. LastError: " << GetLastError() << std::endl; 
     iRet = -1; 
    } 
    else 
    { 
     // Fetch identity blob from output buffer. 
     PIDENTIFY_DEVICE_DATA pIdentityBlob(reinterpret_cast<PIDENTIFY_DEVICE_DATA>(&vBuffer[ sizeof(ATA_PASS_THROUGH_EX) ])); 
    } 

    CloseHandle(hDevice); 

    return iRet; 
} 

注意,這必須由管理員帳戶或提升上下文中運行。

+0

嘿..謝謝。我似乎不能添加頭文件ata.h或irb.h.任何想法爲什麼?我使用贏7,VS. – Nick

+1

這些頭文件是Windows DDK的一部分,可以從MSDN下載。 – Bukes