IDE READ NATIVE MAX ADDRESS

Тема в разделе "WASM.WIN32", создана пользователем Cneg, 14 ноя 2007.

  1. Cneg

    Cneg New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    78
    Есть функция, которая посылает ЖД (IDE/ATA) команду IDENTIFY DEVICE.
    Код (Text):
    1. BOOL DoIDENTIFY (HANDLE hPhysicalDriveIOCTL, PSENDCMDINPARAMS pSCIP,
    2.                  PSENDCMDOUTPARAMS pSCOP, BYTE bIDCmd, BYTE bDriveNum,
    3.                  PDWORD lpcbBytesReturned)
    4. {
    5.       // Set up data structures for IDENTIFY command.
    6.    pSCIP -> cBufferSize = IDENTIFY_BUFFER_SIZE;
    7.    pSCIP -> irDriveRegs.bFeaturesReg = 0;
    8.    pSCIP -> irDriveRegs.bSectorCountReg = 1;
    9.    //pSCIP -> irDriveRegs.bSectorNumberReg = 1;
    10.    pSCIP -> irDriveRegs.bCylLowReg = 0;
    11.    pSCIP -> irDriveRegs.bCylHighReg = 0;
    12.  
    13.       // Compute the drive number.
    14.    pSCIP -> irDriveRegs.bDriveHeadReg = 0xA0 | ((bDriveNum & 1) << 4);
    15.  
    16.       // The command can either be IDE identify or ATAPI identify.
    17.    pSCIP -> irDriveRegs.bCommandReg = bIDCmd;
    18.    pSCIP -> bDriveNumber = bDriveNum;
    19.    pSCIP -> cBufferSize = IDENTIFY_BUFFER_SIZE;
    20.  
    21.    return ( DeviceIoControl (hPhysicalDriveIOCTL, DFP_RECEIVE_DRIVE_DATA,
    22.                (LPVOID) pSCIP,
    23.                sizeof(SENDCMDINPARAMS) - 1,
    24.                (LPVOID) pSCOP,
    25.                sizeof(SENDCMDOUTPARAMS) + IDENTIFY_BUFFER_SIZE - 1,
    26.                lpcbBytesReturned, NULL) );
    27. }
    Возвращается 512 байтная структура с разной информацией о ЖД.
    Код (Text):
    1. typedef struct _IDSECTOR
    2. {
    3.    USHORT  wGenConfig;
    4.    USHORT  wNumCyls;
    5.    USHORT  wReserved;
    6.    USHORT  wNumHeads;
    7.    USHORT  wBytesPerTrack;
    8.    USHORT  wBytesPerSector;
    9.    USHORT  wSectorsPerTrack;
    10.    USHORT  wVendorUnique[3];
    11.    CHAR    sSerialNumber[20];
    12.    USHORT  wBufferType;
    13.    USHORT  wBufferSize;
    14.    USHORT  wECCSize;
    15.    CHAR    sFirmwareRev[8];
    16.    CHAR    sModelNumber[40];
    17.    USHORT  wMoreVendorUnique;
    18.    USHORT  wDoubleWordIO;
    19.    USHORT  wCapabilities;
    20.    USHORT  wReserved1;
    21.    USHORT  wPIOTiming;
    22.    USHORT  wDMATiming;
    23.    USHORT  wBS;
    24.    USHORT  wNumCurrentCyls;
    25.    USHORT  wNumCurrentHeads;
    26.    USHORT  wNumCurrentSectorsPerTrack;
    27.    ULONG   ulCurrentSectorCapacity;
    28.    USHORT  wMultSectorStuff;
    29.    ULONG   ulTotalAddressableSectors;
    30.    USHORT  wSingleWordDMA;
    31.    USHORT  wMultiWordDMA;
    32.    BYTE    bReserved[128];
    33. } IDSECTOR, *PIDSECTOR;
    В итоге можно получить максимальное количество секторов адресуемых пользователем (ulTotalAddressableSectors - слова 60-61).
    Код (Text):
    1. sectors = diskdata [61] * 65536 + diskdata [60];
    2.         bytes = sectors * 512;
    Так вот есть ещё такая команда READ NATIVE MAX ADDRESS (0xF8), с помощью которой можно получить заводское количество секторов (может отличаться от макс. кол-ва секторов доступных пользователю при наличии Host Protected Area).
    Не могу вкурить...
    1. Как правильно посылать эту команду ЖД. (У меня почему то ничего не возвращается)
    2. Куда вернётся это значение (в спецификации нашёл пометки что в регистры IDE, но там написано только про 28 битную адресацию... сам пытался, регистры не изменяются)
    3. Приветствуется любая помощь, если кто занимался этим.. в использовании команд ATA SET_MAX_ADDRESS, DEVICE_CONFIGURATION_IDENTIFY и иже с ними.

    Заранее благодарен!
     
  2. Cneg

    Cneg New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    78
  3. HCode

    HCode New Member

    Публикаций:
    0
    Регистрация:
    21 янв 2006
    Сообщения:
    72
    C помощью такого управляющего кода ничего не получиться.
    Попробуй - IOCTL_ATA_PASS_THROUGH.
     
  4. Cneg

    Cneg New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    78
    HCode
    мда всё правильно, спасибо
     
  5. Cneg

    Cneg New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    78
    Нет ни у кого документации по формату ATA команд при 48-битной адресации? (IDENTIFY_DEVICE, READ_NATIVE_MAX_ADDRESS... конкретно что в какие регистры писать) для 28-битной с горем пополам нашёл какой-то старый мануал от Hitachi за 2000 год, а более нового нет..
     
  6. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Cneg

    Information Technology - AT Attachment with Packet Interface

    http://www.t13.org

    Это официально.
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Для 48битной адресации используется READ NATIVE MAX ADDRESS EXT. Описание команды можно посмотреть в стандарте, на сайте, указанном PROFi.
     
  8. Cneg

    Cneg New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    78
    Вопрос в продолжении темы..
    Если командой SET_MAX_ADDRESS установить ulTotalAddressableSectors меньше значения, которое возвращает команда READ NATIVE MAX ADDRESS (то есть установить область HPA в конце диска), то новое значение почему то вступает в силу только после перезагрузки. То есть чтобы избежать перезагрузки необходимо произвести сброс устройства (жёсткого диска) командой DEVICE_RESET? Что именно происходит при этой команде с устройством я так и не разобрался и можно ли так сбросить системный диск?
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Служит для перезагрузки оптических дисков в случии сбоя. У жестких такой команды нет у них есть порт для этого дела. Подробнее в читай в спецификациях на ATA/ATAPI сылку на сайт тебе дали.