пятница, 28 января 2011 г.

MmIsAddressValid

В некоторых задачах, таких как, скажем, поиск неэкспортируемых символов, полезно юзать ассерты проверяющие найденные адреса, пример:

ASSERT( MmIsAddressValid(currentAddress) == TRUE );

И если найдется что-то совсем не то, что искалось, то в отладчике по команде .cxr произойдет остановка на ассерте в сорцах, плюс будут видны все локальные переменные.

Но тут есть один нюанс. При использовании верифаера и опции emulate low resources, он помечает некоторые PTE как инвалидные, бит Valid == 0 (Transition PTE в моем случае).


kd> !pte 0xfffff800`0292fe04

    VA fffff8000292fe04

PXE at FFFFF6FB7DBEDF80 PPE at FFFFF6FB7DBF0000 PDE at FFFFF6FB7E0000A0 PTE at FFFFF6FC00014978
contains 0000000000199063 contains 0000000000198063 contains 00000000001DA063 contains 062000000292F860
pfn 199 ---DA--KWEV pfn 198 ---DA--KWEV pfn 1da ---DA--KWEV not valid

    Transition: 292f

Protect: 3 - ExecuteRead


А ф-ция MmIsAddressValid делает проверку:

PointerPte = MiGetPteAddress(VirtualAddress);

if (PointerPte->u.Hard.Valid == 0)
    return FALSE;

Из-за этого ассерт сфейлится.
В релизе ессно таких проблем нет, но в debug'е пришлось убрать подобные ассерты.

Комментариев нет:

Отправить комментарий