Ошибка при запуске потока

Тема в разделе "WASM.BEGINNERS", создана пользователем slesh, 1 сен 2010.

  1. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Пытаюсь запустить из 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
    Далее когда нажимаю ОК в сообщении об ошибке, то удачно выполняется функция которая должна выполнится.

    Уже всё перерыл, так и не пойму почему вываливается ошибка. Как будто система что-то хочет сделать когда запускается поток, но чего-то не хватает. Возможно чтото пропустил при инициализации потока, вот только что - хз.
     
  2. slesh

    slesh New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2009
    Сообщения:
    214
    Вопрос решен.
    Покопался в исходниках Win 2000 и нашел кое какие различия.
    я использовал структуру:
    Код (Text):
    1. typedef struct _INITIAL_TEB
    2. {
    3.     void*   StackBase;
    4.     void*   StackLimit;
    5.     void*   StackCommit;
    6.     void*   StackCommitMax;
    7.     void*   StackReserved;
    8. } INITIAL_TEB, *PINITIAL_TEB;
    А в Win 2000 (и получается и XP) юзается:
    Код (Text):
    1. typedef struct _INITIAL_TEB
    2. {
    3.     struct
    4.     {
    5.         PVOID OldStackBase;
    6.         PVOID OldStackLimit;
    7.     } OldInitialTeb;
    8.     PVOID StackBase;
    9.     PVOID StackLimit;
    10.     PVOID StackAllocationBase;
    11. } INITIAL_TEB, *PINITIAL_TEB;
    т.е. в принципе одно и тоже. но главная разница в том, что в исходниках обнуляются значения
    OldStackBase и OldStackLimit; В этом и оказывается была вся ошибка, что я их не обнулял)