Отслеживание процессов и синхронизация

Тема в разделе "WASM.NT.KERNEL", создана пользователем T800, 5 янв 2010.

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    T800
    cli/sti нужно для того, чтобы поток не прервался между lock dec и ret. Это будет фатально, поскольку счетчик сигнализирует о том, что хуки завершились, а некоторые потоки еще находятся внутри кода драйвера. Сразу после анлоада в этом случае будет бсод DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS.
    Поэтому cli/sti нужна. sti гарантирует так же, что IF будет установлен в 1 именно _после_ ret, то ест ьуправление уже выйдет за пределы драйвера.
    насчет атомарности - без префикса lock по-моему все-таки нет, хотя не уверен. в любом случае, лишним не будет.
    вообщем нужно и cli/sti и lock.
    без них DriverUnload будет жрать 100% выделенного ей процессорного времени, хотя это ей не требуется

    x64
    Хороший вариант, как в fastmutex. Но не катит в случае вызова перехвата на высоких IRQL. Допустим один процессор выполняет на высоком IRQL код перехвата, а другому потребовалось подождать выгрузки хуков. Представим случай: вызвана DriverUnload, и в этот момент случается прерывание, которое в конце концов уходит в вызов нашего хука на DIRQL (к примеру).
    Для того и задумывался этот код, в других случаях катит RemoveLock обычная (как я понимаю, она и устроена так, как ты описал, но я не смотрел).
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Кстати, я написал _или_ то _или_ другое.
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да, ну тем не менее в случае с обычными SSDT-хуками работать будет. Если что-то покруче хукать, та да, как у тебя надо делать.