Смекни!
smekni.com

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

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


ДодатокБ

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