Могу ли я узнать символическую ссылку открытого устройства, когда процесс IRP_MJ_READ?

У меня есть драйвер, который создает и возвращает некоторые данные по запросу IRP_MJ_READ. Я использую символическую ссылку для открытия и чтения устройства, связанного с драйвером. Символическая ссылка что-то вроде \\DosDevice\\Name1,

Я хочу использовать то же устройство, чтобы получить другие данные из того же драйвера.

Как драйвер может определить, какой тип данных он будет возвращать?

Я думаю, если это какой-то способ использовать другую символическую ссылку (например: \\DosDevice\\Name2) к тому же устройству для разделения запросов на первый тип данных и запросов на второй тип? Иначе, если это другой способ, передать некоторую идентифицирующую информацию вместе с тремя IRP_MJ_READ?

1 ответ

Решение

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

когда пользователь открывает файл на вашем устройстве, он указывает имя файла. и вы можете и должны использовать это имя - основываясь на нем - возвращать другой контент на IRP_MJ_READ,

скажем ваше устройство с именем как \Device\MyDevice, пользователь может открыть файл, например, со следующими именами: "\Device\MyDevice", "\Device\MyDevice\""\Device\MyDevice\Name1", "\Device\MyDevice\Name2", в результате вы, в вашем IRP_MJ_CREATE будут просмотрены следующие имена FileObject: "", "\","\Name1","\Name2" и вы, основываясь на имени файла, можете связать другой контекст с объектом файла, а затем использовать этот контекст в IRP_MJ_READ и еще один момент. Также пользователь может передать дополнительную информацию о создании с помощью Extended Attributes (EA) и AllocationSize.

и как общее примечание - для чего вообще использовать символические ссылки на устройство? почему бы не открыть его по имени? и использовать IRP_MJ_READ Существует смысл только в том случае, если вы можете обработать этот запрос асинхронно или передать IRP более низкому драйверу. в случае, если вы всегда выполняете синхронный запрос - гораздо лучше использовать FastIoRead обработчик


также вместо обработки запроса на чтение на основе имени файла вы можете использовать параметры: вы используете ByteOffset сейчас? если нет, вы можете использовать его для различения. если вы используете ByteOffset сейчас, используется ли параметр Key? почти уверен, что нет. в этом случае вы можете для Key==0 вернуть некоторые данные, для Key == 1, некоторые другие данные и так далее. для использования ключа вам нужно использовать NtReadFile вместо ReadFile в режиме пользователя.

также вы можете использовать IOCTL вместо чтения файла для возврата данных и т. д. без дополнительных знаний о вашем драйвере и его связи с пользовательским режимом, скажем так, что лучше. но формальный ответ - можно и нужно использовать FileName для определения, какие данные нужно вернуть на чтение

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