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