读书人

Win XP停IOCTL_ATA_PASS_THROUGH的使

发布时间: 2013-07-11 15:38:46 作者: rapoo

Win XP下,IOCTL_ATA_PASS_THROUGH的使用?!!急!!
想编写C++程序,想SATA Disk发送ATA Command,如READ/WRITE SECTORS,Download等。查了些资料,发现IOCTL_ATA_PASS_THROUGH可以发送ATA Command,但是我写了个小Code,总是不能成功呢?求大神解惑!!!
或者,请大神告诉我一个可以在Win Xp下发送ATA Command的方法。PS:我不是要发IDENTIFY DEVICE这个指令,而是发送如READ SECTORS, WRITE SECTORS, DOWNLOAD等指令的方法!!!!万分感谢!!!!

Code如下。直接使用WDK进行编译!

HANDLE hDevice = CreateFile("\\\\.\\PhysicalDrive0", GENERIC_READ|GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);

// 这一步是成功的,我可以打开Port

ATA_PASS_TRHOUGH_EX inputBuffer;
ULONG inputBufferSize = sizeof(ATA_PASS_THROUGH_EX);

inputBuffer.Length = sizeof(ATA_PASS_THROUGH_EX);
inputBuffer.AtaFlags = ATA_FLAGS_DATA_IN;
inputBuffer.DataTransferLength = 512; // 1 sector
inputBuffer.DaatBufferSize = 0;

inputBuffer.CurrentTaskFile[0] = 0; // feature reg
inputBuffer.CurrentTaskFile[1] = 1; // sector count reg
inputBuffer.CurrentTaskFile[2] = 0x3f; // sector number reg
inputBuffer.CurrentTaskFile[3] = 0; // cyl low reg
inputBuffer.CurrentTaskFile[4] = 0; // cyl high reg
inputBuffer.CurrentTaskFile[5] = 0xe0; // device reg
inputBuffer.CurrentTaskFile[6] = 0x20; // commang reg
inputBuffer.CurrentTaskFile[7] = 0;

UCHAR *outputBuffer;
ULONG outputBufferSize = 512;

ULONG length = outputBuffer + sizeof(ATA_PASS_THROUGH_EX);

BOOL status;
status = DeviceIoControl(hDevice,
IOCTL_ATA_PASS_THROUGH,


&inputBuffer,
inputBufferSize,
outputBuffer,
length,
&returned,
FALSE);

if(!status) {
ULONG errorcode = GetLastError();}

到这里,我每次运行,得到的errorcode都是87,即参数不正确。实在不知道哪个参数有问题???求达人解答!!!或者,告诉个其他能在Win XP下,发送ATA Command(WRITE/READ SECTORS)的方法!!!!谢谢


读书人网 >C++

热点推荐