IRP 日志记录

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

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

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

WMI 记录

WMI 记录不会包含每个设备的 20 多个 IP。 记录第二十一个 IRP 后,将替换第一条 IRP 记录。 因此,如果记录列出了 20 个 IP,则它们始终是最新的 20 个,但无法知道其中哪一个是最新的。

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

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

激活此选项

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

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

  • 在命令行中

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

    若要激活 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]

这些参数具有以下含义:

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

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

DC2WMIParser 日志文件的格式

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

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

第一行后,文件划分为多个部分;每个部分描述一个设备。

对于每个设备,格式为:

  • 在单行中: 设备名称。

  • 在单行中: 一个十进制数,指定此设备的目标设备类型和功能数量。

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

  • 在每个设备类型和功能的一组行中:

    • 一行,包含一个十进制数,用于指定当前设备类型的 ITL 计数。
    • 每个 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