我試圖識別使用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
我從這裏這個代碼.. http://stackoverflow.com/questions/5070987/sending-ata-commands-directly-to-device-in-windows?rq=1 – Nick
句柄是不是產生的?因此,有些東西肯定是錯的。 – Nick
你從不檢查'CreateFile()'的返回值。那次電話會議後的「處理」是什麼? –