diff --git a/BOOT/ENVIRON/INC/mm.h b/BOOT/ENVIRON/INC/mm.h index 1b77c9a..fea0b92 100644 --- a/BOOT/ENVIRON/INC/mm.h +++ b/BOOT/ENVIRON/INC/mm.h @@ -20,6 +20,7 @@ Abstract: #define MDL_OPERATION_FLAGS_TRUNCATE 0x00000002 #define MDL_OPERATION_FLAGS_PHYSICAL 0x40000000 +#define MDL_OPERATION_FLAGS_VIRTUAL 0x80000000 NTSTATUS MmFwGetMemoryMap ( diff --git a/BOOT/ENVIRON/LIB/MM/mmmd.c b/BOOT/ENVIRON/LIB/MM/mmmd.c index 1a85251..492eeec 100644 --- a/BOOT/ENVIRON/LIB/MM/mmmd.c +++ b/BOOT/ENVIRON/LIB/MM/mmmd.c @@ -454,9 +454,60 @@ Return Value: { + BOOLEAN Mapped; + PMEMORY_DESCRIPTOR Descriptor; + PLIST_ENTRY ListEntry; + ULONGLONG FirstPage; + + Mapped = FALSE; + if (Flags & MDL_OPERATION_FLAGS_VIRTUAL) { + if (Mdl->Type == MDL_TYPE_PHYSICAL) { + Mapped = TRUE; + } + } else { + // + // If the MDL is virtual, the + // virtual flag must be set. + // + if (Mdl->Type == MDL_TYPE_VIRTUAL) { + return NULL; + } + } + // - // TODO: Implement this routine. + // Check if the cached descriptor is in range. // + if (!Mapped && Mdl->Current != NULL) { + Descriptor = (PMEMORY_DESCRIPTOR)Mdl->Current; + if (Page < Descriptor->FirstPage) { + ListEntry = Mdl->Head->Flink; + } else { + ListEntry = Mdl->Current; + } + } else { + ListEntry = Mdl->Head->Flink; + } + + while (ListEntry != Mdl->Head) { + Descriptor = (PMEMORY_DESCRIPTOR)ListEntry; + + if (Mapped) { + FirstPage = Descriptor->MappedFirstPage; + } else { + FirstPage = Descriptor->FirstPage; + } + + // + // Check if this descriptor contains Page. + // + if ((!Mapped || FirstPage) + && Page >= FirstPage + && Page < FirstPage + Descriptor->PageCount) { + return Descriptor; + } + + ListEntry = ListEntry->Flink; + } return NULL; }