Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows KMDF WdfDriverCreate函数返回;资源不足”;_Windows_Kmdf_Wdf - Fatal编程技术网

Windows KMDF WdfDriverCreate函数返回;资源不足”;

Windows KMDF WdfDriverCreate函数返回;资源不足”;,windows,kmdf,wdf,Windows,Kmdf,Wdf,我正在尝试编写一个kmdf驱动程序,以自定义PCIe板为目标。按照Microsoft提供的默认项目,我对.inf文件做了一些小更改,主要是更改字符串的名称并提供PCIe板的硬件ID 部署驱动程序的工作方式应该是这样的。驱动程序安装并显示在设备管理器上,但它表示安装不正确或可能已损坏 调试时,我看到WdfDriverCreate失败,错误为0xC000009A,这意味着资源不足 作为参考,这是kmdf模板项目为您生成的代码,这是我当前正在运行的代码: NTSTATUS DriverEntry(

我正在尝试编写一个kmdf驱动程序,以自定义PCIe板为目标。按照Microsoft提供的默认项目,我对.inf文件做了一些小更改,主要是更改字符串的名称并提供PCIe板的硬件ID

部署驱动程序的工作方式应该是这样的。驱动程序安装并显示在设备管理器上,但它表示安装不正确或可能已损坏

调试时,我看到WdfDriverCreate失败,错误为0xC000009A,这意味着资源不足

作为参考,这是kmdf模板项目为您生成的代码,这是我当前正在运行的代码:

NTSTATUS
DriverEntry(
    _In_ PDRIVER_OBJECT  DriverObject,
    _In_ PUNICODE_STRING RegistryPath
    )
{
    WDF_DRIVER_CONFIG config;
    NTSTATUS status;
    WDF_OBJECT_ATTRIBUTES attributes;

    //
    // Initialize WPP Tracing
    //
    WPP_INIT_TRACING( DriverObject, RegistryPath );

    TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry");

    //
    // Register a cleanup callback so that we can call WPP_CLEANUP when
    // the framework driver object is deleted during driver unload.
    //
    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DEVICE_CONTEXT);
    attributes.EvtCleanupCallback = CIPDriverEvtDriverContextCleanup;

    WDF_DRIVER_CONFIG_INIT(&config,
                           CIPDriverEvtDeviceAdd
                           );

    KdPrint(("CIP: Driver Entry\n"));
    status = WdfDriverCreate(DriverObject,
                             RegistryPath,
                             &attributes,
                             &config,
                             WDF_NO_HANDLE
                             );

    if (!NT_SUCCESS(status)) {
        TraceEvents(TRACE_LEVEL_ERROR, TRACE_DRIVER, "WdfDriverCreate failed %!STATUS!", status);
        KdPrint(("CIP: WdfDriverCreate failed with status - 0x%x\n", status));
        WPP_CLEANUP(DriverObject);
        return status;
    }

    TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Exit");

    return status;
}
我的第一个问题是,这是什么原因造成的?

我试图在运行时引发错误后转储日志

!wdfkd.wdflogdump mydriver.sys
但它从来都不起作用。我确保正确加载所有符号路径,如下所示

    fffff880`05fdd000 fffff880`05fe6000   CIPDriver   (private pdb symbols)  C:\Users\jimmyjoebobby\Documents\Visual Studio 2013\Projects\CIPDriver\x64\Win7Debug\CIPDriver.pdb        
22: kd> lm m wdf*
start             end                 module name
fffff880`00e5e000 fffff880`00f20000   Wdf01000   (pdb symbols)          c:\winsymbols\Wdf01000.pdb\03FC6AA4329F4372BE924775887225632\Wdf01000.pdb
fffff880`00f20000 fffff880`00f30000   WDFLDR     (pdb symbols)          c:\winsymbols\wdfldr.pdb\9674B20D2E5B4E7AA2DE143F642A176E2\wdfldr.pdb
“CIPDriver”是我的司机

运行dump命令时,这是输出:

22: kd> !wdfkd.wdflogdump CIPDriver.sys
Trace searchpath is: 

Trace format prefix is: %7!u!: %!FUNC! - 
TMF file used for formatting log is: C:\WinDDK\7600.16385.1\tools\tracing\amd64\wdf01000.tmf
Log at fffffa80356232f8
Gather log: Please wait, this may take a moment (reading 0 bytes).
% read so far ... 
warn: The log could not be accessed
hint: Are the symbols the WDF library available?
hint: The log is inaccessable after driver unload.
以及.sympath的输出

22: kd> .sympath
Symbol search path is: C:\Users\jimmyjoebobby\Documents\Visual Studio 2013\Projects\CIPDriver\Win7Debug;C:\winsymbols
Expanded Symbol search path is: c:\users\jimmyjoebobby\documents\visual studio 2013\projects\cipdriver\win7debug;c:\winsymbols
其中C:\winsymbols是Microsofts符号的缓存,我通过以下指南获得:

我的第二个问题是,如何正确设置调试器以转储日志?


谢谢

我不太明白为什么这会有帮助,但是如果我在下关闭KMDF验证程序

[DriverName] Package -> Properties -> Configuration Properties -> Driver Install -> KMDF Verifier -> Enable KMDF Verifier 
然后部署驱动程序,它就工作了。如果我打开它,它就会失败。我部署了我的驱动程序几次,切换该选项的开和关,当它打开时总是失败


我把这个问题和我的发现一起发布了。也许有人可以回答为什么会这样:

我可以确认这解决了我的问题@shaboinkin您最近安装了WDK吗?我在上周做的。也许在最近的版本中有一个bug?我正在试图找出根本原因,这似乎是有可能的。是的,但我安装了WDK 8.1,它看起来已经在2014年上传到了微软。我认为0的值被传递到内存分配中,这导致了失败。如果您在文件“handleapi.cpp”中检查WDK()的源代码,则会传入一个名为FxObjectHandleAlloc的函数,该函数的参数为“size”。有一条评论提到大小是由编译器传入的。它在fxobject.hpp内的函数宏中使用了重载的新运算符。我从来没有得到过一个更改,可以通过调试器来验证这确实是问题所在,因为设置过程需要很长时间。但在FxObjectHandleAlloc内部的其他故障点中,这是我看到它失败的唯一地方。在该函数中,它调用on,FxPoolAllocateWithTag最终调用wdfpool.cpp内部的FxPoolAllocator,该函数在size==0时失败,或者在这些Rtl*函数的输出时失败,这些函数的源代码我无法查看。无论出于什么原因,让编译器传入0是我唯一能想到的会使它失败的事情。