kdlibcpp

Форк
0
/
autoswitch.cpp 
88 строк · 2.5 Кб
1
#include "stdafx.h"
2

3
#include "win/autoswitch.h"
4

5
namespace kdlib
6
{
7

8
///////////////////////////////////////////////////////////////////////////////
9

10
ContextAutoRestoreIf::ContextAutoRestoreIf(bool skipContextRestore)
11
{
12
    HRESULT      hres;
13

14
    m_skipRestore = skipContextRestore;
15
    if (m_skipRestore)
16
        return;
17

18
    memset( &m_localContext, 0, sizeof(m_localContext) );
19
    memset( &m_currentFrame, 0, sizeof(m_currentFrame) );
20

21
    m_quietState = g_dbgMgr->setQuietNotiification(true);
22

23
    hres = g_dbgMgr->system->GetCurrentThreadId(&m_currentThread);
24
    if (FAILED(hres))
25
    {
26
        m_currentThread = -1;
27
    }
28

29
    hres = g_dbgMgr->system->GetCurrentProcessId(&m_currentProcess);
30
    if (FAILED(hres))
31
    {
32
        m_currentProcess = -1;
33
    }
34

35
    hres = g_dbgMgr->system->GetCurrentSystemId(&m_currentSystem);
36
    if (FAILED(hres))
37
    {
38
        m_currentSystem = -1;
39
    }
40

41
    m_savedRegCtx = false;
42
    m_savedLocalContext = false;
43
    m_savedCurrentFrame = false;
44

45
    DEBUG_VALUE  regVal;
46
    hres = g_dbgMgr->registers->GetValues2(DEBUG_REGSRC_EXPLICIT, 1, NULL, 0, &regVal);
47
    if (S_OK == hres)
48
    {
49
        hres = g_dbgMgr->symbols->GetScope(&m_instructionOffset, NULL, &m_localContext, sizeof(m_localContext));
50
        m_savedLocalContext = (S_OK == hres);
51
    }
52

53
    hres = g_dbgMgr->symbols->GetScope(&m_instructionOffset, &m_currentFrame, NULL, 0);
54
    m_savedCurrentFrame = (S_OK == hres);
55
}
56

57

58
///////////////////////////////////////////////////////////////////////////////
59

60
ContextAutoRestoreIf::~ContextAutoRestoreIf()
61
{
62
    if (m_skipRestore)
63
        return;
64

65
    if (m_currentSystem != -1)
66
        g_dbgMgr->system->SetCurrentSystemId(m_currentSystem);
67

68
    if (m_currentProcess != -1)
69
        g_dbgMgr->system->SetCurrentProcessId(m_currentProcess);
70

71
    if (m_currentThread != -1)
72
        g_dbgMgr->system->SetCurrentThreadId(m_currentThread);
73

74
    if (m_savedRegCtx)
75
        g_dbgMgr->registers->SetValues2(DEBUG_REGSRC_EXPLICIT, static_cast<ULONG>(m_regValues.size()), NULL, 0, &m_regValues[0]);
76

77
    if (m_savedLocalContext)
78
        g_dbgMgr->symbols->SetScope(m_instructionOffset, NULL, &m_localContext, sizeof(m_localContext));
79

80
    if (m_savedCurrentFrame)
81
        g_dbgMgr->symbols->SetScope(m_instructionOffset, &m_currentFrame, NULL, 0);
82

83
    g_dbgMgr->setQuietNotiification(m_quietState);
84
}
85

86
///////////////////////////////////////////////////////////////////////////////
87

88
} // namespace kdlib
89

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.