how to send an ata command with buffer to deivice ?

I

icsi

dear all:

I know MS provide IOCTL_IDE_PASS_THROUGH controlcode to send ata
command from user interface.

but I test that it only can return data in registers,like return status
at bCommandReg (see below).

When I want a command with buffer that conntaining returned data or
send data. it will failed.

How to do then ?

Thanks.

THis is the structs I used.

typedef struct
{
UCHAR bFeaturesReg;
UCHAR bSectorCountReg;
UCHAR bSectorNumberReg;
UCHAR bCylLowReg;
UCHAR bCylHighReg;
UCHAR bDriveHeadReg;
UCHAR bCommandReg;
UCHAR bReserved;
} IDEREGS, *PIDEREGS;

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

Jan Lenoch

Hi icsi,

I'm a total programming diletant, so I don't know if it will help you. I was
trying to write an application that sends one simple ATA command and I was
asking people for help and samples of code. One of them answered me and gave
me this sample code. Maybe it will help you.
The code is:

typedef struct {
IDE_REGISTER strIDEReg;
unsigned long ulBufSize;
unsigned char ucBuffer[512];
}IDE_PASSTHROUGH;

IDE_PASSTRHOUGH strIDE;
strIDE.bFeatures = 0x00; /* NA for ATA inquiry */
strIDE.bSectorCount = 0x00; /* NA for ATA inquiry */
strIDE.bSecrorNumber =0x01; /* NA for ATA inquiry, but set to 1 */
strIDE.bCylinderLow = 0x00; /* NA for ATA inquiry */
strIDE.bCylinderHigh = 0x00; /* NA for ATA inquiry */
strIDE.bDeviceHead = 0xA0; /* 1010 0000 let say CHS mode and master */
strIDE.bCommand = 0xEC;
strIDE.features = 0x00; /* NA for ATA inquiry */

/* send the command*/
status = DeviceIOControl( DeviceHandle, IOCTL_IDE_PASS_THROUGH,
&strIDE, sizeof(strIDE), /* input buffer and size */
&strIDE, sizeof(strIDE), /* output buffer and size */
&bytescopied, /* bytes copied to output buffer*/
False); /* no overlapping */
if(!status)
error handling
.............

I don't know if this will help you, but I think the code sample has some
buffers, so maybe it's what you're looking for.

Regards
Jan Lenoch
 
G

Gary G. Little

ATA pass-through is broken in 2000 and XP up through SP1. For this to work
properly you must upgrade to XP SP2 or use Server 2003 and use
IOCTL_ATA_PASS_THROUGH or IOCTL_ATA_PASS_THROUGH_DIRECT. You will also need
to compile your application with a path to the latest DDK for Server 2003 to
provide the proper definitions for the ATA_PASS_THROUGH/DIRECT structures.
Caveats to be aware of: DMA does not work with pass through so you are
limited to PIO.

Microsoft does have a hot fix avaialable for XP SP1 which replaces
atapi.sys. That might still be supported. As to a fix for 2000, that is
supposed to be in the next SP(5).

--
The personal opinion of
Gary G. Little

Jan Lenoch said:
Hi icsi,

I'm a total programming diletant, so I don't know if it will help you. I was
trying to write an application that sends one simple ATA command and I was
asking people for help and samples of code. One of them answered me and gave
me this sample code. Maybe it will help you.
The code is:

typedef struct {
IDE_REGISTER strIDEReg;
unsigned long ulBufSize;
unsigned char ucBuffer[512];
}IDE_PASSTHROUGH;

IDE_PASSTRHOUGH strIDE;
strIDE.bFeatures = 0x00; /* NA for ATA inquiry */
strIDE.bSectorCount = 0x00; /* NA for ATA inquiry */
strIDE.bSecrorNumber =0x01; /* NA for ATA inquiry, but set to 1 */
strIDE.bCylinderLow = 0x00; /* NA for ATA inquiry */
strIDE.bCylinderHigh = 0x00; /* NA for ATA inquiry */
strIDE.bDeviceHead = 0xA0; /* 1010 0000 let say CHS mode and master */
strIDE.bCommand = 0xEC;
strIDE.features = 0x00; /* NA for ATA inquiry */

/* send the command*/
status = DeviceIOControl( DeviceHandle, IOCTL_IDE_PASS_THROUGH,
&strIDE, sizeof(strIDE), /* input buffer and size */
&strIDE, sizeof(strIDE), /* output buffer and size */
&bytescopied, /* bytes copied to output buffer*/
False); /* no overlapping */
if(!status)
error handling
............

I don't know if this will help you, but I think the code sample has some
buffers, so maybe it's what you're looking for.

Regards
Jan Lenoch

icsi said:
dear all:

I know MS provide IOCTL_IDE_PASS_THROUGH controlcode to send ata
command from user interface.

but I test that it only can return data in registers,like return status
at bCommandReg (see below).

When I want a command with buffer that conntaining returned data or
send data. it will failed.

How to do then ?

Thanks.

THis is the structs I used.

typedef struct
{
UCHAR bFeaturesReg;
UCHAR bSectorCountReg;
UCHAR bSectorNumberReg;
UCHAR bCylLowReg;
UCHAR bCylHighReg;
UCHAR bDriveHeadReg;
UCHAR bCommandReg;
UCHAR bReserved;
} IDEREGS, *PIDEREGS;

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