[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_TRUNCATE 0x00000002
|
||||||
#define MDL_OPERATION_FLAGS_PHYSICAL 0x40000000
|
#define MDL_OPERATION_FLAGS_PHYSICAL 0x40000000
|
||||||
|
#define MDL_OPERATION_FLAGS_VIRTUAL 0x80000000
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
MmFwGetMemoryMap (
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user