M
Hallo.
Ich probiere mit IOCTL_ATA_PASS_THROUGH Befehle an die Disk zu senden. Das klappt für viele, aber nicht für alle. Wenn ich nämlich versuche LBA mit 48 bit zu nutzen und mehr als 256 Sektoren auszulesen (ATA Befehl 0x24 oder auch 0x29), dann wirft DeviceIoControl immer 87 (invalid parameter).
Also... sobald ich bei "PreviousTaskFile[1]" was einfülle, das nicht 0 ist (hier vermute ich, dass ich die oberen Bits der Anzahl Sektoren eintragen muss, die ich auslesen will), dann krachts... wobei, ok, stimmt nicht ganz... CurrentTaskFile[1] auf 0 und PreviousTaskFile[1] auf 1, das geht gerade noch (also 256)... aber alles andere > 256 geht nicht. Woran liegt das? Welche "Falle" hab ich vielleicht übersehen??
pCommand->AtaFlags = ATA_FLAGS_48BIT_COMMAND | ATA_FLAGS_DRDY_REQUIRED | ATA_FLAGS_DATA_IN;
// pCommand->AtaFlags |= ATA_FLAGS_NO_MULTIPLE; -> nützt auch nichts
pCommand->Length = sizeof(ATA_PASS_THROUGH_EX);
pCommand->DataTransferLength = 384 * 512;
pCommand->TimeOutValue = 2;
pCommand->DataBufferOffset = sizeof(ATA_PASS_THROUGH_EX);
// Anzahl Sektoren, die zu lesen sind
pCommand->CurrentTaskFile[1] = 0x80; // Count >> 0
pCommand->PreviousTaskFile[1] = 0x01; // Count >> 8
// Adresse
pCommand->CurrentTaskFile[2] = (ullAddress >> 0) & 0xff; // >> 0 von der Adresse
pCommand->CurrentTaskFile[3] = (ullAddress >> 8) & 0xff; // >> 8 von der Adresse
pCommand->CurrentTaskFile[4] = (ullAddress >> 16) & 0xff; // >> 16 von der Adresse
pCommand->PreviousTaskFile[2] = (ullAddress >> 24) & 0xff; // >> 24 von der Adresse
pCommand->PreviousTaskFile[3] = (ullAddress >> 32) & 0xff; // >> 32 von der Adresse
pCommand->PreviousTaskFile[4] = (ullAddress >> 40) & 0xff; // >> 40 von der Adresse
pCommand->CurrentTaskFile[5] = 0x40; // "Flag für LBA Modus" -> bzw. muss einfach 1 sein
// pCommand->CurrentTaskFile[5] |= 0xa0; // für LBA28 "empfohlen", aber obsolete
pCommand->CurrentTaskFile[6] = 0x24; // IDE_COMMAND_READEX - (READ SECTORS EXT)
::DeviceIoControl(hDisk, IOCTL_ATA_PASS_THROUGH, pCommand, sizeof(_ATA_PASS_THROUGH_EX), _raw_buffer, _sz_buffer, &bytes, NULL);
Rudolf