// JP opened flex table

Click to See Complete Forum and Search --> : About using DeviceIoControl() to send ATA WRITE BUFFER command ...


Goldbach
September 22nd, 2008, 10:39 PM
I am trying to send ATA WRITE BUFFER command through Win32 API DeviceIoControl().
The following is my code,


typedef struct
{
IDEREGS IdeReg;
ULONG DataBufferSize;
UCHAR DataBuffer[1];
} ATA_PASS_THROUGH;

HANDLE hDevice = CreateFile(_T("\\\\.\\PhysicalDrive0"), GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice != INVALID_HANDLE_VALUE)
{
DWORD dwBufSize = 512;
DWORD dwSize = sizeof(ATA_PASS_THROUGH) + dwBufSize;
ATA_PASS_THROUGH * pAPT = (ATA_PASS_THROUGH *) VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
if (pAPT != NULL)
{
pAPT->DataBufferSize = dwBufSize;
// fill pAPT->DataBuffer
pAPT->IdeReg.bCommandReg = 0xE8;

DWORD dwRetSize = 0;
BOOL bRet = DeviceIoControl(hDevice, IOCTL_IDE_PASS_THROUGH, pAPT, dwSize, pAPT, dwSize, &dwRetSize, NULL);

if (bRet == TRUE)
{
// skip
}

VirtualFree(pAPT, dwSize, MEM_RELEASE);
}
CloseHandle(hDevice);
}


After running the code, DeviceIoControl() return TRUE, return registry are
pAPT->IdeReg.bDriveHeadReg = 0x0A
pAPT->IdeReg.bCommandReg = 0x58

In WRITE BUFFER command, Status Registry defined as
BSY DRDY DF na DRQ na na ERR
0 1 0 1 1 0 0 0 (0x58)

My question is why DRQ (Data Request) bit is 1? DRQ should set to be 0 if no error occurs.

//JP added flex table