я надеюсь там (ULONG) *((ULONG) Mdl+sizeof(MDL)+PageNum*sizeof(ULONG))
почти попал, только зачем PageNum*sizeof(ULONG)? Это вышел указатель за пределы MDL.
Размер так вычисляют-
MemoryDescriptorList->Size = (CSHORT)(sizeof(MDL) + (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES((BaseVa), (Length))));
не физические адреса, а номера страниц...
Вполне возможно, и скорее всего там не номера страниц, а номера записей в Page Frame Number Database, я себя этим вопросом не напрягал, и по моему у них(у PFN) взаимно однозначное соответствие с номерами физических страниц. То есть физический адрес равен номеру страницы, умноженному на 0x1000 (для 4 кб страниц).
Флаги у твоей MDL интересные - MDL_NETWORK_HEADER | MDL_PARTIAL .
С пятой страницей похоже что-то не то. Нулевой PFN маловероятен, он вроде уже ядром занят. Скорее всего ты проскочил первый номер страницы. Надо так было
PULONG Pages = (PULONG) (Mdl + 1);
DbgPrnt("PFN[0]= 0x%X \n", Page[0]);
DbgPrnt("PFN[1]= 0x%X \n", Page[1]);
и т.д.