[BOOT:MM] Implement MmMdFindDescriptorFromMdl()
This commit is contained in:
parent
471beb8130
commit
3aae765c9c
@ -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 (
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user