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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как удалить драйвер из класса KbdClass  (Прочитано 2238 раз)
0 Пользователей и 1 Гость смотрят эту тему.
alexey29
Интересующийся

ru
Offline Offline

« : 13-02-2016 18:24 » 

Написал эмулятор для клавиатуры.
Разместил это драйвер в KbdClass.
В диспетчере устройств пропала возможность удалить или остановить этот драйвер.

Удаление через devcon также не заканчивается успехом.
Если устанавливаю этот драйвер в другой класс (создаю свой), то всё удаляется, но ко мне не цепляется kbdclass.sys

Как сделать так чтобы драйвер можно было удалить через диспетчер устройств???

Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 15-02-2016 10:56 » 

может в скрытых устройствах? что значит пропала возможность?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
alexey29
Интересующийся

ru
Offline Offline

« Ответ #2 : 15-02-2016 18:28 » 

В диспетчере устройств если вызвать контекстное меню любого устройства то можно увидеть (Обновить драйверы..., отключить, удалить, обновить конфигурацию оборудования, свойства).
Для моей виртуальной клавиатуры отсутствует отключить и удалить.
Убрал всё лишнее и оставил следующий код.

Код:
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
KdPrint(("DRIVER_ENTRY DriverObject=%Xh;\n", DriverObject));
DriverObject->DriverUnload = DriverUnload;
DriverObject->DriverExtension->AddDevice = AddDevice;
return 0;
}

NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
{
PDEVICE_OBJECT fdo;

NTSTATUS status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), NULL, FILE_DEVICE_KEYBOARD, NULL, true, &fdo);
if (!NT_SUCCESS(status)) {
KdPrint(("HID emulation: createPdoFilter IoCreateDeviceSecure error: %x\n", status));
return status;
}

KdPrint(("ADD_DEVICE DriverObject=%Xh; pdo=%Xh; fdo=%Xh\n", DriverObject, pdo, fdo));

return 0;
}

VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
KdPrint(("UNLOAD DriverObject=%Xh; DeviceObject=%Xh\n", DriverObject, DriverObject->DeviceObject));
IoDeleteDevice(DriverObject->DeviceObject);
}

При установке выполняется DriverEntry и AddDevice.
Мне кажется что виновником является kbdclass.sys  

Если убрать функцию AddDevice то драйвер спокойно удаляется.
« Последнее редактирование: 15-02-2016 18:35 от alexey29 » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 16-02-2016 11:01 » 

у вас флаг инициализации в adddevice не снят.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
alexey29
Интересующийся

ru
Offline Offline

« Ответ #4 : 16-02-2016 16:46 » 

Вот мой код AddDevice

Код:
NTSTATUS AddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo )
{
KdPrint(("HID Keyboard: IN AddDevice\n"));

PDEVICE_OBJECT pdoFilter = NULL;
PDEVICE_OBJECT pdoUserApp = NULL;

//Внутри этой функции создаю два устройства. Одно для kbdclass.sys Другое для пользовательского приложения
NTSTATUS status = createPdoFilterAndUserApp(DriverObject, pdo, &pdoFilter, &pdoUserApp);
if (NT_SUCCESS(status) == false) { return status; }


PDEVICE_EXTENSION pdxUserApp = (PDEVICE_EXTENSION)pdoUserApp->DeviceExtension;
PDEVICE_EXTENSION pdxFilter = (PDEVICE_EXTENSION)pdoFilter->DeviceExtension;

IoInitializeRemoveLock(&pdxFilter->RemoveLock, 0, 0, 0);
KeInitializeSpinLock(&pdxFilter->SpinLock);

pdxUserApp->RemoveLock = pdxFilter->RemoveLock;
pdxUserApp->SpinLock = pdxFilter->SpinLock;

pdxFilter->DeviceLower = IoAttachDeviceToDeviceStack(pdoFilter, pdo);
if (pdxFilter->DeviceLower == NULL) {
deletePdoFilter(pdoFilter);
deletePdoUser(pdoUserApp);
KdPrint(("HID Keyboard: Error IoAttachDeviceToDeviceStack \n"));
return STATUS_DEVICE_CONFIGURATION_ERROR;
}

pdxUserApp->DeviceLower = pdxFilter->DeviceLower;

KdPrint(("HID Keyboard: DeviceLower = %X;  pdo = %X, pdoFilter = %X; pdoUserApp = %X; \n", pdxFilter->DeviceLower, pdo, pdoFilter, pdoUserApp));


pdoUserApp->Flags |= DO_BUFFERED_IO;  // | DO_POWER_PAGABLE
pdoFilter->Flags |= DO_BUFFERED_IO | DO_DIRECT_IO; // | DO_POWER_PAGABLE

pdoUserApp->Flags &= ~DO_DEVICE_INITIALIZING;
pdoFilter->Flags &= ~DO_DEVICE_INITIALIZING;

KdPrint(("HID Keyboard: flagsPdo = %X flagsFilter = %X; flagsUser = %X; \n", pdo->Flags, pdoFilter->Flags, pdoUserApp->Flags));

_isInit = true;

return STATUS_SUCCESS;
}



HID Keyboard: IN AddDevice
HID Keyboard: DeviceLower = 7CF0080;  pdo = 7CF0080, pdoFilter = 76861E0; pdoUserApp = 4AB8060;
HID Keyboard: flagsPdo = 1040 flagsFilter = 1C; flagsUser = 44;


Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 16-02-2016 17:47 » 

я имел в виду что когда вы "убрали все лишнее" - флаг DO_DEVICE_INITIALIZING надо было все таки снять.
иначе устройство будет в недозагруженном состоянии и непонято что с ним делать.

Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
alexey29
Интересующийся

ru
Offline Offline

« Ответ #6 : 17-02-2016 16:16 » 

в общем вопрос где может быть проблема. Где надо копать.
Может надо какой нибудь запрос обработать?
Или создать какой-нибудь запрос и отправить кому-нибудь?
Может в inf файле проблема?
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 17-02-2016 19:25 » 

Почему неактивна кнопка Uninstall - почти уверен, что это связано с вашим inf-файлом и соответствующей секцией в нём.
По уму шина обрабатывает IRP_MN_QUERY_CAPABILITIES и заполняет DEVICE_CAPABILITIES надлежащим образом. Возможно disable растёт отсюда.
Сравнивайте свою клавиатуру с остальными клавиатурами, а не с устройствами другого типа.
« Последнее редактирование: 17-02-2016 19:49 от resource » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines