имеется Код (Text): ... CONTEXT con; status = ZwOpenThread(&hThread, THREAD_ALL_ACCESS, &ObjectAttributes, &(pProcesses->Threads[i].ClientId)); if (!NT_SUCCESS(status)) DbgPrint ("ZwOpenThread status: %x\n", status); pZwSuspendThread = (ZwSuspendThread *)0x805DC61B;//хардадрес status = pZwSuspendThread (hThread, &prev_mod); if (!NT_SUCCESS(status)) DbgPrint ("ZwSuspendThread status: %x\n", status); con.ContextFlags = CONTEXT_FULL; pZwGetContextThread =(ZwGetContextThread *)0x805DC5B0;//хардадрес status = pZwGetContextThread (hThread, &con); if (!NT_SUCCESS(status)) DbgPrint ("ZwGetContextThread status: %x\n", status); pZwSetContextThread = (ZwSetContextThread *)0x8062C85B;//хардадрес status = pZwSetContextThread (hThread, &con); if (!NT_SUCCESS(status)) DbgPrint ("ZwSetContextThread status: %x\n", status); pZwResumeThread = (ZwResumeThread *)0x8057F8D5;//хардадрес status = pZwResumeThread (hThread, &prev_mod); if (!NT_SUCCESS(status)) DbgPrint ("ZwResumeThread status: %x\n", status); ... Также имеется бсод. Собсно вылетаю на попытке установки контекста. Ошибка - set_invalid_of_context. По сырцам реактос - Код (Text): /* Don't allow ESP to be lowered, this is illegal */ if (Esp < Previous) KeBugCheckEx(SET_OF_INVALID_CONTEXT, Esp, Previous, (ULONG_PTR)TrapFrame, 0); в дампе Код (Text): Arg1: e1035008, New stack pointer Arg2: f31d8dd8, Old stack pointer Arg3: f31d8d64, TrapFrame address Arg4: 00000000, 0 .... .... STACK_TEXT: f31d8b5c 8051db15 00000030 e1035008 f31d8dd8 nt!KeBugCheckEx+0x1b f31d8b80 804e6329 f31d8d64 e1035008 f8985550 nt!KiEspToTrapFrame+0x47 f31d8ba0 8062ef2b 001d8d64 00000000 f8985594 nt!KeContextToKframes+0xe4 f31d8bbc 805fba6c f31d8d64 00000000 f8985594 nt!PspSetContext+0x18 f31d8bdc 804ed15a f8985550 f31d8c28 f31d8c1c nt!PspGetSetContextSpecialApc+0x39 f31d8c2c 804ed199 00000000 00000000 00000000 nt!KiDeliverApc+0xb3 f31d8c44 804dc6f2 000025ff e12a46a0 00000000 nt!KiSwapThread+0x64 f31d8c6c bf802ec4 00000001 0000000d 00000001 nt!KeWaitForSingleObject+0x1c2 f31d8ca8 bf801aa8 000025ff 00000000 00000001 win32k!xxxSleepThread+0x192 f31d8cec bf80f106 f31d8d18 000025ff 00000000 win32k!xxxRealInternalGetMessage+0x418 f31d8d4c 804df06b 0007fefc 00000000 00000000 win32k!NtUserGetMessage+0x27 f31d8d4c 00000000 0007fefc 00000000 00000000 nt!KiFastCallEntry+0xf8 WARNING: Frame IP not in any known module. Following frames may be wrong. f31d8dd4 0007febc 00000023 804fa477 f81f6b85 0x0 f31d8ddc 804fa477 f81f6b85 818a6508 00000000 0x7febc f31d8ed4 7c914d8f 00000110 77ddd248 00000010 nt!KiThreadStartup+0x16 f31d8f38 7c91056d 77dde0ae 00090000 00000000 ntdll!RtlAppendUnicodeToString+0x50 f31d8ff4 00000000 00000000 00000000 00000000 ntdll!RtlFreeHeap+0x647 STACK_COMMAND: kb FOLLOWUP_IP: win32k!xxxSleepThread+192 bf802ec4 8945fc mov dword ptr [ebp-4],eax SYMBOL_STACK_INDEX: 8 SYMBOL_NAME: win32k!xxxSleepThread+192 FOLLOWUP_NAME: MachineOwner MODULE_NAME: win32k IMAGE_NAME: win32k.sys DEBUG_FLR_IMAGE_TIMESTAMP: 41107f7a FAILURE_BUCKET_ID: 0x30_win32k!xxxSleepThread+192 BUCKET_ID: 0x30_win32k!xxxSleepThread+192 Если честно - вопросов много. Не совсем понятно такое значение "Arg1: e1035008, New stack pointer"...Откуда оно взялось? С trapframe тоже непонятки...Откуда должно браться "правильное" значение esp? Проясните ситуацию. пс. Буду очень признателен если толкнёте на хорошие источники касательно анализадампов/работа_нитей_в_ядре(реактос пока сам копаю).
итаг через ZwSetContextThread нельзя менять ряд регитсров и флагов, eip также. Хогланд саааамую малость описывает эту технику) Ничего более информативного пока не нашёл.) Есть варианты?)
PsGetContextThread выдаёт контекст указанного потока через структуру PETHREAD... PsGetCurrentThread выдаёт эту структуру для текущей нити - это нить юзер спейс, но как он определяет _текущую _ нить? Если я её открыл через zwopenthread - то эта нить текущая? Или текущая та нить, на которой было прервано выполнение процесса...или...или как? //добавлено по врк/реактос немного разобрался - PsGetCurrentThread/KeGetCurrentThread берут структуру из KPCR структуру KTHREAD CurrentThread...но кем она заполняется? Какие функции изменяют её и в какие моменты (касательно потоков)? Кто знает?)
Я щас пишу статью насчет процессов и потоков, если интересно, могу скинуть написанную часть - там есть про контексты потоков и все такое.
Ага, давай. Нашёл твою тему http://wasm.ru/forum/viewtopic.php?id=21856 - ты там затрагиваешь несколько интересующих меня вопросов, надеюсь они будут освещены в статье.