Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Технологии программирования > Железо. Написание драйверов
Перезагрузить страницу Синий экран при обращении к PCI
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
skalex skalex вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.11.2005
По умолчанию Синий экран при обращении к PCI - 21.11.2005, 14:31

Доброго времени суток. Столкнулся со следующией проблемой.

Есть PCI-устройство (собственная разработка), с которым нужно наладить взаимодействие из ОС Windows 2000/XP. Для решения этой задачи был написан WDM-драйвер. При выборе инструментальных средств для разработки драйвера, выбор пал на Compuware Driver Studio.

Пока работаем по IOCTL-ам все прекрасно работает. Однако устройство также генерирует аппаратные прерывания, которые нужно уметь ловить и обрабатывать.

Первое, что необходимо сделать в обработчике - это проверить, "свое" ли это прерывание. Для того, чтобы выяснить это, я должен обратиться к своему устройству и прочитать соответствующий его регистр. Вот тут и появляется беда - при попытке обратиться к PCI из обработчика прерывания я вылетаю в "Синий экран" со ссылками на ошибку в ntoskernel.exe.

Делаю я это так:
В объекте устройства объявлены следующие переменные:
Код:
KInterrupt m_Irq;
KDeferredCall m_DpcFor_m_Irq;
KPnpLowerDevice m_Lower;
В конструкторе объекта устройства:
Код:
PCIBlueDrvDevice::PCIBlueDrvDevice(PDEVICE_OBJECT Pdo, ULONG Unit) : KPnpDevice(Pdo, NULL)
{
    // ...................

    // Initialize the lower device
    m_Lower.Initialize(this, Pdo);

    // Inform the base class of the lower edge device object
    SetLowerDevice(&m_Lower);

    // ...................
}
При старте устройства:
Код:
NTSTATUS PCIBlueDrvDevice::OnStartDevice(KIrp I)
{
    // Initialize and connect the interrupt
    status = m_Irq.InitializeAndConnect(
  pResListTranslated, 
  LinkTo(Isr_m_Irq), 
  this
  );
    if (!NT_SUCCESS(status))
    {
        // ...................
    }

    // Setup the DPC to be used for interrupt processing
    m_DpcFor_m_Irq.Setup(LinkTo(DpcFor_m_Irq), this);
}
Функция обработки прерывания (пытаюсь обращаться к PCI также, как делал это в IOCTL-ах):
Код:
BOOLEAN PCIBlueDrvDevice::Isr_m_Irq(void)
{
    UCHAR bufferSize = 0;
    // ...................

    KPciConfiguration PciConfig(m_Lower.TopOfStack()); // вот тут и падаем !!!!

    PciConfig.ReadDeviceSpecificConfig(&bufferSize, 40, 1);
    // и т.д.
}
Подскажите, что и где я делаю неправильно.
Ответить с цитированием
  (#2 (permalink)) Старый
Dian Dian вне форума
Member
 
Сообщений: 5,243
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 17.09.2004
По умолчанию 21.11.2005, 18:56

Возможно, проблема с обращением к памяти: m_Lower, похоже, размещается, в страничной памяти.
Вообще в таких случаях полезно знать код ошибки
Ответить с цитированием
  (#3 (permalink)) Старый
Olesya Olesya вне форума
Member
 
Сообщений: 1,485
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 11.06.2002
По умолчанию 22.11.2005, 12:49

Код ошибки это раз. Во воторых если прерывание шареное, тогда надо проверять какое девай сгенерил прерывание. Возможно ты чужое хватаешь.
Ответить с цитированием
  (#4 (permalink)) Старый
skalex skalex вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.11.2005
По умолчанию 22.11.2005, 20:20

Спасибо всем откликнувшимся. Проблему уже решил. Напишу сюда - чтобы, если вдруг у кого возникнет аналогичная беда, знал, как это лечить.

Беда была в том, что я пытался использовать конструктор класса KPciConfiguration в 4-й форме. В функциях обработки IOCTL-ов, выполняемых на уровне IRQL = DISPATCH_LEVEL, все хорошо. Однако подпрограмма обработки прерывания работает на IRQL > DISPATCH_LEVEL. А здесь уже этот вариант не проходит. Вывод - нужно было проинициализировать объект класса KPciConfiguration в функции OnStartDevice, а тут уже просто к нему обращаться.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синий экран andrewterry Windows 7 3 29.12.2014 22:13
синий экран licv Любые вопросы от новичков 6 13.01.2012 21:54
Синий экран xxl Любые вопросы от новичков 4 11.12.2011 14:40
синий экран cahek2107 Память 2 09.12.2011 01:16
Синий экран Rihardt Windows 7 1 31.10.2011 23:30
синий экран ale96083389 Windows 7 1 26.10.2011 18:30
Синий экран... gidron Любые вопросы от новичков 13 09.07.2011 08:37
синий экран inze Любые вопросы от новичков 1 29.01.2011 16:34
Синий экран!! Nevoz Windows XP 1 17.12.2010 17:14
синий экран juz64 Материнские платы 0 13.12.2010 23:29
Синий экран Iron0071 Любые вопросы от новичков 3 11.11.2010 21:26
синий экран Kakuwa Операционная система Windows 9 24.06.2008 02:32



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов