Кому принадлежит WDFMEMORY в WDFREQUEST? - PullRequest
0 голосов
/ 07 октября 2018

Я пишу драйвер ядра Windows.Мне нужно создать новый запрос ввода-вывода и выделить собственную память для буфера ввода.

// Create request
WDFREQUEST request;
status = WdfRequestCreate(WDF_NO_OBJECT_ATTRIBUTES, target, &request);
if (!NT_SUCCESS(status)) {
    goto exit;
}

// Allocate buffer for request
WDFMEMORY inputMemory;
status = WdfMemoryCreate(WDF_NO_OBJECT_ATTRIBUTES, PagedPool, 0, 1024, &inputMemory, NULL);
if (!NT_SUCCESS(status)) {
    goto exit;
}

// Assign input buffer to request
status = WdfIoTargetFormatRequestForIoctl(target, request, IOCTL_FOO, inputMemory, NULL, NULL, NULL);
if (!NT_SUCCESS(status)) {
    goto exit;
}

// Asynchronously send the ioctl request
WdfRequestSetCompletionRoutine(request, MyCompletionRoutine, NULL);
if (!WdfRequestSend(request, target, NULL)) {
    status = WdfRequestGetStatus(request);
    goto exit;
}

Мой вопрос: если WdfIoTargetFormatRequestForIoctl завершится успешно, я должен также выполнить WdfObjectDelete(inputMemory) в своей очисткеили WdfObjectDelete(request) уничтожит как память, так и запрос?Кроме того, является ли ответ одинаковым как для устранения ошибок в функции, так и в процедуре завершения?

1 Ответ

0 голосов
/ 14 января 2019

Согласно этому объекту Driver принадлежит память, он будет очищен только после выгрузки драйвера.

если вы можете покончить с памятью, вы должны вызвать WdfObjectDelete (), чтобы не сохранять неиспользуемую память.

...