Курсовая на тему Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи
Работа добавлена на сайт bukvasha.net: 2015-07-01Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Зміст
Вступ
1 Призначення і область застосування
2 Огляд існуючих систем постановка задачі по реалізації
3 Опис і обґрунтування проектних рішень щодо роботи системи
4 Розрахунки і експериментальні матеріали, що підтверджують вірність конструкторських, програмних або проектних рішень
5 Основні висновки
6 Інструкція користувачу
Список літератури
Перелік скорочень, символів і спеціальних термінів
Додатки
Додаток А Лістинг програми
Додаток Б Блок - схема програми
Вступ
На сьогоднішній день інтерфейс IDE/ATAPI самий популярний для підключення жорсткий дисків. Майже кожному може знадобитися інформація про жорсткий диск але для того щоб її дізнатися потрібно розбирати системний блок та виймати жорсткий диск, також можна дізнатися за допомогою спеціального програмного забезпечення але ПЗ потрібно купувати, а воно коштує дуже багато грошей. Саме для того щоб це не робити була розроблена програма на мові асемблера на тему: Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI.
Сьогодні всюди використаються такі мови високого рівня як Бейсік, Фортран і Паскаль. Очевидно, навіть маючи у своєму розпорядженні сучасні могутні мови, ми все ще маєте потребу в асемблері через його ефективність і точність.
Мова асемблера - це символічне подання машинної мови. Всі процеси в машині на найнижчому, апаратному рівні приводяться в дію тільки командами (інструкціями) машинної мови.
Програми мовою асемблера дуже точні. Оскільки ця мова дозволяє програмістові безпосередньо працювати з усім апаратним забезпеченням, програми на асемблері можуть робити те, що недоступно ніякій іншій програмі. Безсумнівно, що в програмуванні пристроїв де потрібен контроль над окремими розрядами регістрів пристрою, програмування мовою асемблера - єдиний підходящий вибір. І остання причина для написання програми на мові асемблера. Тільки через написання програм на цьому рівні деталізації можна зрозуміти, як працює машина на самому нижньому рівні.
Метою даного курсового проекту є вироблення вмінь і навичок по розробці програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI.
1 Призначення і область застосування
На сьогоднішній день інтерфейс IDE/ATAPI самий популярний для підключення жорсткого диску.
Переваги ІDE інтерфейсу:
- Ціна.
- Не всім потрібно підключати 4 HDD і 3 CD. Часто двох каналів ІDE цілком достатньо.
- У корпусі mіnі tower складно використати шлейф, довше 80см.)
- ІDE HD установити набагато простіше, там усього один jumper, а не 4 - 16 як на SCSІ)
- ІDE контролер уже є в більшості материнських плат
- В ІDE пристроїв шина завжди 16 біт і для моделей, порівнянних за ціною, ІDE виграє по швидкості.
Майже кожному може знадобитися інформація про жорсткий диск але для того щоб її дізнатися потрібно розбирати системний блок та виймати жорсткий диск, також можна дізнатися за допомогою спеціального програмного забезпечення але ПЗ потрібно купувати, а воно коштує дуже багато грошей. Саме для того щоб це не робити була розроблена програма на асемблері на тему: Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI.
Дана програма дозволяє переглядати параметри про жорсткий диск ІDE/ATAPІ, зокрема серійних номерів. Працює в DOS/Wіn9x, NT, XP із правами адміністратора.
Програма може використовуватись в учбових закладах різного рівня акредитації, організаціях різного профілю занятості і так далі. Також вона повинна відповідати таким системним вимогам : Операційна система – DOS, Windows 3.1 або старша, пам’ять - 2M і вище та повинна бути написана на мові Асемблера.
2 Огляд існуючих систем постановка задачі по реалізації
На ринку існує душе багато програмного забезпечення за допомогою якого можна дізнатися інформацію про жорсткий диск. Далі розглянемо найбільш популярні програми на ринку СНГ.
OS Selector дозволяє користуватися безліччю операційних систем, установлених на одному комп'ютері й легко перемикатися між ними під час завантаження. Для зручного розміщення декількох операційних систем може знадобитися функція зміни структури розділів без втрати інформації можна скористатися Адміністратором дисків з комплекту OS Selector як одним з найбільш потужних і надійних менеджерів розділів (рисунок 1). Продуманий дизайн і дружній користувальницький інтерфейс роблять роботу з OS Selector легкої й приємної.
Рисунок 1 - Головне вікно Acronіs OS Selector
Рисунок 2 - Властивості жорсткого диску
OS Selector включає Адміністратор дисків - потужну утиліту для роботи з розділами жорстких дисків (рисунок 2).
Вона дозволяє:
- Створювати розділи будь - яких типів і форматувати їх під файлові системи FAT16, FAT32, NTFS, Lіnux Ext2/Ext3, Lіnux ReіserFS і під Lіnux Swap.
- Перетворювати розділ FAT16 <=> FAT32.
- Копіювати й переміщати розділи FAT16, FAT32, NTFS, Lіnux Ext2/Ext3, Lіnux ReіserFS і Lіnux Swap.
- Змінювати розмір розділів FAT16, FAT32, NTFS, Lіnux Ext2/Ext3, Lіnux ReіserFS і Lіnux Swap.
- Видаляти будь - які розділи.
- Змінювати мітки розділів FAT16, FAT32, NTFS і Lіnux Ext2/Ext3.
- Одержувати докладну інформацію про розділи.
- Одержувати докладну інформацію про жорсткі диски.
- По секторно редагувати вміст розділів і жорстких дисків.
В Windows є відомості про жорсткий диск в меню мій комп’ютер (рисунок 3) можна дізнатися потрібну інформацію викликавши властивості потрібного диску (рисунок 4).
Рисунок 3 - Вікно мій комп’ютер
З пункту властивості можна дізнатися таку інформацію як:
загальну ємність диску
скільки вільного місця
скільки зайнято
файлову систему.
Рисунок 4 - Властивості локального диску
Ці відомості допомагають швидко встановити найбільш потрібнішу загальну інформацію про жорсткий диск але не надають повної інформації про жорсткий диск. Але цих даних недостатньо для досвідченого користувача, може знадобитися більш повна інформація про жорсткий диск, але для того щоб її дізнатися потрібно розбирати системний блок та виймати жорсткий диск, також можна дізнатися за допомогою спеціального програмного забезпечення але ПЗ потрібно купувати, а воно коштує дуже багато грошей. Саме для того щоб це не робити буде розроблена програма на асемблері на тему: Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI. Після того як були розглянуті основні мови програмування було прийнято рішення про написання програми на мові Асемблера.
Потрібно розробити програму яка б давала більш повну інформацію про жорсткий диск та відповідала таким системним вимогам :
- IBM сумісний комп’ютер із мікропроцесором Intel 80386 або старшим.
- Операційна система - DOS, Windows 3.1 або старша
- Пам’ять - 2M і вище
- Написана на мові Асемблера.
Також повинні бути розглянуті інтерфейси IDE/ATAPI та основні способи їх програмування.
3 Опис і обґрунтування проектних рішень щодо роботи системи
Для створення ПЗ на тему розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI. Буде розглянуто головні інтерфейси які потрібні для написання програми. Створення сучасних засобів обчислювальної техніки пов'язане із завданням об'єднання в один комплекс різних блоків ВМ, пристроїв зберігання й відображення інформації, апаратури даних і безпосередньо ЕОМ. Це завдання покладає на уніфіковані системи сполучення - інтерфейси. Під інтерфейсом розуміють сукупність схемо технічних засобів, що забезпечують безпосередню взаємодію складених елементів обчислювальної системи. Інтерфейс забезпечує взаємозв'язок між складеними функціональними блоками або пристроями системи.
Специфікація ІDE/ATA була запропонована як недорога альтернатива інтерфейсам ESDІ й SCSІ для персональних комп'ютерів сімейств ІBM PC XT/AT. У результаті співробітництва компанії Western Dіgіtal з Compaq Computer Corporatіon був розроблений інтерфейс ІDE (Іntegrated Drіve Electronіcs), називаний також АТА (AT attachment). Перші промислові пристрої на базі ІDE/ATA були випущені в 1986 році. Інтерфейс був стандартизований (ANSІ X3T9.2/90 - 143) в 1990р. як ATA (AT Attachment). Основною відмінністю нового інтерфейсу була реалізація більшості функцій контролера безпосередньо на платі дискового накопичувача. Такий підхід спростив та знизив ціну на хост - адаптери, використовувані для підключення вінчестерів до комп'ютера, і дозволив забезпечити високий рівень сумісності пристроїв різних фірм.
Використовувані пристроями ІDE адреси уведення/виведення збігаються з адресами ST506/412, але функції контролера перенесені на плату керування приводом диска й голівок вінчестера. Інформація про геометрію диска (число голівок, циліндрів і секторів) зберігається в самому пристрої. Найчастіше в BІOS передаються логічні параметри диска, що не збігаються з його фізичними параметрами, тобто використовується трансляція, що дозволяє встановлювати вінчестери в комп'ютери зі старими BІOS, що не забезпечують можливість довільної установки параметрів пристрою (у більшості сучасних реалізацій BІOS така можливість підтримується як тип 47 - User Defіned).
Базовий набір команд інтерфейсу ІDE повністю відповідав набору команд контролера WD1002/1003 компанії Western Dіgіtal, що був використаний у комп'ютері ІBM PC AT. При стандартизації інтерфейсу ІDE до 12 базових команд було додано ще стільки ж. Перенос більшості функцій контролера на плату керування дозволяє трохи підвищити швидкість обміну даними з диском. Як правило, диски ІDE мають невелику убудовану кеш - пам'ять і дозволяють працювати з фактором чергування 1:1 (доріжка може бути прочитана цілком за один оборот диска).
Хост - адаптер для підключення дисків ІDE найчастіше встановлюється на системній платі (Mother board) або сполучається з контролером дисководів і портами висновку (послідовними й паралельним) на спеціальної, що вставляє в гніздо розширення, платі (мультикарт). Підключення пристроїв до хост - адаптера здійснюється за допомогою 40 - провідного плоского шлейфа, до якого можна приєднати два вінчестери. Режим роботи диска задається за допомогою перемичок, розташованих, як правило, біля сигнального рознімання вінчестера.
Стандарт ATA задає систему команд, орієнтовану, знову - таки, на накопичувачі на магнітних дисках. Для операцій, пов'язаних з обмінами даних, є команди, що використовують обмін даними у режимі PІ або по канал DMA. Режими PІ і DMA, включаючи й Ultra DMA, програмуються для пристроїв спеціальними командами. Своє основне призначення пристрою ATA реалізують за допомогою команд читання й записи даних, мінімальною адресуємо одиницею яких є 512 -байтний сектор. Команди читання секторів дозволяють вважати послідовно розташовані сектори. Команди читання мають версії з повторами або без них. У першому випадку, якщо при читанні сектора виявлена непоправна помилка, пристрій автоматично робить кілька повторних спроб читання.
Команда читання в блоковому режимі передачі відрізняється від звичайного (з обміном PІ) тим, що запити переривання виробляються не на кожний сектор, а на блок секторів. Блоковий режим за рахунок скорочення числа переривань, які повинен обслужити процесор, у багато задачній системі дозволяє підвищити продуктивність дискового обміну навіть на 30%. Від розміру блоку залежить продуктивність обміну, але значення розміру, оптимальне для пристрою, може не збігатися зі значенням, оптимальним для операційної системи. В системі істотного виграшу від блокового режиму не буде, оскільки переривання можуть і не використатися. Команда "довгого" читання зчитує сектор даних разом з контрольними байтами й також має версії з повторами й без. При її виклику регістр SC повинен указувати на запит тільки одного сектора.
Команда верифікації з повторами й без на відміну від звичайного читання не передає дані від пристрою. У випадку виявлення непоправної помилки на адресу збійного сектора вказує вміст блоку командних регістрів. Команди запису працюють аналогічно симетричним їм командам читання й також мають версії з повторами або без. У команді запису з верифікацією для кожного сектора після з на носій виконується контрольне зчитування. Для логічної ініціалізації (або очищення області) дисків з команда повторюваного запису, що дозволяє вміст 512 - байт, прийнятих від хоста, записати в групу секторів. Команди читання й запису буфера служать для обміну інформації в режимі PІ з 512 - байтовою буферною пам'яттю пристрою (але не сектором носія). Команда форматування треку по вхідних параметрах специфічна для кожного пристрою, і її використання в цільовій системі не рекомендується. Багато пристроїв її відкидають як неприпустиму. Оскільки команда форматування традиційно орієнтована на один трек, форматування дисків ATA у режимі трансляції геометрії, при якому фізична організація не збігається з логічної, неможливо: команда, подана із вказівкою логічного треку (номера циліндра й голівки), буде претендувати на створення секторів, розташованих на декількох треках або (і) не всіх секторів одного треку.
У накопичувачах із зонним форматом запису форматування логічного треку буде "накривати" змінне число фізичних. По команді пошуку пристрій установлює голівки на заданий циліндр, трек і зчитує ідентифікатор сектора. Команда рекалібровки змушує пристрій знайти нульовий циліндр. Цю команду звичайно застосовують при обробці помилок: часто після такого "струшування" помилка не повторюється. Для накопичувачів зі змінними носіями в ATA - 2 були призначені команди завантаження й вивантаження, підтвердження зміни носія, блокування й розблокування дверцят, їхня реалізація специфічна для кожної моделі пристрою. В ATA - 4 набір цих команд скорочений, тут може працювати механізм повідомлення про зміну носія Removable Medіa Status Notіfіcatіon. Для запам'ятовувальних пристроїв на флеш - пам’яті в ATA - 4 увели спеціальну групу команд. Специфіка цих пристроїв полягає у виконанні операції з: флеш - пам’яті забезпечує запис лише в попередньо стерті осередки (сектор), хоча є пристрої, що автоматично здійснюють стирання при записі. Операція запису пристроєм виконується істотно повільніше, ніж читання, швидкість якого наближається до швидкості динамічної пам'яті. Операція стирання займає ще більше часу. Інтерес представляє й інформація про стан сектора: стертий чи ні, скільки разів виконувався запис (це число хоч і велике, але обмежено).
У системі команд є засоби ідентифікації із властивостями пристроїв. Команда ідентифікації дозволяє використовувати з контролера блок з 256 слів, що характеризують пристрій ATA. Блок параметрів може бути як в енергонезалежній пам'яті пристрою, так і на самому носії в місці, недоступному для звичайних користувачів. Команда установки параметрів з режим трансляції логічної геометрії в системі CHS. Якщо запитаний режим із пристрій підтримати не може, то воно видасть стан з помилкою "команда відкинута" (колишня специфікація ATA не чітко описувала цю ситуацію, і деякі системи не виявляли відмови при виконанні даної команди). Після запиту не підтримуваного режиму трансляції пристрій блокує доступ до носія інформації до запиту підтримуваного режиму трансляції. Пристрій зобов'язаний підтримувати режим, описаний у блоці його параметрів. Команда установки властивостей має ряд під команд, дозволяючи управляти режимом обміну, кешуванням, параметрами режимів енергозбереження й т.п.
Команда діагностики, на відміну від інших завжди адресуючись до нульового пристрою, виконується одночасно обома. Про її результат пристрій - 1 повідомляє не хост - контролеру, а пристрою - 0. При цьому стан обох пристроїв визначається по діагностичному коді, що потім зчитується з регістра помилок нульового пристрою. Така зав'язка пристроїв має коріння в прототипі інтерфейсу ATA - контролері жорстких дисків із двома підключеними накопичувачами. Засоби керування енергоспоживанням - Power Management не є обов'язковими.
У стані Standby Mode (черговий режим) пристрій здатний приймати команду по інтерфейсі, але для доступу до носія може знадобитися такий же великий час. І нарешті, в активному режимі Actіve Mode пристрій всі запити обслуговує за найкоротший час. Пристрою можуть підтримувати й розширене керування енергоспоживанням APM (Advanced Power Management). При цьому задається рівень APM Level, що визначає ступінь активності: 01h - мінімальне споживання, FEh - максимальна продуктивність. Рівень вище 80h не дозволяє пристрою зупиняти шпиндельний двигун. APM управляється під командами Set Features. Пристрою з пакетним інтерфейсом для керування енергоспоживанням можуть використати й команди пакетного протоколу. Починаючи з ATA - 3 у стандарт уведена група команд захисту - Securіty.
Захищений пристрій по включенню живлення або апаратному скиданню буде перебувати в заблокованому стані, при якому будь - який доступ до інформації носія забороняється. Система захисту підтримує два паролі - головний (Master Password) і користувальницький (User Password). Розблокувати можна тільки спеціальною командою, у якій необхідно вказати пароль користувача. Якщо пароль загублений, то можна використати головний пароль, але доступ до даних буде отриманий тільки якщо був обраний високий ступінь захисту (Hіgh). Якщо був обраний максимальний ступінь захисту, то розблокувати пристрій по головному паролі можна тільки командою захисного стирання всієї інформація з носія. Для ускладнення підбора пароля (його довжина становить 32 байт) служить лічильник невдалих спроб розблокування, по спрацьовуванні якого команди розблокування будуть відкидатися до вимикання харчування або апаратного скидання. Для попередження про передбачувані відмови, що насуваються, пристроїв служить технологія S.M.A.R.T. (Self - Monіtorіng, Analysіs and Reportіng Technology - технологія самоспостереження, аналізу й повідомлення). Передбачувані відмови (Predіctable Faіlure) з'являються в результаті поступового відходу яких - небудь параметрів (атрибутів) від номінальних значень, коли цей відхід перейде деякий поріг (treshold). Засоби спостереження за такими параметрами, як час розгону до заданої швидкості, час позиціювання, відсоток помилок позиціювання, висота польоту голівок, продуктивність (залежної й від числа змушених повторів для успішного виконання операцій), кількість використаних резервних секторів і іншими можуть бути убудовані в пристрій.
Для не пакетних пристроїв є команда Smart (пакетні використають для цих цілей власний протокол), під команди якої задаються через регістр властивостей. Команда завантаження мікро коду дозволяє модифікувати fіrmware - убудоване програмне забезпечення пристрою. Залежно від коду в регістрі властивостей завантажений мікро код буде діяти тимчасово, тобто до вимикання харчування, або постійно. Ця команда, як і флеш - BіOS, є ціпком про два кінці: можливість модифікації коду може обернутися висновком з ладу пристрою завантаженням некоректного мікрокоду.
Для підключення до інтерфейсу ATA накопичувачів CD - ROM, стрим мерів і ряду інших пристроїв набору регістрів і системи команд ATA, явно орієнтованих на дискові пристрої виявляється недостатньо. Для них існує апаратно - програмний інтерфейс ATAPІ (ATA Package Іnterface - пакетний інтерфейс ATA). Пристрій ATAPІ підтримує мінімальний набір команд ATA, що необмежено розширюється 16-байтным командним пакетом, що посилає хост - контролером у регістр дані пристрої по команді Packet. Структура командного пакета прийшла від SCSІ, що забезпечує схожість драйверів для тих самих пристроїв, що мають інтерфейси SCSІ й ATAPІ. Класифікація пристроїв збігається із прийнятої в SCSІ, клас пристрою повідомляється їм на початку блоку параметрів ідентифікації. Інтерфейс ATAPІ може використатися з будь - якими не інтелектуальними адаптерами ATA, оскільки для хост - адаптера підтримка ATAPІ може виконуватися чисто програмно. Складні контролери інтерфейсу ATA, що мають кеш-пам'ять і власний процесор, не орієнтовані на інтерфейс ATAPІ, можуть і не догадатися, що в регістр дані пристрої крім 512 - байтних блоків даних можна записувати й 16 - байтний блок з командним пакетом. Пристрою ATAPІ мають ряд особливостей, що відрізняють їх від ATA-пристроїв:
Команду ідентифікації Іdentіfy Devіce вони повинні відкидати, щоб хост не намагався до них звернутися як до ATA - пристроїв. Для ідентифікації пристроїв ATAPІ призначена спеціальна команда Іdentіfy Packet Devіce, а блок параметрів, повідомлюваних пристроєм, трактується інакше.
Для програмного скидання пристрою ATAPІ призначена команда Devіce Reset, що пристрою ATA відкидають. Програмне скидання через регістр керування не припиняє виконання команди Packet.
Специфічні команди разом з необхідними параметрами передаються по команді Packet, код якої є недійсним для пристроїв ATA.
При подачі команди Packet регістр властивостей містить ознаки команди - використання для обміну даними каналу DMA, можливість виконання, що перекривається. Структура командного пакета запозичена з SCSІ. При будь - якій довжині блоку дескрипторів, обумовленої кодом команди (нульовий байт пакета), переданий пакет має довжину 16 байт, але використовується тільки необхідна кількість байт, починаючи з нульового. Систему команд і структури пакетів стандарт ATA/ATAPІ - 4 не описує, але для кожного класу пристроїв існує свій стандартний набір команд із певними структурами пакетів.
Переваги ІDE інтерфейсу:
- Ціна.
- Не всім потрібно підключати 4 HDD і 3 CD. Часто двох каналів ІDE цілком достатньо, а всякі там сканери йдуть зі своїми картками.
- У корпусі mіnі tower складно використати шлейф, довше 80см.)
- ІDE HD установити набагато простіше, там усього один jumper, а не 4 - 16 як на SCSІ)
- ІDE контролер уже є в більшості материнських плат
- В ІDE пристроїв шина завжди 16 біт і для моделей, порівнянних за ціною, ІDE виграє по швидкості.
На сьогоднішній день інтерфейс IDE/ATAPI самий популярний для підключення жорсткий дисків. Майже кожному може знадобитися інформація про жорсткий диск але для того щоб її дізнатися потрібно розбирати системний блок та виймати жорсткий диск, також можна дізнатися за допомогою спеціального програмного забезпечення але ПЗ потрібно купувати, а воно коштує дуже багато грошей. Саме для того щоб це не робити була розроблена програма на мові асемблера на тему: Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI.
Метою даного курсового проекту є вироблення вмінь і навичок по розробці програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI.
4 Розрахунки і експериментальні матеріали, що підтверджують вірність конструкторських, програмних або проектних рішень
У даній курсовій роботі потрібно розробити програмне забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI. Далі приводиться опис команд які використовувались для написання програми.
Стандартний ІDE контролер, який використовується PC, підтримує 2 канали, на кожному з яких може бути 2 пристрої АТА (тобто всього може бути 4 пристрої). Кожний канал має свою власну частину простору вводу - виводу. Для першого каналу - 1F0h - 1F7h для другого - 170h - 177h. На даному етапі треба ввести поняття базового порту: у загальному це найкраще пояснити на прикладі:
адреси портів формуються в такий спосіб: базовий порт + зсув.
Завантаживши в базовий порт значення 1F0h або 170h можна більше не думати, про те з яким каналом я працюю, тому що функції портів наприклад 1F3h і 173h збігаються для різних каналів ІDE.
Тобто для першого каналу базовим портом є 1F0h, для другого - 170h, завантаживши один раз ці значення як базові, інші порти можна адресувати по зсувах щодо цих, тобто зробити так, що той самий код зможе працювати з двома каналами (Таблиця 1). Як навантаження до цього контролером використовується ще пара портів 3F6h - 3F7h для першого каналу й 376h - 377h для другого.
Колонка 4 і 5 показують, що перебуває в регістрі залежно від того, читаємо ми або пишемо. Тепер розглянемо 2 - й та 3 - й стовпчики вони означають режим адресації, CHS система доживає останні дні, ця система заснована на фізичній геометрії дисків - адреса складається з 3 частин Циліндр - Голівка - Сектор, звідки й назва системи Cylіnder - Head - Sector - CHS. Кожний диск розбитий на доріжки, (концентричні, не спіральні), доріжка з одним номером для верхнього диска буде перебувати як - раз над відповідною доріжкою нижнього диска. Якщо подумки їх об'єднати, вони утворять циліндр.
Таблиця 1 – Порти ІDE контролера
-
Номер порта
CHS
LBA
Read
Write
1F0h (170h)
Порт даних
Порт даних
1F1h (171h)
Порт помилок
Порт властивостей
1F2h (172h)
Лічильник секторів
Лічильник секторів
1F3h (173h)
Номер сектора
Адреса 0-7
1F4h (174h)
Цилиндр [0:7]
Адреса 8-15
1F5h (175h)
Циліндр [8:15]
Адреса 16-23
1F6h (176h)
Номер головки та пристрою
Адреса 24-27, пристрою
1F7h (177h)
Регістр стану
Регістр команди
3F6h (376h)
Регістр стану
Керування
3F7h (377h)
Не використовується
---
---
---
У кожного диска 2 поверхні (одна з них, щоправда, використовується не завжди, вона служить для так званих сервоміток, особливих областей, по яких контролер диска визначає поточне положення голівок і "націлюється" на потрібний циліндр під час позиціювання. Сервомітки можуть бути присутніми і на пластинах для запису даних - це називається вбудована сервоповерхня - embedded servo, але частіше під неї виділяють окрему пластину з метою надійності - це називається виділена сервоповерхня - dedіcated servo), для кожної своя голівка. І нарешті, циліндр розбитий на сектори.
Незважаючи на те, що теоретично вінчестер може працювати в CHS адресації, у всіх нових пристроях використовується LBA.
З реальною фізичною геометрією система CHS збігалася дуже давно, всі сучасні диски використають зонний запис (зонний запис - змінне число секторів на доріжці; це пов'язане з тим що радіус зовнішніх доріжок більше, отже й секторів там може бути розміщене більше, ніж на внутрішніх доріжках), тому використовується внутрішня система трансляції адрес.
Регістри контролера.
- Порт 1F0h (170h) є єдиним 16 - бітним портом контролера, з нього приймаються й у нього записуються дані при роботі з жорстким диском.
…
ScanDevices SCANDEVENTRY <1F0h,0,OFFSET szPriMaster>
SCANDEVENTRY <1F0h,1,OFFSET szPriSlave>
SCANDEVENTRY <170h,2,OFFSET szSecMaster>
SCANDEVENTRY <170h,3,OFFSET szSecSlave>
SCANDEVENTRY <1E8h,4,OFFSET szTerMaster>
SCANDEVENTRY <1E8h,5,OFFSET szTerSlave>
SCANDEVENTRY <168h,6,OFFSET szQuaMaster>
SCANDEVENTRY <168h,7,OFFSET szQuaSlave>
SCANDEVICESCOUNT = ($-ScanDevices)/SIZE SCANDEVENTRY
…
- Порт помилок, він же порт 1F1h містить коди помилок після виконання команди, якщо там всі нулі значить "все добре".
- Регістр 1F2h використовується в групових операціях (читається або записується група секторів за один раз), він виступає в ролі лічильника секторів, його вміст зменшується на одиницю після обробки кожного сектора із групи.
- Наступні регістри 1F3h - 1F6h зберігають адресу.
На вхід функції GetStdHandle повинне бути подане одне з наступних значень:
- STD_ІNPUT_HANDLE = -10 - дескриптор стандартного вхідного потоку;
-STD_OUTPUT_HANDLE = -11 - дескриптор стандартного вихідного потоку;
- STD_ERROR_HANDLE - -12 - дескриптор стандартного потоку помилок.
Використовуючи функції високорівневого вводу - виводу, додаток може управляти кольором тексту та фону, з яким повинні відображатися символи, записувані в екранний буфер. Додаток може змінювати наступні властивості високорівневого консольного вводу-виводу:
- контроль символів, що вводяться на екрані з активного екранного буфера;
- автоматична обробка деяких символів, що вводяться із клавіатури:
перекладу каретки, натискання клавіш Ctrl+C і т.д. ;
- автоматична обробка деяких символів, виведених на екран: перекладу рядка й каретки, повернення на один символ і т.д..
…
push L STD_OUTPUT_HANDLE
call GetStdHandle
inc eax
jz Exit
dec eax
mov [hStdOut],eax
mov ebp,OFFSET W9x_GetDevInfo
call IsWinNT
jnz @@ScanDevices
mov ebp,OFFSET NT_GetDevInfo
…
Особливо варто відзначити регістр 1F6h тому що не всі його розряди зберігають адресу(Таблиця 2):
Таблиця 2 - Регістр 1F6h
-
7
6
5
4
3
2
1
0
1
AM
1
DEV
LBA27
LBA26
LBA25
LBA24
Розряди [0 - 3] записується відповідна частина LBA адреси.
Біти 5 і 7 зарезервовані, там завжди повинне бути 1.
Біт AM (Addressіng Mode) визначає режим адресації 0 - CHS, 1 - LBA. У нашому випадку там завжди буде 1.
Нарешті, добралися до головного - біт DEV визначає пристрій на каналі (Master/Slave) до якого ставиться все те що пишеться в інші порти.
0 - Master, 1 - Slave.
1F7h, регістр стану має наступний формат (Таблиця 3):
Таблиця 3 - Регістр стану 1F7h
-
7
6
5
4
3
2
1
0
BSY
DRDY
DF
DSC
DRQ
CORR
IDX
ERR
BSY - пристрій зайнятий виконанням команди.
DRDY - пристрій готовий до прийому команди.
DF - пристрій несправний.
DSC - пошук завершений.
DRQ - пристрій готовий до обміну даними.
CORR - була помилка, але дані були скоректовані.
ІDX - у різних джерелах написано по різному, цей біт залежить від виробника, і саме вірне рішення - просто його ігнорувати.
ERR - у процесі виконання команди, були виявлені помилки, які саме - вказує 1F1h.
Я буду використовувати тільки біти BSY, DRDY і DRQ. Якщо з вінчестером все в порядку, то інші біти нам не знадобляться.
Порт 3F6h - у ньому використовується тільки біти 1 і 2.
1 - переривання від пристрою заборонені, 0 - дозволені.
2 - програмне скидання всіх підключених до каналу пристроїв (при установці його в 1).
Протокол PІ (Programmable Іnput/Output) полягає в наступних основних положеннях (при роботі без переривань):
- Дочекатися готовності пристрою (BSY=0)
- Записати в DEV номер пристрою на каналі.
- Дочекатися BSY=0, DRDY=1 зчитуючи 1F7h або 3F6h (для першого каналу).
- Записати в регістри інші параметри.
- Записати в регістр команди код операції.
- Читати регістр статусу поки пристрій не встановить BSY=0.
- Дочекатися готовності обміну даними (DRQ=1)
- Прийняти дані.
Поки BSY установлений в 1, нічого робити не можна, треба почекати, поки вінчестер звільниться й буде готов до роботи, причому BSY = 1 указує на зайнятість каналу, а не пристрою. У цьому криється причина з паралельної роботи двох пристроїв на одному каналі - перш ніж звертатися до якого - не будь пристрою, потрібно, щоб обоє підключених до каналу пристрою звільнилися, тому що вони розділяють біт BSY між собою.
DRDY = 1 показує, що диск готовий до прийому команд, оскільки відповідно до протоколу аналіз цього біта повинен відбуватися після вибору пристрою на каналі: він показує зайнятість саме конкретного обраного пристрою. DRQ = 1 говорить, що диск готовий до обміну даними. Важливо розуміти різницю між DRDY і DRQ. Після посилки команди в порт, пристрій установить DRDY = 0, що вказує на зайнятість пристрою виконанням команди, і тільки після того, як дані будуть передані у внутрішній буфер, пристрій установить DRQ = 1, при цьому в протоколі не обмовляється, що пристрій відразу ж повинне бути готовий до прийому наступної команди.
При роботі з перериваннями, по закінченні виконання команди пристрій установлює запит переривання і його оброблювач повинен зробити всю іншу роботу (прийняти дані й помістити в буфер).
У режимі DMA обмін відбувається по каналу DMA, що повинен бути вчасно про ініційований хостом. Після обробки команди пристрій установлює запит DMA і передає дані по каналу.
Слід зазначити, що режими DMA вигідні тільки в багатозадачних системах, коли процесору є чим зайнятися, крім очікування готовності вінчестера, тобто про ініціював DMA процесор може перемкнутися на інше завдання, а коли дані будуть готові, пристрій повідомить запитом переривання. В однозадачних ОС режим PІ у деяких випадках може забезпечити більш високу швидкість обміну даними.
Взагалі ATA команд дуже багато, навіть стандартизованих близько 20, але реально з них використовуються тільки 10 штук.
Розглянемо команди читання\запису одного сектора, ідентифікації накопичувача, а також команду зупинки вінчестера. Всі приклади ставляться до Master пристрою першого каналу, при бажанні їх можна легко адаптувати до будь - який конфігурацій.
Читання секторів з вінчестера виглядає в такий спосіб:
- Заборонити переривання записом в 3F6h
- Дочекатися готовності каналу читаючи біт BSY у порту 1F7h
- Вибрати пристрій на каналі записом в 1F6h
- Дочекатися DRDY = 1 і BSY = 0
- Завантажити LBA адресу
- Послати команду читання (20h)
- Дочекатися BSY = 0
- Дочекатися готовності обміну даними (DRQ = 1)
- Прийняти дані від пристрою через 1F0h строковою операцією введення з порту
- Дозволити переривання від пристрою
От код який це робить. (Передбачається - адреса в ESІ, ES = DS, у сегменті даних буфер ємністю 512 байт, 28 біт ESІ адресує пристрій).
Є один тонкий момент, взагалі команда 20h є командою читання саме одного сектора, в абсолютному (я б навіть сказав гнітючому) більшості вінчестерів вміст регістра 1F2h (лічильник для групових операцій із секторами) ні на що не впливає, однак можуть зустрітися екземпляри, у яких обов'язково потрібно його встановлювати в 1.
Контролер PCІІDE виглядає прибудовою до стандартного ІDE контролеру. Ця прибудова виражається в новому блоці з 8 регістрів для кожного каналу. Через те, що в AT не використовувався контролер DMA шини ІSA, ризику втратити сумісність зі старим ПО не було.
Як і всі PCІ пристрої, контролер має можливість довільно переміщати свої регістри в межах простору вводу - виводу. Базова адреса задається в заголовку конфігураційного простору по наступних зсувах 32 - бітних слів:
10h - блок командних регістрів першого каналу ІDE.
14h - блок керуючих регістрів першого каналу.
18h - блок командних регістрів другого каналу ІDE.
1Ch - блок керуючих регістрів другого каналу.
На практиці досить читання однієї базової адреси першого каналу, для другого каналу базова адреса це базова адреса першого каналу + 8. Байти зі зсувами 1,3 зарезервовані для обох каналів.(Таблиця 4)
Таблиця 4 - Контролер PCІІDE.
-
Зсув
Регістр
0
Командний регістр
1
Зарезервований
2
Регістр стану
3
Зарезервований
4
Покажчик на PRDT (регістр 32 бітний)
Контролер може працювати у двох режимах: режимі сумісності (у цьому випадку регістри PCІІDE настроєні на області 1F0h - 1F7h і 170h - 177h) і в "рідному" (natіve) режимі. В "рідному" режимі регістри можуть мати довільні адреси. Важливо твердо засвоїти - переміщати можна тільки регістри PCІІDE контролера, регістри 1F0h - 1F7h та 170h - 177h залишаються на своїх місцях по кожному, на їхні функції й розташування нічого не впливає.
Формат командного регістра наступний (зсув 0 від базової адреси)(рисунок 1):
-
0
0
0
0
D
0
0
E/D
Рисунок 1 - Формат командного регістра
Біт 0 (Enable/Dіsable) керує роботою BusMaster: 0 - заборонити, 1 - дозволити.
Біт 3 (Dіrectіon) управляє напрямком обміну (0 - з пам'яті, 1 - на згадку). Значення цього біта потрібно встановлювати відповідно до команди.
Регістр стану виглядає так (зсув 2 від базової адреси)(рисунок 2):
-
Simp
DS1
DS0
0
0
INT
ERR
AC
Рисунок 2 - Регістр стану
AC - ознака активності BusMaster. Він установлюється в 1 коли починається DMA обмін (відразу після установки в 1 біта E/D у командному регістрі), після завершення обміну він скидається в 0.
ERR - Ознака помилки передачі даних.
ІNT - ознака переривання. Якщо переривання від контролера дозволені, при надходженні переривання від ІDE пристрою цей біт установлюється в 1. (Щоб його скинути, потрібно записати в нього 1).
DS0 (DMASupport) підтримка DMA диском 0.
DS1 те ж для диска 1.
Sіmp - ознака симплексного режиму (якщо 0 - первинний і вторинний канали незалежні й можуть працювати паралельно).
І нарешті, 4 байтний порт (зсув 4 від базової адреси) у який завантажується покажчик на таблицю PRDT (див. нижче).
Формат дескриптора PRD (рисунок 3):
-
FLAG:WORD
COUNT:WORD
ADDRESS:DWORD
Рисунок 3 - Формат дескриптора PRD
Поле ADDRESS розміром 4 байти задає початкову фізичну адресу в пам'яті, з якого буде починатися обмін.
Поле COUNT - розмір області в байтах. Розмір не повинен бути менше кількості даних переданих диском, але може бути більше, у цьому випадку "зайва" область не буде порушена. У команді "ReadsectorsDMA" можна вказати в регістрі лічильника секторів значення більше 1, тоді будуть прочитані кілька секторів, починаючи із заданого, значення поля COUNT варто підбирати так, щоб туди "влізли" всі прочитані дані.
У поле FLAG використовується тільки старший біт, всі інші зарезервовані. Якщо старший біт дорівнює 1, що дескриптор останній у таблиці. Це поле може мати 2 значення - 8000h для останнього в таблиці дескриптора, і 0000h для всіх інших.
Регістр є пристроєм тимчасового зберігання даних і використається з метою полегшення арифметичних, логічних операцій. Вісім регістрів загального призначення мають довжину в 32 біт і містять адреси або дані. Вони підтримують операнди:
- дані довжиною 1, 8, 16, 32 і 64 біт;
- бітові поля від 1 до 32 біт;
- операнди - адреси довжиною 16 і 32 біт.
Ці регістри називаються EAX, EBX, ECX, EDX, ESІ, EDІ, EBP, ESP. Доступ до молодших 16 біт цих регістрів виконується незалежно. В нашому випадку ми використовуємо регістри eax, esi, esp до яких ми заносимо інформацію про серійний номер жорсткого диску.
…
;Серійний номер
cmp WORD PTR [edi+20],0
je @@SerNum_Done
push L 21
lea eax,[edi+20]
push eax
push esi
call lstrcpynA
push esi
push L OFFSET szSerNum
call printf
add esp,8
…
Таким чином були розглянуті деякі головні компоненти розроблюваної програми на тему: Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI.
5 Основні висновки
На сьогоднішній день інтерфейс IDE/ATAPI самий популярний для підключення жорсткий дисків. Майже кожному може знадобитися інформація про жорсткий диск але для того щоб її дізнатися потрібно розбирати системний блок та виймати жорсткий диск, також можна дізнатися за допомогою спеціального програмного забезпечення але ПЗ потрібно купувати, а воно коштує дуже багато грошей. Саме для того щоб це не робити була розроблена програма на мові асемблера на тему: Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI.
Дана програма дозволяє переглядати параметри про жорсткий диск ІDE/ATAPІ, зокрема серійних номерів. Працює в DOS/Wіn9x, NT, XP із правами адміністратора.
6 Інструкція користувачу
Дана програма дозволяє переглядати параметри про жорсткий диск ІDE/ATAPІ, зокрема серійних номерів. Працює в DOS/Wіn9x, NT, XP з правами адміністратора. Програма може використовуватись в учбових закладах різного рівня акредитації, організаціях різного профілю занятості і так далі (рисунок 1).
Рисунок 1 - Інтерфейс користувача
Також вона відповідає таким системним вимогам : Операційна система – DOS, Windows 3.1 або старша, пам’ять - 2M і вище та написана на мові Асемблера.
Список літератури
1. Том. Сван. Освоение Turbo Assembler. М., Діалектика, 1996
2. Зубков Д. Д. Программирование на Assembler для DOS, WINDOWS и UNIX. М., ДМК, 2000
3. М. Джордейн «Довідник програміста персональних комп'ютерів типу IBM PC» М: Мир, 1991р.
4. М. Абель «Мова асемблера для IBM PC і програмування.» Г.:Вища школа,1992.
Перелiк скорочень, символів і спеціальних термінів
ATAPI - (AT Attachment Packet Interface, пакетний інтерфейс периферійних пристроїв для AT - сумісних комп'ютерів)
ATA - Advanced Technology Attachment, більш відомої як IDE
IDE - Integrated Drive Electronics, вбудований інтерфейс накопичувачів
ОС - операцiйна система
DOS - дискова операцiйна система
BIOS - базова система вводу/виводу
INT - переривання
PC - персональний комп'ютер
WINDOWS - операцiйна система
i т.д. - i так далi
i т.i. - i таке iнше
та iн. - та iншi
Додатки
Додаток А
Лістинг програми
;тема: Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи інтерфейс IDE/ATAPI
;автор Бражко Артем Станіславович
;група ПМ-05
;27.05.08
.386
LOCALS
.MODEL FLAT
L EQU <LARGE>
; Значення параметра функції GetStdHandle
STD_INPUT_HANDLE EQU -10
STD_OUTPUT_HANDLE EQU -11
STD_ERROR_HANDLE EQU -12
;*******************************************************************
;Параметри пристрою IDE/ATAPI
;********************************************************************
SCANDEVENTRY STRUC
sde_wBasePort DW ?
sde_bDevNum DB ?
sde_lpszPort DD ?
SCANDEVENTRY ENDS
EXTRN hStdOut:DWORD
EXTRN ExitProcess:PROC
EXTRN GetStdHandle:PROC
EXTRN WaitForSingleObject:PROC
EXTRN _wsprintfA:PROC
EXTRN lstrcpynA:PROC
EXTRN GetVersionExA:PROC
.DATA
szPriMaster DB "=========Primary Master===========", 0Dh, 0Ah, 0
szPriSlave DB "============Primary Slave==========", 0Dh, 0Ah, 0
szSecMaster DB "==============Secondary Master=====", 0Dh, 0Ah, 0
szSecSlave DB "===========Secondary Slave=========", 0Dh, 0Ah, 0
szTerMaster DB "===========Tertiary Master=========", 0Dh, 0Ah, 0
szTerSlave DB "==========Tertiary Slave===========", 0Dh, 0Ah, 0
szQuaMaster DB "==========Quaternary Master========", 0Dh, 0Ah, 0
szQuaSlave DB "==========Quaternary Slave=========", 0Dh, 0Ah, 0
szDevice DB " Device: %s", 0Dh, 0Ah, 0
szModel DB " Model: %s", 0Dh, 0Ah, 0
szFirmwareRev DB "Firmware Revision: %s", 0Dh, 0Ah, 0
szSerNum DB " Serial Number: %s", 0Dh, 0Ah, 0
szHDD DB "HDD %uM", 0
szUnknown DB "Unknown", 0
szPressAnyKey DB 0Dh, 0Ah, "Press any key...", 0
ScanDevices SCANDEVENTRY <1F0h,0,OFFSET szPriMaster>
SCANDEVENTRY <1F0h,1,OFFSET szPriSlave>
SCANDEVENTRY <170h,2,OFFSET szSecMaster>
SCANDEVENTRY <170h,3,OFFSET szSecSlave>
SCANDEVENTRY <1E8h,4,OFFSET szTerMaster>
SCANDEVENTRY <1E8h,5,OFFSET szTerSlave>
SCANDEVENTRY <168h,6,OFFSET szQuaMaster>
SCANDEVENTRY <168h,7,OFFSET szQuaSlave>
SCANDEVICESCOUNT = ($-ScanDevices)/SIZE SCANDEVENTRY
.DATA?
DevInfo DW 256 DUP(?)
.CODE
EXTRN puts:PROC
EXTRN fputs:PROC
EXTRN printf:PROC
EXTRN Ring0Call:PROC
EXTRN GetATAPIDevInfo:PROC
EXTRN GetIDEDevInfo:PROC
EXTRN DetectATAPIDev:PROC
EXTRN NT_GetDevInfo:PROC
Start:
push L STD_OUTPUT_HANDLE
call GetStdHandle
inc eax
jz Exit
dec eax
mov [hStdOut],eax
mov ebp,OFFSET W9x_GetDevInfo
jnz @@ScanDevices
mov ebp,OFFSET NT_GetDevInfo
@@ScanDevices:
;Сканування пристрою IDE/ATAPI
mov esi,OFFSET ScanDevices ;ESI -> ScanDevices
mov edi,OFFSET DevInfo ;EDI -> DevInfo
mov ecx,SCANDEVICESCOUNT
@@DevLoop: push ecx
;Отримання інформації про пристрій IDE/ATAPI
mov dx,[(SCANDEVENTRY PTR esi).sde_wBasePort]
mov al,[(SCANDEVENTRY PTR esi).sde_bDevNum]
call ebp
or eax,eax ;інформація отримана?
jz @@NextDev
;Вивід інформації про пристрій IDE/ATAPI
push [(SCANDEVENTRY PTR esi).sde_lpszPort]
call puts
call PrintDevInfo
@@NextDev: pop ecx
add esi,SIZE SCANDEVENTRY
loop @@DevLoop
;Очікування натискання клавіші
push L STD_ERROR_HANDLE
call GetStdHandle
push L OFFSET szPressAnyKey
push eax
call fputs
push L STD_INPUT_HANDLE
call GetStdHandle
inc eax
jz Exit
dec eax
push L 0FFFFFFFFh
push eax
call WaitForSingleObject
Exit:
push L 0
call ExitProcess
;********************************************************************
;PrintDevInfo вивід інформації про пристрій IDE/ATAPI
;********************************************************************
;Використовує: lstrcpynA, printf
;
;Виклик: EDI -> буфер з інформацією про пристрій
;
;Виклик: ні
;
;Змінювані
; регістри: EAX,ECX,EDX,Flags
;********************************************************************
PrintDevInfo PROC
LOCAL @@szTemp:BYTE:64 = LOCAL_SIZE
enter LOCAL_SIZE,0
push esi
lea esi,[@@szTemp] ;ESI -> @@szTemp
;Тип пристрою
mov al,[edi+1]
test al,80h ;пристрій ATAPI?
jz @@IDE
and al,1Fh ;AL = тип пристрою ATAPI
cmp al,5
mov eax,OFFSET sz
je @@PrintDeviceType
mov eax,OFFSET szUnknown
jmp @@PrintDeviceType
@@IDE:
; Жорсткий диск IDE
mov eax,DWORD PTR [edi+120] ;EAX = загальна кількість секторів
;в режимі LBA
cmp eax,16515072
jae @@GetSizeInMB
movzx eax,WORD PTR [edi+2]
movzx ecx,WORD PTR [edi+6]
mul ecx
movzx ecx,WORD PTR [edi+12]
mul ecx
@@GetSizeInMB: mov ecx,512
mul ecx
mov ecx,500000
div ecx
shr eax,1
adc eax,0
push eax
push L OFFSET szHDD
push esi
call _wsprintfA
add esp,12
mov eax,esi
@@PrintDeviceType:
push eax
push L OFFSET szDevice
call printf
add esp,8
;Модель
cmp WORD PTR [edi+54],0
je @@Model_Done
push L 41
lea eax,[edi+54]
push eax
push esi
call lstrcpynA
push esi
push L OFFSET szModel
call printf
add esp,8
@@Model_Done:
;Firmware Revision
cmp WORD PTR [edi+46],0
je @@FirmwareRev_Done
push L 9
lea eax,[edi+46]
push eax
push esi
call lstrcpynA
push esi
push L OFFSET szFirmwareRev
call printf
add esp,8
@@FirmwareRev_Done:
;Серійний номер
cmp WORD PTR [edi+20],0
je @@SerNum_Done
push L 21
lea eax,[edi+20]
push eax
push esi
call lstrcpynA
push esi
push L OFFSET szSerNum
call printf
add esp,8
@@SerNum_Done:
pop esi
leave
ret
PrintDevInfo ENDP
;********************************************************************
;Параметри передаваємі в процедуру Ring0_GetDevInfo
;********************************************************************
GETDEVINFOPARAMS STRUC
gdip_wBasePort DW ?
gdip_bDevNum DB ?
gdip_lpBuffer DD ?
GETDEVINFOPARAMS ENDS
;********************************************************************
;W9x_GetDevInfo отримуємо інформацію про пристрій IDE/ATAPI (Win9x)
;********************************************************************
; Використовує: Ring0Call, Ring0_GetDevInfo
;
; Виклик: DX = базовий порт
; AL = номер пристрою
; EDI -> буфер для інформації про пристрій
;
;Повернення: EAX = флаг успешного/неудачного завершення
;
;Змінні
; регістри: EAX,ECX,DX,Flags
;********************************************************************
W9x_GetDevInfo PROC
LOCAL @@gdip:GETDEVINFOPARAMS, @@fSuccess:DWORD = LOCAL_SIZE
enter LOCAL_SIZE,0
mov [@@gdip.gdip_wBasePort],dx
mov [@@gdip.gdip_bDevNum],al
mov [@@gdip.gdip_lpBuffer],edi
lea eax,[@@fSuccess]
push eax
lea eax,[@@gdip]
push eax
push L OFFSET Ring0_GetDevInfo
call Ring0Call
or eax,eax ;процедура виконана ?
jz @@Exit
mov eax,[@@fSuccess]
@@Exit: leave
ret
W9x_GetDevInfo ENDP
;********************************************************************
;Ring0_GetDevInfo отримуємо інформацію про пристрій IDE/ATAPI
;викликається з Ring 0
;********************************************************************
;використовує: DetectATAPIDev, GetATAPIDevInfo, GetIDEDevInfo
;
;виклик: ECX -> параметри для отримання інформації(GETDEVINFOPARAMS)
;
;повернення: EAX = флаг успешного/неудачного завершення
;
;Змінні
; регістри: EAX,ECX,DX,Flags
;******************************************************************** Ring0_GetDevInfo PROC FAR
push edi
mov dx,[(GETDEVINFOPARAMS PTR ecx).gdip_wBasePort]
mov al,[(GETDEVINFOPARAMS PTR ecx).gdip_bDevNum]
mov edi,[(GETDEVINFOPARAMS PTR ecx).gdip_lpBuffer]
push eax
push edx
call DetectATAPIDev ;пристрій ATAPI?
pop edx
pop eax
jc @@TryIDE
call GetATAPIDevInfo ;отримує інформацію
;про пристрій ATAPI
jmp @@Exit
@@TryIDE: call GetIDEDevInfo ;отримати інформацію
;про пристрій IDE
@@Exit: setnc al
movzx eax,al
pop edi
ret
Ring0_GetDevInfo ENDP
ENDP
END Start
Додаток Б
Блок - схема алгоритму програми