You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:24:03