|
|
| Посл.отвђт | Сообщен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 |