Привет Всем! Как следует из описания функции PsSetCreateProcessNotifyRoutine "она регистрирует callback функцию, которая вызывается всякий раз, когда происходит запуск или закрытие процесса"... Интересует следующее: 1. Как устроен этот механизм в ядре? 2. И если запускается процесс Y во время того, когда я в своей callback функции обрабатываю данные о предыдущем запустившимся процессе X, могу ли не зарегистрировать запуск процесса Y? Заранее спасибо!
как я помню, раньше был тупо массив из 8 нотификаторов, щас вроде механизм callback объектов, но тоже 8 штук кажись. при создании процесса винда проходит по списку и вызывает каждый хандлер,если он есть. при уничтожении аналогично а как процесс Y зависеть будет старта X? в разных потоках два раза будет вызван твой нотификатор вот и все // блин сорри, раз 5 точно отредактил пока не написал как надо)) опечатываюсь часто чето ужс.
Спасибо за обсуждение! Фишка в том, что был написан драйвер, который таким способом отслеживает запуск процессов. Далее было создано многопоточное приложение, которое в заданном количестве потоков (10) запускает и завершает указанный процесс (в данном случае был выбран notepad.exe) заданное количество раз (1000). Сам процесс создавался с помощью CreateProcess и когда мне был возвращен не нулевой описатель созданного процесса, то я его уничтожал вызовом TerminateProcess. По идее было создано 10000 процессов, но зафиксировалось порядка 6000. Кто-нить поведает, что тут происходило? Может слишком много процессов и винда не все их запускала? Но я сразу после запуска их уничтожал...
10 потоков по 1000 раз в каждом запускать notepad.exe ? хм. Вопрос, как вы считаете сколько было зафиксировано?
WIN32 Как только был запущен, сразу был уничтожен... Т.е. ресурсы были освобождены, наверна . Видимо нужно другой тест придумать...
prus Я спрашиваю как вы считаете сколько было зафиксировано созданий и завершений. Потому что теоритически все должно считать нормально, и работать нормально. Видимо как-то криво вы считаете.
WIN32 Каждый поток по идее создает и завершает 1000 процессов. Всего потоков 10. Получается 10000. Разве не так? А если вы имеете в виду, как считаю в драйвере, то в список кладу имя запустившегося процесса и диспетчерской функции вытаскиваю в юзермод. Там не 10000 получается. Да и DbgPrint использую, тоже не 10000 показывает.
мб там было чтото dwStartCount++ dwStopCount++ DbgPrint("%d processes started",dwStartCount); DbgPrint("%d processes stopped",dwStopCount); offtop: TarasCo у вас есть жаббер\icq или ещё что нибудь IM'ное ?
WIN32 Вот нечто похожее Скажите еще, если при создании процесса я получаю не нулевой его описатель, значит процесс создался и в драйвере должно это зафиксироваться?
Даже на одном процессоре надо Interlocked, просто глюк может редко проявляться. Представте, поток A прочитал переменную в регистр, переключение задач, поток Б прочитал переменную в регистр, переключение задач, поток А инкрементировал значение в регистре и.т.д
а кто отменил инкремент по виртуальному адресу напрямую? Код (Text): inc dword ptr [XXXXXXXX] прерывание (если оно в ожидании) происходит только после завершения инструкции, а контексты в винде переключаются от прерываний
Тогда надо lock добавить для глобальной переменной (если без апишек), если её выравнивание не равно естественномую
А кто гарантирует, что компилятор переведёт "a++" в "inc [a]", а не "mov eax,[a]/add eax,1/mov [a],eax" (возможно, разнесённое во времени)? Это же Си, а не асм...
diamond ну я не про то говорю, я говорю, что если переведет, тогда необязательно) ну а так конечно не факт что переведет