· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ELECTRONICS —› DispatchCreateClose в PnP (nt5)

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


Дата: Июл 24, 2004 16:14:36

Совсем запутался.
Проблема следующая.
Есть драйвер PnP- фильтр для клавиатуры.
В AddDevice создается device фильтра и аттачится
в стек драйверов. Создается символьная ссылка.
Все пока OK.
Но мне надо из приложения общаться с ЭТИМ драйвером.
Т. е. посылать IOCTL запросы ни кому- нибудь, а
этому драйверу. Я вызываю CreateFile, но он
возвращает ошибку. Access denied.
Как надо сделать? Если я перенаправляю в функции
DispatchCreateClose Irp запрос ниже по стеку,
получается, я пытаюсь открыть не свой девайс(фильтра),
а другой. Или я не так понял?
Если я принимаю Irp и глушу его (IoCompleteRequest),
то клава после перезагрузки не отвечает на нажатия клавишь :((

Так как же правильно?
Или следует создать второй девайс?


Дата: Июл 24, 2004 19:01:00

Именно второй девайс. По официальной терминологии это будет: Control Device Object (CDO) и Filter Device Object (filter DO). Причем FiDO ДОЛЖЕН быть безымянным. Если есть IFS KIT смотри в доке раздел "Types of Device Objects Used by File System Filter Drivers". Пусть "File System" тя не смущает. Теория та же самая.


Дата: Июл 24, 2004 19:51:18

IFS KIT у меня нет.
А второй девайс создавать одновременно вместе с 1-м
в AddDevice?


Дата: Июл 24, 2004 19:56:57

И еще вопрос вдогонку:
допустим, вызывается DispatchControl.
В самом начале надо проверять, кокому девайсе пришло
сообщение?
Наподобие

mov eax, pDeviceObject
cmp eax, pDeviceObjectFilter
...

Или с помощью DeviceExtension.

Ведь DispatchControl- одна для всех девайсов.
Ход мыслей верен?


Дата: Июл 24, 2004 20:24:04

Порядок создания не принципиален. Важно чтоб когда ты фильтр аттачить будешь CDO уже был. Девайсы обычно по указателям на них и различают. Можно и в экстеншн какую-нить сигнатуру запихать.


Дата: Июл 24, 2004 21:09:06

Если использовать екстеншн, пидется использовать одну
и ту же структуру. А глобальные переменные юзать
нехорошо...
Пока все ясно :))
А что, во всех Disppatch- функциях придется
для каждого девайса свой обработчик писать?

Да, в фильтре изначально элементам всего массива
MAJOR_FUNCTION присваивается адрес транслирующей
вниз функции. А для CDO этого не надо.
Я в этой функции для него глушу Irp со статусом
STATUS_INVALID_DEVICE_REQUEST.
Так правильно?


Дата: Июл 24, 2004 22:46:50

[ drone: Если использовать екстеншн, пидется использовать одну и ту же структуру. ]

Это почему? У одного девайса свой екстеншн, у другого свой.


[ drone: А глобальные переменные юзать нехорошо... ]

Теоритически :)


[ drone: А что, во всех Disppatch- функциях придется для каждого девайса свой обработчик писать? ]

Так ты ж не будеш каждый тип IRP обрабатывать. Грубо говоря для CDO нужен Create/Close и пару каких-нить контролов от юзера обработать. Всё остальное в сад. А для FiDO всё вниз пойдет после твоей обработки, если она нужна.


Дата: Июл 24, 2004 23:00:17

Что за лажа!!
Всю субботу потерял!
Почему CDO нельзя открыть в CreateFile?
Чого ему не хватает?
DispatchCreateClose сделал, заверщаю Irp STATUS_SUCCESS.
Не работает. Даже в WinObj при клике на девайс-
говорит, мол не удается найти ук-й файл.

А насчет екстеншена- как ты собираешься приводить тип?

devExt= (DEVICE_EXTENSION)DeviceObject->DeviceExtencion;


Дата: Июл 25, 2004 00:27:04

[ drone: Всю субботу потерял! ]

Тю... Я уже пол-жизни потерял :)


[ drone: Чого ему не хватает? ]

Хм... Точно не уверен, но ты про флажок DO_DEVICE_INITIALIZING знаешь? IoCreateDevice взводит его, когда девайс создает. Если её звать в DriverEntry, то по выходе диспетчер в/в сам его сбрасывает. Если ты не в DriverEntry, то должен это сделать ручками вот так:

deviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

До тех пор, пока он взведен диспетчер считает, что девайс не готов и ничего с ним делать не дает. И IRP через него тоже, естественно, не гоняет. Думаю, что причина в этом может бвть. Только ты его сбрасывай, когда девайс полностью готов.


[ drone: А насчет екстеншена- как ты собираешься приводить тип? ]

Не понял. Нет такой структуры DEVICE_EXTENSION ! Вернее нет предопределенной. Ты сам её определяешь. Что хочеш, то и напихаешь туда.



ЗЫ: Тебе бы какой-нить сорс посмотреть. Там ещё куча всяких тонкостей. А то ты не только воскресенье, но и всю следующую неделю потеряешь ;))


Дата: Июл 25, 2004 01:04:06

Йо!
Круто! В час ночи наконец- то заработало.
Спасибо большое. Я как- то не обратил на него (флажок)
внимание... Привык к DriverEntry.

Аты когда вообще спать ложишься?


Дата: Июл 25, 2004 01:13:48

Насчет экстеншена.
Пусть есть dev1 и dev2.
Соответственно devExt1 и devExt2.
И пусть это две разные структуры (с разными полями и
размером соответственно).

Заходим в DispatchControl(device, Irp):
если НЕ ЗНАЕШЬ, какому девайсу пришел Irp, то ЧТО ты
cделаешь:

DEV_EXT1 devExt1= (DEV_EXT1)device->DeviceExtension;

или

DEV_EXT2 devExt2= (DEV_EXT2)device->DeviceExtension;

Ведь вопрос в том, чтобы с помощью ЭКСТЕНШЕНА ОПЕРЕЛЯТЬ
device: dev1 или dev2.

Вот о чем я хотел сказать ;)


Дата: Июл 25, 2004 01:37:21

Определи в обоих структурах первым даблвордом сигнатуру. Сигнатуры будут разные, по ним и определишь. Да или даже пусть первым даблвордом указатель на девайс будет. Он всяко уникален.

Через пару часов бай-бай. Но больше в сеть сегодня не полезу.


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