当进程 IRP_MJ_READ 时,我可以找出已打开设备的符号 link 吗?

Can i find out symbolic link of opened device, when process IRP_MJ_READ?

我有驱动程序,该构造和 return 一些关于 IRP_MJ_READ 请求的数据。 我使用一些符号 link 来打开和读取与驱动程序关联的设备。 符号 link 类似于 \DosDevice\Name1.

我想使用同一个设备从同一个驱动程序获取另一个数据。

驱动程序如何确定它将使用哪种类型的数据return?

我想,如果这是某种方式使用另一种符号 link(例如:\DosDevice\Name2)到同一设备来拆分对第一类数据的请求和对第二类数据的请求? 否则,如果换一种方式,将一些识别信息与 IRP_MJ_READ?

一起传递

不,您无法确定使用了哪些符号链接以及它是否用于您设备上打开的文件。你根本不需要尝试这样做。这是错误的方式。

当用户在您的设备上打开文件时,它会指定一些文件名。您可以而且必须使用此名称 - 基于它 - return IRP_MJ_READ.

上的不同内容

假设您的设备名为 \Device\MyDevice。用户可以打开文件,例如,下一个名称:"\Device\MyDevice""\Device\MyDevice\" "\Device\MyDevice\Name1""\Device\MyDevice\Name2"。结果,您将在 IRP_MJ_CREATE 中查看下一个文件对象名称:"""\""\Name1""\Name2",您可以根据文件名将不同的上下文与文件对象相关联,然后在 IRP_MJ_READ 和其他点中使用此上下文。用户还可以通过使用 Extended Attributes (EA) 和 AllocationSize[=27 传递有关创建的附加信息=]

并且作为一般说明 - 到底使用符号链接到设备的目的是什么?为什么不直接按名称打开它?并且仅当您可以异步处理此请求或将 IRP 传递给较低的驱动程序时,才使用 IRP_MJ_READ 存在意义。以防万一,如果你总是同步完成请求 - 更好地使用 FastIoRead handler


也可以代替基于文件名处理读取请求,您可以使用参数:您现在正在使用 ByteOffset 吗?如果没有,你可以用它来区分。如果您现在使用 ByteOffset,是否正在使用 Key 参数?几乎可以肯定没有。在这种情况下,您可以为 Key==0 return 一些数据,为 Key==1,一些其他数据,等等在。对于使用密钥,您需要在用户模式下使用 NtReadFile 而不是 ReadFile

你也可以使用 IOCTL 而不是读取文件 return 数据等,无需更多了解你的驱动程序,它与用户模式的通信很难说哪个更好。但正式的答案 - 你可以而且需要使用 FileName 来区分哪些数据需要 return 读取