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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сново DMA  (Прочитано 5663 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Stran_nik
Гость
« : 08-11-2003 09:11 » 

Я извиняюсь, но у меня сново глюки с DMA. WDM драйвер, Windows 98, ISA карта.  
На StartDevice IoGetDmaAdapter проходит. Берет указатель.
Дальше на обрабочик записи стоит:

pdx->AdapterObject->DmaOperations->
               AllocateAdapterChannel(
                   pdx->AdapterObject,
                   fdo,
                   mapRegsNeeded,
                   AdapterControl,
                   pdx );
Данное место тоже проходится, но в  AdapterControl стоит

pdx->AdapterObject->DmaOperations->MapTransfer(
      pdx->AdapterObject,
      mdl,
      regbase,
      pdx->vaddr,
      &pdx->xfer,
      pdx->bWriting);

Так вот на этом 98 вываливается в синий экран и пишет:
Неустранимая ошибка 0E по адрему 0028:С00286с7 в VXD NTKERN (01) +00006F87

Что это может быть такое?
Записан
Stran_nik
Гость
« Ответ #1 : 12-11-2003 20:26 » 

Суть ошибки если я правильно понял в том, что я делал    KeFlushIoBuffers(mdl, !pdx->bWriting, TRUE) по левому mdl
Но возникает сразу вопрос. Прототип функции
  AllocateAdapterChannel(
  IN PDMA_ADAPTER DmaAdapter,
  IN PDEVICE_OBJECT DeviceObject,
  IN ULONG NumberOfMapRegisters,
  IN PDRIVER_CONTROL ExecutionRoutine,
  IN PVOID Context );

где ExecutionRoutine
Points to a driver-supplied AdapterControl routine to be called as soon the system DMA controller or busmaster adapter is available. This routine is declared as follows:
IO_ALLOCATION_ACTION
(*PDRIVER_CONTROL)(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID MapRegisterBase,
    IN PVOID Context
    );

Так вот SoftIce говорит, что  *Irp=0х00000000 <{...}>
Почему?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 13-11-2003 11:29 » 

А как понимать *Irp =0x00000, скорее Irp=0x0000, без *.

А вот тебе ответ товарища W. Oney:

IO_ALLOCATION_ACTION AdapterControl(PDEVICE_OBJECT fdo,
  PIRP junk, PVOID regbase, PDEVICE_EXTENSION pdx)
................
The second argument—which I named junk—to AdapterControl is whatever was in the CurrentIrp field of the device object when you called AllocateAdapterChannel. When you use a DEVQUEUE for IRP queuing, you need to ask the DEVQUEUE object which IRP is current. If you use the Microsoft queuing routines IoStartPacket and IoStartNextPacket to manage the queue, junk would be the right IRP. In that case, I’d have named it Irp instead.

Ты же очереди не используешь- вот поэтому у тебя и ноль. Сохраняй указатель на текущий Irp в DEVICE_OBJECT в его extension и бери оттуда и никакие очереди не нужны.
Записан
Stran_nik
Гость
« Ответ #3 : 13-11-2003 18:14 » 

Спасибо. Это я видимо пропустил.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines