Как лучше организовать каркас?
Нужно, чтобы некоторые процессы создавались с перехватом некоторых API-функций, а некотрые как обычно. При этом, если нажата определенная комбинация клавиш, то в активном процессе(тот у кого в данный момент окно активно) состояние перехвата API менялось бы на противоположное, т.е. если в момент нажатия клавишь перехват осуществлялся, то отменить его, иначе — начать.
Вот, что я придумал:
Составить таблицу(храниться в файле, загружается в память при загрузке my_prog.exe):
prog1.exe +
prog2.exe +
prog3.exe +
prog4.exe -
prog5.exe -
prog6.exe -
1. Запускаем my_prog.exe при старте Windows. Он сразу же вешает хук на все процессы и перехватывает(меняя таблицу импорта) у них СreateProcess(). Так же он ловит нажатие определенной комбинации клавиш(глобальный хоткей).
2. При создании кем-либо процесса входящего в мою таблицу и отмеченного "+", вызываем CreateProcess() с флагом CREATE_SUSPENDED, после чего передаем в my_prog.exe идентификатор первичного потока создаваемового процесса. Внутри my_prog.exe мы вешаем на него хук(и исправляем таблицу импорта для нужных API функций), после чего вызываем ResumeThread().
3. Если нажата определенная комбинация клавиш(тот самый глобальный хоткей) и текущее активное окно десктопа является окном процесса, находящегося в моей таблице, то: если перехват API функций в этом процессе производится, то прекращаем его, иначе — начинаем перехват.
Фу. Надеюсь понятно объяснил. Я сам сильно начинающий и многого не понимаю, так что если мой вариант решения поставленной задачи глуп и нелогичен, то с огромным удовольствием выслушаю ваши наброски и идеи. Если же мой вариант вполне удовлетворителен и не должен вызывать особых проблем в реализации, то хотелось бы узнать следующее:
а) как лучше передавать идентификатор процесса отмеченного "+" в my_prog.exe? (это нужно для того, чтобы только моя программа контролировала время жизни хуков)
б) как узнать имеет ли поток(threadId) окно? Может быть можно перебирать все окна в системе, и узнавать их threadId?
зы Нужно, чтобы всё работало в Win9x/2000/XP.