Windows 2000驱动开发中IoAllocateErrorLogEntry返回空值是什么原因?
IoAllocateErrorLogEntry返回NULL的常见原因
- 代码写法不符合C语言规范:你给出的代码是伪代码形式,C语言不支持
IoObject = DriverObject这类命名参数传参方式,也不需要加ntoskrnl.exe/前缀调用内核函数。正确做法是引入WDK官方头文件#include <ntddk.h>后,直接调用IoAllocateErrorLogEntry,按参数定义顺序传参即可。 - 入口大小参数配置错误:第二个参数
EntrySize的有效值必须等于sizeof(IO_ERROR_LOG_PACKET)加上你需要额外存储的可变长调试数据的总长度,硬编码44属于不规范写法,如果该值小于IO_ERROR_LOG_PACKET结构本身的大小,函数会直接返回分配失败。 - 系统资源不足:该函数从非分页池中分配内存,虽然DriverEntry默认运行在符合要求的PASSIVE_LEVEL层级,但如果当时系统非分页池内存极度紧张,也会出现分配失败的情况,不过该场景出现概率极低。
正确调用示例
#include <ntddk.h> NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { PIO_ERROR_LOG_PACKET pLogEntry; // 基础结构大小 + 4字节自定义调试数据大小 ULONG ulAllocSize = sizeof(IO_ERROR_LOG_PACKET) + 4; pLogEntry = IoAllocateErrorLogEntry(DriverObject, ulAllocSize); if (pLogEntry == NULL) { return STATUS_INSUFFICIENT_RESOURCES; } // 填充日志字段 pLogEntry->MajorFunctionCode = 0; pLogEntry->RetryCount = 0; pLogEntry->DumpDataSize = 4; *(PULONG)pLogEntry->DumpData = 0x12345678; // 提交日志到系统事件日志 IoWriteErrorLogEntry(pLogEntry); return STATUS_SUCCESS; }
注意:填充完成后必须调用
IoWriteErrorLogEntry提交日志,才能在事件查看器中对应分类下找到你输出的日志条目。
内容的提问来源于stack exchange,提问作者Some name
相关产品推荐
相关产品推荐

