aboutsummaryrefslogtreecommitdiff
path: root/loader_wsock32_proxy/hookutils.cpp
blob: ed2b6c3a04d4a8fb74e9d2bfd378b48cb044e658 (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
#include <cstdio>

#include "pch.h"
#include "../NorthstarDedicatedTest/hookutils.h"

#define HU_ERROR(...)                                                                                                                      \
	{                                                                                                                                      \
		char err[2048];                                                                                                                    \
		snprintf(err, sizeof(err), __VA_ARGS__);                                                                                           \
		MessageBoxA(GetForegroundWindow(), err, "Northstar Wsock32 Proxy Error", 0);                                                       \
	}

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)
		{
			HU_ERROR("MH_CreateHook failed for function %s", targetName);
		}
		else
		{
			HU_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)
			{
				HU_ERROR("MH_EnableHook failed for function %s", hook->targetName);
			}
			else
			{
				HU_ERROR("MH_EnableHook failed for unknown function");
			}
		}
		else
		{
			// HU_ERROR("Enabling hook %s", hook->targetName);
		}
	}
}