Функция KMDF WdfDriverCreate возвращает недостаточно ресурсов

Я пытаюсь написать драйвер kmdf для пользовательской платы PCIe. Следуя проекту по умолчанию, предоставленному Microsoft, я внес несколько незначительных изменений в файл .inf, в основном изменив имена строк и указав идентификатор оборудования нашей платы PCIe.

Развертывание драйвера работает как надо. Драйвер устанавливается и отображается в диспетчере устройств, но пишет, что он установлен неправильно или может быть поврежден.

При отладке вижу, что 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» — мой драйвер.

При запуске команды дампа это вывод:

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 — это кеш символов Microsoft, который я получил, следуя приведенному здесь руководству: https://msdn.microsoft.com/en-us/library/windows/hardware/ff558829(v=vs.85).aspx

Мой второй вопрос: как правильно настроить отладчик для вывода журналов?

Спасибо


person shaboinkin    schedule 06.07.2016    source источник


Ответы (1)


Я не совсем понимаю, почему это помогает, но если я отключил верификатор KMDF под

[DriverName] Package -> Properties -> Configuration Properties -> Driver Install -> KMDF Verifier -> Enable KMDF Verifier 

И разверните драйвер, он работает. Если я включу это, это не удастся. Я развернул свой драйвер несколько раз, включая и выключая эту опцию, и она всегда терпит неудачу, когда она включена.

Я разместил этот вопрос вместе с моими выводами. Может быть, кто-нибудь ответит, почему это так: https://www.osronline.com/showthread.cfm?link=277793

person shaboinkin    schedule 18.07.2016
comment
Я могу подтвердить, что это исправило мою проблему. @shaboinkin ты недавно устанавливал WDK? Я сделал это на прошлой неделе. Может в последнем релизе ошибка? Я пытаюсь выяснить основную причину, и это кажется вероятным. - person Warty; 19.07.2016
comment
Да, но я установил WDK 8.1, который, похоже, был загружен со стороны Microsoft еще в 2014 году. Я считаю, что значение 0 передавалось в выделение памяти, что приводило к сбою. Если вы проверите исходный код WDK (github.com/Microsoft/Windows-Driver-Frameworks) в файле handleapi.cpp есть функция FxObjectHandleAlloc, в которую передается параметр размера. В комментарии упоминается, что размер передается компилятором. Он использует перегруженный оператор new в макросе функции внутри fxobject.hpp. - person shaboinkin; 20.07.2016
comment
У меня никогда не было возможности копаться в отладчике, чтобы убедиться, что это действительно проблема, просто потому, что для ее настройки требуется целая вечность. Но из других точек отказа внутри FxObjectHandleAlloc это было единственное место, где я мог видеть, что он не работает. В этой функции она вызывает FxPoolAllocateWithTag, в конечном счете, вызывает FxPoolAllocator внутри wdfpool.cpp, который терпит неудачу при размере == 0 или терпит неудачу на выходе этих функций Rtl*, те из которых я не могу просмотреть источник. Если компилятор по какой-либо причине передаст 0, это единственное, что я могу придумать, что приведет к сбою. - person shaboinkin; 20.07.2016