|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 10, 2004 15:32:23 Всё народ! Я боьше на магу помагайте. Как мне что нибудть запистаь в сектор. Вот мой исходник! Кто знает помогите, я передпологаю что нужно HDD правильно настроить!
format PE native 4.0 at 10000h
entry DriverEntry
include "%include%/win32a.inc"
NOP equ 00h
CFA_REQUEST_EXTENDED_ERROR_CODE equ 03h ;Указывает ошибку
DEVICE_RESET equ 08h
; Убирает SLEEP состояние...
READ_SECTOR equ 20h
; Читает сектора
; При указанни DEVICE(Master/Slave) также нужно указать LBA
; outb 1F6h,Slave+LBA - пример
WRITE_SECTOR equ 30h
; При указанни DEVICE(Master/Slave) также нужно указать LBA
CFA_WRITE_SECTORS_WITHOUT_ERASE equ 38h
READ_VERIFY_SECTOR equ 40h
SEEK equ 70h ; Устанавливает DRDY(Drive Ready) регистр в еденицу.
CFA_TRANSLATE_SECTOR equ 87h
EXECUTE_DEVICE_DIAGNOSTIC equ 90h ;????
; Параметры указывать не нужно. Показывает сколько HDD подключено на шлейф.
; После выполнения команды результат находится в 1f1 регистре.
INITIALIZE_DEVICE_PARAMETERS equ 91h ; Enable CHS-Format
DOWNLOAD_MICROCODE equ 92h
PACKET equ $A0 ; ?????
IDENTIFY_PACKET_DEVICE equ $A1
SERVICE equ $A2
SMART equ $B0
CFA_ERASE_SECTORS equ $C0
READ_MULTIPLE equ $C4
WRITE_MULTIPLE equ $C5
SET_MULTIPLE_MODE equ $C6 ; ????? ОБЬЕМ ПЕРЕДОВАЕМОЙ ИНФЫ ЧЕРЕЗ READ(WRITE)_MULTIPLE
READ_DMA_QUEUED equ $C7
READ_DMA equ $C8
WRITE_DMA equ $CA
WRITE_DMA_QUEUED equ $CC
CFA_WRITE_MULTIPLE_WITHOUT_ERASE equ $CD
GET_MEDIA_STATUS equ $DA
MEDIA_LOCK equ $DE ; Монтирование CD-ROM
MEDIA_UNLOCK equ $DF ; Демонтирование CD-ROM
STANDBY_IMMEDIATE equ $E0
IDLE_IMMEDIATE equ $E1
STANDBY equ $E2 ; Усыпляет устройство на определённое время или бесконечно (Time Out)
IDLE equ $E3 ; Переводит в режим ожидания
READ_BUFFER equ $E4
CHECK_POWER_MODE equ $E5
;Sector Count(1F2) result value –
;00h – device is in Standby mode. - спяший режим
;80h – device is in Idle mode. - Режим ожидания
;FFh – device is in Active mode or Idle mode.
SLEEP equ $E6
; Усыпляет Венчестер - выключает питание
; Монтирует CD-ROM ... дверца не открывате.
; Что бы убрать значение нужно вызвать DEVICE_RESET
FLUSH_CACHE equ $E7
WRITE_BUFFER equ $E8
IDENTIFY_DEVICE equ $EC ; Информация об устройстве
MEDIA_EJECT equ $ED
SET_FEATURES equ $EF ; Характиристика устройвства
SECURITY_SET_PASSWORD equ $F1
SECURITY_UNLOCK equ $F2
SECURITY_ERASE_PREPARE equ $F3
SECURITY_ERASE_UNIT equ $F4
SECURITY_FREEZE_LOCK equ $F5
SECURITY_DISABLE_PASSWORD equ $F6
READ_NATIVE_MAX_ADDRESS equ $F8 ; ????? GETING HDD SIZE
SET_MAX_ADDRESS equ $F9
section '.data' data readable writeable notpageable
buff2 db 'Fuck you . Cock Sucker you will die like A beatch',0
buff rb 512
section 'INIT' code readable executable notpageable
macro outb Port,Value
{
if Port<>0
mov dx,Port
end if
mov al,Value
out dx,al
}
macro outw Port,Value
{
if Port<>0
mov dx,Port
end if
if Value<>0
mov ax,Value
else
xor ax,ax
end if
out dx,ax
}
macro inb Port
{
if Port<>0
mov dx,Port
end if
in al,dx
}
macro inw Port
{
if Port<>0
mov dx,Port
end if
in ax,dx
}
offset equ
Slave equ 10000b
Master equ 00000b
LBA equ 40h ; Need to Read or Write
Device0 equ 80h ; Primary
Device1 equ 0 ; Secondery
ATA equ Device0
;1F0-1F7 Fixed Disk Controller (primary)
;170-177 Fixed Disk Controller (secondary)
;170h = 1F0h
;171h = 1F1h
;172h = 1F2h
;173h = 1F3h
;174h = 1F4h
;175h = 1F5h
;176h = 1F6h
;177h = 1F7h
proc DriverEntry,pDriverObject,pusRegistryPath
enter
pushad
int 3
cld
cli
stdcall ZeroPort,Device1
xor eax,eax
sub edx,edx
outb 176h,Master+LBA; Slave ; LBA/Device
stdcall SetLBA,Device1,5
;----------------------------
outb 177h,READ_SECTOR;WRITE_SECTOR;WRITE_MULTIPLE;READ_BUFFER;
stdcall GetError,Device1
test eax,eax
jnz ErrorDV
;------------------------------
mov ecx,512/2 ;Один сектор /2
mov dx,170h
; ----- WRITE ----
; mov esi,offset buff2
; rep outsw
; ---- READ ----
mov edi,offset buff
rep insw
;------------------
nop
ErrorDV:
sti
popad
.exit: mov eax,0C0000182h
return
endp
;stdcall Correct,buff,512
proc ZeroPort,DevMode
enter
mov edx,172h
add edx,[DevMode]
outb 0,0
@@:
mov ecx,[DevMode]
add ecx,176h
cmp dx,cx
je @F
inc dx
outb 0,0
jmp @B
@@:
return
endp
proc SetLBA,DevMode,LBA
enter
mov edx,173h
add edx,[DevMode]
mov eax,[LBA]
out dx,al ;173h
shr eax,8
inc dx
out dx,al ;174h
shr eax,8
inc dx
out dx,al ;175h
shr eax,8
mov cl,al
inc dx
in al,dx ;176h
and al,11110000b
or al,cl
out dx,al ;176h
return
endp
proc GetError,DevMode ; if 0 then no Error
enter
push edx
xor eax,eax
mov edx,177h
add edx,[DevMode]
inb 0
and al,1
dec al
jnz @F
mov edx,171h
add edx,[DevMode]
inb 0
dec al
jz .@X
inc al
jmp .@X
@@:
xor al,al
.@X:
pop edx
return
endp
lea eax,[KeServiceDescriptorTable]
section '.rdata' import readable notpageable
library ntoskrnl,'ntoskrnl.exe'
import ntoskrnl,\
KeServiceDescriptorTable,'KeServiceDescriptorTable'
section '.reloc' data fixups readable discardable
|
|
|
Дата: Май 10, 2004 16:43:23 Как я понял, ты используешь порты 170-176, я это соответствует 2-му винту (1-1F0h, 2-170h, 3-1E8h, 4-168h); Ты проверял тот-же код под ДОС? Попробуй восползоваться приложенной библиотекой. Это один из примеров Кулакова переработанный под FASM и упрощённый. p.s. ты знаешь как наладить связь на FASM между драйвером и прогой? 1825129041__HDDNew.inc |
|
|
Дата: Май 10, 2004 17:05:52 я че-т не могу понять. а не проще ли посмотреть что лежит в /usr/src/linux/drivers/ide? там даже с комментами все. |
|
|
Дата: Май 10, 2004 22:40:08 ProgramMan: Тот исходник то что я выложил, это и есть драйвер под Win2k. rst Ну если у тебя есть linux так выложи инфу от туда! |
|
|
Дата: Май 10, 2004 22:57:35 |
|
|
Дата: Май 11, 2004 07:20:11 Я вижу. Используя HDDNew.inc можно спакойно записать данные в сектор. mov [ChannelNumber],0 mov [HDDNumber],0 mov [ATAHead],0 mov [ATASectorCount],1 mov [ATACylinder],0 mov [ATASectorNumber],1 mov [ATAAddressMode],0 mov [BufSectorAdres],byffer call HDDSWrite И всё. Проверял код на VMW WinXP |
|
|
Дата: Май 11, 2004 13:16:13 Может быть лутше изпользовать DMA? |
|
|
Дата: Май 14, 2004 15:42:35 Всё проблема решина! Оказывается сначало нужно записать в буффер а только потом писать на кластер! |