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

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

驱动程序的调度例程必须为 IRP 检查驱动程序的 I/O 堆栈位置,以确定在满足以下任一条件时要执行的操作:

  • 调度例程处理多个主 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 以获取指向下一级别驱动程序的 I/O 堆栈位置的指针,这些 I/O 堆栈位置在驱动程序 堆栈中向下传递 IRP 时,为下一个较低级别的驱动程序设置的 I/O 堆栈位置。

设备驱动程序的 DispatchDeviceControl 例程或 DispatchInternalDeviceControl 例程,或者可能由其紧密耦合的类驱动程序 () )必须确定每个请求在驱动程序的 I/O 堆栈位置上设置哪个 I/O 控制代码,该位置位于 Parameters.DeviceIoControl.IoControlCode 。 I/O 控制代码包含在驱动程序的 I/O 堆栈位置中。

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