单个 DispatchCreateClose 例程

许多驱动程序(尤其是分层驱动程序链中的较低级别驱动程序)只需在收到 创建 请求时建立其存在,并且只需确认收到 关闭 请求。

例如,具有一个或多个调用 IoGetDeviceObjectPointer 的紧密耦合类驱动程序的设备控制器的端口驱动程序可能具有最少的 DispatchCreateClose 例程。 例程可能只是完成 IRP,如下所示:

    :    : 
{ 
    Irp->IoStatus.Status = STATUS_SUCCESS; 
 Irp->IoStatus.Information = 0; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
 return STATUS_SUCCESS; 
}

这个最小 DispatchCreateClose 例程将 I/O 状态块 的信息 成员设置为零,指示文件对象已为创建请求打开; 信息 对关闭请求没有意义。 例程将 Status 成员设置为 STATUS_SUCCESS 并返回此状态值,指示驱动程序已准备好接受 I/O 请求。

此最小 DispatchCreateClose 例程完成创建 IRP,而不会提高 IRP (IO_NO_INCREMENT) 的发起者的优先级,因为假定发起人等待一个不确定但非常小的间隔才能完成请求。

DispatchCreateClose 例程的工作量部分取决于驱动程序设备或基础设备的性质,部分取决于驱动程序的设计。 如果驱动程序对创建和关闭请求执行非常不同的操作,则应在 单独的 DispatchCreate 和 DispatchClose 例程中处理这些请求。

若要处理创建请求以打开表示逻辑或物理设备的文件对象,最高级别的驱动程序应执行以下操作:

  1. 调用 IoGetCurrentIrpStackLocation 以获取指向 IRP 中其 I/O 堆栈位置的指针。

  2. 检查 FileObjectFileName 位于 I/O 堆栈位置,如果 FileName 中的 Unicode 字符串的长度为零,则使用 STATUS_SUCCESS完成 IRP ;否则,请使用 STATUS_INVALID_PARAMETER 完成 IRP。

按照上述步骤操作可确保以后不会尝试在设备上打开伪文件会导致问题。 例如,这会阻止尝试打开不存在的 \\device\parallel0\temp.dat。