Теоритический вопрос про PsSetCreateProcessNotifyRoutine

Тема в разделе "WASM.NT.KERNEL", создана пользователем prus, 19 мар 2008.

  1. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Привет Всем!
    Как следует из описания функции PsSetCreateProcessNotifyRoutine "она регистрирует callback функцию, которая вызывается всякий раз, когда происходит запуск или закрытие процесса"...
    Интересует следующее:
    1. Как устроен этот механизм в ядре?
    2. И если запускается процесс Y во время того, когда я в своей callback функции обрабатываю данные о предыдущем запустившимся процессе X, могу ли не зарегистрировать запуск процесса Y?

    Заранее спасибо!
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    как я помню, раньше был тупо массив из 8 нотификаторов, щас вроде механизм callback объектов, но тоже 8 штук кажись.

    при создании процесса винда проходит по списку и вызывает каждый хандлер,если он есть.
    при уничтожении аналогично

    а как процесс Y зависеть будет старта X? в разных потоках два раза будет вызван твой нотификатор вот и все


    // блин сорри, раз 5 точно отредактил пока не написал как надо)) опечатываюсь часто чето ужс.
     
  3. sww_

    sww_ New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2007
    Сообщения:
    155
    Great: ты пьян? :))

    Советую посмотреть как теперь реализован механизм в висте и 2008 server.
     
  4. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Спасибо за обсуждение!

    Фишка в том, что был написан драйвер, который таким способом отслеживает запуск процессов. Далее было создано многопоточное приложение, которое в заданном количестве потоков (10) запускает и завершает указанный процесс (в данном случае был выбран notepad.exe) заданное количество раз (1000). Сам процесс создавался с помощью CreateProcess и когда мне был возвращен не нулевой описатель созданного процесса, то я его уничтожал вызовом TerminateProcess. По идее было создано 10000 процессов, но зафиксировалось порядка 6000.
    Кто-нить поведает, что тут происходило? Может слишком много процессов и винда не все их запускала? Но я сразу после запуска их уничтожал...
     
  5. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    10 потоков по 1000 раз в каждом запускать notepad.exe ? хм.
    Вопрос, как вы считаете сколько было зафиксировано?
     
  6. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    WIN32
    Как только был запущен, сразу был уничтожен... Т.е. ресурсы были освобождены, наверна :).
    Видимо нужно другой тест придумать...
     
  7. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    prus
    Я спрашиваю как вы считаете сколько было зафиксировано созданий и завершений.
    Потому что теоритически все должно считать нормально, и работать нормально. Видимо как-то криво вы считаете.
     
  8. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    WIN32
    Каждый поток по идее создает и завершает 1000 процессов. Всего потоков 10. Получается 10000. Разве не так?
    А если вы имеете в виду, как считаю в драйвере, то в список кладу имя запустившегося процесса и диспетчерской функции вытаскиваю в юзермод. Там не 10000 получается. Да и DbgPrint использую, тоже не 10000 показывает.
     
  9. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    чел считал по отладочному выводу до 10000, это вызывает чувство, похожее на уважение :))
     
  10. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    :) мб там было чтото
    dwStartCount++
    dwStopCount++
    DbgPrint("%d processes started",dwStartCount);
    DbgPrint("%d processes stopped",dwStopCount);

    offtop: TarasCo у вас есть жаббер\icq или ещё что нибудь IM'ное ?
     
  11. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    WIN32
    Вот нечто похожее :)
    Скажите еще, если при создании процесса я получаю не нулевой его описатель, значит процесс создался и в драйвере должно это зафиксироваться?
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да
     
  13. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    надо бы в таком случае интерлокед юзадь, потомучто 10 потоков
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Freeman
    ну если больше одного логического процессора то да
     
  15. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    Даже на одном процессоре надо Interlocked, просто глюк может редко проявляться. Представте, поток A прочитал переменную в регистр, переключение задач, поток Б прочитал переменную в регистр, переключение задач, поток А инкрементировал значение в регистре и.т.д
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а кто отменил инкремент по виртуальному адресу напрямую?
    Код (Text):
    1. inc dword ptr [XXXXXXXX]
    прерывание (если оно в ожидании) происходит только после завершения инструкции, а контексты в винде переключаются от прерываний
     
  17. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Тогда надо lock добавить для глобальной переменной (если без апишек), если её выравнивание не равно естественномую
     
  18. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    А кто гарантирует, что компилятор переведёт "a++" в "inc [a]", а не "mov eax,[a]/add eax,1/mov [a],eax" (возможно, разнесённое во времени)? Это же Си, а не асм...
     
  19. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    diamond
    ну я не про то говорю, я говорю, что если переведет, тогда необязательно) ну а так конечно не факт что переведет