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

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

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

« : 16-04-2017 23:22 » 

Как получить названия устройств, к которым подключён драйвер? Попробовал сделать так:
Код: (C)
..............................................................
ULONG infproc(IN PWCHAR pool1, IN ULONG cb) {
        ULONG cbr;
        ULONG ebxcbr = 0;
        PDEVICE_OBJECT DeviceObject;
        PFiDO_DEVICE_EXTENSION devExt;

        if (KeyDeviceObject->NextDevice != 0) {
                DeviceObject = KeyDeviceObject->NextDevice;

        fbj:
                devExt = (PFiDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
                if (devExt->LlirDeviceType == LLIR_DEVICE_KEYBOARD) {

                        cbr = 0;
                        IoGetDeviceProperty(devExt->PDO, DevicePropertyDriverKeyName, cb,
                                pool1, &cbr);
                        if (pool1 != 0) {
                                pool1 += cbr;
                                cb -= cbr;
                        }
                        ebxcbr += cbr;
                }
                if (DeviceObject->NextDevice != 0) {
                        DeviceObject = DeviceObject->NextDevice;
                        goto fbj;
                }
        }
        return ebxcbr;
}
, но почему-то KeyDeviceObject->NextDevice = 0, хотя драйвер ещё создал устройства
Записан
Ochkarik
Модератор

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

« Ответ #1 : 17-04-2017 09:48 » 

KeyDeviceObject - это что?
NextDevice - может на момент вызова процесс инсталяции не завершен?
посмотрите при помощи DeviceTree

не делайте так.
Код: (C++)
 
...
 fbj:
...
if (DeviceObject->NextDevice != 0) {
                        DeviceObject = DeviceObject->NextDevice;
                        goto fbj;
используйте
Код: (C++)
do {
 DeviceObject = DeviceObject->NextDevice;
....
} while(DeviceObject->NextDevice != 0);

PS вы в курсе что DevicePropertyDriverKeyName  - возвращает имя ключа в реестре?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ллирик
Постоялец

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

« Ответ #2 : 17-04-2017 15:25 » 

Забыл вставить в код первого поста
Код: (C)
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
        IN PUNICODE_STRING RegistryPath)
{
        RtlInitUnicodeString(&QgusDeviceName, L"\\Device\\KeyMouse");
        status = IoCreateDevice(DriverObject, 0, &QgusDeviceName,
                FILE_DEVICE_UNKNOWN, 0, FALSE, &KeyDeviceObject);
        if (status == STATUS_SUCCESS) {
                RtlInitUnicodeString(&gusSymbolicLinkName, L"\\??\\KeyMouse\0");
                IoCreateSymbolicLink(&gusSymbolicLinkName, &QgusDeviceName);
        }
, то есть драйвер загружается во время загрузки виндоус, а infproc выполняется по IOCTL, так что все устройства к этому времени у инициированы.
Забыл поменять DevicePropertyDriverKeyName на DevicePropertyDeviceDescription, но сути проблемы это не меняет. Всё-равно дело до IoGetDeviceProperty пока не доходит
Записан
Ochkarik
Модератор

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

« Ответ #3 : 17-04-2017 16:06 » 

DeviceTree посмотрели? есть там устройство на самом деле? (в дереве Driver View)

Добавлено через 8 минут и 9 секунд:
может быть просто не с того конца просто перечисляете?
« Последнее редактирование: 17-04-2017 16:16 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ллирик
Постоялец

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

« Ответ #4 : 17-04-2017 16:51 » 

А что тогда создаёт мою виртуальную мышь, если не мои устройства?) KeyDeviceObject создаётся самым первым, но не подключается ни к какому стеку. Что ли надо начинать перечисление с последнего созданного устройства?
« Последнее редактирование: 17-04-2017 18:07 от Ллирик » Записан
Ochkarik
Модератор

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

« Ответ #5 : 17-04-2017 19:06 » 

я никогда не задавался вопросом на очередность указателя Next. поэтому предлагаю вам это уточнить) займет это минуты полторы. заодно живьем дерево увидите. не хотите - не надо)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ллирик
Постоялец

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

« Ответ #6 : 17-04-2017 22:13 » 

А devicetree х64 нет( Что делать?
Записан
Ochkarik
Модератор

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

« Ответ #7 : 18-04-2017 09:50 » 

внимательно посмотреть ссылку которую я давал
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ллирик
Постоялец

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

« Ответ #8 : 05-05-2017 01:22 » new

Что ли надо начинать перечисление с последнего созданного устройства?
Да. Устройства в  DeviceObject->NextDevice расположены в обратном порядке.
Я ещё тут с виндой боролся по другим проблемам, так что вот только сегодня руки дошли))
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines