Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема при считывании больших блоков из устройства  (Прочитано 5764 раз)
0 Пользователей и 1 Гость смотрят эту тему.
V-ctor
Гость
« : 12-01-2004 16:28 » 

При чтении блока длинной больше чем ~(0х700-0xE00), например, 0xF00 выдает ошибку page_fault_in_nonpaged_area

метод чтения METHOD_OUT_DIRECT
#define TRUNK_IOCTL_Read   CTL_CODE  (FILE_DEVICE_UNKNOWN, 0x800, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)

в приложении читаю так:
#define   buf_len   0xF00
USHORT b=SLDATA0;   DWORD BytesRet=0;
WORD buf[buf_len];
DeviceIoControl(hADSP_PCI, TRUNK_IOCTL_Read,&b,sizeof(b),buf, buf_len,&BytesRet,NULL);

в драйвере использую Mdl и MmGetSystemAddressForMdlSafe

буфер мой я так понимаю сам должен заблокироваться, т.к. метод директ

в чем проблема?
Записан
grozny
Гость
« Ответ #1 : 12-01-2004 20:54 » 

Дык! Мож будем сверяться с мануалом, с параметрами, прежде чем постить, а? Или это опечатка? В общем, ошибка в 6-м параметре DeviceIoControl.

чё пишут в мануале:

BOOL DeviceIoControl(
  HANDLE hDevice,
  DWORD dwIoControlCode,
  LPVOID lpInBuffer,
  DWORD nInBufferSize,
  LPVOID lpOutBuffer,
  DWORD nOutBufferSize,
  LPDWORD lpBytesReturned,
  LPOVERLAPPED lpOverlapped
);

....

nOutBufferSize
[in] Size of the output buffer, in bytes.

а тут я вижу buf_len, что есть количество 16-ти разрядных слов в буфере, не байт. Ядро при локировании страничек честно локирует сколько просишь, buf_len байт. Что есть в 2 раза меньше нужного  Отлично .

надо бы buf_len*sizeof(WORD) или sizeof(buf) написать.

Напиши, помогло или чё-то ещё?
Записан
V-ctor
Гость
« Ответ #2 : 13-01-2004 10:49 » 

Да вот какая странная штука, пробовал я в байтах, пробовал sizeof(buf), тогда вообще больше 10 байт не удается считать Жаль(
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 13-01-2004 11:54 » 

Цитата

Да вот какая странная штука, пробовал я в байтах, пробовал sizeof(buf), тогда вообще больше 10 байт не удается считать (


Ну это уже другая проблемма(на самом деле бред какой-то, сам подумай что у тебя выходит- читает только куски среднего размера, маленькие и большие не читает), разбирайся с драйвером устройства и со своим кодом- там явный баг. А размер только в байтах.
Записан
V-ctor
Гость
« Ответ #4 : 13-01-2004 14:47 » 

Мдяяя... разобрался.
А вот из любопытства мне интересен такой момент, как происходит непрерывное заполнения пользовательского буфера, если он в физической памяти разбит? А то, что он разбит я так понял вполне может быть.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines