IRP 日志记录

驱动程序验证程序的 IRP 日志记录功能监视驱动程序对 IRP 的使用情况,并记录 IRP 使用情况。 此记录存储为 WMI 信息。

Windows 驱动程序工具包 (WDK) 包括可将此 WMI 记录转换为文本文件的工具 DC2WMIParser (dc2wmiparser.exe) 。

此驱动程序验证程序选项仅在 Windows Server 2003 及更高版本中可用。

WMI 记录

WMI 记录不包括每个设备的 20 个以上的 IRP。 记录第 21 个 IRP 后,将替换第一条 IRP 记录。 因此,如果记录列出了 20 个 IRP,则这些 IRP 始终是最近的 20 个,但无法知道其中哪一个是最新的 IRP。

由于 WMI 记录存储在内存中,因此在重启计算机时会将其擦除。 因此,请使用 DC2WMIParser 将此信息保存到文件中。

如果使用 /t 选项,DC2WMIParser 将在指定的持续时间内连续运行。 在这种情况下,记录可以包含每个设备的 20 多个 IRP, (每个采样周期) 最多包含 20 个 IRP。

激活此选项

可以使用驱动程序验证程序管理器或Verifier.exe命令行激活一个或多个驱动程序的 IRP 日志记录功能。

若要激活 IRP 日志记录功能,还必须激活 I/O 验证

  • 在命令行

    在命令行上,IRP 日志记录选项由 0x400 (位 10) 表示。

    若要激活 IRP 日志记录,请使用标志值0x410或向标志值添加0x410。 此值激活 I/O 验证 (0x10) 和 IRP 日志记录 (0x400) 。 例如:

    verifier /flags 0x410 /driver MyDriver.sys
    

    下次启动后,该功能将处于活动状态。

    在 Windows Vista 和更高版本的 Windows 上,还可以通过将 /volatile 参数添加到 命令来激活和停用 IRP 日志记录,而无需重启计算机。 例如:

    verifier /volatile /flags 0x410 /adddriver MyDriver.sys
    

    此设置会立即生效,但在关闭或重启计算机时会丢失。 有关详细信息,请参阅 使用易失性设置

  • 使用驱动程序验证程序管理器

    1. 启动驱动程序验证程序管理器。 在命令提示符窗口中键入 验证程序
    2. 选择“ 为代码开发人员) 创建自定义设置 ( ”,然后单击“ 下一步”。
    3. 从完整列表中选择“选择单个设置”。
    4. 选择“ (检查) IRP 日志记录I/O 验证”。

DC2WMIParser

DC2WMIParser 是一种工具,用于收集驱动程序验证程序创建的 WMI IRP 记录,并将此日志转换为文本文件。

DC2WMIParser 语法如下所示:

dc2wmiparser [/f File] [/t Time]

这些参数具有以下含义:

/f文件
指定要写入的日志文件的完整路径和文件名。 相对路径将相对于当前目录。 如果省略此项,将使用当前目录中的文件名 dc2verifier.act。

/t时间
指定 DC2WMIParser 将继续运行的时间长度(以分钟为单位)。 如果 Time 等于零,DC2WMIParser 将记录驱动程序验证程序已存储的所有 WMI IRP 信息,然后退出。 如果 Time 设置为正值,DC2WMIParser 将继续在指定的时间长度内运行,并存储新信息到达时。 默认值为零。

DC2WMIParser 日志文件的格式

DC2WMIParser 生成的文件是 ASCII 文本文件。

此文件的第一行包含一个十进制数字,表示文件中记录的设备数。

在第一行之后,文件分为多个部分:每个部分介绍一个设备。

对于每个设备,格式为:

  • 在单行上: 设备名称。

  • 在单行上: 一个十进制数,指定针对此设备的设备类型和函数的数量。

  • 对于每种设备类型和功能,在一行中: 三个十六进制数字,用逗号分隔。 这些表示设备类型,以及此记录中记录的最低和最高函数。

  • 对于每种设备类型和功能,在一组行中:

    • 具有十进制数的单个行,指定当前设备类型的 IOCTL 计数。
    • 每个 IOCTL 对应一行。 每一行都包含六个用逗号分隔的十六进制数字。 它们指定设备类型、函数、方法、访问、输入缓冲区的长度和输出缓冲区的长度。

下面是 DC2WMIParser 日志文件示例。 在实际文件中,不会有任何空格、注释或空白行,但这些行已添加到此示例中以使其更清晰。

2           There are two devices described by this log file.

The first device begins here:

  DP(1)0x7e00-0x21dbda400+3   Device name of the first device
  2                           Number of device type IOCTLs targeted at this device

    7,12,12                     First targeted device: device type 7, low function 12, high function 12
    2d,420,420                  Second targeted device: device type 2d, low function 420, high function 420

    1                           Number of IOCTLs for first targeted  device (type 7)
      7,12,0,0,90,0               Device type 7, function 12, method 0, access 0, inbuflen 90, outbuflen 0
    1                           Number of IOCTLs for second targeted device (type 2d)
      2d,420,0,0,c,0              Device type 2d, function 420, method 0, access 0, inbuflen c, outbuflen 0

The second device begins here:

  DP(1)0x7e00-0x21dbda400+2   Device name of the second device
  2                           Number of device type IOCTLs targeted at this device

    7,12,12                     First targeted device: device type 7, low function 12, high function 12
    2d,420,420                  Second targeted device: device type 2d, low function 420, high function 420


    1                           Number of IOCTLs for first targeted  device (type 7)
      7,12,0,0,90,0               Device type 7, function 12, method 0, access 0, inbuflen 90, outbuflen 0
    1                           Number of IOCTLs for second targeted device (type 2d)
      2d,420,0,0,c,0              Device type 2d, function 420, method 0, access 0, inbuflen c, outbuflen 0