Как происходит возврат из сист. сервиса (и куда)?

Тема в разделе "WASM.BEGINNERS", создана пользователем IceFire, 21 июн 2009.

  1. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Я представляю себе, как проходит вызов из третьего кольца в нулевое (скажем, от CreateFile до IoCreateFile). Подскажите, пожалуйста, как управление передается назад? Особенно интересно, как возвращается оно из нулевого кольца.

    Спасибо.
     
  2. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    если через системный сервис организован через прерывание то это обычный iret, если нет то sysexit(ret) на конкретный адрес в ntdll
     
  3. expert

    expert New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    151
    возращается в KiFastSystemCallRet
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    SashaTalakin
    В обоих случаях используется IRETD в конечном итоге, см. Kei386EoiHelper.
    Просто при сисентере стековый фрейм KTRAP_FRAME так составляется, чтобы в нем лежали корректные адрес возврата, селектор возврата, флаги и указатель на стек - полный комплект для IRETD.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Эта очень обширный вопрос, описание многа страниц займёт подробное, ибо это и есть базовая архитектура системы, кстати не только Iretd, обычно из сервиса возврат посредством Sysexit.
     
  6. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    что-то ты перепутал. есть разные ситуации например если входишь в sysenter в режиме трассировки то в трап фрейме взводится TF флаг после того как обработчик int1 передает управление на KiFastCallEntry2. А когда происходит выход из обработчика системного сервиса проверяется взведен ли флаг TF в трапфрейме и если да то возврат происходит по iret.

    Может гдето ошибаюсь тк уже мало что помню (буду скоро освежать посмотрю точнее), но смысл такой.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ой я спутал с Kei386EoiHelper.
    Ты прав насчет передачи управлени на iretd при взведенном TF.
    Но можно поставить флажок Session Manager\Kernel\FastSystemCallDisable=1, тогда будет всегда передаваться на iretd.
    Хотя на самом деле без разницы через что возвращать управление. Вызов Kei386EoiHelper из, например, хука KiSystemServiceRepeat вполне успешно отработает и вернется в точку вызова через iretd.