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:
Родитель
1664a4f58b
Коммит
123e7a2626
|
@ -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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче