DbgPrintEx 函数 (wdm.h)
如果满足指定的条件,DbgPrintEx 例程会将字符串发送到内核调试器。
语法
NTSYSAPI ULONG DbgPrintEx(
[in] ULONG ComponentId,
[in] ULONG Level,
[in] PCSTR Format,
...
);
参数
[in] ComponentId
指定调用此例程的组件。 这必须是 Dpfilter.h 头文件中定义的组件名称筛选器 ID 之一。 为了避免将驱动程序的输出与 Windows 组件的输出混合,应仅对 ComponentId使用以下值:
- DPFLTR_IHVVIDEO_ID
- DPFLTR_IHVAUDIO_ID
- DPFLTR_IHVNETWORK_ID
- DPFLTR_IHVSTREAMING_ID
- DPFLTR_IHVBUS_ID
- DPFLTR_IHVDRIVER_ID
[in] Level
指定要发送的消息的严重性。 这可以是任何 32 位整数。 0 和 31 之间的值(含)的处理方式不同于 32 和 0xFFFFFFFF 之间的值。 有关详细信息,请参阅 读取和筛选调试消息。
[in] Format
指定要打印的格式字符串的指针。 Format 字符串支持大多数 printf样式 格式规范字段。 但是,Unicode 格式代码(%C、%S、%lc、%ls、%wc、%ws和 %wZ)只能与 IRQL = PASSIVE_LEVEL一起使用。 DbgPrintEx 例程不支持任何浮点类型(%f、%e、%E、%g、%G、%a或 %A)。
...
指定格式字符串的参数,如 printf中所示。
返回值
如果成功,DbgPrintEx 返回 NTSTATUS 代码STATUS_SUCCESS;否则,它将返回相应的错误代码。
言论
只有内核模式驱动程序可以调用 DbgPrintEx 例程。
可以在 IRQL<=DIRQL 调用 DbgPrint 和 DbgPrintEx。 但是,Unicode 格式代码(%wc 和 %ws)只能用于 IRQL = PASSIVE_LEVEL。 此外,由于调试器使用进程间中断(IPIs)与其他处理器通信,因此在 IRQL>DIRQL 调用 DbgPrint 可能会导致死锁。
DbgPrintEx 将指定的字符串传递给内核调试器或根本不执行任何作,具体取决于 ComponentId、Level的值以及相应的组件筛选器掩码。 有关详细信息,请参阅 读取和筛选调试消息。
除非绝对必要,否则不应从用户输入或其他进程获取字符串并将其传递给 DbgPrintEx。 如果使用未创建的字符串,则必须验证这是有效的格式字符串,并且格式代码是否与类型和数量的参数列表匹配。 最佳编码做法是将所有 格式 字符串设置为静态,并在编译时定义。
Format 字符串的大小或参数数没有上限。 但是,对 DbgPrintEx 的任何单个调用将仅传输 512 字节的信息。 DbgPrint 缓冲区的大小也有限制。 有关详细信息,请参阅 DbgPrint 缓冲区和调试器。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Microsoft Windows XP 及更高版本中提供。 |
目标平台 | 普遍 |
标头 | wdm.h (包括 Wdm.h) |
库 | NtDll.lib(用户模式):NtosKrnl.lib (内核模式) |
DLL | NtDll.dll(用户模式):NtosKrnl.exe(内核模式) |
IRQL | <= DIRQL (请参阅注释部分) |