通常,一个设备有多路数据流。而ReadFile,WriteFile又只针对一个句柄。这就出现一个矛盾,这有几个解决方案
- 多个设备对象
- 编写总线驱动
- 设备对象命名空间
虽然我没有找到WDK中推荐的做法,但在WHDC上,微软给出了推荐的做法。下面简单介绍一下吧。
首先IoRegisterDeviceInterface接受一个ReferenceString,我们可以给一个字符串“ch0”。这样,设备接口生成的符号连接就加了这个字符串。打开设备用这个带ReferenceString的字符串枚举。也就是说CreateFile用不同的Path得到不同的句柄。区别在于句柄上的IRP,其IO_STACK_LOCATION中的FileObject->FileName。现在明了了
NTSTATUS
DispatchRead (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
NTSTATUS status=STATUS_SUCCESS;
PIO_STACK_LOCATION stack= IoGetCurrentIrpStackLocation(Irp);
/*比如设备有两个IRP队列,这里就可以区分了*/
if(stack->FileObject->FileName...)
{
}
else
{
}
KdTrace(("Irp(%8.8lX)\n",Irp));
COMPLETE_REQUEST_NOINCREMENT(Irp,status,0);
return status;
}