Ходьба по дереву PnP в режиме ядра

Я хочу пройти Pnp дерево в режиме ядра. Это можно сделать в пользовательском режиме с помощью функций CM_XXX, однако, делая это вручную, мы получаем больше контроля. Также я хочу иметь возможность подключать процедуры отправки интересующего драйвера, чтобы знать, какие запросы он обрабатывает. Я нарисую псевдокод ходьбы по дереву Pnp:

void TraverseNode(DEVICE_NODE *Node, MY_DEVICE_NODE *MyNode)
{
    List Names;
    HANDLE Handle;
    DEVICE_NODE *Child;
    MY_DEVICE_NODE *MyChild;

    KeAcquireSpinLock(&IopDeviceTreeLock);
    Child = Node->Child;
    while (Child)
    {
        Names.Add(ObQueryNameString(Child->PhysicalDeviceObject);
        Child = Child->Sibling;
    }
    KeReleaseSpinLock(&IopDeviceTreeLock);
    for each Name in Names
    {
         Handle = ZwCreateFile(Name);
         if (Handle)
         {
             Child = Handle->DeviceObject->DeviceObjectExtension->DeviceNode;
             MyChild = CreateMyNode(Child);
             MyNode->Add(MyChild);
             TraverseNode(Child, MyChild);
             ZwClose(Handle);
         }
    }
}

MY_DEVICE_NODE* CreateMyNode(DEVICE_NODE *Node)
{
    MY_DEVICE_NODE *MyNode;
    DEVICE_OBJECT *DeviceObject;

    DeviceObject = Node->PhysicalDeviceObject;

    /*
    here we will create our own tree node
    for each device object in DeviceObject's stack we will store info:
    e.g. device object name, type, characteristics, driver's name, etc.
    */

    return MyNode;
}

// usage:

MyNode = CreateMyNode(IopRootDeviceNode);
TraverseNode(IopRootDeviceNode, MyNode);

Предположения, которые я сделал:

1) Если узел устройства все еще подключен к дереву Pnp, его PhysicalDeviceObject участник указывает на действительный PDO,

2) Если NtCreateFile возвращает успех, стек устройства уже создан. Завершено IRP_MN_START_DEVICE запрос так и не был отправлен IRP_MN_REMOVE_DEVICE пока нет запроса - все объекты устройства все еще действительны и подключены.

Приложение пользовательского режима сделает DeviceIoControl вызовите драйвер, чтобы получить снимок дерева. Мы сделаем это при запуске и каждый раз, когда мы получаем WM_DEVICECHANGE событие.

Я не знаю, есть ли элегантный способ получить IopRootDeviceNode а также IopDeviceTreeLock, но скажем, у нас есть. Я хочу спросить, есть ли у моего дизайна потенциальные проблемы, которые могут вызвать BSOD. Имеет ли это смысл? Спасибо.

0 ответов

Другие вопросы по тегам