IOCTL_ATA_PASS_THROUGH wirft Fehler



  • 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


Anmelden zum Antworten