我有驱动程序,它可以根据请求构造并返回一些数据IRP_MJ_READ。 我使用一些符号链接来打开和读取与驱动程序关联的设备。 符号链接类似于\DosDevice\Name1
.
我想使用相同的设备从同一驱动程序获取另一个数据。
驱动程序如何确定它将返回哪种类型的数据?
我想,如果这是使用另一个符号链接(例如:\DosDevice\Name2
)到同一设备的某种方式,用于拆分第一种类型的数据请求和第二种类型的请求? 否则,如果这是另一种方式,将一些识别信息与三IRP_MJ_READ一起传递?
不,您无法确定使用了哪些符号链接,以及它是否用于设备上的打开文件。 而且您根本不需要尝试这样做。 这是错误的方式。
当用户在您的设备上打开文件时,它会指定一些文件名。 您可以并且必须使用此名称 - 基于它 - 在IRP_MJ_READ
上返回不同的内容。
DeviceMyDevice
。 例如,用户可以打开文件,具有下一个名称:"DeviceMyDevice"
、"DeviceMyDevice"
"DeviceMyDeviceName1"
、"DeviceMyDeviceName2"
。 因此,您将在IRP_MJ_CREATE
中查看下一个文件对象名称:""
、""
、"Name1"
、"Name2"
,并且您基于文件名,可以将不同的上下文与文件对象相关联,然后在IRP_MJ_READ
和另一个点中使用此上下文。 用户还可以传递其他信息使用扩展属性(EA)和分配大小创建
作为一般说明 - 什么用途是指向设备的符号链接? 为什么不直接按名称打开它? 并且仅当可以异步处理此请求或将 IRP 传递给较低的驱动程序时,才使用IRP_MJ_READ
存在的意义。 万一,如果您总是同步完成请求 - 更好地使用处理程序FastIoRead
此外,在基于文件名的处理读取请求时,您可以使用参数: 你现在使用字节偏移量吗? 如果没有,您可以使用它进行区分。 如果您现在使用ByteOffset,是否正在使用Key参数? 几乎可以肯定没有。 在这种情况下,您可以为 Key==0 返回一些数据, 对于Key==1,返回一些另一个数据, 等等。要使用密钥,您需要在用户模式下使用NtReadFile
而不是ReadFile
。
您也可以使用 IOCTL 代替读取返回数据的文件等,而无需更多关于您的驱动程序和 IT 与用户模式通信的信息 很难说哪个更好。 但是正式的答案 - 您可以并且需要使用FileName
来区分哪些数据需要在读取时返回