CPL0 показывает, что ты находишься в kernelmode, верно? Для изменения и работы с отладочными регистрами нужны привилегии ядра, а чтобы их получить, придется лезть в ядро, т.е. писать драйвер. Изменить отладочные регистры из юзермода система не даст.
steelfactor при чём тут привелегированная инструкция ? Ты правишь контекст, функция SwapContext ядерная уже установит нужный контекст потока
k3internal mea culpa, поспешил с ответом. Но как тогда такое может быть, если вызов юзермодной функции SetThreadContext может корректировать debug-регистры, доступ к которым, со слов Intel'a, требует CPL0? Где на@бывают?
steelfactor Уфф.. Отладочные регистры хорошё изменяются через NtSet/GetContextThread, доступ к ним закрыт из р3, но контекст потока изменятся в р0.
Clerk Реально не знал о такой возможности (никогда не сталкивался), надеюсь t00x будет не в обиде, что ввел в заблуждение
GetCurrentThread() + GetThreadContext(); - отработали без ошибок, однако структура осталась пустой k3internal насколько понял, надо изменить отладочные регистры в CONTEXT и выполнить SwapContext. поискал на c:\windows файлы со SwapContext, только в *.pdb от SP2 нашлись, и в engdbg.dll. P.S. steelfactor это понятно
пробовал считать контекст текущего потока. сделал mov [CONTEXT + 48], CONTEXT_ALL и ещё, в OllyDbg смотрел, поток не создаётся: Код (Text): push idThread ; push ecx ; Flags push ecx ; ValueIn push ThreadFunc ; push ecx ; push ecx ; call [CreateThread] ; ... proc ThreadFunc push esp add ecx, 1 pop esp ret endp
t00x почему +48 ? вроде в самом начале флажки стоят да, вижу, есть в DDK CONTEXT_ALL, это меня windows.inc попутал
есть CONTEXT_ALL в него как раз и входят дебажные регистры, а вообще какой статус возвращается при вызове? Мож привилегии поднять?
картинка прилагается. без отладчика выполняется, но контекст не считывает Код (Text): xor ecx, ecx push idThread ; push ecx ; Flags push ecx ; ValueIn push ThreadFunc ; push ecx ; push ecx ; call [CreateThread] ; mov dword [_thread_context.ContextFlags], CONTEXT_ALL ; ContextFlags = CONTEXT_ALL push _thread_context ; CONTEXT CurrentThread mov eax, [idThread] push eax call [SuspendThread] mov eax, [idThread] push eax call [GetThreadContext] P.S. покажите кто-нибудь структуру CONTEXT, и флаги для этой структуры