![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Dark Wanderer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 25.10.2004 Где: Кишинёв Репутация: нет Всего: нет |
Снова...Не могу найти.
--------------------
|
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
Читать SMART-атрибуты ты уже умеешь... Могу дать линк на список возможных атрибутов и их описание на русском: http://pcjs.chat.ru/smartdoc.html
Есть еще журналы и функции самоконтроля... Я этим не особо занимался... Но немного порывшись, выяснил, что: 1. Самоконтроль делается через SMART_EXECUTE_OFFLINE_IMMEDIATE ($D4). Посмотри как делается DoReadAttributesCmd, только вместо SMART_READ_ATTRIBUTE_VALUES ставить надо SMART_EXECUTE_OFFLINE_IMMEDIATE. В № сектора указывается № подфункции (тип теста)... Результаты сохранятся либо в каких-то атрибутах, либо в журнале... 2. Читать журналы нужно через READ LOG SECTOR ($D5): bSectorCountReg = 02 - первый сектор журнала, 03 - следующий сектор bSectorNumberReg = № журнала Описание журналов, форматов команд и регистров, атрибутов и др. можно найти на www.t13.org - поиском ищи, типа: http://www.google.com/search?hl=en&lr=&q=+...LOG&btnG=Search Это сообщение отредактировал(а) p0s0l - 1.3.2005, 15:56 -------------------- С уважением, г-н Посол. |
|||
|
||||
| Dark Wanderer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 25.10.2004 Где: Кишинёв Репутация: нет Всего: нет |
Спасибо p0s0l. Опять выручаешь! Сейчас буду пробовать.
--------------------
|
|||
|
||||
| Dark Wanderer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 25.10.2004 Где: Кишинёв Репутация: нет Всего: нет |
p0s0l очень прошу покажи пару примеров по запуска одного (любого)теста и чтения текущего состояния регистров винта ERR,BSY, ...
Я всю ночь убил читая всю документацию. Так и не дошло до меня как это делается. --------------------
|
|||
|
||||
| p0s0l |
|
||||||||||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
Интересно, что для посылки SMART-команды через DeviceIoControl, нужно заполнять структуру, содержащую IDE-регистры... На выходе же имеет некую структуру SENDCMDOUTPARAMS, в ней содержится структура DriverStatus... Вот как описывается она в MSDN:
Первые два поля - расписаны, остальные - зарезервированы... Но если на них посмотреть, то сразу же в глаза бросилось наличие двух очень знакомых байт - это $4F и $C2. Кто не знает - это значение, которое нужно заносить в регистр цилиндра при посылке любой SMART-команды... Также есть байтик $B0 - это код IDE-команды "SMART"... Байтик $A0 - это значение регистра "Drive/Head" при посылке SMART-команды... Т.е. было такое предположение: в этих байтах хранятся IDE-регистры... Но в итоге, всё-таки, получился облом - тут хранятся только SecNum, Cyl, Head/Dev (или всё вместе - LBA) и Error регистры, остальных - нет... Есть командочка RETURN STATUS, (регистр Feature = $DA), она возвращает IDE-регистры в структуре IDEREGS (в SENDCMDOUTPARAMS.bBuffer), но даже там нет нужного тебе регистра состояния... (хотя использовать RETURN STATUS для чтения регистров - бред, т.к. при посылке этой команды мы сами же и их изменяем...) Вопрос: зачем тебе нужно смотреть состояние регистров ? Ведь они постоянно меняются, т.к. программа работает в многозадачной среде... Поэтому понятие "текущее состояние" как-то не очень мне понятно... Если надо смотреть состояние регистров именно на этот момент времени - то это только через порты ввода-вывода. В NT'ях можно с помощью небольшого своего драйверочка разрешить своему процессу доступ к портам, тогда можешь прочитать регистры... Если же надо смотреть состояние регистров на момент окончания твоей команды (к примеру, SMART-команды), то через SMART_* IOCTL'ы это не сделать... Как-то видал IOCTL_IDE_PASS_THROUGH: посылается структура, содержащая IDEREGS, размер буффера и сам буффер... Никогда это не пробовал, поэтому даже не знаю, какие IDE-команды можно послать через IDE_PASS_THROUGH, в каких условиях это всё будет работать и т.д. Но можешь попробовать... Я так полагаю, что структура IDEREGS после выполнения IOCTL'а заполниться новыми значениями регитров... Возможно, сегодня-завтра сам попробую Ide Pass Through - самому интересно...
Читаем доку, к примеру, у меня есть по ATA4: SMART EXECUTE OFF-LINE IMMEDIATE Регистры на входе:
Мдя... Попробуй закачай описалово ATA5 или ATA6 (http://www.t13.org/project/d1410r3-ATA-ATAPI-6.zip) и погляди описание команды SMART... Где-то я видел, что вроде в Sector Number указывается № теста. Засовывай в регистры нужные значения, посылай через DFP_SEND_DRIVE_COMMAND - и усё Подкоманды (вернее, уже под-подкоманды) для SMART EXECUTE OFFLINE (которые нужно указывать в Sector Count, имхо): 0 - Выполнить Offline routine в фоновом режиме 1 - Выполнить Short Self-test в фоновом режиме 2 - Выполнить Extended Self-test в фоновом режиме 129 - Выполнить Short Self-test в монопольном режиме 130 - Выполнить Extended Self-test в монопольном режиме ... Сейчас проверил - запустил Short Self-Test, и всё ок SMART READ DATA во время теста в "Self-test execution status byte" крутило проценты завершенности У меня этот тест длился около 20-30 секунд... Extended тест не решился запустить... А вот 129 не пошло
Все остальные SMART-команды делаются аналогичным образом, только меняются значения в: bFeaturesReg - это может быть:
Остальные регистры - не изменются (bCylLowReg, bCylHighReg, bDriveHeadReg, bCommandReg) Если это команды $D0, $D1, $D5 - то делай DeviceIoControl (h, SMART_RCV_DRIVE_DATA, ...) иначе - DeviceIoControl (h, SMART_SEND_DRIVE_COMMAND, ...)
PS: возможно, я где-то что-то напутал, т.к. с доками разбирался навскорь... Тебе же нужно закачать доки по ATA с www.t13.org, почитать описание и форматы команд... Это сообщение отредактировал(а) p0s0l - 3.3.2005, 01:23 -------------------- С уважением, г-н Посол. |
||||||||||||||
|
|||||||||||||||
| Dark Wanderer |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 25.10.2004 Где: Кишинёв Репутация: нет Всего: нет |
Очень помог. С примерами всегда легче
А я то думал почему O&O Drive Lead устанавливает свой драйвер.
Интересно было, что делает мой винт Маленький вопросик по журналам: как получить кол-во журналов и прочитать нужный мне по его названию(названия нашёл на "http://pcjs.chat.ru/smartdoc.html"). Это сообщение отредактировал(а) Dark Wanderer - 3.3.2005, 23:37 --------------------
|
||||
|
|||||
| p0s0l |
|
||||||||||||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
Назначения журналов определяется по таблице (см. доки по ATA)... У меня есть на винте дока по ATA-8, в предыдущих ATA поменьше будет этих журналов:
К примеру, журнал №1 - Summary SMART error log:
Журнал 02h Comprehensive SMART error log - тоже наподобие первого журнала, формат полностью совпадает, только если первый журнал мог занимать только 1 сектор, то этот - до 51 секторов (51*5 = 515 ошибок хранит)... Журнал 03h Extended Comprehensive SMART error log тоже хранит ошибки, только для 48-битной адресации (01 и 02 журналы - 24-битная адресация)... Про остальные - почитай сам Некоторые журналы читаются через SMART READ LOG команду, некоторые - через READ LOG EXT, а некоторые могут и теми и другими командами читаться... Смотри описание команды SMART, подфункция READ LOG... Там описаны SMART-Logging журналы... Также смотри описание (если тебе нужны эти журналы) команды READ LOG EXT (это не подфункция команды SMART, а отдельная команда), там описаны General Purpose Logging журналы... -------------------- С уважением, г-н Посол. |
||||||||||||||
|
|||||||||||||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
Во, держи, накатал пример чтения LOG-сектора.
Только не все винты ведут журнал, так что может быть и облом... В данном случае используется IDE PASS THROUGH... Через SMART IOCTL чтение журнала не идёт... Могу показать как делать через SCSI MINIPORT, но через минипорт у меня получалось читать только первые сектора журналов... Если же использовать IDE PASS THROUGH, то вроде читаются все сектора, но фиг знает... больно уж они у меня были пустые... Может так и надо, а может это глюки IDE PASS THROUGH... Пытался еще через SPTI, команда ATA PASS THROUGH, но чего-то не вышло Осталось еще для кучи попробовать ATA PASS THROUGH (но, если верить слухам, в Win2kSP1..SP4, XP и XPsp1 это глючно работает или вообще не работает) и ATA PASS THROUGH команду через ASPI...
Добавлено @ 20:07 Еще бы почитать доки по SCSI... Как через него использовать SMART (если возможно) ? (без ATA PASS THROUGH)... -------------------- С уважением, г-н Посол. |
|||
|
||||
| Dark Wanderer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 25.10.2004 Где: Кишинёв Репутация: нет Всего: нет |
Ты был прав большая часть действительно пустые. Почитаю документацию и помотрю почему. Это сообщение отредактировал(а) Dark Wanderer - 6.3.2005, 15:15 --------------------
|
|||
|
||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
У меня к примеру, SMART-журналов только 2: 1-ый и 2-ой 1-ый - он всегда 1 сектор 2-ой - пять секторов: первый сектор - полный, второй - полупустой, остальные - пустые... Еще фишка такая: если хочешь прочитать три сектора, то в буфере надо выделять не 512*3 байтов, а (512*3 + 3) байтов... 4 сектора = (512*4 + 5) байтов 5 секторов = (512*5 + 7) байтов... Иначе DeviceIoControl возвращает True, но буфер ничем не заполняется! Странно это, на сектор не 512 байт надо, а 514... и причем это не относится к первому сектору... А на счёт пустоты - это нормально... К примеру, первый сектор содержит следующее: 01 07 00 00 ... 01 - версия журнала 07 - № записи в журнале, соотвествующей самой недавней ошибке... т.е. у меня всего 7 ошибок было... Также есть поле: 'Device error count', оно тоже содержит 7... Вот, написал просмотрщик журнала "Comprehensive Error Log" (№2):
-------------------- С уважением, г-н Посол. |
||||
|
|||||
| Dark Wanderer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 25.10.2004 Где: Кишинёв Репутация: нет Всего: нет |
Не могу понять почему не работает процедура
Запускаю эту процедуру по таймеру 100ms и пытаюсь прочитать процент выполнения теста "Short Self-Test". Тест запускается (точно), но при попытке чтения прогресса все байты от 1..511 пустые. --------------------
|
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
Потому что на выходе требуется не просто array [0..511] of byte, а SENDCMDOUTPARAMS... При чем надо задавать на входе размер выходного буфера (хотя и без этого работает...):
-------------------- С уважением, г-н Посол. |
|||
|
||||
| Dark Wanderer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 25.10.2004 Где: Кишинёв Репутация: нет Всего: нет |
Всё заработало! Спасибо!
--------------------
|
|||
|
||||
| Dark Wanderer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 25.10.2004 Где: Кишинёв Репутация: нет Всего: нет |
Не хотел создавать новой темы поэтому решил спросить здесь. Понадобилось програмно узнать куда винт подключён (master/slave...).
Посмотрел доки по ATA (ATA-6), но там про это даже ничего не сказано. Решил закачать новые(ATA-8) на T13, но и там ничего не нашёл. Как это можно сделать? --------------------
|
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
$01 - ATA Primary Master $02 - ATA Primary Slave $04 - ATA Secondary Mastera $08 - ATA Secondary Slave $10 - ATAPI Primary Master $20 - ATAPI Primary Slave $40 - ATAPI Secondary Master $80 - ATAPI Secondary Slave Но, насколько я слышал, такой способ определения не всегда будет работать... вернее работать будет, но определяться будет неправильно... У себя сейчас проверил (XP) - Primary Master выдал 04 Тогда можно еще через ASPI - первые два SCSI-контроллера соответствуют Primary и Secondary IDE-контроллерам (Adapter=0 и Adapter=1), а устройство (Target) определяет Master это (0) или Slave (1)... -------------------- С уважением, г-н Посол. |
|||
|
||||
| Dark Wanderer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 25.10.2004 Где: Кишинёв Репутация: нет Всего: нет |
p0s0l Можешь поподробней про ASPI и SCSI. Доки, линки. Вобщем, что есть.
Это сообщение отредактировал(а) Dark Wanderer - 31.3.2005, 12:23 --------------------
|
|||
|
||||
| Dark Wanderer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 25.10.2004 Где: Кишинёв Репутация: нет Всего: нет |
p0s0l Выполнил твой код и получил 33
Вобщем если кто интересуется данным вопросом кроме меня отрыл немного инфы в архиве: http://www.zianet.com/jgray/dat/files/ASPISDK.exe --------------------
|
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
ASPI - в принципе, хватит и того, что ты уже нашёл но есть кое-что и для delphi: http://www.torry.net/authorsmore.php?id=19...1931ca762e50f84 -------------------- С уважением, г-н Посол. |
|||
|
||||
| Dark Wanderer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 119 Регистрация: 25.10.2004 Где: Кишинёв Репутация: нет Всего: нет |
Круто! Иду разбираться
Реально ли прочитать те же SMART атрибуты только через ASPI? Это сообщение отредактировал(а) Dark Wanderer - 5.4.2005, 17:09 --------------------
|
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
Если проверишь - обязательно дай знать -------------------- С уважением, г-н Посол. |
|||
|
||||
| falcon39 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 103 Регистрация: 21.6.2004 Репутация: нет Всего: 0 |
Как узнать температуру диска я узнал. А как узнать температуру процессора и чипсета?
--------------------
|
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |