CreateFile, чтобы открыть устройство MS-DOS, созданное в другом терминальном сеансе

У меня есть (своего рода фильтр) драйвер, который должен взаимодействовать с компонентами пользовательского режима. Создает объект устройства путем вызова IoCreateDeviceи затем он создает для него так называемую символическую ссылку MS-DOS IoCreateSymbolicLink, чтобы сделать возможным доступ к нему из кода режима пользователя (по CreateFile). Это стандартная техника более или менее. Драйвер создает символическую ссылку вида \DosDevices\mydevicenameтогда как код пользовательского режима открывает файл с именем \\.\mydevicename,

Теперь проблемы начинаются, когда драйвер создает устройство в контексте сеанса сервера терминалов. Созданная символическая ссылка на самом деле принадлежит локальный каталог сеансов, тогда как мой сервис пользовательского режима работает под системной учетной записью в «нулевом сеансе», и он «видит» символические ссылки, которые принадлежат глобальный каталог.

В документации упоминается, что обычно проблем нет, потому что драйверы в основном создают объекты устройств в контексте DriverEntry или же AddDevice функции, которые гарантированно работают под системной учетной записью. Но мой случай другой. И я не хочу это менять, мне действительно нужно иметь возможность создавать / уничтожать объекты устройства в контексте произвольного потока, принадлежащего любому сеансу.

Согласно документации, есть способ решить эту проблему. Водитель может настаивать на создании символической ссылки, принадлежащей глобальный каталог, назвав это так: \DosDevices\Global\mydevicename, Кроме того, если код пользовательского режима выполняется под какой-либо учетной записью, он также может настаивать на поиске ссылки в глобальный каталог, назвав файл так: \\.\Global\mydevicename, Хотя обычно это не требуется, если символ не существует в локальном каталоге, он автоматически проверяется в глобальном каталоге.

Я попробовал этот трюк: он не работает для меня. Я использую Windows 2008R2, 64-битный. Пока безуспешно. Я постоянно могу открывать устройства, созданные в системной учетной записи, но не могу открыть устройства, созданные в других сеансах (код ошибки «файл не найден»). Я перепробовал все комбинации и варианты определения \Global в режиме ядра / пользователя — пока результат тот же.

Это заставляет меня подозревать, что есть еще один уровень изоляции символов. Возможно используя \Global создает символическую ссылку, которая является глобальной для сеанса, но все же не для всей системы.

Имеет ли это смысл? Есть ли способ создать общесистемную символическую ссылку? Или есть способ открыть файл, символическая ссылка которого принадлежит другому сеансу?

РЕДАКТИРОВАТЬ:

Спасибо @Hans Passant. Я попробовал утилиту WinObj, чтобы увидеть, какие устройства и символические ссылки на самом деле создает драйвер.

На первый взгляд все в порядке. Я вижу все мои устройства под \Device каталог, и все символические ссылки находятся под \GLOBAL??, Символические ссылки указывают на правильные имена устройств.

Однако одна вещь странная. Попытка просмотреть свойства устройства из WinObj: для устройств, созданных в нулевом сеансе, это работает нормально, но для устройств, созданных в других сеансах, WinObj отвечает с ошибкой:

  • Ошибка открытия \ Device \ mydevicename: система не может найти указанный файл.

Таким образом, он отображает этот объект устройства в своем списке, но OTOH он «не найден» при попытке открыть его.
Очень странно. Но это объясняет мою проблему. Но это действительно странно.

Есть идеи? Заранее спасибо.

4

Решение

Eсть \Sessions\N\DosDevices\ путь, где N — номер сеанса. Я не пробовал это, но это должно работать.

Также я заметил, что субстрат и отображение сетевого диска создают символические ссылки в \Sessions\0\DosDevices\ID\где ID — это идентификатор сеанса. Таким образом, вы можете проверить этот путь тоже.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector