Такой вопрос - как ее правильно вызывать? Какой минимум параметров ей нужен, и как ей передать виртуальный адрес старта. Я нашел описание ее: NTSYSAPI NTSTATUS NTAPI ZwCreateThread( OUT PHANDLE ThreadHandle, //понятно IN ACCESS_MASK DesiredAccess, //понятно IN POBJECT_ATTRIBUTES ObjectAttributes, //понятно IN HANDLE ProcessHandle, //понятно OUT PCLIENT_ID ClientId, //понятно IN PCONTEXT ThreadContext, IN PUSER_STACK UserStack, IN BOOLEAN CreateSuspended //понятно ); остается 2 параметра IN PCONTEXT ThreadContext, IN PUSER_STACK UserStack, подозреваю, что в какую-то из этих структур надо передавать адрес старта p.s. - запускаю из ядра
Может это поможет: ThreadContext Points to a structure that specifies the initial values of the processor registers for the thread. UserStack Points to a structure that specifies the user mode stack of the thread. typedef struct _USER_STACK { PVOID FixedStackBase; PVOID FixedStackLimit; PVOID ExpandableStackBase; PVOID ExpandableStackLimit; PVOID ExpandableStackBottom; } USER_STACK, *PUSER_STACK;
нашел описание структуры context typedef struct { double Fpr0; double Fpr1; double Fpr2; double Fpr3; double Fpr4; double Fpr5; double Fpr6; double Fpr7; double Fpr8; double Fpr9; double Fpr10; double Fpr11; double Fpr12; double Fpr13; double Fpr14; double Fpr15; double Fpr16; double Fpr17; double Fpr18; double Fpr19; double Fpr20; double Fpr21; double Fpr22; double Fpr23; double Fpr24; double Fpr25; double Fpr26; double Fpr27; double Fpr28; double Fpr29; double Fpr30; double Fpr31; double Fpscr; DWORD Gpr0; DWORD Gpr1; DWORD Gpr2; DWORD Gpr3; DWORD Gpr4; DWORD Gpr5; DWORD Gpr6; DWORD Gpr7; DWORD Gpr8; DWORD Gpr9; DWORD Gpr10; DWORD Gpr11; DWORD Gpr12; DWORD Gpr13; DWORD Gpr14; DWORD Gpr15; DWORD Gpr16; DWORD Gpr17; DWORD Gpr18; DWORD Gpr19; DWORD Gpr20; DWORD Gpr21; DWORD Gpr22; DWORD Gpr23; DWORD Gpr24; DWORD Gpr25; DWORD Gpr26; DWORD Gpr27; DWORD Gpr28; DWORD Gpr29; DWORD Gpr30; DWORD Gpr31; DWORD Cr; DWORD Xer; DWORD Msr; DWORD Iar; DWORD Lr; DWORD Ctr; DWORD ContextFlags; DWORD Fill[3]; DWORD Dr0; DWORD Dr1; DWORD Dr2; DWORD Dr3; DWORD Dr4; DWORD Dr5; DWORD Dr6; DWORD Dr7; } CONTEXT; но где тут регистры общего назначения и EIP?
инфо о стеке извлекай из ZwQuerysection из структуры SECTION_IMAGE_INFORMATION оттуда и о значение eip и esp
я все таки не могу понять - ты с нуля запускаешь процесс из ядра или на каком-то этапе перехватываешь уже созданный процесс ?
ты неправильное описание структуры взял или неполное CONTEXT context = {CONTEXT_FULL}; context.Eip = (SECTION_IMAGE_INFORMATION)si.EntryPoint ну или свою подставляй
Если есть возможность посмотри пример 6.2 из "Gary Nebbett Windows NT, 2000 Native API Reference". Там показано, как заполняется данная структура.