В общем эта функция возвращает FALSE при проверки IN OUT PVOID *BaseAddress в ZwMapViewOfSection, хотя адрес валиден и все впоряде... Мне подсказали что это связано с контекстом в котором вызываешь ZwMapViewOfSection... Куда курить чтобы все работало?
По идее она проверяет адрес(если он < 0x80000000) в контексте процесса, который её вызвал. Без кода хз.
MmIsAddressValid - опасная функция, т.к. делает не совсем то, что кажется. http://blogs.msdn.com/doronh/archive/2006/03/09/547793.aspx
кстати, давно хотел узнать, как правильно проверить доступ памяти в ядре, не лазя по всяким PTE MmSecureVirtualMemory? или все-таки MmProbeAndLockPages?
Никак. Парадигма простая: память, которую ты сам выделил и так знаешь, а по чужим огородам неча шариться
ProbeForRead - экспортируемая функция ядра. И рекомендованная для использования в драйверах для проверки доступа. Согласно ддк, она выбрасывает исключение нарушения доступа, если доступа к памяти нету. Соответственно обернув ее в try/except можно сразу сказать, есть доступ к участку, или нету.
она только для проверки юзермодных буферов.. чтобы испольовать ее для проверки ядра, нужно как минимум на время изменить переменную MmUserProbeAddress, хотя не факт, что функция после этого заработает правильно а менять MmUserProbeAddress, пусть даже и ненадолго.. но гуд )
тру.. найти какой-нить способ для XP, а начиная с Висты юзать документированне возможности а что, XP документированно никак?
итак, резюме: MmSecureVirtualMemory работает только с юзермодом MmProbeAndLockPages бсодится при обращении к отсутствующей памяти ядра ProbeForRead тоже работает только с юзермодом.. в принципе, самая подходящая функция, но для использования с памятью ядра требует временной коррекции MmUserProbeAddress или передачи управления не в начало, в обход проверки MmIsAddressValid делает не совсем то, что нужно лажово получается...
подскажите пожалуйста как правильно обрабатывать исключения от MmProbeAndLockPages на асме? Код (Text): _try invoke MmProbeAndLockPages,pMdl,KernelMode,IoWriteAccess _finally не помогает(при обращении к отсутствующему адресу bsod все равно)
а если использовать Код (Text): invoke MmIsAddressValid,pMdl перед вызовом MmIsAddressValid? уменьшит/исключит ли это возможные bsod'ы? в msdn как-то про это туманно написано Код (Text): If the pages do not support the specified operation, the routine raises the STATUS_ACCESS_VIOLATION exception. по каким правилам должен быть поставлен SEH-кадр?
нет, это не поможет скорее всего. исключение возникает не из-за кривости pMdl, а из-за того, что может обломаться попытка проверки и блокировки страниц, которые описывает MDL.
Этого я не знаю. Всё что у меня было, приаттачил в том посте. Дизассемблирование нужных компонентов архива + многочисленные статьи по внутренностям SEH должны помочь
наверное так и сделаю. А нельзя с помощью каких либо функций точно установить будет ли в результате вызова MmProbeAndLockPages сгенерировно исключение? тоесть чтоб точно знать насчет того , что "может обломаться попытка проверки и блокировки страниц, которые описывает MDL"