Я пытаюсь написать драйвер 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
Мой второй вопрос: как правильно настроить отладчик для выгрузки журналов?
Благодаря
Я могу подтвердить это исправил свою проблему. @shaboinkin вы недавно установили WDK? Я сделал это на прошлой неделе. Возможно, в недавнем выпуске есть ошибка? Я пытаюсь выяснить основную причину, и это кажется вероятным. – Warty
Да, но я установил WDK 8.1, который, похоже, был загружен на стороне Microsoft в 2014 году. Я считаю, что значение 0 передавалось в распределение памяти, что приводило к сбоям в работе. Если вы проверите исходный код для WDK (https://github.com/Microsoft/Windows-Driver-Frameworks) в файле «handleapi».cpp ", есть функция FxObjectHandleAlloc, в которую передается параметр« размер ». Существует комментарий, в котором упоминается, что размер передается компилятором. Он использует перегруженный новый оператор в макросе функции внутри fxobject.hpp – shaboinkin
У меня никогда не было изменений, чтобы прорваться через отладчик, чтобы убедиться, что это действительно проблема просто потому, что для установки требуется много времени. Но из других точек отказа внутри FxObjectHandleAlloc это было единственное место, где я мог видеть он не работает. В этой функции, которую он вызывает, FxPoolAllocateWithTag в конечном итоге вызывает FxPoolAllocator внутри wdfpool.cpp, который не выполняется при размере == 0 или не работает на выходе этих функций Rtl *, из которых я не могу просмотреть источник. Передача компилятора в 0 по какой-то причине - единственное, что я могу думать о том, что это приведет к сбою. – shaboinkin