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

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Дисковод, WIN2000, DMA

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


Дата: Июн 1, 2003 15:52:19

Заранее хочу извинится если вопрос некорректный, я .
Суть проблемы такова: Нужно работать на низком уровне с дисководом(читать/писать сектора) и что осложняет дело работать надо в WIN2000. Единственным, как мне кажется, возможный способ сделать это – написать программу работающую в режиме ядра, драйвер. Читаем и пишем сектор мы с использованием DMA. Насколько я понимаю ,буфер данных для DMA должен находится в первых 16 MB памяти. Где находиться мой драйвер я не знаю, но как мне кажется за пределами первых 16MB . А теперь внимание, вопрос: Как мне определить свой драйвер в эти первые 16MB или, хотя бы, получить в них буфер размером 512 байт?
Заранее благодарен всем кто ответит.


Дата: Июн 1, 2003 19:18:34

В ддк (по крайней мере 2000) есть пример floppy.c.

"This is the NEC PD756 (aka AT, aka ISA, aka ix86) and Intel 82077 (aka MIPS) floppy diskette driver for NT."

Можно попробовать, для начала, в нем порыться. А в первые 16Мб запихнуть драйвер (по крайней мере драйвер режима ядра) никак не удастся. Ядро начинается с 80000000h.


Дата: Июн 1, 2003 19:57:11

Ох не знаю. Боюсь, что разобрать этот исходник мне не по силам.
В Шрайбере «Недокументируемые возможности Win2k» я вычитал такую интересную деталь:
«…диапазон физических адресов с 0x00000000 по 0x1FFFFFFF один к одному отображается в диапазон линейных адресов 0x80000000 – 0x9FFFFFFF…». Если я правильно понимаю, то DMA работает с физической памятью, т. е. область физической памяти должна быть с 0x00000000 по 0x01000000 или 0x80000000 - 0x81000000 для логической. Так, что задача для драйвер – оказаться в области памяти 0x80000000 - 0x81000000. Как вы думаете это можно сделать?

И еще одно, если у кого-то есть исходник на ассемблере программки которая читает/пишет сектор на низком уровне (работа с контроллером дисковода), вышлете на a@splash.com.ua
Буду очень благодарен.


Дата: Июн 1, 2003 20:36:28

disk=CreateFile("\\\\.\\A:",GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTI NG,FILE_ATTRIBUTE_NORMAL,0);
ReadFile(disk,buf,1024,&result,0);
WriteFile(disk,buf,1024,&result,0);


Дата: Июн 1, 2003 20:51:05

2Black_mirror: Спасибо за ответ, но не совсем понятно, что это. Если вам не сложно, объясните подробнее.


Дата: Июн 1, 2003 21:21:02

В вин2000 дисковод можно открыть как файл, и никакие драйвера для того чтобы прочитать/записать сектор не нужны. А данный код читает первые два сектора и записывет их в следующие два.
При чтении/записи нужно указывать размер блока кратный размеру сектора.


Дата: Июн 1, 2003 21:37:53

Это конечно замечательно. Но моя задача заключается в работе с дисководом на низком уровне, т.е. я должен посылать через порты команды контроллеру. И только так, а не иначе. Использование каких либо уже готовых функций в моей ситуации невозможно.


Дата: Июн 1, 2003 22:02:53 · Поправил: Four-F

Получение хендла устройства дисковода \Device\Floppy0 (драйвер flpydisk.sys) и чтение/запись с нулевого (вроде) сектора.

Используя этот хэндл можно например легко прочитать геометрию диска:

local dwBytesReturned:DWORD
local dg:DISK_GEOMETRY

invoke DeviceIoControl, disk, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, \
addr dg, sizeof dg, addr dwBytesReturned, NULL

Но произвольно обращаться к цилиндрам/секторам так, IMHO, не получится.

Упссс... опоздал ;-)


Дата: Июн 1, 2003 22:22:51

2Four-F: Спасибо. Но это опять не то. Задача по прежнему осталась та же: либо засунуть драйвер в указанную область памяти (куда видно из предыдущих моих постингов), либо найти какой-либо другой способ читать сектор используя контроллер. Я думаю это возможно, хотя я согласен с тем, что задачка слегка маразматична.


Дата: Июн 1, 2003 23:59:04

Вот интересная ссылка, как раз в тему.
[url=]http://board.win32asmcommunity.net/showthread.php?s=86942b3255b1 b576eb238ac9793cf5b8&threadid=12751&highlight=DMA[/url]


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