Слушай, извини, что мучаю, но больше никто, видимо, ответить не могет. Народа, общающегося с кернел, не так то много:)
Насчет эксклюзивности ты уверен абсолютно или все же стОит попробовать?
Насколько я знаю, filter драйверы пишутся именно так, и вроде все работает. Например, фильтер драйвер для ком порта.
И после этого юзерские приложения не могут открывать более одного раза ком порт, как и положено.
А если использовать IoAttachDevice для вторичного девайса вместо IoAttachDeviceToDeviceStack?
Тут то экслюзивность сохраняется? И можно ли после этого убить SourceDevice (см. IoAttachDevice), или они должны жить вместе с AttachedDevice долго и умереть в один день?
А оверхед... В принципе, всего 2 варианта:
1. Для каждого девайса — свой саттелит. При этом в DEVICE_EXTENSION саттелита хранится lower device настоящего девайса. Соотв, надо различать, запрос к чему идет. Можно для это цели выбрать первый элемент структуры в DEVICE_EXTENSION, который будет указывать, саттелит это или нет. Соотв., дальнейшие поля DEVICE_EXTENSION в зависимости от этого интерпретируются по-разному.
2. Для всех девайсов — один саттелит. При этом при первом вызове из юзер-моде приложения ему возвращается соотв. DEVICE_OBJECT настоящего девайса, который потом и используется при вызовах для роутинга между настоящими девайсами.
Для метода (2) наверное, каждый запрос к драйверу требует нового IRP. Или нет?
Очевидно, что для (1) все может быть проще — просто передаем запрос ниже по стеку драйверов и все.
Правда, если только насчет эксклюзивности ты ошибся :)
Мне просто интересно не как логичнее на мой взгляд, а как делают другие, т.к. у меня опыта пока немного и все кажется весьма сложным.
И еще. А почему рекомендуешь создавать пул IRP заранее (под пулом подразумевается LinkedList?)? Чем это удобно? Почему нельзя создавать IRP непосредственно при необходимости, в момент запроса?