diff options
author | Tuck Therebelos <snares@users.sourceforge.net> | 2010-01-07 14:56:08 +0300 |
---|---|---|
committer | Tuck Therebelos <snares@users.sourceforge.net> | 2010-01-07 14:56:08 +0300 |
commit | 58081c648c6c376302ec1d34d9c7aaf500692ec3 (patch) | |
tree | 7cd1ce6cc76be92801f4df8c99535ffe5e7ed476 /plugins/bf1942 | |
parent | b5b6ba260464a52d58d94d2fe3001504f3d54f5d (diff) |
Update licenses; add UT3, 2004, 1942 plugins; update some Source plugins
Diffstat (limited to 'plugins/bf1942')
-rw-r--r-- | plugins/bf1942/bf1942.cpp | 230 | ||||
-rw-r--r-- | plugins/bf1942/bf1942.pro | 7 |
2 files changed, 237 insertions, 0 deletions
diff --git a/plugins/bf1942/bf1942.cpp b/plugins/bf1942/bf1942.cpp new file mode 100644 index 000000000..3d6a37fc5 --- /dev/null +++ b/plugins/bf1942/bf1942.cpp @@ -0,0 +1,230 @@ +/* Copyright (C) 2009-2010, Snares <snares@users.sourceforge.net> + Copyright (C) 2005-2010, Thorvald Natvig <thorvald@natvig.com> + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + - Neither the name of the Mumble Developers nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <windows.h> +#include <tlhelp32.h> +#include <math.h> + +#include "../mumble_plugin.h" + +HANDLE h; + +BYTE *faceptr; +BYTE *topptr; +BYTE *stateptr; +//BYTE *contextptr; + +static DWORD getProcess(const wchar_t *exename) { + PROCESSENTRY32 pe; + DWORD pid = 0; + + pe.dwSize = sizeof(pe); + HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (hSnap != INVALID_HANDLE_VALUE) { + BOOL ok = Process32First(hSnap, &pe); + + while (ok) { + if (wcscmp(pe.szExeFile, exename)==0) { + pid = pe.th32ProcessID; + break; + } + ok = Process32Next(hSnap, &pe); + } + CloseHandle(hSnap); + } + return pid; +} + +static BYTE *getModuleAddr(DWORD pid, const wchar_t *modname) { + MODULEENTRY32 me; + BYTE *addr = NULL; + me.dwSize = sizeof(me); + HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid); + if (hSnap != INVALID_HANDLE_VALUE) { + BOOL ok = Module32First(hSnap, &me); + + while (ok) { + if (wcscmp(me.szModule, modname)==0) { + addr = me.modBaseAddr; + break; + } + ok = Module32Next(hSnap, &me); + } + CloseHandle(hSnap); + } + return addr; +} + +static bool peekProc(VOID *base, VOID *dest, SIZE_T len) { + SIZE_T r; + BOOL ok=ReadProcessMemory(h, base, dest, len, &r); + return (ok && (r == len)); +} + +static DWORD peekProc(VOID *base) { + DWORD v = 0; + peekProc(base, reinterpret_cast<BYTE *>(&v), sizeof(DWORD)); + return v; +} + +static BYTE *peekProcPtr(VOID *base) { + DWORD v = peekProc(base); + return reinterpret_cast<BYTE *>(v); +} + +static void about(HWND h) { + ::MessageBox(h, L"Reads audio position information from Battlefield 1942 v1.61b.", L"Mumble BF2 Plugin", MB_OK); +} + +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) { + for (int i=0;i<3;i++) + avatar_pos[i]=avatar_front[i]=avatar_top[i]=0.0f; + + //char ccontext[128]; + char state; + //char spawn; + bool ok; + + /* + state value is: + 0 when not in a server + 32 when in a server + */ + ok = peekProc(stateptr, &state, 1); // Magical state value + if (! ok) + return false; + + if (state == 0) + return false; // Unlink plugin + + //ok = peekProc((BYTE *) 0x0097634D, &spawn, 1); + //if (! ok) + // return false; + + //if (spawn == 0) + // return true; //Center PA + + //peekProc(contextptr, ccontext, 128); + + ok = peekProc((BYTE *) 0x00976274, avatar_pos, 12) && + peekProc(faceptr, avatar_front, 12) && + peekProc(topptr, avatar_top, 12); + + if (! ok) + return false; + + /* + Get context string; in this plugin this will be an + ip:port (char 256 bytes) string + */ + //ccontext[127] = 0; + //context = std::string(ccontext); + + for (int i=0;i<3;i++) { + camera_pos[i] = avatar_pos[i]; + camera_front[i] = avatar_front[i]; + camera_top[i] = avatar_top[i]; + } + + return ok; +} + +static int trylock() { + h = NULL; + faceptr = topptr = NULL; + + DWORD pid=getProcess(L"BF1942.exe"); + if (!pid) + return false; + BYTE *mod=getModuleAddr(pid, L"binkw32.dll"); + if (!mod) + return false; + + h=OpenProcess(PROCESS_VM_READ, false, pid); + if (!h) + return false; + + BYTE *ptr1 = peekProcPtr((BYTE *) 0x009A9468); + BYTE *ptr2 = peekProcPtr(ptr1 + 0x98); + + faceptr = ptr2 + 0x5C; + topptr = ptr2 + 0x4C; + stateptr = mod + 0x52FB1; + + //BYTE *ctxtp1 = peekProcPtr((BYTE *) 0x); + //BYTE *ctxtp2 = peekProcPtr(ctxtp1 + 0x); + + //contextptr = ctxtp2 + 0x; + + float apos[3], afront[3], atop[3], cpos[3], cfront[3], ctop[3]; + std::string context; + std::wstring identity; + + if (fetch(apos, afront, atop, cpos, cfront, ctop, context, identity)) + return true; + + CloseHandle(h); + h = NULL; + return false; +} + +static void unlock() { + if (h) { + CloseHandle(h); + h = NULL; + } + return; +} + +static const std::wstring longdesc() { + return std::wstring(L"Supports Battlefield 1942 v1.61b. No identity or context support yet."); +} + +static std::wstring description(L"Battlefield 1942 v1.61b"); +static std::wstring shortname(L"Battlefield 1942"); + +static MumblePlugin bf1942plug = { + MUMBLE_PLUGIN_MAGIC, + description, + shortname, + about, + NULL, + trylock, + unlock, + longdesc, + fetch +}; + +extern "C" __declspec(dllexport) MumblePlugin *getMumblePlugin() { + return &bf1942plug; +} diff --git a/plugins/bf1942/bf1942.pro b/plugins/bf1942/bf1942.pro new file mode 100644 index 000000000..8743b8dc2 --- /dev/null +++ b/plugins/bf1942/bf1942.pro @@ -0,0 +1,7 @@ +include(../plugins.pri) + +TARGET = bf1942 +SOURCES = bf1942.cpp +LIBS += -luser32 + + |