不,您无法确定使用了哪些符号链接,以及它是否完全用于您设备上的打开文件。你根本不需要尝试这样做。这是错误的方式。
当用户在您的设备上打开文件时,它会指定一些文件名。你可以而且必须使用这个名字——基于它——返回不同的内容IRP_MJ_READ
。
说您的设备名为\Device\MyDevice
. 用户可以打开文件,例如,使用下一个名称:"\Device\MyDevice"
, "\Device\MyDevice\"
"\Device\MyDevice\Name1"
, "\Device\MyDevice\Name2"
. 结果,您IRP_MJ_CREATE
将查看下一个文件对象名称:、、、""
和您"\"
,基于文件名,您可以将不同的上下文与文件对象相关联,然后在其他点中使用此 "\Name1"
上下文。用户还可以使用扩展属性( EA ) 和AllocationSize传递有关创建的附加信息"\Name2"
IRP_MJ_READ
并作为一般说明 - 用于设备的符号链接有什么用?为什么不直接按名字打开呢?IRP_MJ_READ
并且仅当您可以异步处理此请求或将 IRP 传递给较低的驱动程序时才使用存在意义。以防万一,如果你总是同步完成请求 - 更好地使用FastIoRead
处理程序
也可以根据文件名处理读取请求,您可以使用参数:您现在使用ByteOffset吗?如果没有,你可以用它来区分。如果您现在使用ByteOffset,是否正在使用Key参数?几乎可以肯定没有。在这种情况下,您可以为Key==0返回一些数据,为Key==1返回一些其他数据,等等。使用密钥,您需要使用NtReadFile
而不是ReadFile
在用户模式下使用。
您也可以使用 IOCTL 代替读取文件以获取返回数据等,而无需更多地了解您的驱动程序,并且它与用户模式的通信很难说哪个更好。但正式的答案 - 您可以并且需要FileName
用于区分哪些数据需要在读取时返回