diff options
author | Vadim Dashevskiy <watcherhd@gmail.com> | 2015-09-07 20:48:58 +0000 |
---|---|---|
committer | Vadim Dashevskiy <watcherhd@gmail.com> | 2015-09-07 20:48:58 +0000 |
commit | 9fa74ab4f864a651f22a107818baee2cc55fca10 (patch) | |
tree | cdd81260553c3d9a2b5b064ae7588492aba6aa66 /protocols/Xfire/src/tools.cpp | |
parent | ddc02f70444aa7a4a8b407ddaa069ddb0d0d4985 (diff) |
xfire moved to deprecated pt. 1
git-svn-id: http://svn.miranda-ng.org/main/trunk@15300 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'protocols/Xfire/src/tools.cpp')
-rw-r--r-- | protocols/Xfire/src/tools.cpp | 985 |
1 files changed, 0 insertions, 985 deletions
diff --git a/protocols/Xfire/src/tools.cpp b/protocols/Xfire/src/tools.cpp deleted file mode 100644 index bb9b8e0d79..0000000000 --- a/protocols/Xfire/src/tools.cpp +++ /dev/null @@ -1,985 +0,0 @@ -/* - * Plugin of miranda IM(ICQ) for Communicating with users of the XFire Network. - * - * Copyright (C) 2010 by - * dufte <dufte@justmail.de> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * Based on J. Lawler - BaseProtocol - * Herbert Poul/Beat Wolf - xfirelib - * - * Miranda ICQ: the free icq client for MS Windows - * Copyright (C) 2000-2008 Richard Hughes, Roland Rabien & Tristan Van de Vreede - * - */ - -#include "stdafx.h" - -#include <winsock2.h> -#include "tools.h" -#include "xdebug.h" - -extern HANDLE hNetlib; - -void EnableDlgItem(HWND hwndDlg, UINT control, int state) -{ - EnableWindow(GetDlgItem(hwndDlg, control), state); -} - - -//eigene string replace funktion, da die von der std:string klasse immer abstürzt -BOOL str_replace(char*src, char*find, char*rep) -{ - string strpath = src; - int pos = strpath.find(find); - - if (pos > -1) { - char *temp = new char[mir_strlen(src) + mir_strlen(rep) + 1]; - - mir_strcpy(temp, src); - *(temp + pos) = 0; - - mir_strcat(temp, rep); - mir_strcat(temp, (src + pos + mir_strlen(find))); - mir_strcpy(src, temp); - - delete[] temp; - - return TRUE; - } - return FALSE; -} - -/* popup darstellen */ -int displayPopup(HWND, LPCSTR lpText, LPCSTR lpCaption, UINT uType, HICON hicon) -{ - static signed char bUsePopups = -1; - static BOOL bIconsNotLoaded = TRUE; - - static HICON hicNotify = NULL, hicWarning = NULL, hicError = NULL; - - if ((uType & MB_TYPEMASK) == MB_OK) { - POPUPDATAT ppd = { 0 }; - ppd.lchIcon = hicon; - - if (bIconsNotLoaded) { - hicNotify = IcoLib_GetIcon("popup_notify"); - hicWarning = IcoLib_GetIcon("popup_warning"); - hicError = IcoLib_GetIcon("popup_error"); - bIconsNotLoaded = FALSE; - } - - mir_tstrncpy(ppd.lptzContactName, _A2T(lpCaption), _countof(ppd.lptzContactName)); - mir_tstrncpy(ppd.lptzText, _A2T(lpText), _countof(ppd.lptzText)); - - if ((uType & MB_ICONMASK) == MB_ICONSTOP) { - ppd.lchIcon = hicError; - ppd.colorBack = RGB(191, 0, 0); - ppd.colorText = RGB(255, 245, 225); - } - else if ((uType & MB_ICONMASK) == MB_ICONWARNING) { - ppd.lchIcon = hicWarning; - ppd.colorBack = RGB(210, 210, 150); - ppd.colorText = RGB(0, 0, 0); - } - else { - ppd.lchIcon = hicNotify; - ppd.colorBack = RGB(230, 230, 230); - ppd.colorText = RGB(0, 0, 0); - } - - PUAddPopupT(&ppd); - } - - return IDOK; -} - -char*menuitemtext(char*mtext) -{ - static char temp[256] = ""; - int j = 0; - - if (!mtext) - return NULL; - - int size = mir_strlen(mtext); - - if (!size || size > 255) - return mtext; - - //alle & zeichen zählen - for (int i = 0; i < size; i++, j++) { - temp[j] = mtext[i]; - if (mtext[i] == '&') { - j++; - temp[j] = '&'; - } - } - //terminieren - temp[j] = 0; - - return temp; -} - -void Message(LPVOID msg) -{ - switch (db_get_b(NULL, protocolname, "nomsgbox", 0)) { - case 1: - return; - case 2: - displayPopup(NULL, (LPCSTR)msg, PLUGIN_TITLE, MB_OK); - return; - } - - MSGBOXPARAMSA mbp; - mbp.cbSize = sizeof(mbp); - mbp.hwndOwner = NULL; - mbp.hInstance = hinstance; - mbp.lpszText = (char*)msg; - mbp.lpszCaption = PLUGIN_TITLE; - mbp.dwStyle = MB_USERICON; - mbp.lpszIcon = MAKEINTRESOURCEA(IDI_TM); - mbp.dwContextHelpId = NULL; - mbp.lpfnMsgBoxCallback = NULL; - mbp.dwLanguageId = LANG_ENGLISH; - MessageBoxIndirectA(&mbp); - //MessageBoxA(0,(char*)msg,PLUGIN_TITLE,MB_OK|MB_ICONINFORMATION); -} - -void MessageE(LPVOID msg) -{ - static BOOL already = FALSE; - switch (db_get_b(NULL, protocolname, "nomsgbox", 0)) { - case 0: - if (!already) { - already = TRUE; //keine doppelte fehlernachrichten - Message(msg); - already = FALSE; - } - break; - case 2: - displayPopup(NULL, (LPCSTR)msg, PLUGIN_TITLE, MB_OK | MB_ICONSTOP); - break; - } -} - -//funktion soll pfad erkennen und zurückgeben -char* GetLaunchPath(char*launch) -{ - static char temp[XFIRE_MAX_STATIC_STRING_LEN] = ""; - char find[] = ".exe "; //gesucht wird - char * p = temp; - char * f = find; - - if (launch == NULL) - return temp; - - strncpy(temp, launch, XFIRE_MAX_STATIC_STRING_LEN - 1); - - while (*p != 0 && *f != 0) { - if (tolower(*p) == *f) { - f++; - } - else - f = find; - - p++; - } - - if (*f == 0) { - *p = 0; - } - else - return temp; - - if (strrchr(temp, '\\')) { - *(strrchr(temp, '\\')) = 0; - } - - return temp; -} -//roll bits, vllt ein tickschneller als die funktionen von winsock -unsigned short r(unsigned short data) -{ -#if defined(_WIN64) - return ((data & 0xFF) << 8) + (data >> 8); -#else - _asm { - mov ax, data - rol ax, 8 - mov data, ax - } - return data; -#endif -} - -//simple und hoffetnlich schnelle teamspeakdetection -BOOL FindTeamSpeak(DWORD*pid, int*vid) -{ - BOOL found = FALSE; - if (pid == NULL) - return FALSE; - - HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); - PROCESSENTRY32* processInfo = new PROCESSENTRY32; - processInfo->dwSize = sizeof(PROCESSENTRY32); - - // XFireLog("Scanning for voiceprograms..."); - - - while (Process32Next(hSnapShot, processInfo) != FALSE) { - if (processInfo->th32ProcessID != 0) { - int size = mir_tstrlen(processInfo->szExeFile); - - if (size == 13) { - if ((processInfo->szExeFile[0] == 'T' || processInfo->szExeFile[0] == 't') && - processInfo->szExeFile[1] == 'e'&& - processInfo->szExeFile[2] == 'a'&& - processInfo->szExeFile[3] == 'm'&& - processInfo->szExeFile[4] == 'S'&& - processInfo->szExeFile[5] == 'p'&& - processInfo->szExeFile[6] == 'e'&& - processInfo->szExeFile[7] == 'a'&& - processInfo->szExeFile[8] == 'k') { - *pid = processInfo->th32ProcessID; - found = TRUE; - *vid = 32; - break; - } - } - else if (size == 12) { - if ((processInfo->szExeFile[0] == 'V' || processInfo->szExeFile[0] == 'v') && - processInfo->szExeFile[1] == 'e'&& - processInfo->szExeFile[2] == 'n'&& - processInfo->szExeFile[3] == 't'&& - processInfo->szExeFile[4] == 'r'&& - processInfo->szExeFile[5] == 'i'&& - processInfo->szExeFile[6] == 'l'&& - processInfo->szExeFile[7] == 'o') { - *pid = processInfo->th32ProcessID; - found = TRUE; - *vid = 33; - break; - } - } - else if (size == 10) { - if ((processInfo->szExeFile[0] == 'm' || processInfo->szExeFile[0] == 'M') && - processInfo->szExeFile[1] == 'u'&& - processInfo->szExeFile[2] == 'm'&& - processInfo->szExeFile[3] == 'b'&& - processInfo->szExeFile[4] == 'l'&& - processInfo->szExeFile[5] == 'e') { - *pid = processInfo->th32ProcessID; - found = TRUE; - *vid = 34; - break; - } - } - } - } - CloseHandle(hSnapShot); - return found; -} - -#define maxuppackets 4 - -//funktion liefer ip/port einer verbindung -BOOL GetServerIPPort(DWORD pid, char*, unsigned long localaddr, char*ip1, char*ip2, char*ip3, char*ip4, long*port) -{ - static std::vector<int> localport; - static const int hdrInclude = 1; - static int lastip = 0; - static int lastport = 0; - static int lastpid = 0; - - //DUMP("***Suche IP/Port***",""); - - if (pid != lastpid) { - lastip = lastport = 0; - lastpid = pid; - } - - DWORD size = 0; - - GetExtendedUdpTable(NULL, &size, FALSE, AF_INET, UDP_TABLE_OWNER_PID, 0); - MIB_UDPTABLE_OWNER_PID *ptab = (MIB_UDPTABLE_OWNER_PID*)malloc(size); - if (ptab == NULL) - return FALSE; - int ret = GetExtendedUdpTable(ptab, &size, FALSE, AF_INET, UDP_TABLE_OWNER_PID, 0); - //alle grad geöffnet updverb nach der pid vom spiel suchen, um an den port ranzukommen - if (ret == NO_ERROR) { - BOOL notfound = TRUE; - for (unsigned int i = 0; i < ptab->dwNumEntries; i++) { - if (ptab->table[i].dwOwningPid == pid) //spiel gefunden - { - localport.push_back(ptab->table[i].dwLocalPort); - //DUMP("Localport: %d",ptab->table[i].dwLocalPort); - //localport=; //port wird gesichert - //break; //wir brauchen nicht mehr suchen - notfound = FALSE; - } - } - if (notfound) //kein port gefunden - { - //DUMP("Kein Localport gefunden",""); - XFireLog("no local port found"); - return FALSE; //dann erstmal schluss - } - } - else { - XFireLog("GetExtendedUdpTable error!"); - return FALSE; - } - - free(ptab); //speicher frei machn - - - //socker erstellen - SOCKET s; - s = socket(AF_INET, SOCK_RAW, IPPROTO_UDP); - if (s == INVALID_SOCKET) { - //DUMP("Kann Rawsocket nicht erstellen. Error: %d",WSAGetLastError()); - XFireLog("unable to create raw socket %d", WSAGetLastError()); - closesocket(s); - return FALSE; - } - - static struct sockaddr_in msockaddr; - memset(&msockaddr, 0, sizeof(msockaddr)); - msockaddr.sin_addr.s_addr = localaddr; - msockaddr.sin_family = AF_INET; - msockaddr.sin_port = 0; - - //socket an nw binden - if (bind(s, (sockaddr *)&msockaddr, sizeof(msockaddr)) == SOCKET_ERROR) { - //DUMP("Kann Rawsocket nicht binden. Error: %d",WSAGetLastError()); - XFireLog("unable to bind raw socket %d", WSAGetLastError()); - closesocket(s); - return FALSE; - } - - // wir wollen alles was da reinkommt haben - { - int I = 1; - DWORD b; - if (WSAIoctl(s, _WSAIOW(IOC_VENDOR, 1), &I, sizeof(I), NULL, NULL, &b, NULL, NULL) == SOCKET_ERROR) { - //DUMP("IOCTL Error",""); - /*closesocket(s); - return FALSE;*/ - XFireLog("IOCTL error %d", WSAGetLastError()); - //unter bestimmten umständen schlägt es hier fehl, dann lass trotzdem ip weiter erkennen - } - } - - //socket soll timeout auswerfen, wenn nix kommt, damit der gamethread nicht hängt - //DUMP("timeout>>>",""); - static int timeout = 200; - if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout) == SOCKET_ERROR)) - XFireLog("setsockopt(SO_RCVTIMEO) error %d", WSAGetLastError()); - - //updstruct, nur mit wichtigen sachen - struct mpacket - { - unsigned char ipv; - char dmp[11]; //dummy - //srcip, serverip - unsigned char ip1; - unsigned char ip2; - unsigned char ip3; - unsigned char ip4; - //unsere nw - unsigned int ipdst; - char temp[1024]; - }; - struct mpacket2 - { - unsigned char ipv; - char dmp[11]; //dummy - //srcip, serverip - unsigned long srcip; - //server ip - unsigned char ip1; - unsigned char ip2; - unsigned char ip3; - unsigned char ip4; - char temp[1024]; - }; - struct udp - { - //srcport - u_short srcport; - //dstport - u_short dstport; - }; - - mpacket temp = { 0 }; //empfamngsbuffer - udp * temp2; - char * temp3; - mpacket2 * temp4; - - for (int I = 0; I < maxuppackets; I++) //maximal 4 packete, das reicht - { - int msize = recv(s, (char*)&temp, sizeof(mpacket), 0); - if (msize == SOCKET_ERROR) { - XFireLog("recv() error %d", WSAGetLastError()); - } - else if (msize) //empfangen - { - /*DUMP("Packet empfangen",""); - DUMP("Dump Full packet##############",""); - DUMP(tohex((unsigned char*)&temp,msize),""); - DUMP("Dump Full packet##############",""); - - DUMP("Headersize: %d",(temp.ipv & 0x0f)*4);*/ - - temp3 = (char*)&temp; - temp3 += (temp.ipv & 0x0f) * 4; - temp2 = (udp*)temp3; - temp4 = (mpacket2*)&temp; - - /*DUMP("Dump Udp##############",""); - DUMP(tohex((unsigned char*)temp2,sizeof(udp)),""); - DUMP("Dump Udp##############","");*/ - - - for (unsigned int i = 0; i < localport.size(); i++) { - //DUMP("destport %d ==",temp2->dstport); - //DUMP("== %d",localport.at(i)); - if (temp2->dstport == localport.at(i)/*FIX: für XP SP3 ->*/ && temp4->srcip != localaddr) //ist das ziel des packets, gleich dem port des spiels - { - *port = r(temp2->srcport); //ja dann serverdaten an gamethread übermitteln - *ip1 = temp.ip1; - *ip2 = temp.ip2; - *ip3 = temp.ip3; - *ip4 = temp.ip4; - closesocket(s); //socket zumachn - - //DUMP("SourceIP %d",temp4->srcip); - //DUMP("SourcePort %d",temp2->srcport); - if (lastip != temp4->srcip || temp2->srcport != lastport) { - lastport = temp2->srcport; //fixed port wechsel, damit dieser auch mitgetielt wird, wenn zb vorher nur serverinfos angefordert wurden - lastip = temp4->srcip; - closesocket(s); - //DUMP("IP gefunden",""); - XFireLog("got ip!"); - return TRUE; - } - - XFireLog("no serverip found!"); - return FALSE; - } - /* else if (temp4->srcip==localaddr && temp2->srcport==localport.at(i)) //gesendete gamepackets - { - *port=r(temp2->dstport); //ja dann serverdaten an gamethread übermitteln - *ip1=temp4->ip1; - *ip2=temp4->ip2; - *ip3=temp4->ip3; - *ip4=temp4->ip4; - closesocket(s); //socket zumachn - return TRUE; - }*/ - } - } - } - closesocket(s); //socket zumachn - lastip = 0; - lastport = 0; - return TRUE; -} - -//funktion liefert ip/port einer verbindung, dupliziert für teamspeak/ventrilo, wegen static vals -//TODO: eventuell umbauen, damit es für beide genutzt werden kann -BOOL GetServerIPPort2(DWORD pid, char*, unsigned long localaddr, char*ip1, char*ip2, char*ip3, char*ip4, long*port) -{ - static std::vector<int> localport; - static const int hdrInclude = 1; - static int lastip = 0; - static int lastpid = 0; - static int lastport = 0; - - if (pid != lastpid) { - lastip = lastport = 0; - lastpid = pid; - } - - DWORD size = 0; - - GetExtendedUdpTable(NULL, &size, FALSE, AF_INET, UDP_TABLE_OWNER_PID, 0); - MIB_UDPTABLE_OWNER_PID *ptab = (MIB_UDPTABLE_OWNER_PID*)malloc(size); - if (ptab == NULL) - return FALSE; - int ret = GetExtendedUdpTable(ptab, &size, FALSE, AF_INET, UDP_TABLE_OWNER_PID, 0); - //alle grad geöffnet updverb nach der pid vom spiel suchen, um an den port ranzukommen - if (ret == NO_ERROR) { - BOOL notfound = TRUE; - for (unsigned int i = 0; i < ptab->dwNumEntries; i++) { - if (ptab->table[i].dwOwningPid == pid) //spiel gefunden - { - localport.push_back(ptab->table[i].dwLocalPort); - //localport=; //port wird gesichert - //break; //wir brauchen nicht mehr suchen - notfound = FALSE; - } - } - if (notfound) //kein port gefunden - { - if (lastip != 0) { - lastip = 0; - lastport = 0; - return TRUE; - } - return FALSE; //dann erstmal schluss - } - } - else - return FALSE; - - free(ptab); //speicher frei machn - - - //socker erstellen - SOCKET s; - s = socket(AF_INET, SOCK_RAW, IPPROTO_UDP); - - static struct sockaddr_in msockaddr; - memset(&msockaddr, 0, sizeof(msockaddr)); - msockaddr.sin_addr.s_addr = localaddr; - msockaddr.sin_family = AF_INET; - msockaddr.sin_port = 0; - - // socket an nw binden - if (bind(s, (sockaddr *)&msockaddr, sizeof(msockaddr)) == SOCKET_ERROR) { - closesocket(s); - return FALSE; - } - - // wir wollen alles was da reinkommt haben - { - int I = 1; - DWORD b; - if (WSAIoctl(s, _WSAIOW(IOC_VENDOR, 1), &I, sizeof(I), NULL, NULL, &b, NULL, NULL) == SOCKET_ERROR) { - /*closesocket(s); - return FALSE;*/ - //unter bestimmten umständen schlägt es hier fehl, dann lass trotzdem ip weiter erkennen - } - } - - //socket soll timeout auswerfen, wenn nix kommt, damit der gamethread nicht hängt - //DUMP("timeout>>>",""); - static int timeout = 200; - setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)); - - //updstruct, nur mit wichtigen sachen - struct mpacket - { - unsigned char ipv; - char dmp[11]; //dummy - //srcip, serverip - unsigned char ip1; - unsigned char ip2; - unsigned char ip3; - unsigned char ip4; - //unsere nw - unsigned int ipdst; - char temp[1024]; - }; - struct mpacket2 - { - unsigned char ipv; - char dmp[11]; //dummy - //srcip, serverip - unsigned long srcip; - //server ip - unsigned char ip1; - unsigned char ip2; - unsigned char ip3; - unsigned char ip4; - char temp[1024]; - }; - struct udp - { - //srcport - u_short srcport; - //dstport - u_short dstport; - }; - - mpacket temp = { 0 }; //empfamngsbuffer - udp * temp2; - char * temp3; - mpacket2 * temp4; - - for (int I = 0; I < maxuppackets; I++) //maximal 4 packete, das reicht - { - int msize = recv(s, (char*)&temp, sizeof(mpacket), 0); - if (msize) //empfangen - { - temp3 = (char*)&temp; - temp3 += (temp.ipv & 0x0f) * 4; - temp2 = (udp*)temp3; - temp4 = (mpacket2*)&temp; - - for (unsigned int i = 0; i < localport.size(); i++) - if (temp2->dstport == localport.at(i)/*FIX: für XP SP3 ->*/ && temp4->srcip != localaddr) //ist das ziel des packets, gleich dem port des spiels - { - *port = r(temp2->srcport); //ja dann serverdaten an gamethread übermitteln - *ip1 = temp.ip1; - *ip2 = temp.ip2; - *ip3 = temp.ip3; - *ip4 = temp.ip4; - closesocket(s); //socket zumachn - - if (lastip != temp4->srcip || temp2->srcport != lastport) { - lastport = temp2->srcport; //fixed port wechsel, damit dieser auch mitgetielt wird, wenn zb vorher nur serverinfos angefordert wurden - lastip = temp4->srcip; - return TRUE; - } - - return FALSE; - } - /* else if (temp4->srcip==localaddr && temp2->srcport==localport.at(i)) //gesendete gamepackets - { - *port=r(temp2->dstport); //ja dann serverdaten an gamethread übermitteln - *ip1=temp4->ip1; - *ip2=temp4->ip2; - *ip3=temp4->ip3; - *ip4=temp4->ip4; - closesocket(s); //socket zumachn - return TRUE; - }*/ - } - } - closesocket(s); //socket zumachn - lastip = 0; - lastport = 0; - return TRUE; -} - -char* getItem(char *string, char delim, int count) -{ - static char item[255]; - char i = 0; - - while (*string != '\0' && count > 0) { - if (*string == delim) { - item[i] = 0; - i = 0; - count--; - string++; - } - else { - item[i] = *string; - i++; - string++; - } - } - if (*string == '\0') - item[i] = 0; - if (count > 1) - item[0] = 0; - - for (unsigned int j = 0; j < mir_strlen(item); j++) - item[j] = tolower(item[j]); - - return item; -} - -// soll commandline der spiele prüfen -// -// TRUE bedeutet, entweder ok, oder konnte wegen systemfehler nicht geprüft werden -// FALSE bedeutet beinhaltet nicht das, was es soll -// -// get process comamndline quelle hier: -// http://forum.sysinternals.com/forum_posts.asp?TID=6510 -#define cb 1024 - -pZwQueryInformationProcess _ZwQueryInformationProcess = NULL; -//pZwClose _ZwClose = NULL; -pZwReadVirtualMemory _ZwReadVirtualMemory = NULL; - -BOOL checkCommandLine(HANDLE hProcess, char * mustcontain, char * mustnotcontain) -{ - WCHAR * buffer; - char * buffer2; - PPEB peb = NULL; - PPROCESS_PARAMETERS proc_params = NULL; - HLOCAL UserPool = LocalAlloc(LPTR, 8192); - PROCESS_BASIC_INFORMATION ProcessInfo; - HMODULE hNt = GetModuleHandle(_T("ntdll.dll")); - - //strings leer abbruch - if (!mustcontain&&!mustnotcontain) - return TRUE; - - //prüfe und lade nötige funktionen - if (_ZwQueryInformationProcess == NULL) { - _ZwQueryInformationProcess = (pZwQueryInformationProcess)GetProcAddress(hNt, "ZwQueryInformationProcess"); - if (_ZwQueryInformationProcess == NULL) { - LocalFree(UserPool); - return TRUE; - } - } - if (_ZwReadVirtualMemory == NULL) { - _ZwReadVirtualMemory = (pZwReadVirtualMemory)GetProcAddress(hNt, "ZwReadVirtualMemory"); - if (_ZwReadVirtualMemory == NULL) { - LocalFree(UserPool); - return TRUE; - } - } - - //commandline bekommen, siehe link oben - ULONG rc = _ZwQueryInformationProcess(hProcess, ProcessBasicInformation, &ProcessInfo, sizeof(ProcessInfo), NULL); - - rc = _ZwReadVirtualMemory(hProcess, ProcessInfo.PebBaseAddress, UserPool, sizeof(PEB), NULL); - - peb = (PPEB)UserPool; - rc = _ZwReadVirtualMemory(hProcess, peb->ProcessParameters, UserPool, sizeof(PROCESS_PARAMETERS), NULL); - - proc_params = (PPROCESS_PARAMETERS)UserPool; - ULONG uSize = 0; - LPVOID pBaseAddress = NULL; - - uSize = proc_params->CommandLine.Length; - pBaseAddress = proc_params->CommandLine.Buffer; - - //keine commandline?! - if (uSize == 0 || pBaseAddress == NULL) { - LocalFree(UserPool); - return FALSE; - } - - buffer = (WCHAR*)new char[uSize]; - - rc = _ZwReadVirtualMemory(hProcess, pBaseAddress, buffer, uSize, NULL); - - //in ansi umwandeln - int correctsize = WideCharToMultiByte(CP_OEMCP, 0, buffer, -1, NULL, 0, NULL, NULL); - - if (correctsize == 0) { - LocalFree(UserPool); - return FALSE; - } - - buffer2 = new char[correctsize]; - WideCharToMultiByte(CP_OEMCP, 0, buffer, -1, buffer2, correctsize, NULL, NULL); - buffer2[correctsize - 1] = 0; - - - for (unsigned int i = 0; i < mir_strlen(buffer2); i++) { - buffer2[i] = tolower(buffer2[i]); - } - - //lowercase mustcontain/mustnotcontain - if (mustcontain) - for (unsigned int i = 0; i < mir_strlen(mustcontain); i++) - mustcontain[i] = tolower(mustcontain[i]); - - if (mustnotcontain) - for (unsigned int i = 0; i < mir_strlen(mustnotcontain); i++) - mustnotcontain[i] = tolower(mustnotcontain[i]); - - string cmdline = buffer2; - - if (mustcontain) - if (cmdline.find(mustcontain) != string::npos) { - delete[] buffer; - delete[] buffer2; - LocalFree(UserPool); - return TRUE; - } - else { - delete[] buffer; - delete[] buffer2; - LocalFree(UserPool); - return FALSE; - } - - int count = 1; - if (mustnotcontain) { - char*str = getItem(mustnotcontain, ';', count); - do { - if (cmdline.find(str) != string::npos) { - delete[] buffer; - delete[] buffer2; - LocalFree(UserPool); - return FALSE; - } - count++; - str = getItem(mustnotcontain, ';', count); - } while (*str != 0); - } - - //_ZwClose(hProcess); - LocalFree(UserPool); - delete[] buffer; - delete[] buffer2; - - return TRUE; -} - -#define RECV_BUFFER_SIZE 6144 - -BOOL CheckWWWContent(char*address) -{ - Netlib_Logf(hNetlib, "Check Url %s ...", address); - - //netlib request - NETLIBHTTPREQUEST nlhr = { 0 }; - nlhr.cbSize = sizeof(nlhr); - nlhr.requestType = REQUEST_HEAD; - nlhr.flags = NLHRF_NODUMP | NLHRF_GENERATEHOST | NLHRF_SMARTAUTHHEADER; - nlhr.szUrl = address; - - NETLIBHTTPREQUEST *nlhrReply = (NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION, (WPARAM)hNetlib, (LPARAM)&nlhr); - - if (nlhrReply) { - //nicht auf dem server - Netlib_Logf(hNetlib, "Resultcode %d ...", nlhrReply->resultCode); - if (nlhrReply->resultCode != 200) { - CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)nlhrReply); - return FALSE; - } - CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)nlhrReply); - } - else - return FALSE; - - return TRUE; -} - - -BOOL GetWWWContent2(char*address, char*filename, BOOL dontoverwrite, char**tobuf, unsigned int* size) -{ - if (dontoverwrite == TRUE) { - if (GetFileAttributesA(filename) != 0xFFFFFFFF) { - Netlib_Logf(hNetlib, "%s already exists, no overwrite.", filename); - return TRUE; - } - } - Netlib_Logf(hNetlib, "Download Url %s ...", address); - - //netlib request - NETLIBHTTPREQUEST nlhr = { 0 }; - nlhr.cbSize = sizeof(nlhr); - nlhr.requestType = REQUEST_GET; - nlhr.flags = NLHRF_NODUMP | NLHRF_GENERATEHOST | NLHRF_SMARTAUTHHEADER; - nlhr.szUrl = address; - - NETLIBHTTPREQUEST *nlhrReply = (NETLIBHTTPREQUEST*)CallService(MS_NETLIB_HTTPTRANSACTION, (WPARAM)hNetlib, (LPARAM)&nlhr); - - if (nlhrReply) { - //nicht auf dem server - if (nlhrReply->resultCode != 200) { - Netlib_Logf(hNetlib, "Bad statuscode: %d", nlhrReply->resultCode); - CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)nlhrReply); - return FALSE; - } - //keine daten für mich - else if (nlhrReply->dataLength < 1 || nlhrReply->pData == NULL) { - Netlib_Logf(hNetlib, "No data received."); - CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)nlhrReply); - return FALSE; - } - else { - if (tobuf == NULL) { - FILE * f = fopen(filename, "wb"); - if (f == NULL) { - Netlib_Logf(hNetlib, "Cannot open %s for binary write mode.", filename); - CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)nlhrReply); - return FALSE; - } - fwrite(nlhrReply->pData, nlhrReply->dataLength, 1, f); - fclose(f); - } - else { - if (*tobuf == NULL) { - *tobuf = new char[nlhrReply->dataLength + 1]; - memcpy_s(*tobuf, nlhrReply->dataLength, nlhrReply->pData, nlhrReply->dataLength); - //0 terminieren - (*tobuf)[nlhrReply->dataLength] = 0; - //größe zurückliefern, wenn gewollt - if (size) - *size = nlhrReply->dataLength + 1; - } - } - } - CallService(MS_NETLIB_FREEHTTPREQUESTSTRUCT, 0, (LPARAM)nlhrReply); - } - else { - Netlib_Logf(hNetlib, "No valid Netlib Request.", filename); - return FALSE; - } - return TRUE; -} -//eigener www downloader, da winet exceptions erzeugt -BOOL GetWWWContent(char*host, char* request, char*filename, BOOL dontoverwrite) -{ - char add[1024] = "http://"; - mir_strcat(add, host); - mir_strcat(add, request); - - return GetWWWContent2(add, filename, dontoverwrite); -} - -unsigned int getfilesize(char*path) -{ - FILE *f = fopen(path, "rb"); - if (f == NULL) - return 0; - fseek(f, 0, SEEK_END); - int size = ftell(f); - fclose(f); - return size; -} - -//funktion soll erst in der userini suchen, danach in der xfire_games.ini -DWORD xfire_GetPrivateProfileString(__in LPCSTR lpAppName, __in LPCSTR lpKeyName, __in LPCSTR lpDefault, __out LPSTR lpReturnedString, __in DWORD nSize, __in LPCSTR lpFileName) -{ - //xfire_games.ini - int size = mir_strlen(lpFileName); - if (size > 15) { - char*file = (char*)lpFileName; - int ret = 0; - *(file + size - 14) = 'u'; - *(file + size - 13) = 's'; - *(file + size - 12) = 'e'; - *(file + size - 11) = 'r'; - ret = GetPrivateProfileStringA(lpAppName, lpKeyName, lpDefault, lpReturnedString, nSize, lpFileName); - if (ret) - return ret; - - *(file + size - 14) = 'f'; - *(file + size - 13) = 'i'; - *(file + size - 12) = 'r'; - *(file + size - 11) = 'e'; - return GetPrivateProfileStringA(lpAppName, lpKeyName, lpDefault, lpReturnedString, nSize, lpFileName); - } - return GetPrivateProfileStringA(lpAppName, lpKeyName, lpDefault, lpReturnedString, nSize, lpFileName); -} - - -BOOL mySleep(int ms, HANDLE evt) -{ - switch (WaitForSingleObject(evt, ms)) { - case WAIT_TIMEOUT: - return FALSE; - case WAIT_ABANDONED: - //MessageBoxA(NULL,"Abbruch","Abbruch",0); - return TRUE; - default: - return TRUE; - } -} |