· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Пытаюсь прочитать из vxd сектор HDD

Посл.отвђт Сообщенiе


Дата: Мар 17, 2003 07:43:27

Вот столкнулся с проблемой....
Пытаюсь прочитать из драйвера vxd сектор HDD
Через порт....

Так вот чо-то не работает этот код....
и не работает именно из драйвера,но если сделать его в виде
простого досовского экзешника - и запустить из чистого доса - то
все работает как надо....а если тот же самый экзешник запустить
из-под вин98,то прога тоже не работает....не читается сектор
В ax оказывется значение 0ffh

mov dx,1f6h
mov al,0a0h
out dx,al

mov dx,1f2h
mov al,1
out dx,al

mov dx,1f3h
mov al,2
out dx,al

mov dx,1f4h
mov al,0
out dx,al

mov dx,1f5h
mov al,0
out dx,al

mov dx,1f7h
mov al,21h
out dx,al

in al,dx

В чем дело может быть? Я просто не представляю....

Вот кстати пытался реализовать через VxDCall IFSMgr_Ring0_FileIO
Ну тут ваще грабли....просто не ожидал....
Или ддк для вин98 такое дурное....

Короче константа R0_READABSOLUTEDISK в ifs.inc определена как 0dd00h,
то есть слово и помещать его нужно в регистр....ah....
Натурально в хэлпе сказано что в al должен быть номер диска (0=A,1=B,2=C....)
Так вот если записать код вот так:

mov ax,R0_READABSOLUTEDISK (щас ax=0dd00h)
;без этой строчки***//mov al,1
mov ecx,1
mov edx,0
mov esi,OFFSET32 rx_buff
VxDCall IFSMgr_Ring0_FileIO

То натурально читается заданный сектор с диска A - из сайса я видел при отладке
драйвера....а вот если в al что-нить написать ***,то выдает ошибки....
Это чо микрософт так пошутил или я торможу?
Как можно решить такое?


Дата: Мар 17, 2003 09:29:09

Ну вот я бряк поставил на этот сервис - IFSMgr_Ring0_FileIO и увидел (win98, вызов из vmm):

; На входе в ah всегда было 3Fh
sub ah,3Fh
movzx eax,ah ; eax !!!
add eax,0D602h
call [IFSMgr_Ring0_FileIO] ; Заменился уже int


Дата: Мар 18, 2003 08:26:24

Спасибо за ответ

Проблема в том что с константой 0D602h
все работает нормально работает....
А вот с 0DD00h НЕ РАБОТАЕТ!

; На входе в ah всегда было 3Fh
sub ah,3Fh ;ПОСЛЕ ЭТОГО ax=0 ?
movzx eax,ah ; eax !!! ТЕРЬ eax=0 ?
add eax,0D602h ;ТЕПЕРЬ eax=0000D602h ?
call [IFSMgr_Ring0_FileIO] ; Заменился уже int

С константой 0D602h ВСЕ В ПОРЯДКЕ
То есть открытие файла и запись в него
все нормально работает....
А вот абсолютное чтение....облом....
Даже константа R0_ABSDISKREAD (это ее так в ддк зовут)
на самом деле в ifs.inc зовется R0_READABSOLUTEDISK
Может проблема в этом?

ReadAbsoluteDisk

This function is called to read absolute sectors
from the disk. It provides the same functionality as the INT 25h interface.

[AH]
R0_ABSDISKREAD

[AL]
Zero-based driveletter the operation is to be done on (zero = A, 1 = B,...).

[ECX]
Number of sectors to read.

[EDX]
Starting sector number for the read.

[ESI]
Flat pointer to buffer the read is to be done into.
Carry flag clear, no error.
Carry flag set, an error occurred. [AX] contains the error code.


Дата: Мар 18, 2003 09:52:01

Абсолютное чтение/запись секторов под 98 я как-то делал через DeviceIOControl - если хочешь, могу код дать (это из приложения, разумеется). Можно его потрассировать и выяснить, которая из vxd вызывается и как в этом случае...


Дата: Мар 19, 2003 07:09:38

Как через DeviceIOControl ?
На каком языке?

Отправь пожалуйста кусок этого кода мне на qw66615@yandex.ru


Дата: Мар 19, 2003 15:23:57

> Как через DeviceIOControl ?

Вызов апи из kernel...

> На каком языке?

Ну не си же ...

> Отправь пожалуйста

Отправил ;)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.087