Ходьба по дереву 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. Имеет ли это смысл? Спасибо.