Установка пароля на HDD

Тема в разделе "WASM.ASSEMBLER", создана пользователем drem1lin, 2 мар 2010.

  1. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Здравствуйте, пишу свою программу по установке пароля на жесткий диск. Честно говоря не уверен в разделе, но более подходящего не нашел. При разработке столкнулся с проблемой, у меня после посылки команды SECURITY SET PASSWORD или SECURITY UNLOCK в регистре состояния устанавливается флаг ошибки, а почему понять не могу. Архив с программой я прикладываю, функции посылки команды находятся в файле HDD.inc

    Код (Text):
    1. ;********************************************
    2. ;*Передает жесткому диску одну из команд                      
    3. ;*SET PASSWORD; DISABLE PASSWORD; UNLOCK        
    4. ;*Входные параметры передаются через глобальные
    5. ;* переменные и регисты:                        
    6. ;* ChannelNumber - номер канала (1 или 2);    
    7. ;* DiskNumber - номер диска на канале (0 или 1).
    8. ;* Блок данных считывается из массива Sector512.              
    9. ;*Вход - код команды, передается в регистре bl        
    10. ;*************************************************
    11. PROC SecSendCommandToHDD near
    12.         pushad
    13.         push    ES
    14. ;Конфигурируем Sector512
    15.         call    GetPassword
    16.         lea     bx, [Sector512]
    17.         mov             [word ptr bx], 0000h
    18. ; Задать режим CHS
    19.         mov     [ATAAddressMode],0
    20. ; Послать команду идентификации устройства
    21.         mov     [ATAFeatures],0
    22.         mov     [ATAHead],0
    23.         mov     [ATACommand],bl
    24.         call    SendCommandToHDD  ;процедура корректна и работает
    25.         cmp     [DevErrorCode],0 ;проверить код ошибки
    26.         jne     @@End  ;закончить, сохранив код ошибки
    27. ; Ожидать готовность HDD
    28.         mov     AX,0
    29.         mov     ES,AX
    30.         mov     DX,[ATABasePortAddr]
    31.         add     DX,7     ;адрес регистра состояния
    32. @@WaitCompleet:
    33.         ; Проверить время выполнения команды
    34.         mov     EAX,[ES:046Ch]
    35.         sub     EAX,[OpTime]
    36.         cmp     EAX,MaxHDDWaitTime
    37.         ja      @@Error1 ;ошибка тайм-аута
    38.       ; Проверить готовность
    39.         in      AL,DX
    40.         test    AL, 80h
    41.         jnz             @@WaitCompleet
    42.         test    AL,1    ;состояние сигнала ERR
    43.         jnz     @@Error6
    44.         and     AL,0c8h ;состояние сигнала BSY & DRQ & DRDY
    45.         cmp     AL,40h;состояние сигнала BSY = 0 & DRDY =1 & DRQ = 0
    46.         jnz             @@WaitCompleet
    47.        
    48. ;Послать блок данных контроллеру
    49.         mov     AX,DS
    50.         mov     ES,AX
    51.         mov     DI,offset Sector512
    52.         mov     DX,[ATABasePortAddr] ;регистр данных
    53.         mov     CX,256   ;число посылаемых слов
    54.         rep     outsw    ;послать блок данных
    55.         jmp     short @@End
    56. ; Записать код ошибки
    57. @@Error1:
    58.         mov     [DevErrorCode],1  
    59.         jmp     short @@End
    60. @@Error6:
    61.         mov     [DevErrorCode],6
    62.         MShowDecByte 16,15,AL
    63. @@End:  pop     ES
    64.         popad
    65.         ret
    66. ENDP SecSendCommandToHDD
    Может я как то не правильно ожидаю/проверяю готовность HDD?? Если у кого есть исходники программ устанавливающих пароль или которые посылают блок данных HDD можете скинуть?