DDK : Как связаться с драйвером?
У меня такая проблема, я связываюсь с драйвером клавиатуры путем вызова функции CreateFile() (имя драйвера получаю путем вызовов SetupDiGetClassDevs(), SetupDiEnumDeviceInterfaces(), SetupDiGetInterfaceDeviceDetail() ). Когда режим доступа при вызове CreateFile() установлен в “GENERIC_READ | GENERIC_WRITE” или одно из них, функция взращает код ошибки, если же режим доступа установить в 0 то все нормально. Пробовал открывать игровой порт и дисковод все нормально открывается с режимом доступа “GENERIC_READ | GENERIC_WRITE”, а с мышкой то же что и с клавиатурой. Попытался связаться с драйвером фильтром клавиатуры (kdbfilter) (зарегистрировал интерфейс, включил его, в реестре все нормально прописалось) ситуация аналогичная, не хочет открывать. Сравнивал исходники драйверов игрового порта и клавиатуры, но вроде все что есть в игровом порте, то есть и в клавиатуре.
Я работаю под Win 2k, ddk то же под Win 2k.
Если кто ни будь знает в чем здесь проблема помогите пожалуйста.
(kbdclass.c)
// We do not allow user mode opens for read. This includes services (who
// have the TCB privilege).
//
if (Irp->RequestorMode == UserMode &&
(irpSp->Parameters.Create.SecurityContext->DesiredAccess & FILE_READ_DATA)
) {
status = STATUS_ACCESS_DENIED;
goto KeyboardClassCreateEnd;
}
Она не позволяет открыть драйвер на чтение и запись. Что бы получить нужный эффект надо ее просто закоментировать.
ставлю фильтр на клаву (фильтр написан на базе
DDK-ного kbfiltr.c), в AddDevice прописываю
создание SymbolicLink. Открыть через CreateFile
с GENERIC_READ | GENERIC_WRITE - не получается, с 0 - всё OK. Суть проблемы: в DriverEntry
вроде как положено прописываю
тра-та-та[IRP_MJ_DEVICE_CONTOL] = MyDevIoCtl. Фишка в том, что туда я никогда не попадаю. В комментариях kbfiltr.c что-то мутно сказано про то, что если я хочу использовать IOCTL, то надо создавать ещё один объект устройства, причем при передаче IRP нижележащим дровам надо анализировать
с каким объектом устр-ва я имею дело. Что за ботва такая? Вопрос : как огранизовать нормальный
IOCTL - интерфейс моего фильтра с Application'ом??? И как нормально сделать так, чтобы можно было открывать мою SymbolicLink c GENERIC_READ | GENERIC_WRITE??? (Предложенный Sergei_cn выше метод не самый лучший, т.к. kbdclass.sys я не трогаю, а просто вешаю фильтр)
P.S. Я вообще правильно устанавливаю фильтр???
Я делаю следующим образом: в панели инструментов
в разделе "система" ищу установленный по дефолту драйвер клавы, открываю "сведения о драйверах", далее жму "обновить" и указываю свой inf и check-версию своего фильтра. Вроде всё ставится как надо. Единственное, у меня закрадывается подозрение, что кто-то хватает IRP'ы для моего вроде как самого верхнего драйвера. Может я под kbdclass'ом стою???
Please HELP ME! А то я чего-то децл запутался.
кто-нибудь знает, где достать 16 битный компилятор (VC v1.52) для использования с DDK?