информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsSpanning Tree Protocol: недокументированное применениеАтака на Internet
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Принцып... 22.11.01 15:55  Число просмотров: 1148
Автор: Chingachguk <Chingachguk> Статус: Member
<"чистая" ссылка>
> Спасибо за ответ.
ж)
> Напиши принцип. Я не знаю где найти, чтоб почитать.
> Где вообще SN читать, номера портов, сам принцип? Это
> работает для всех типов дисков (в смысле разных фирм)?

Код - ниже. На сишные комментарии особо не смотри, ибо там вечный
цикл был - я его на асме нормально сделал - если порт не вернул ожидаемое значение - то надо тайм-аут делать.
Насчет все... Не знаю точно, но пяти-шести винтах он работал сто пудей, на многих компах (>100) - 90% - это было часть большой проги.

Собственно, тебе нужна тока "ReadInfo proc near".
Остальное - интерфейс для вызова сервиса через int 13h.

; Программа для выдачи серийного номера жесткого диска.
; Выдает серийный номер жесткого диска в указнный буфер из 256 слов.
; Необходимо указать в autoexec.bat ее инсталляцию.
; Будучи загружена перед Windows 95/98, попадает в 0-кольцо защиты OS
; И потому способна корректно работать с портами ввода-вывода ЖД.
; Под DOS работает так же, как обычная программа, читающая порты ЖД.
; Поддерживает 2 функции (регистр AL):
; AL = 00h - INSTALLATION CHECK
; Если инсталлировна, то AL = FBh(Номер резерв. ф-ции), CF флаг сброшен
; AL = 01h - READ SERIAL DISK NUMBER
; В случае успешного чтения возвращает:
; - AL = FBh (Номер резерв. ф-ции), CF флаг сброшен;
; - В переданный буфер ES:DI читает серийный номер диска, буфер
; должен быть длиной 256 слов;
; Если чтение не удалось, то AL = FF и флаг CF установлен
; На другие значения в AL возвращает FF + установленный флаг CF
.286 ; Команды процессора 286+ незащищенного режима
HookedVector equ 13h ; Перехватываем вектор 13h - работа с диском BIOS
OurFunction equ 0fbh ; Резервируем ф-цию 0fbh прерывания 13h для себя
Drive equ 00h ; Видимо, номер жесткого диска (0,1,..)
FuncNumber equ 2 ; Число поддерживаемых функций
InstallCheck equ 0 ; Запрос на инсталляцию
ReadSerial equ 1 ; Запрос на чтение серийного номера
ErrorFunc equ 0ffh ; Ответ на ошибочный запрос
cseg segment byte 'code'
assume cs:cseg
org 100h ; Обычный PSP com - программы
begin: jmp Iniz ; Обойдем резидентный код
messagekey proc near
pushf ; Сохраним флаги вызывающей программы
cmp ah,OurFunction
jnz @NotOurFunction
popf ; Парная команда к pushf в начале кода
call Dispatcher ; Отработать возможные функции
retf 2 ; Вернуться с установленными внутри флагами
@NotOurFunction:
popf ; Восстановим флаги вызывающей программы
db 0eah ; код команды jmp far
Old_13H dd ? ; На предидущий обработчик int 13h
messagekey endp
Dispatcher proc near
push si
xor si,si
@FindFunc:
cmp al,cs:Functions[si]
jz @FuncFound
inc si
cmp si,FuncNumber
jb @FindFunc
pop si
mov al,ErrorFunc
stc
retn
@FuncFound:
shl si,1
call word ptr cs:FuncOfs[si]
pop si
retn
Dispatcher endp
Functions db InstallCheck,ReadSerial
FuncOfs dw offset Install, offset ReadInfo
Install proc near
mov al,OurFunction
clc
retn
Install endp
ReadInfo proc near
pusha
mov word ptr cs:Counter,0
@TryAgain:
mov dx,03f6h
mov al,0ah
out dx,al ; outportb(0x3F6,0x0A)
call Waiter
@Wait1: mov dx,01f7h
in al,dx
call TimeOut
test al,80h ; while(inportb(0x1F7)&0x80);
jnz @Wait1
call Waiter
mov dx,01f6h
mov al,Drive
shl al,4
add al,0a0h
out dx,al ; outportb(0x1F6,0xA0+(drive<<4));
call Waiter
@Wait2: mov dx,01f7h
in al,dx
call TimeOut
test al,40h ; while(!(inportb(0x1F7)&0x40));
jz @Wait2
call Waiter
mov dx,01f7h
mov al,0ech
out dx,al ; outportb(0x1F7,0xEC);
call Waiter
@Wait3: mov dx,01f7h
in al,dx
call TimeOut
test al,08h ; while(!(inportb(0x1F7)&0x08));
jz @Wait3
call Waiter
; for(i=0; i<256; i++) infoArray[i] = swap(inportw(0x1F0)) (to es:[di])
mov cx,256
@FillBuf:
call Waiter
mov dx,01f0h
in ax,dx
xchg al,ah
mov es:[di],ax ; es:[di] = ax, di:=di+2
inc di
inc di
loop @FillBuf
mov dx,01f7h
in al,dx
call TimeOut
test al,80h ; if(inportb(0x1F7)&0x80) continue;
jz @ReadOK
jmp @TryAgain
@ReadOK:popa
clc
mov al,OurFunction
retn
TimeOut proc near
inc word ptr cs:Counter
jnz @TimeDone
pop ax
popa
mov al,ErrorFunc
stc
@TimeDone:
retn
Counter dw 0
TimeOut endp
ReadInfo endp
Waiter proc near
push cx
xor cx,cx
@Wait: loop @Wait
pop cx
retn
Waiter endp
Iniz proc
assume ds:cseg
push ds
mov ax,(35H shl 8) + HookedVector
int 21h ; Get old HookedVector to es:bx
mov word ptr Old_13h,bx
mov word ptr Old_13h+2,es
mov dx,offset MessageKey
mov ah,25h
int 21H ; Set new Vector
mov dx,offset Iniz
int 27H ; Terminate and Stay Rezident
Iniz endp
cseg ends
end Begin
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach