Могу ли я узнать символическую ссылку открытого устройства, когда процесс 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
для определения, какие данные нужно вернуть на чтение