Fix driver verifier failure due to not setting the flag to indicate pages are locked (#653)

* Fix driver verifier failure due to not setting the flag to indicate pages are locked

Signed-off-by: Alan Jowett <alanjo@microsoft.com>

* PR feedback

Signed-off-by: Alan Jowett <alanjo@microsoft.com>
This commit is contained in:
Alan Jowett 2021-11-10 13:48:58 -07:00 коммит произвёл GitHub
Родитель 1664a4f58b
Коммит 123e7a2626
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
1 изменённых файлов: 14 добавлений и 7 удалений

Просмотреть файл

@ -203,18 +203,20 @@ ebpf_allocate_ring_buffer_memory(size_t length)
source_mdl = &ring_descriptor->memory->memory_descriptor_list; source_mdl = &ring_descriptor->memory->memory_descriptor_list;
// Create a MDL big enough to double map the pages. // Create a MDL big enough to double map the pages.
ring_descriptor->memory_descriptor_list = IoAllocateMdl( ring_descriptor->memory_descriptor_list =
ebpf_memory_descriptor_get_base_address(ring_descriptor->memory), IoAllocateMdl(NULL, (uint32_t)(requested_page_count * 2 * PAGE_SIZE), FALSE, FALSE, NULL);
(uint32_t)(requested_page_count * 2 * PAGE_SIZE),
FALSE,
FALSE,
NULL);
if (!ring_descriptor->memory_descriptor_list) { if (!ring_descriptor->memory_descriptor_list) {
EBPF_LOG_NTSTATUS_API_FAILURE(EBPF_TRACELOG_KEYWORD_BASE, IoAllocateMdl, STATUS_NO_MEMORY); EBPF_LOG_NTSTATUS_API_FAILURE(EBPF_TRACELOG_KEYWORD_BASE, IoAllocateMdl, STATUS_NO_MEMORY);
status = STATUS_NO_MEMORY; status = STATUS_NO_MEMORY;
goto Done; goto Done;
} }
#pragma warning(push)
#pragma warning(disable : 28145) /* The opaque MDL structure should not be modified by a driver except for
MDL_PAGES_LOCKED and MDL_MAPPING_CAN_FAIL. */
ring_descriptor->memory_descriptor_list->MdlFlags |= MDL_PAGES_LOCKED;
#pragma warning(pop)
memcpy( memcpy(
MmGetMdlPfnArray(ring_descriptor->memory_descriptor_list), MmGetMdlPfnArray(ring_descriptor->memory_descriptor_list),
MmGetMdlPfnArray(source_mdl), MmGetMdlPfnArray(source_mdl),
@ -226,7 +228,12 @@ ebpf_allocate_ring_buffer_memory(size_t length)
sizeof(PFN_NUMBER) * requested_page_count); sizeof(PFN_NUMBER) * requested_page_count);
ring_descriptor->base_address = MmMapLockedPagesSpecifyCache( ring_descriptor->base_address = MmMapLockedPagesSpecifyCache(
ring_descriptor->memory_descriptor_list, KernelMode, MmCached, NULL, FALSE, NormalPagePriority); ring_descriptor->memory_descriptor_list,
KernelMode,
MmCached,
NULL,
FALSE,
NormalPagePriority | MdlMappingNoExecute);
if (!ring_descriptor->base_address) { if (!ring_descriptor->base_address) {
EBPF_LOG_NTSTATUS_API_FAILURE(EBPF_TRACELOG_KEYWORD_BASE, MmMapLockedPagesSpecifyCache, STATUS_NO_MEMORY); EBPF_LOG_NTSTATUS_API_FAILURE(EBPF_TRACELOG_KEYWORD_BASE, MmMapLockedPagesSpecifyCache, STATUS_NO_MEMORY);
status = STATUS_NO_MEMORY; status = STATUS_NO_MEMORY;