start.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. #include "Netzwerk.h"
  2. #include <main.h>
  3. #include <Datei.h>
  4. #include <Fenster.h>
  5. #include <Globals.h>
  6. #include <InitDatei.h>
  7. #include "Keys.h"
  8. int KSGStart Framework::Start( Startparam p )
  9. {
  10. Network::Start( 10 );
  11. char serverReturn = 0;
  12. HANDLE Mutex = OpenMutex( MUTEX_ALL_ACCESS, false, "KSG_Client" );
  13. if( Mutex == NULL )
  14. {
  15. Mutex = CreateMutex( NULL, true, "KSG_Client" );
  16. DateiRemove( new Text( "data/tmp/k.id" ) );
  17. DateiRemove( new Text( "data/tmp/keinabsturz" ) );
  18. }
  19. else
  20. {
  21. WMessageBox( 0, new Text( "Fehler" ), new Text( "Das Programm läuft bereits. Wenn dieß nicht der Fall ist,\nmusst du den Komputer neu starten." ), MB_ICONERROR );
  22. Network::Exit();
  23. return 0;
  24. }
  25. if( DateiExistiert( new Text( "data/update/unable/list.patch" ) ) )
  26. {
  27. PROCESS_INFORMATION prozessinfo3;
  28. STARTUPINFO startinfo3;
  29. ZeroMemory( &startinfo3, sizeof( STARTUPINFOW ) );
  30. startinfo3.cb = sizeof( STARTUPINFOW );
  31. if( CreateProcess( 0, "data/patch/bin/übernehmen.exe", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3 ) == 1 )
  32. {
  33. Network::Exit();
  34. DateiRemove( new Text( "data/tmp" ) );
  35. exit( 0 );
  36. }
  37. else
  38. {
  39. WMessageBox( 0, new Text( "Fehler" ), new Text( "Bei dem Übernehen der Änderungen ist ein Fehler aufgetreten.\nBitte starte den Komputer neu. Sollte diese Meldung weiterhin\nerscheinen, so musst du das Spiel neu Installieren." ), MB_ICONERROR );
  40. exit( 0 );
  41. }
  42. }
  43. PROCESS_INFORMATION prozessinfo1;
  44. STARTUPINFO startinfo1;
  45. startinfo1.cb = sizeof( STARTUPINFOW );
  46. ZeroMemory( &startinfo1, sizeof( STARTUPINFOW ) );
  47. bool pe = 0;
  48. if( CreateProcess( 0, "data/start/icon.exe", 0, 0, 0, 0, 0, 0, &startinfo1, &prozessinfo1 ) == 1 )
  49. {
  50. CloseHandle( prozessinfo1.hThread );
  51. pe = 1;
  52. }
  53. InitDatei *iDat = new InitDatei( "data/optionen.ini" );
  54. iDat->laden();
  55. if( !iDat->zWert( "ServerIP" ) )
  56. iDat->addWert( "ServerIP", "127.0.0.1" );
  57. if( !iDat->zWert( "ServerPort" ) )
  58. iDat->addWert( "ServerPort", "4253" );
  59. iDat->speichern();
  60. Text *ipT = iDat->getWert( "ServerIP" );
  61. unsigned short port = (unsigned short)TextZuInt( iDat->zWert( "ServerPort" )->getText(), 10 );
  62. iDat->release();
  63. Klient *klient = new Klient();
  64. int l = 0;
  65. char *key;
  66. Keys::getServerKey( &key, l, Keys::MAIN, Keys::SENDEN );
  67. klient->setSendeKey( key, l );
  68. delete[] key;
  69. Keys::getServerKey( &key, l, Keys::MAIN, Keys::EMPFANGEN );
  70. klient->setEmpfangKey( key, l );
  71. delete[] key;
  72. if( !klient->verbinde( port, ipT->getText() ) )
  73. {
  74. Text *message = new Text( "Der Server wurde nicht gefunden.\nServer Ip:" );
  75. message->append( ipT->getText() );
  76. message->append( "\nServer Port:" );
  77. message->append( (int)port );
  78. WMessageBox( 0, new Text( "Fehler" ), message, MB_ICONERROR );
  79. ipT->release();
  80. klient->release();
  81. Network::Exit();
  82. return 0;
  83. }
  84. klient->sende( "\0", 1 ); // Verschlüsselung aktivieren
  85. klient->sendeEncrypted( "\1\0\0\0\0", 5 );
  86. char byte = 0;
  87. klient->getNachrichtEncrypted( &byte, 1 );
  88. if( byte == 3 )
  89. {
  90. klient->getNachrichtEncrypted( &byte, 1 );
  91. char *message = new char[ byte + 1 ];
  92. message[ byte ] = 0;
  93. klient->getNachrichtEncrypted( message, byte );
  94. Text *nachricht = new Text( "Fehler während der Identifikation beim Server.\nServer Rückgabe:\n " );
  95. nachricht->append( message );
  96. WMessageBox( 0, new Text( "Server Fehler" ), nachricht, MB_ICONERROR );
  97. delete[]message;
  98. ipT->release();
  99. klient->sendeEncrypted( "\3", 1 );
  100. klient->getNachrichtEncrypted( &serverReturn, 1 );
  101. klient->trenne();
  102. klient->release();
  103. Network::Exit();
  104. return 0;
  105. }
  106. int klientNummer = 0;
  107. char *netwSchlüssel = 0;
  108. char netwSchlüsselLän = 0;
  109. if( byte == 1 )
  110. {
  111. klient->getNachrichtEncrypted( (char*)&klientNummer, 4 );
  112. klient->getNachrichtEncrypted( &netwSchlüsselLän, 1 );
  113. if( netwSchlüsselLän )
  114. {
  115. netwSchlüssel = new char[ netwSchlüsselLän ];
  116. klient->getNachrichtEncrypted( netwSchlüssel, netwSchlüsselLän );
  117. klient->setSendeKey( netwSchlüssel, netwSchlüsselLän );
  118. klient->setEmpfangKey( netwSchlüssel, netwSchlüsselLän );
  119. Datei *dat = new Datei();
  120. dat->setDatei( "data/tmp/schlüssel.netw" );
  121. dat->erstellen();
  122. dat->open( Datei::Style::schreiben );
  123. dat->schreibe( &netwSchlüsselLän, 1 );
  124. dat->schreibe( netwSchlüssel, netwSchlüsselLän );
  125. dat->close();
  126. dat->release();
  127. }
  128. }
  129. else
  130. {
  131. WMessageBox( 0, new Text( "Server Fehler" ), new Text( "Unbekannte Rückgabe vom Server.\nEventuell ist deine Version des Spiels veraltet." ), MB_ICONERROR );
  132. ipT->release();
  133. klient->sendeEncrypted( "\3", 1 );
  134. klient->getNachrichtEncrypted( &serverReturn, 1 );
  135. klient->trenne();
  136. klient->release();
  137. Network::Exit();
  138. delete[] netwSchlüssel;
  139. return 0;
  140. }
  141. Datei *dat = new Datei();
  142. dat->setDatei( "data/tmp/k.id" );
  143. dat->erstellen();
  144. dat->open( Datei::Style::schreiben );
  145. dat->schreibe( (char*)&klientNummer, 4 );
  146. dat->close();
  147. dat->release();
  148. klient->sendeEncrypted( "\3", 1 );
  149. klient->getNachrichtEncrypted( &serverReturn, 1 );
  150. klient->trenne();
  151. klient->release();
  152. ErhaltungKlient *erhaltung = new ErhaltungKlient( klientNummer );
  153. erhaltung->verbinden( port, ipT, netwSchlüssel, netwSchlüsselLän );
  154. if( pe )
  155. {
  156. while( WaitForSingleObject( prozessinfo1.hProcess, 1000 ) == WAIT_TIMEOUT );
  157. CloseHandle( prozessinfo1.hProcess );
  158. }
  159. PROCESS_INFORMATION prozessinfo2;
  160. STARTUPINFO startinfo2;
  161. startinfo2.cb = sizeof( STARTUPINFOW );
  162. ZeroMemory( &startinfo2, sizeof( STARTUPINFOW ) );
  163. if( CreateProcess( 0, "data/patch/bin/patcher.exe", 0, 0, 0, 0, 0, 0, &startinfo2, &prozessinfo2 ) == 1 )
  164. {
  165. CloseHandle( prozessinfo2.hThread );
  166. while( WaitForSingleObject( prozessinfo2.hProcess, 5000 ) == WAIT_TIMEOUT );
  167. unsigned long erfolg = 0;
  168. GetExitCodeProcess( prozessinfo2.hProcess, &erfolg );
  169. if( erfolg != 0 && DateiExistiert( new Text( "data/tmp/keinabsturz" ) ) )
  170. {
  171. bool gamestart = erfolg == 2;
  172. if( erfolg == 1 )
  173. {
  174. PROCESS_INFORMATION prozessinfo3;
  175. STARTUPINFO startinfo3;
  176. startinfo3.cb = sizeof( STARTUPINFOW );
  177. ZeroMemory( &startinfo3, sizeof( STARTUPINFOW ) );
  178. if( CreateProcess( 0, "data/patch/bin/übernehmen.exe", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3 ) == 1 )
  179. {
  180. if( DateiExistiert( new Text( "data/tmp/keinabsturz" ) ) )
  181. erhaltung->abmelden();
  182. erhaltung->trennen();
  183. erhaltung->warteAufThread( 5000 );
  184. erhaltung->release();
  185. klient = new Klient();
  186. int l = 0;
  187. char *key;
  188. Keys::getServerKey( &key, l, Keys::MAIN, Keys::SENDEN );
  189. klient->setSendeKey( key, l );
  190. delete[] key;
  191. Keys::getServerKey( &key, l, Keys::MAIN, Keys::EMPFANGEN );
  192. klient->setEmpfangKey( key, l );
  193. delete[] key;
  194. if( !klient->verbinde( port, ipT->getText() ) )
  195. {
  196. WMessageBox( 0, new Text( "Fehler" ), new Text( "Die Verbindung zum Server ist abgebrochen." ), MB_ICONERROR );
  197. ipT->release();
  198. klient->release();
  199. Network::Exit();
  200. delete[] netwSchlüssel;
  201. return 0;
  202. }
  203. klient->sende( "\0", 1 ); // Verschlüsselung aktivieren
  204. klient->sendeEncrypted( "\1", 1 );
  205. klient->sendeEncrypted( (char*)&klientNummer, 4 );
  206. klient->getNachrichtEncrypted( &serverReturn, 1 );
  207. if( serverReturn == 3 )
  208. {
  209. klient->getNachrichtEncrypted( &byte, 1 );
  210. char *message = new char[ byte + 1 ];
  211. message[ byte ] = 0;
  212. klient->getNachrichtEncrypted( message, byte );
  213. Text *nachricht = new Text( "Fehler während der Identifikation beim Server.\nServer Rückgabe:\n " );
  214. nachricht->append( message );
  215. WMessageBox( 0, new Text( "Server Fehler" ), nachricht, MB_ICONERROR );
  216. delete[] message;
  217. }
  218. else
  219. {
  220. klient->setSendeKey( netwSchlüssel, netwSchlüsselLän );
  221. klient->setEmpfangKey( netwSchlüssel, netwSchlüsselLän );
  222. }
  223. klient->sendeEncrypted( "\7", 1 );
  224. klient->getNachrichtEncrypted( &serverReturn, 1 );
  225. if( serverReturn == 3 )
  226. {
  227. klient->getNachrichtEncrypted( &byte, 1 );
  228. char *message = new char[ byte + 1 ];
  229. message[ byte ] = 0;
  230. klient->getNachrichtEncrypted( message, byte );
  231. Text *nachricht = new Text( "Fehler während der Abmeldung beim Server.\nServer Rückgabe:\n " );
  232. nachricht->append( message );
  233. WMessageBox( 0, new Text( "Server Fehler" ), nachricht, MB_ICONERROR );
  234. delete[]message;
  235. }
  236. klient->sendeEncrypted( "\3", 1 );
  237. klient->getNachrichtEncrypted( &serverReturn, 1 );
  238. klient->trenne();
  239. ipT->release();
  240. klient->release();
  241. Network::Exit();
  242. DateiRemove( new Text( "data/tmp" ) );
  243. exit( 0 );
  244. }
  245. else
  246. gamestart = 0;
  247. if( !gamestart )
  248. WMessageBox( 0, new Text( "Fehler" ), new Text( "Bei dem Übernehen der Änderungen ist ein Fehler aufgetreten." ), MB_ICONERROR );
  249. }
  250. if( gamestart )
  251. {
  252. PROCESS_INFORMATION prozessinfo3;
  253. STARTUPINFO startinfo3;
  254. startinfo3.cb = sizeof( STARTUPINFOW );
  255. ZeroMemory( &startinfo3, sizeof( STARTUPINFOW ) );
  256. DateiRemove( new Text( "data/tmp/keinabsturz" ) );
  257. if( CreateProcess( 0, "\"data/client/bin/game client.exe\"", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3 ) == 1 )
  258. {
  259. CloseHandle( prozessinfo3.hThread );
  260. while( WaitForSingleObject( prozessinfo3.hProcess, 5000 ) == WAIT_TIMEOUT );
  261. CloseHandle( prozessinfo3.hProcess );
  262. }
  263. else
  264. WMessageBox( 0, new Text( "Fehler" ), new Text( "Das Spiel konnte nicht gestartet werden." ), MB_ICONERROR );
  265. }
  266. }
  267. CloseHandle( prozessinfo2.hProcess );
  268. }
  269. else
  270. {
  271. WMessageBox( 0, new Text( "Fehler" ), new Text( "Der Patcher konnte nicht gestartet werden." ), MB_ICONERROR );
  272. }
  273. if( DateiExistiert( new Text( "data/tmp/keinabsturz" ) ) )
  274. erhaltung->abmelden();
  275. erhaltung->trennen();
  276. erhaltung->warteAufThread( 5000 );
  277. erhaltung->release();
  278. klient = new Klient();
  279. Keys::getServerKey( &key, l, Keys::MAIN, Keys::SENDEN );
  280. klient->setSendeKey( key, l );
  281. delete[] key;
  282. Keys::getServerKey( &key, l, Keys::MAIN, Keys::EMPFANGEN );
  283. klient->setEmpfangKey( key, l );
  284. delete[] key;
  285. if( !klient->verbinde( port, ipT->getText() ) )
  286. {
  287. WMessageBox( 0, new Text( "Fehler" ), new Text( "Die Verbindung zum Server ist abgebrochen." ), MB_ICONERROR );
  288. ipT->release();
  289. klient->release();
  290. Network::Exit();
  291. delete[] netwSchlüssel;
  292. return 0;
  293. }
  294. klient->sende( "\0", 1 ); // Verschlüsselung aktivieren
  295. klient->sendeEncrypted( "\1", 1 );
  296. klient->sendeEncrypted( (char*)&klientNummer, 4 );
  297. klient->getNachrichtEncrypted( &serverReturn, 1 );
  298. if( serverReturn == 3 )
  299. {
  300. klient->getNachrichtEncrypted( &byte, 1 );
  301. char *message = new char[ byte + 1 ];
  302. message[ byte ] = 0;
  303. klient->getNachrichtEncrypted( message, byte );
  304. Text *nachricht = new Text( "Fehler während der Identifikation beim Server.\nServer Rückgabe:\n " );
  305. nachricht->append( message );
  306. WMessageBox( 0, new Text( "Server Fehler" ), nachricht, MB_ICONERROR );
  307. delete[]message;
  308. }
  309. else
  310. {
  311. klient->setSendeKey( netwSchlüssel, netwSchlüsselLän );
  312. klient->setEmpfangKey( netwSchlüssel, netwSchlüsselLän );
  313. }
  314. klient->sendeEncrypted( "\7", 1 );
  315. klient->getNachrichtEncrypted( &serverReturn, 1 );
  316. if( serverReturn == 3 )
  317. {
  318. klient->getNachrichtEncrypted( &byte, 1 );
  319. char *message = new char[ byte + 1 ];
  320. message[ byte ] = 0;
  321. klient->getNachrichtEncrypted( message, byte );
  322. Text *nachricht = new Text( "Fehler während der Abmeldung beim Server.\nServer Rückgabe:\n " );
  323. nachricht->append( message );
  324. WMessageBox( 0, new Text( "Server Fehler" ), nachricht, MB_ICONERROR );
  325. delete[]message;
  326. }
  327. klient->sendeEncrypted( "\3", 1 );
  328. klient->getNachrichtEncrypted( &serverReturn, 1 );
  329. klient->trenne();
  330. ipT->release();
  331. klient->release();
  332. Network::Exit();
  333. DateiRemove( new Text( "data/tmp" ) );
  334. delete[] netwSchlüssel;
  335. return 0;
  336. }