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

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

Приветствую всех!
Я занимаюсь программированием в режиме ядра очень недавно.
Подскажите пожалуйста кто встречался с проблемой связи с фильтр-драйвером kbfiltr из пакета DDK (один изпримеров).
Я создал символьную ссылку, ссылка создалась как положено, открываю через приложение при помощи
CreateFile("\\\\.\\kbfiltr") на что система отвечает сообщением об ошибке "Отказано в доступе".
Посмотрел лог отладки оказывается что-то уже его открыло после его инициализации!

Ниже лог отладки (DebugView):

000000 0.00000000 =kbfiltr= CreateDevice Ok 1E001C                    Создается объект устройства
00000001 0.00003249 =kbfiltr= CreateLink Ok 240022                    Создается символьная ссылка
00000002 0.00026566 =kbfiltr= hook keyboard received!                               
00000003 11.18125629 =kbfiltr= Create_FILE_is                              ВОТ ЭТО ЧТО-ТО ОТКРЫВАЕТ
00000004 11.18125916 =kbfiltr= OPEN_FILE_first time enable here

00000008 18.04690170 =kbfiltr= Key= 12 Time, -183346496              Это я пароль ввожу входа в Windows
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
00000014 19.53060341 =kbfiltr= Key= 30 Time, -168502746             
00000015 19.68208504 =kbfiltr= Key= 15 Time, -166940246
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
00000021 20.58407402 =kbfiltr= Key= 1C Time, -158033996
00000022 20.62473488 =kbfiltr= Key= 1C Time, -157565246

00000034 108.73882294 =kbfiltr= Key= 2A Time, 723997254
00000035 108.74505615 =kbfiltr= Key= 4F Time, 723997254
00000036 108.82349396 =kbfiltr= Key= 4F Time, 724778504
00000037 108.83283234 =kbfiltr= Key= 2A Time, 724934754
00000038 109.40206909 =kbfiltr= Key= E Time, 730559754
00000039 109.52223969 =kbfiltr= Key= E Time, 731809754


Подскажете пожалуйста как можно решить проблему.
Заранее благодарю!
« Последнее редактирование: 03-09-2007 09:12 от wold515 » Записан
sss
Специалист

ru
Offline Offline

« Ответ #1 : 04-09-2007 00:49 » 

Цитата: wasm.ru
Поток необработанного ввода RawInputThread системного процесса csrcc.exe открывает объект "устройство" драйвера класса клавиатуры для эксклюзивного использования.
Записан

while (8==8)
wold515
Гость
« Ответ #2 : 04-09-2007 11:17 » 

Уважаемый SSS спасибо что ткнул носом!
Но тогда как обратиться к драйвер-фильтру kbfiltr из UserMode?
Через обращение к KeyBoardClass0 тоже не пускает...
Где же вход  Здесь была моя ладья...
Записан
sss
Специалист

ru
Offline Offline

« Ответ #3 : 05-09-2007 08:30 » 

Создать дополнительной объект устройства ( IoCreateDevice), отличать которое в диспетчере пакетов можно будет, например, по структуре расширения.
Код:
struct 
{
  ULONG             ulType;
} COMMON_PDX;

struct FIDO_PDX : public COMMON_PDX
{
  ...
};

struct EDO_PDX : public COMMON_PDX
{
  ...
};

NTSTATUS DispatchIrps( IN PDEVICE_OBJECT pdo, IN PIRP Irp)
{
  ...
  COMMON_PDX* pcx = pdo->(COMMON_PDX*) pdo->DeviceExtension;

  if ( pcx->ulType)
  ...

}
Записан

while (8==8)
wold515
Гость
« Ответ #4 : 05-09-2007 17:49 » new

       SSS идею я понял пытался это сделать на днях, правда я создавал второе точно такое же устройство, которое по всем правилам тоже открывалось и обратится к нему было тоже невозможно. SSS я не совсем понял, как разделять IRP от моего приложения на открытие устройства от IRP системного процесса csrcc.exe.   Т.е. из своего приложения я должен передавать какие-то дополнительные параметры по которым второе устройство должно опознать эти IRP ?
       Или если у устройства другая структура расширения (DeviceExtension Это я так понял и есть структура расширения в примере структура COMMON_PDX), то системного процесса csrcc.exe его не сможет занять при открытии основного устройства?
       Постойте-ка кажется дошло Внимание! Говорит и показывает...
       IRP Направляется на самом деле не устройству, а его структуре расширения (т.е. менеджер ввода вывода определяет кому IRP послать именно по данным этой структуры). Отсюда следует что нужно создать два устройства (скажем Dev0 и Dev1) отличающихся по структуре расширения и на Dev1 создать символьную ссылку. И затем общаться с Dev0 через символьную ссылку Dev1 (через устройство Dev1).
        Я все правильно понял?
Записан
sss
Специалист

ru
Offline Offline

« Ответ #5 : 06-09-2007 08:54 » 

ДА. Создавай устройство чуть выше там, где вызываешь IoAttachDeviceToDeviceStack, которая присоединяет твое FiDO к стеку клавиатуры.
Записан

while (8==8)
wold515
Гость
« Ответ #6 : 07-09-2007 18:33 » 

Ура получилось!  Класс!
Я в структуру просто добавил переменную BOOLEAN Type и по ней отличаю для какого девайса IRP.
В процедурах добавил условие для распознавания кому пакет и как его обрабатывать.
После десятка BSOD и анализа DUMP MEMORY устройство открылось и при этом все работало!
И никакой BSOD больше не доставал. Улыбаюсь

Кстати на WASM.RU вычитал:
Цитата
Вот фрагмент функции KeyboardClassCreate драйвера kbdclass:

    PIO_STACK_LOCATION   pStack;

    pStack = IoGetCurrentIrpStackLocation( pIrp )

    if  pIrp->RequestorMode == UserMode
            &&
        pStack->Parameters.Create.SecurityContext->DesiredAccess & FILE_READ_DATA  {

        status = STATUS_ACCESS_DENIED
        goto KeyboardClassCreateEnd
    }


Как видите, kbdclass отклоняет попытку режима пользователя получить доступ к его устройствам для чтения.
Вот почему не получалось открыть устройство.

SSS огромнейшее тебе СПАСИБО!
« Последнее редактирование: 07-09-2007 19:13 от wold515 » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines