Для IoGetAttachedDeviceReference написано:
The IoGetAttachedDeviceReference routine returns a pointer to the highest level device object in a driver stack and increments the reference count on that object.
То есть самый последний.
IoGetLowerDeviceObject, похоже, то, что нужно, правда, несколько смущает:
IoGetLowerDeviceObject returns NULL if:
The next-lower-level driver is not loaded.
The next-lower-level driver is currently being unloaded, removed, or deleted.
The device object pointed to by DeviceObject is the lowest device object in the driver stack.
Возможно, я смогу просмотреть не все объекты.
Алгоритм примерно такой: берём верхний объект в стеке функцией IoGetAttachedDeviceReference, затем идём вниз, вызывая IoGetLowerDeviceObject. Нужно не забыть вызвать ObDereferenceObject для верхнего объекта.
Добавлено через 2 часа, 5 минут и 18 секунд:Ещё такой вопрос. Как можно получить все устройства, работающие в системе? Знаю, что можно получить все драйвера через ZwQuerySystemInformation(SystemModuleInformation, ..). Есть ещё один способ, уже забыл, давно делал.. Вроде, просмотр корневой директории \\??\\ или \\DosDevices\\ через ZwQueryDirectoryFile...