何时检查驱动程序的 I/O 堆栈位置

在驱动程序的 I/O 堆栈位置 为每个传入 IRP 设置主要的 I/O 函数代码。

驱动程序的调度例程必须检查驱动程序的 I/O 堆栈的 IRP 位置,以确定如果出现以下任何一种情况,该怎么做:

  • 调度例程处理多个主要 I/O 函数代码。

  • 调度例程必须为某些主要函数代码处理一组次要函数代码。 具有次要函数代码的 IRP 包括 IRP_MJ_PNPIRP_MJ_POWER,以及 SCSI 端口驱动程序和文件系统驱动程序必须处理的某些 IRP。

  • 设备驱动程序或紧密耦合的更高级别的驱动程序的调度例程处理 IRP_MJ_DEVICE_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROL 请求,这些请求具有关联的 I/O 控制代码集。

若要获取指向驱动程序 I/O 堆栈位置的指针,其调度例程调用 IoGetCurrentIrpStackLocation

高级驱动程序的调度例程总是调用 IoGetCurrentIrpStackLocation,还调用 IoGetNextIrpStackLocation,来获取下一个较低驱动程序为下一个较低驱动程序设置的 IRP 的 I/O 堆栈位置的指针(在向驱动程序堆栈传递 IRP 时)。

设备驱动程序的 DispatchDeviceControl 例程、DispatchInternalDeviceControl 例程或其紧密耦合的类驱动程序,必须确定每个请求在驱动程序的 I/O 堆栈位置 Parameters.DeviceIoControl.IoControlCode 中设置了哪个 I/O 控制代码。 I/O 控件代码包含在驱动程序的 I/O 堆栈位置中。

在大多数情况下,高级驱动程序的 DispatchDeviceControlDispatchInternalDeviceControl 例程只需在 IRP 中设置堆栈位置后,将 IRP_MJ_DEVICE_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROL 请求传递给下一个较低的驱动程序。 但是,SCSI 类驱动程序必须检查某些 SCSI 端口 I/O 控制代码,以便可以在传递这些请求之前正确设置 SCSI 端口驱动程序的 I/O 堆栈位置。