· Начало · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ELECTRONICS —› ATA Соманда : WRITE_MULTIPLE

Посл.отвђт Сообщен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

Songoku: ftp://ftp.kernel.org/pub
а самому скачать сорцы посмотреть не?


Дата: Май 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

Всё проблема решина!
Оказывается сначало нужно записать в буффер а только потом писать на кластер!