Пытаюсь запустить из kernel-mode поток в каком-нибудь определенном user-mode процессе. Ход действий такой: 0) Имеется имя запущенной проги и адрес функции в ней 1) По имени нашел PID процесса в котором надо выполнить запуск потока 2) По PID нашел PEPROCESS 3) Получаю хендл процесса через ObOpenObjectByPointer 4) Выделяю память под контекст в UserMode SYSTEM, настраиваю контекст. 5) присоединяюсь к нужному процессу 6) Выделяю память под стек в UserMode нужного процесса 7) отсоединяюсь от процесса 8) Запускаю поток status = ZwXXX(NtCreateThreadID, &hThread, THREAD_ALL_ACCESS, NULL, hProcess, &cid, Context, &UserStack, FALSE); Функция возвращает status = 0. При этом в юзермоде вываливается ошибка с кодом 0xC000000D Далее когда нажимаю ОК в сообщении об ошибке, то удачно выполняется функция которая должна выполнится. Уже всё перерыл, так и не пойму почему вываливается ошибка. Как будто система что-то хочет сделать когда запускается поток, но чего-то не хватает. Возможно чтото пропустил при инициализации потока, вот только что - хз.
Вопрос решен. Покопался в исходниках Win 2000 и нашел кое какие различия. я использовал структуру: Код (Text): typedef struct _INITIAL_TEB { void* StackBase; void* StackLimit; void* StackCommit; void* StackCommitMax; void* StackReserved; } INITIAL_TEB, *PINITIAL_TEB; А в Win 2000 (и получается и XP) юзается: Код (Text): typedef struct _INITIAL_TEB { struct { PVOID OldStackBase; PVOID OldStackLimit; } OldInitialTeb; PVOID StackBase; PVOID StackLimit; PVOID StackAllocationBase; } INITIAL_TEB, *PINITIAL_TEB; т.е. в принципе одно и тоже. но главная разница в том, что в исходниках обнуляются значения OldStackBase и OldStackLimit; В этом и оказывается была вся ошибка, что я их не обнулял)