0

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

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

驱动程序如何确定它将返回哪种类型的数据?

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

4

1 回答 1

1

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

当用户在您的设备上打开文件时,它会指定一些文件名。你可以而且必须使用这个名字——基于它——返回不同的内容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用于区分哪些数据需要在读取时返回

于 2017-12-01T14:21:04.420 回答