2016-07-06 1 views
1

Я пытаюсь написать драйвер kmdf для настройки пользовательской платы PCIe. После выполнения проекта по умолчанию, который предоставляет Microsoft, я внес несколько незначительных изменений в файл .inf, в основном меняя имена строк и предоставляя идентификатор оборудования нашей платы PCIe.Функция KMDF WdfDriverCreate возвращает «недостаточные ресурсы»

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

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

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

Благодаря

ответ

1

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

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

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

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

+0

Я могу подтвердить это исправил свою проблему. @shaboinkin вы недавно установили WDK? Я сделал это на прошлой неделе. Возможно, в недавнем выпуске есть ошибка? Я пытаюсь выяснить основную причину, и это кажется вероятным. – Warty

+0

Да, но я установил WDK 8.1, который, похоже, был загружен на стороне Microsoft в 2014 году. Я считаю, что значение 0 передавалось в распределение памяти, что приводило к сбоям в работе. Если вы проверите исходный код для WDK (https://github.com/Microsoft/Windows-Driver-Frameworks) в файле «handleapi».cpp ", есть функция FxObjectHandleAlloc, в которую передается параметр« размер ». Существует комментарий, в котором упоминается, что размер передается компилятором. Он использует перегруженный новый оператор в макросе функции внутри fxobject.hpp – shaboinkin

+0

У меня никогда не было изменений, чтобы прорваться через отладчик, чтобы убедиться, что это действительно проблема просто потому, что для установки требуется много времени. Но из других точек отказа внутри FxObjectHandleAlloc это было единственное место, где я мог видеть он не работает. В этой функции, которую он вызывает, FxPoolAllocateWithTag в конечном итоге вызывает FxPoolAllocator внутри wdfpool.cpp, который не выполняется при размере == 0 или не работает на выходе этих функций Rtl *, из которых я не могу просмотреть источник. Передача компилятора в 0 по какой-то причине - единственное, что я могу думать о том, что это приведет к сбою. – shaboinkin

Смежные вопросы