p align="left">Рисунок 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 Додаток Б Блок - схема алгоритму програми
Страницы: 1, 2, 3, 4
|