Что делает функция RtlEncodePointer? В справочнике Garry Nebbet нет такой функции, в MSDN и подавно. По предположению она переводит указатель пользовательского режима в какой-то другой. Но зачем? И в какой другой?
Я нашёл эту функцию только в ntdll.dll от XP SP2. Т.к. сама эта система у меня не установлена, пришлось ограничится IDA и гуглом. Код (Text): :7C913917 RtlEncodePointer proc . . . :7C91391D push 0 ; ReturnLength :7C91391F push 4 ; ProcessInformationLength :7C913921 lea eax, [ebp+var_4] :7C913924 push eax ; pProcessInformation :7C913925 push 36 ; PROCESSINFOCLASS :7C913927 push -1 ; NtCurrentProcess() :7C913929 call ZwQueryInformationProcess . . . :7C913935 RtlEncodePointer endp Как видно, вызывается ZwQueryInformationProcess с информационным классом 36. Что это за класс выяснить не удалось. Но, RtlEncodePointer вызывается из RtlAddVectoredExceptionHandler и можно предположить, что это связано с векторной обработкой исключений. В MSDN есть описалово VEH вообще, и AddVectoredExceptionHandler в частности. В дизасме хорошо видно, что RtlAddVectoredExceptionHandler выделяет структуру, вызывает RtlEncodePointer и пихает то что она вернет в эту структуру. Судя по тому, что ProcessInformationLength = 4, RtlEncodePointer возвращает указатель. Наверное, это указатель на цепочку векторных обработчиков, а RtlAddVectoredExceptionHandler добавляет в неё новый. Ещё есть RtlDecodePointer, которая вызывается из KiUserExceptionDispatcher. Так что всё это связано с VEH 100%. Вот тут: http://www.hkitn.com/article.php/2481 какой-то китаёза (кореец?) что-то нам говорит про RtlDecodePointer. Переводил http://babelfish.altavista.com/ Английский получился слишком ломанным, поэтому читать я не стал
Я натолкнулся на эту функцию когда как раз исследовал VEH изнутри. В VEH-цепочке один из элементов одной 12 байтной записи есть адрес векторного обработчикаи, который как раз закодирован этой функцей. Более подробно о VEH изнутри Вы можете почитать в "От зеленого к красному" Глава 3. Four-F и Quantum пасибо!
<font color="gray][ Quantum</font><!--color--><font color="gray]: RtlDecodePointer состоит всего лишь из "jmp RtlEncodePointer". ]</font><!--color--> Ну, я бегло смотрел - не заметил