写入到系统事件日志

错误由其 NTSTATUS 值指定。 系统预定义可由驱动程序使用的特定 NTSTATUS 值,驱动程序编写者可以定义其他错误。 请注意,记录错误时只能使用某些 NTSTATUS 值。

记录错误时可以使用的每个 NTSTATUS 值都有关联的错误消息。 例如,并行端口驱动程序使用 NTSTATUS 值PAR_INTERRUPT_CONFLICT来表示硬件中断冲突,消息文本为“检测到 %1 的中断冲突”。

事件查看器在日志条目的属性表上的“说明”文本框中显示消息文本。 如果消息文本字符串包含“%1”,则事件查看器将其替换为记录条目的设备的名称。 邮件文本可以包含“%2”、“%3”等形式的其他参数。 当驱动程序记录错误时,它可以为这些参数提供字符串值。 这些字符串值称为 插入字符串。 事件查看器将自动插入它们来代替百分比值。

驱动程序还可以在日志条目中包含二进制数据,称为 转储数据。 事件查看器在日志条目的属性表的“数据”文本框中显示转储数据。

可以通过双击事件查看器中的条目来显示日志条目的属性表。 以下屏幕截图显示了一个示例日志条目属性表。

事件属性表的屏幕截图。

驱动程序使用 IoAllocateErrorLogEntry 例程分配错误日志条目。 日志条目由可变长度 IO_ERROR_LOG_PACKET 标头组成,后跟插入字符串。

下图显示了内存中错误日志条目的布局。

说明内存 中的错误日志数据包布局的示意图。

IO_ERROR_LOG_PACKETErrorCode 成员指定错误的 NTSTATUS 值。 DumpData 成员指定日志条目的任何转储数据。 DumpData 是一个大小可变的数组,其大小由 DumpDataSize 成员指定。 驱动程序使用 StringOffset 成员指定第一个插入字符串的开头,以及 NumberOfStrings 成员中的字符串数。 每个插入字符串本身都是以 null 结尾的 Unicode 字符串。

驱动程序填写分配的错误日志条目后,会使用 IoWriteErrorLogEntry 将条目写入错误日志。 IoWriteErrorLogEntry 会自动释放为日志条目分配的内存。 驱动程序可以使用 IoFreeErrorLogEntry 释放任何未使用的日志条目。

IO_ERR_XXX) 格式的预定义错误代码 (在 windows 驱动程序工具包 (WDK) 随附的 ntiologc.h 头文件中定义。 可以在错误代码声明旁边的 ntiologc.h 注释中找到与每个错误代码关联的错误消息。 若要使用预定义的错误代码,驱动程序必须将系统文件(iologmsg.dll)注册为关联错误消息的源。 有关详细信息,请参阅 注册为错误消息源

驱动程序还可以定义自己的自定义错误类型和关联的错误消息。 有关详细信息,请参阅 定义自定义错误类型