aboutsummaryrefslogtreecommitdiff
path: root/loader_wsock32_proxy/hookutils.cpp
blob: 8603cb35b5d4d8a9838178b080cbe316d32de1c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "pch.h"
#include "../NorthstarDedicatedTest/hookutils.h"

#define ERROR(...) { char err[2048]; sprintf_s(err, __VA_ARGS__); MessageBoxA(GetForegroundWindow(), err, "Northstar Wsock32 Proxy Error", 0); }

TempReadWrite::TempReadWrite(void* ptr)
{
    m_ptr = ptr;
    MEMORY_BASIC_INFORMATION mbi;
    VirtualQuery(m_ptr, &mbi, sizeof(mbi));
    VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &mbi.Protect);
    m_origProtection = mbi.Protect;
}

TempReadWrite::~TempReadWrite()
{
    MEMORY_BASIC_INFORMATION mbi;
    VirtualQuery(m_ptr, &mbi, sizeof(mbi));
    VirtualProtect(mbi.BaseAddress, mbi.RegionSize, m_origProtection, &mbi.Protect);
}


void HookEnabler::CreateHook(LPVOID ppTarget, LPVOID ppDetour, LPVOID* ppOriginal, const char* targetName)
{
    // the macro for this uses ppTarget's name as targetName, and this typically starts with &
    // targetname is used for debug stuff and debug output is nicer if we don't have this
    if (*targetName == '&')
        targetName++;

    if (MH_CreateHook(ppTarget, ppDetour, ppOriginal) == MH_OK)
    {
        HookTarget* target = new HookTarget;
        target->targetAddress = ppTarget;
        target->targetName = (char*)targetName;

        m_hookTargets.push_back(target);
    }
    else
    {
        if (targetName != nullptr)
        {
            ERROR("MH_CreateHook failed for function %s", targetName);
        }
        else
        {
            ERROR("MH_CreateHook failed for unknown function");
        }
    }
}

HookEnabler::~HookEnabler()
{
    for (auto& hook : m_hookTargets)
    {
        if (MH_EnableHook(hook->targetAddress) != MH_OK)
        {
            if (hook->targetName != nullptr)
            {
                ERROR("MH_EnableHook failed for function %s", hook->targetName);
            }
            else
            {
                ERROR("MH_EnableHook failed for unknown function");
            }
        }
        else
        {
            //ERROR("Enabling hook %s", hook->targetName);
        }
    }
}