Неверный дескриптор окна дескриптора - PullRequest
0 голосов
/ 28 мая 2018

Я работаю над простым отладчиком на Windows.Когда я пытался получить контекст нужного мне потока, GetLastError возвращает мне код ошибки 6, что означает, что дескриптор потока вызван, но я понятия не имею, почему.

Заголовок Dbg

class PDbg
{
public:
    PDbg() = default;
    ~PDbg();
    bool StartDebugActiveProcess(DWORD processId);
    bool StartDebugNewProcess(LPTSTR processName);
    bool AddBreakpoint(LPVOID address, HANDLE hProecss, PBreakpointHandler pbreakpoint_handler = NULL);
    bool RemoveBreakpoint(LPVOID address, HANDLE hProcess);
    bool SetThreadTrapFlag(DWORD threadId);
    bool Shutdown();

private:
    DWORD _startupProcessId;
    LPVOID _image_base; 
    DWORD _image_size;
    std::map<DWORD, HANDLE> _processes; //handle all processes
    std::map<DWORD, HANDLE> _threads; // handle all threads
    std::map<LPVOID, PBreakpoint> _breakpoints; // handle all breakpoints
    std::map<DWORD, LPVOID> _pending_breakpoints; // handle breakpoints to recreate

    void run();
    void handle_create_process_debug_event(DEBUG_EVENT* dbgEvent);
    void handle_create_thread_debug_event(DEBUG_EVENT* dbgEvent);
    void handle_exception_debug_event(DEBUG_EVENT* dbgEvent);
    void handle_load_dll_debug_event(DEBUG_EVENT* dbgEvent);
    void handle_unload_dll_debug_event(DEBUG_EVENT* dbgEvent);
    void handle_output_debug_string(DEBUG_EVENT* dbgEvent);
    void handle_exit_thread_debug_event(DEBUG_EVENT* dbgEvent);
    void handle_exit_process_debug_event(DEBUG_EVENT* dbgEvent);
};

Метод CreateProcess, здесь я получаю дескриптор потока.

void PDbg::handle_create_process_debug_event(DEBUG_EVENT * dbgEvent)
{
    printf("Event: Create process, PID: %u, Base address: %p, Start address: %p\n",
        dbgEvent->dwProcessId, dbgEvent->u.CreateProcessInfo.lpBaseOfImage, dbgEvent->u.CreateProcessInfo.lpStartAddress);

    if (dbgEvent->u.CreateProcessInfo.hFile != NULL)
    {
        CloseHandle(dbgEvent->u.CreateProcessInfo.hFile);
    }

    this->_processes[dbgEvent->dwProcessId] = dbgEvent->u.CreateProcessInfo.hProcess;
    this->_threads[dbgEvent->dwThreadId] = dbgEvent->u.CreateThread.hThread;

}

Метод SetTreadContext, где я пытаюсь изменить контекст потока

bool PDbg::SetThreadTrapFlag(DWORD threadId)
{
    const unsigned int k86trapflag = (1 << 8);
    CONTEXT ctx;
    memset(&ctx, 0, sizeof(ctx));

    ctx.ContextFlags = CONTEXT_CONTROL;

    auto x = this->_threads;
    if (!GetThreadContext(this->_threads[threadId], &ctx))
    {
        std::cout << "Cannot get thread context. Error:" << GetLastError() << std::endl;

        return FALSE;
    }

    ctx.EFlags |= k86trapflag;

    if (!SetThreadContext(this->_threads[threadId], &ctx))
    {
        std::cout << "Cannot set thread context." << std::endl;

        return FALSE;
    }

    return TRUE;
}

Метод, в котором я вызываю SetTrhreadContext, не важен.Я уверен, и я проверил, что threadId, который я передаю SetTreadContext, СУЩЕСТВУЕТ в карте потоков (DWORD, HANDLE).Так что же делает эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...