Загрузка драйвера с импортом функции из другого драйвера

Тема в разделе "WASM.X64", создана пользователем bers, 1 июл 2010.

  1. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Добрый день, товарищи.
    Столкнулся с такой проблемой под Windows 7 x64:
    есть 2 драйвера - один из которых (Drv1) экспортирует функцию (назовем
    ее Func()), а второй (Drv2) ее соотвественно импортирует.

    Под XP x86 все замечательно работает - прогружаем Drv2, автоматически
    подгружается Drv1 (или сначала прогружаем Drv1, а после Drv2).
    Под Windows 7 x64 ситуация такая:
    инсталляция и запуск Drv1 происходят корректно, инсталляция Drv2 - тоже,
    а при запуске Drv2 выдается следующее:
    An instance of the service is already running.

    При этом, если сначала стартануть Drv2, то он ругнется приведенной фразой,
    а если после этого стартовать Drv1, будет идентичная ругань.
    При этом данные драйвера вроде бы не присутствуют в системе - по крайней
    мере нет ни сообщений в DbgView, ни отображения в списке тулзы DriverView.

    Инсталляцию и запуск делаю с помощью sc в тестовых целях.
    Драйвера в принципе заглушечные - только DriverEntry() с Unload() и
    некоторый отладочный вывод.
    Инсталляция - sc create Drvx type= kernel binPath= c:\Drvx.sys.
    Запуск - sc start Drvx.

    Знает ли кто, в чем может быть дело?
     
  2. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Добавка:
    дело именно в импортировании, как только комменчу вызов испортируемой
    функции или глушу ее в коде Drv2 - все загружается как надо.
     
  3. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Переформулирую и немного конкретизирую вопрос:
    возможно ли взаимодействие драйверов через стандартный импорт-экспорт
    функций в Windows 7 x64, и, если да, то отчего могут возникать приведенные
    выше ошибки?
    Или же получение адресов функций драйвера возможно только через вызов
    специального IOCTL у оного с возвратом от него таблицы адресов
    экспортируемых им функций?
     
  4. bers

    bers New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2005
    Сообщения:
    139
    Адрес:
    Russia
    Оказалось, дело было в слишком малом выравнивании - оно явно
    выставлялось равным 0x20 и для SectionAlignment, и для FileAlignment.
    Выставление выравнивания в значения по умолчанию (0x1000 и 0x200)
    решило проблему.
    Видимо, либо с 64-разрядных ОС, либо именно с Windows7 x64 такое
    выравнивание для драйверов недопустимо.
    Что удивило так это страннейший статус, выдаваемый sc, на который,
    как показала практика, нужно было просто забить.

    Товарищи админы, закройте, пожалуйста, тему.