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
ДодатокБ
Блок - схема алгоритму програми