Я представляю себе, как проходит вызов из третьего кольца в нулевое (скажем, от CreateFile до IoCreateFile). Подскажите, пожалуйста, как управление передается назад? Особенно интересно, как возвращается оно из нулевого кольца. Спасибо.
если через системный сервис организован через прерывание то это обычный iret, если нет то sysexit(ret) на конкретный адрес в ntdll
SashaTalakin В обоих случаях используется IRETD в конечном итоге, см. Kei386EoiHelper. Просто при сисентере стековый фрейм KTRAP_FRAME так составляется, чтобы в нем лежали корректные адрес возврата, селектор возврата, флаги и указатель на стек - полный комплект для IRETD.
Эта очень обширный вопрос, описание многа страниц займёт подробное, ибо это и есть базовая архитектура системы, кстати не только Iretd, обычно из сервиса возврат посредством Sysexit.
что-то ты перепутал. есть разные ситуации например если входишь в sysenter в режиме трассировки то в трап фрейме взводится TF флаг после того как обработчик int1 передает управление на KiFastCallEntry2. А когда происходит выход из обработчика системного сервиса проверяется взведен ли флаг TF в трапфрейме и если да то возврат происходит по iret. Может гдето ошибаюсь тк уже мало что помню (буду скоро освежать посмотрю точнее), но смысл такой.
Ой я спутал с Kei386EoiHelper. Ты прав насчет передачи управлени на iretd при взведенном TF. Но можно поставить флажок Session Manager\Kernel\FastSystemCallDisable=1, тогда будет всегда передаваться на iretd. Хотя на самом деле без разницы через что возвращать управление. Вызов Kei386EoiHelper из, например, хука KiSystemServiceRepeat вполне успешно отработает и вернется в точку вызова через iretd.