diff options
Diffstat (limited to 'protocols/Xfire/src/tools.cpp')
-rw-r--r-- | protocols/Xfire/src/tools.cpp | 1077 |
1 files changed, 1077 insertions, 0 deletions
diff --git a/protocols/Xfire/src/tools.cpp b/protocols/Xfire/src/tools.cpp new file mode 100644 index 0000000000..44e755cd28 --- /dev/null +++ b/protocols/Xfire/src/tools.cpp @@ -0,0 +1,1077 @@ +/*
+ * 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;
+
+//convert buf to hexstring
+/*char* tohex(unsigned char*buf,int size) {
+ static char buffer[1024*10]="";
+
+ strcpy(buffer,"");
+
+ for(int i=0;i<size;i++)
+ {
+ if(i%16==0&&i!=0)
+ sprintf(buffer,"%s\n%02x ",buffer,buf[i]);
+ else
+ sprintf(buffer,"%s%02x ",buffer,buf[i]);
+ }
+
+ return buffer;
+}*/
+
+//von icqproto kopiert
+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[strlen(src)+strlen(rep)+1];
+
+ strcpy(temp,src);
+ *(temp+pos)=0;
+
+ strcat(temp,rep);
+ strcat(temp,(src+pos+strlen(find)));
+ strcpy(src,temp);
+
+ delete temp;
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* popup darstellen */
+int displayPopup(HWND 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)
+ {
+ POPUPDATAEX ppd = {0};
+
+ if (bIconsNotLoaded)
+ {
+ hicNotify = Skin_GetIcon("popup_notify");
+ hicWarning = Skin_GetIcon("popup_warning");
+ hicError = Skin_GetIcon("popup_error");
+ bIconsNotLoaded = FALSE;
+ }
+
+ lstrcpynA(ppd.lpzContactName, lpCaption, sizeof(ppd.lpzContactName));
+ lstrcpynA(ppd.lpzText, lpText, sizeof(ppd.lpzText));
+
+ 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
+ /* if ((uType&MB_ICONMASK) == MB_ICONINFORMATION) */
+ {
+ ppd.lchIcon = hicNotify;
+ ppd.colorBack = RGB(230,230,230);
+ ppd.colorText = RGB(0,0,0);
+ }
+
+ if(hicon!=NULL)
+ ppd.lchIcon=hicon;
+
+ PUAddPopUpEx(&ppd);
+ }
+
+ return IDOK;
+}
+
+char*menuitemtext(char*mtext)
+{
+ static char temp[256]="";
+ int anz=0;
+ int j=0;
+
+ if(!mtext)
+ return NULL;
+
+ int size=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(DBGetContactSettingByte(NULL,protocolname,"nomsgbox",0))
+ {
+ case 1:
+ return;
+ case 2:
+ displayPopup(NULL,(LPCSTR)msg,"Miranda XFire Protocol Plugin",MB_OK);
+ return;
+ }
+
+ MSGBOXPARAMS mbp;
+ mbp.cbSize=sizeof(mbp);
+ mbp.hwndOwner=NULL;
+ mbp.hInstance=hinstance;
+ mbp.lpszText=(char*)msg;
+ mbp.lpszCaption="Miranda XFire Protocol Plugin";
+ mbp.dwStyle=MB_USERICON;
+ mbp.lpszIcon=MAKEINTRESOURCE(IDI_TM);
+ mbp.dwContextHelpId=NULL;
+ mbp.lpfnMsgBoxCallback=NULL;
+ mbp.dwLanguageId=LANG_ENGLISH;
+ MessageBoxIndirect(&mbp);
+ //MessageBoxA(0,(char*)msg,"Miranda XFire Protocol Plugin",MB_OK|MB_ICONINFORMATION);
+}
+
+void MessageE(LPVOID msg)
+{
+ static BOOL already=FALSE;
+ switch(DBGetContactSettingByte(NULL,protocolname,"nomsgbox",0))
+ {
+ case 0:
+ if(!already)
+ {
+ already=TRUE; //keine doppelte fehlernachrichten
+ Message(msg);
+ already=FALSE;
+ }
+ break;
+ case 2:
+ displayPopup(NULL,(LPCSTR)msg,"Miranda XFire Protocol Plugin",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;
+
+ strcpy(temp,launch);
+
+ 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)
+{
+ _asm {
+ mov ax,data
+ rol ax,8
+ mov data,ax
+ }
+ return data;
+}
+
+//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=strlen(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;
+}
+
+//funktion wird in main gesetzt
+extern pGetExtendedUdpTable _GetExtendedUdpTable;
+
+
+#include <vector>
+
+#define maxuppackets 4
+
+//funktion liefer ip/port einer verbindung
+BOOL GetServerIPPort(DWORD pid,char*localaddrr,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***","");
+
+ //wenn die funktion nicht initialisiert werden konnte, könne wir nicht serverip und port rausbekommen
+ if(_GetExtendedUdpTable==NULL)
+ {
+ XFireLog("no GetExtendedUdpTable function");
+ return FALSE;
+ }
+
+ if(pid!=lastpid)
+ {
+ lastip=lastport=0;
+ lastpid=pid;
+ }
+
+ DWORD size=0;
+ MIB_UDPTABLE_OWNER_PID * ptab=NULL;
+
+ _GetExtendedUdpTable(NULL,&size,FALSE, AF_INET, UDP_TABLE_OWNER_PID, 0);
+ ptab=(MIB_UDPTABLE_OWNER_PID*)malloc(size);
+ 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;
+ }
+
+ if(ptab) delete 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
+ static int I = 1;
+ static 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) //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;
+ }*/
+ }
+ }
+ else if(msize==SOCKET_ERROR)
+ {
+ XFireLog("recv() error %d",WSAGetLastError());
+ }
+ }
+ 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*localaddrr,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;
+
+ //wenn die funktion nicht initialisiert werden konnte, könne wir nicht serverip und port rausbekommen
+ if(_GetExtendedUdpTable==NULL)
+ return FALSE;
+
+ if(pid!=lastpid)
+ {
+ lastip=lastport=0;
+ lastpid=pid;
+ }
+
+ DWORD size=0;
+ MIB_UDPTABLE_OWNER_PID * ptab=NULL;
+
+ _GetExtendedUdpTable(NULL,&size,FALSE, AF_INET, UDP_TABLE_OWNER_PID, 0);
+ ptab=(MIB_UDPTABLE_OWNER_PID*)malloc(size);
+ 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;
+
+ if(ptab) delete 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
+ static 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 i=0;i<strlen(item);i++)
+ {
+ item[i]=tolower(item[i]);
+ }
+
+ 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;
+ PVOID UserPool = (PVOID)LocalAlloc(LPTR, 8192);
+ PROCESS_BASIC_INFORMATION ProcessInfo;
+
+ //strings leer abbruch
+ if(!mustcontain&&!mustnotcontain)
+ return TRUE;
+
+ //prüfe und lade nötige funktionen
+ if(_ZwQueryInformationProcess==NULL)
+ {
+ _ZwQueryInformationProcess = (pZwQueryInformationProcess)GetProcAddress(GetModuleHandle( "ntdll.dll"), "ZwQueryInformationProcess");
+ if(_ZwQueryInformationProcess==NULL)
+ {
+ return TRUE;
+ }
+ }
+ if(_ZwReadVirtualMemory==NULL)
+ {
+ _ZwReadVirtualMemory = (pZwReadVirtualMemory)GetProcAddress(GetModuleHandle( "ntdll.dll"), "ZwReadVirtualMemory");
+ if(_ZwReadVirtualMemory==NULL)
+ {
+ 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<strlen(buffer2);i++)
+ {
+ buffer2[i]=tolower(buffer2[i]);
+ }
+
+ //lowercase mustcontain/mustnotcontain
+ if(mustcontain)
+ for(unsigned int i=0;i<strlen(mustcontain);i++)
+ {
+ mustcontain[i]=tolower(mustcontain[i]);
+ }
+ if(mustnotcontain)
+ for(unsigned int i=0;i<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},*nlhrReply;
+ nlhr.cbSize = sizeof(nlhr);
+ nlhr.requestType= REQUEST_HEAD;
+ nlhr.flags = NLHRF_NODUMP|NLHRF_GENERATEHOST|NLHRF_SMARTAUTHHEADER;
+ nlhr.szUrl = address;
+
+ 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(GetFileAttributes(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},*nlhrReply;
+ nlhr.cbSize = sizeof(nlhr);
+ nlhr.requestType= REQUEST_GET;
+ nlhr.flags = NLHRF_NODUMP|NLHRF_GENERATEHOST|NLHRF_SMARTAUTHHEADER;
+ nlhr.szUrl = address;
+
+ 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://";
+ strcat(add,host);
+ strcat(add,request);
+
+ return GetWWWContent2(add,filename,dontoverwrite);
+}
+
+unsigned int getfilesize(char*path)
+{
+ FILE * f = NULL;
+ 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 LPCTSTR lpAppName, __in LPCTSTR lpKeyName, __in LPCTSTR lpDefault, __out LPTSTR lpReturnedString, __in DWORD nSize, __in LPCTSTR lpFileName) {
+ //xfire_games.ini
+ int size=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 = GetPrivateProfileString( lpAppName,lpKeyName,lpDefault,lpReturnedString,nSize,lpFileName);
+ if(ret)
+ {
+ return ret;
+ }
+ else
+ {
+ *(file+size-14)='f';
+ *(file+size-13)='i';
+ *(file+size-12)='r';
+ *(file+size-11)='e';
+ return GetPrivateProfileString( lpAppName,lpKeyName,lpDefault,lpReturnedString,nSize,lpFileName);
+ }
+ }
+ return GetPrivateProfileString( lpAppName,lpKeyName,lpDefault,lpReturnedString,nSize,lpFileName);
+}
+
+
+BOOL mySleep(int ms,HANDLE evt) {
+ switch(WaitForSingleObject(evt,ms))
+ {
+ case WAIT_TIMEOUT:
+ return FALSE;
+ case WAIT_ABANDONED:
+ //MessageBox(NULL,"Abbruch","Abbruch",0);
+ return TRUE;
+ default:
+ return TRUE;
+ }
+
+ return FALSE;
+}
\ No newline at end of file |