Розробка програмного забезпечення для визначення інформації про жорсткий диск використовуючи

Зміст

	

	Вступ

	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


Додаток Б

	

	Блок - схема алгоритму програми

	

	

Початок

Зчитування системних

даних



Ініціалізація даних 

Сканування пристрою IDE/ATAPI

Отримання інформації про пристрій 

IDE/ATAPI

Вивід інформації про пристрій IDE/ATAPI

Кінець