From 058649036faf9a896e75900a52d317f3e6a9cd0d Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Thu, 16 May 2024 22:17:40 +0200 Subject: [PATCH] Take care about blink first, otherwise BlPhysicalListToVirtual() fails to properly map single-element linked list --- xtldr/memory.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/xtldr/memory.c b/xtldr/memory.c index a29343d..2b57d57 100644 --- a/xtldr/memory.c +++ b/xtldr/memory.c @@ -659,16 +659,6 @@ BlPhysicalListToVirtual(IN PXTBL_PAGE_MAPPING PageMap, NextEntry = ListEntry->Flink; /* Convert the address of this element to VirtualAddress */ - if(ListEntry->Flink == ListHead) - { - /* Convert list head */ - ListEntry->Flink = ListHead->Flink->Blink; - } - else - { - /* Convert list entry */ - ListEntry->Flink = BlPhysicalAddressToVirtual(ListEntry->Flink, (PVOID)PhysicalBase, VirtualBase); - } if(ListEntry->Blink == ListHead) { /* Find virtual address of list head */ @@ -679,14 +669,24 @@ BlPhysicalListToVirtual(IN PXTBL_PAGE_MAPPING PageMap, /* Convert list entry */ ListEntry->Blink = BlPhysicalAddressToVirtual(ListEntry->Blink, (PVOID)PhysicalBase, VirtualBase); } + if(ListEntry->Flink == ListHead) + { + /* Convert list head */ + ListEntry->Flink = ListHead->Flink->Blink; + } + else + { + /* Convert list entry */ + ListEntry->Flink = BlPhysicalAddressToVirtual(ListEntry->Flink, (PVOID)PhysicalBase, VirtualBase); + } /* Get to the next element*/ ListEntry = NextEntry; } /* Convert list head */ - ListHead->Flink = BlPhysicalAddressToVirtual(ListHead->Flink, (PVOID)PhysicalBase, VirtualBase); ListHead->Blink = BlPhysicalAddressToVirtual(ListHead->Blink, (PVOID)PhysicalBase, VirtualBase); + ListHead->Flink = BlPhysicalAddressToVirtual(ListHead->Flink, (PVOID)PhysicalBase, VirtualBase); /* Return success */ return STATUS_EFI_SUCCESS;