> Вот столкнулся с проблемой.... > Пытаюсь прочитать из драйвера 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 > > В чем дело может быть? Я просто не представляю.... В винде в порты пишешь не только ты. Если хочешь читать напрямую - пиши свой дривер контроллера и тогда тебе никто мешать не будет :-))) Ну или в крайнем случае запрети ВСЕ прерывания. Вот только состояние контроллера все равно может быть не таким как ты ожидаешь и он не захочет выполнять твои команды. А также состояние контроллера после того как ты сделал все что надо может быть не таким, как ожидает винда (вот это совсем плохо - контроллер может не захотеть выполнять команды винды). Кроме того надо бы глянуть в TSS а не виртуальные ли это порты (я не уверен что это действительно сделано, но даже для ring0 кода можно запретить писать в некоторые порты с последующим вызовом обработчика)
> Вот кстати пытался реализовать через VxDCall > IFSMgr_Ring0_FileIO > Ну тут ваще грабли....просто не ожидал.... > Или ддк для вин98 такое дурное.... > > Короче константа R0_READABSOLUTEDISK в ifs.inc определена > как 0dd00h, > то есть слово и помещать его нужно в регистр....ah.... > Натурально в хэлпе сказано что в al должен быть номер диска > (0=A,1=B,2=C....) > Так вот если записать код вот так: Я под 9х драйвера не писал, но все-таки меня смущает R0 в названии. Вполне возможно что предполагается наличие R1, R2 и т.д. И таким образом номер дисковода как раз окажется в al
> 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 что-нить написать*то выдает > ошибки.... А у тебя есть второй дисковод?
Насколько я помню еще с MSDOS-и винты начинались с 0x80. То бишь C: - 0x80, D: - 0x81 и т.д.. Контора то та же. Может и в 9x то же самое.
> Это чо микрософт так пошутил или я торможу? > Как можно решить такое? Не знаю. Я бы на твоем месте еще почитал документацию. У других-то людей получается. Хотя мелкософт - любитель приколов, не спорю. Но большинство их приколов вполне нормально задокументированы.
Вот столкнулся с проблемой....
Пытаюсь прочитать из драйвера 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....)
Так вот если записать код вот так:
То натурально читается заданный сектор с диска A - из сайса я видел при отладке
драйвера....а вот если в al что-нить написать*то выдает ошибки....
Это чо микрософт так пошутил или я торможу?
Как можно решить такое?
Пытаюсь прочитать из драйвера сектор HDD17.03.03 18:07 Автор: amirul <Serge> Статус: The Elderman
> Вот столкнулся с проблемой.... > Пытаюсь прочитать из драйвера 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 > > В чем дело может быть? Я просто не представляю.... В винде в порты пишешь не только ты. Если хочешь читать напрямую - пиши свой дривер контроллера и тогда тебе никто мешать не будет :-))) Ну или в крайнем случае запрети ВСЕ прерывания. Вот только состояние контроллера все равно может быть не таким как ты ожидаешь и он не захочет выполнять твои команды. А также состояние контроллера после того как ты сделал все что надо может быть не таким, как ожидает винда (вот это совсем плохо - контроллер может не захотеть выполнять команды винды). Кроме того надо бы глянуть в TSS а не виртуальные ли это порты (я не уверен что это действительно сделано, но даже для ring0 кода можно запретить писать в некоторые порты с последующим вызовом обработчика)
> Вот кстати пытался реализовать через VxDCall > IFSMgr_Ring0_FileIO > Ну тут ваще грабли....просто не ожидал.... > Или ддк для вин98 такое дурное.... > > Короче константа R0_READABSOLUTEDISK в ifs.inc определена > как 0dd00h, > то есть слово и помещать его нужно в регистр....ah.... > Натурально в хэлпе сказано что в al должен быть номер диска > (0=A,1=B,2=C....) > Так вот если записать код вот так: Я под 9х драйвера не писал, но все-таки меня смущает R0 в названии. Вполне возможно что предполагается наличие R1, R2 и т.д. И таким образом номер дисковода как раз окажется в al
> 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 что-нить написать*то выдает > ошибки.... А у тебя есть второй дисковод?
Насколько я помню еще с MSDOS-и винты начинались с 0x80. То бишь C: - 0x80, D: - 0x81 и т.д.. Контора то та же. Может и в 9x то же самое.
> Это чо микрософт так пошутил или я торможу? > Как можно решить такое? Не знаю. Я бы на твоем месте еще почитал документацию. У других-то людей получается. Хотя мелкософт - любитель приколов, не спорю. Но большинство их приколов вполне нормально задокументированы.