29
29
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38
#include "../mumble_plugin.h"
32
#include "../mumble_plugin_win32.h"
44
static DWORD getProcess(const wchar_t *exename) {
48
pe.dwSize = sizeof(pe);
49
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
50
if (hSnap != INVALID_HANDLE_VALUE) {
51
BOOL ok = Process32First(hSnap, &pe);
54
if (wcscmp(pe.szExeFile, exename)==0) {
55
pid = pe.th32ProcessID;
58
ok = Process32Next(hSnap, &pe);
65
static BYTE *getModuleAddr(DWORD pid, const wchar_t *modname) {
68
me.dwSize = sizeof(me);
69
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
70
if (hSnap != INVALID_HANDLE_VALUE) {
71
BOOL ok = Module32First(hSnap, &me);
74
if (wcscmp(me.szModule, modname)==0) {
75
addr = me.modBaseAddr;
78
ok = Module32Next(hSnap, &me);
86
static bool peekProc(VOID *base, VOID *dest, SIZE_T len) {
88
BOOL ok=ReadProcessMemory(h, base, dest, len, &r);
89
return (ok && (r == len));
92
static DWORD peekProc(VOID *base) {
94
peekProc(base, reinterpret_cast<BYTE *>(&v), sizeof(DWORD));
98
static BYTE *peekProcPtr(VOID *base) {
99
DWORD v = peekProc(base);
100
return reinterpret_cast<BYTE *>(v);
103
static void about(HWND h) {
104
::MessageBox(h, L"Reads audio position information from Armed Assault 2 v1.05", L"Mumble ArmA2 Plugin", MB_OK);
107
static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &context, std::wstring &identity) {
38
static int fetch(float *avatar_pos, float *avatar_front, float *avatar_top, float *camera_pos, float *camera_front, float *camera_top, std::string &, std::wstring &) {
108
39
for (int i=0;i<3;i++)
109
40
avatar_pos[i] = avatar_front[i] = avatar_top[i] = camera_pos[i] = camera_front[i] = camera_top[i] = 0.0f;
114
46
float front_corrector1;
115
47
float front_corrector2;
116
48
float front_corrector3;
118
50
float top_corrector1;
119
51
float top_corrector2;
120
52
float top_corrector3;
123
56
value is 0 when one is not in a game, 4 when one is
58
ok = peekProc((BYTE *) 0x, &state, 1); // Magical state value
63
return true; // This results in all vectors beeing zero which tells Mumble to ignore them.
125
// ok = peekProc((BYTE *) 0x, &state, 1); // Magical state value
130
// return true; // This results in all vectors beeing zero which tells Mumble to ignore them.
132
66
ok = peekProc(posptr, avatar_pos, 12) &&
133
peekProc((BYTE *) 0x016CE6F8, &front_corrector1, 4) &&
134
peekProc((BYTE *) 0x016CE704, &front_corrector2, 4) &&
135
peekProc((BYTE *) 0x016CE710, &front_corrector3, 4) &&
136
peekProc((BYTE *) 0x016CE6F4, &top_corrector1, 4) &&
137
peekProc((BYTE *) 0x016CE700, &top_corrector2, 4) &&
138
peekProc((BYTE *) 0x016CE70C, &top_corrector3, 4);
67
peekProc(frontptr, avatar_front, 12) &&
68
peekProc(topptr, avatar_top, 12);
70
if (avatar_pos[1] > 999000000.0)
74
peekProc(frontptr, &front_corrector1, 4) &&
75
peekProc(frontptr + 0xC, &front_corrector2, 4) &&
76
peekProc(frontptr + 0x18, &front_corrector3, 4) &&
77
peekProc(topptr, &top_corrector1, 4) &&
78
peekProc(topptr + 0xC, &top_corrector2, 4) &&
79
peekProc(topptr + 0x18, &top_corrector3, 4);
143
86
avatar_front[0] = front_corrector1;
144
87
avatar_front[1] = front_corrector2;
145
88
avatar_front[2] = front_corrector3;
160
static int trylock() {
104
static int trylock(const std::multimap<std::wstring, unsigned long long int> &pids) {
164
DWORD pid=getProcess(L"arma2.exe");
167
// Comment out code we don't need
168
// BYTE *mod=getModuleAddr(pid, L"<module name, if you need it>.dll");
172
h=OpenProcess(PROCESS_VM_READ, false, pid);
176
BYTE *ptr1 = peekProcPtr((BYTE *) 0x00C10F80);
177
BYTE *ptr2 = peekProcPtr(ptr1 + 0x280);
179
posptr = ptr2 + 0x40;
107
if (! initialize(pids, L"arma2.exe"))
112
peekProc((BYTE *) 0x00BF64D0, &bState, 1);
118
Comment out code we don't need
119
BYTE *pModule=getModuleAddr(L"<module name, if you need it>.dll");
123
BYTE *ptr1 = peekProc<BYTE *>((BYTE *) 0x00C500FC);
125
BYTE *ptr2 = peekProc<BYTE *>(ptr1 + 0x88);
127
BYTE *base = ptr2 + 0x10;
129
posptr = base + 0x18;
181
133
float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3];
182
134
std::string context;
183
135
std::wstring identity;
185
if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity))
137
if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) {
193
static void unlock() {
201
145
static const std::wstring longdesc() {
202
return std::wstring(L"Supports Armed Assault 2 v1.05. No identity or context support yet.");
146
return std::wstring(L"Supports Armed Assault 2 v1.08. No identity or context support yet.");
205
static std::wstring description(L"ArmA 2 v1.05");
149
static std::wstring description(L"ArmA 2 v1.08");
206
150
static std::wstring shortname(L"ArmA 2");
152
static int trylock1() {
153
return trylock(std::multimap<std::wstring, unsigned long long int>());
208
156
static MumblePlugin arma2plug = {
209
157
MUMBLE_PLUGIN_MAGIC,
168
static MumblePlugin2 arma2plug2 = {
169
MUMBLE_PLUGIN_MAGIC_2,
170
MUMBLE_PLUGIN_VERSION,
220
174
extern "C" __declspec(dllexport) MumblePlugin *getMumblePlugin() {
221
175
return &arma2plug;
b'\\ No newline at end of file'
178
extern "C" __declspec(dllexport) MumblePlugin2 *getMumblePlugin2() {