Auch wenn der Threadtitel vielleicht auf den ersten Blick vermuten lässt, dass es sich um einen modifizierten Client oder dergleichen handelt ist dies nicht der Fall. Mein Program stellt demnach in keinster Weise eine Verletzung des Urheberrechts dar!
Was ist der M2Loader?
Der M2Loader erlaubt es euch mit jedem beliebigen Metin2-Client auf jeden beliebigen Server zu connecten.
Wie benutze ich den M2Loader?
- M2Loader in den Ordner des Metin2-Clients kopieren (standartmäßig befindet der sich in C:\Programme\Metin2_Germany).
- M2Loader.exe starten.
- In diesem Fenster könnt ihr nun die IP-Adressen eintippen, die der Server verwendet indem ihr auf den Button "Edit" klickt.
- Nachdem ihr die IPs und Ports eingegeben habt, dann klickt anschließend erneut auf den Button unten links, um die Eingabe zu bestätigen.
- Um Metin2 zu starten, klickt auf den Button mit der Aufschrift "Run Metin2".
- Wählt nun einen beliebigen Server und Channel aus und loggt euch ein. Der Client wird sich nun stattdessen mit dem gewünschten Server verbinden.
Wie finde ich die IP-Adressen und die Ports eines Servers heraus?
- Metin2 starten.
- In den Server einloggen.
- Dort beim Charakterbildschirm stehen bleiben, nicht mit einem Charakter ins Spiel reingehen!
- Start -> Ausführen -> "cmd".
- Es sollte sich nun die Konsole öffnen. Dort gebt ihr "netstat -n" ein.
- Nun werden euch alle aktuellen Verbindungen eures Systems angezeigt.
- Die letzten 3 Zeilen sind interessant, da diese die neuesten sind. In der Spalte "Remoteadresse" befindet sich vor dem Doppelpunkt die jeweilige IP-Adresse und dahinter der Port.
Jetzt habt ihr die IP-Adressen des Servers. Diese müsst ihr nur noch in der richtigen Reihenfolge in den M2Loader eintippen und ihr könnt mit jedem beliebigen Client auf diesem Server spielen.
Übrigens, die IP-Adressen und Ports in dem Screenshot oben und die in der M2Loader_config.ini im Archiv sind die aktuellen IPs und Ports von Ch1 des Servers Erfoo.
Server IPs und Ports
Metin2 DE
01. Mosha
02. Kartago
03. Astreya
04. Hyperion
05. Antharos
06. Cascardon
07. Lesanaya
08. Torkas
09. Legoria
10. Phelon
11. Lykanthra
12. Mikor
13. Amkira
14. Evielas
15. Sertain
16. Gonea
17. Altheos
18. Erfoo
Login Server
83.141.21.103:51000
Character Server
CH1 ???
CH2 ???
CH3 ???
CH4 ???
CH5 ???
CH6 ???
World Server
???
83.141.21.103:51000
Character Server
CH1 ???
CH2 ???
CH3 ???
CH4 ???
CH5 ???
CH6 ???
World Server
???
Login Server
83.141.21.114:11000
Character Server
CH1 83.141.21.114:12000
CH2 83.141.21.115:12000
CH3 83.141.21.116:12000
CH4 83.141.21.112:12000
CH5 83.141.21.122:12000
World Server
83.141.21.115:12000
83.141.21.114:11000
Character Server
CH1 83.141.21.114:12000
CH2 83.141.21.115:12000
CH3 83.141.21.116:12000
CH4 83.141.21.112:12000
CH5 83.141.21.122:12000
World Server
83.141.21.115:12000
Login Server
83.141.21.57:11000
Character Server
CH1 83.141.21.57:12000
CH2 83.141.21.58:12000
CH3 83.141.21.120:12000
CH4 83.141.21.121:12000
Login Server
83.141.21.58:12000
83.141.21.57:11000
Character Server
CH1 83.141.21.57:12000
CH2 83.141.21.58:12000
CH3 83.141.21.120:12000
CH4 83.141.21.121:12000
Login Server
83.141.21.58:12000
Login Server
83.141.21.123:11000
Character Server
CH1 83.141.21.123:12000
CH2 83.141.21.127:12000
CH3 83.141.21.128:12000
CH4 83.141.21.129:12000
World Server
83.141.21.127:12000
83.141.21.123:11000
Character Server
CH1 83.141.21.123:12000
CH2 83.141.21.127:12000
CH3 83.141.21.128:12000
CH4 83.141.21.129:12000
World Server
83.141.21.127:12000
Login Server
83.141.21.62:11000
Character Server
CH1 83.141.21.62:12000
CH2 83.141.21.63:12000
CH3 83.141.21.64:12000
CH4 83.141.21.65:12000
World Server
83.141.21.63:12000
83.141.21.62:11000
Character Server
CH1 83.141.21.62:12000
CH2 83.141.21.63:12000
CH3 83.141.21.64:12000
CH4 83.141.21.65:12000
World Server
83.141.21.63:12000
Login Server
83.141.21.66:11000
Character Server
CH1 83.141.21.66:12000
CH2 83.141.21.27:12000
CH3 83.141.21.28:12000
CH4 83.141.21.29:12000
World Server
83.141.21.27:12000
83.141.21.66:11000
Character Server
CH1 83.141.21.66:12000
CH2 83.141.21.27:12000
CH3 83.141.21.28:12000
CH4 83.141.21.29:12000
World Server
83.141.21.27:12000
Login Server
83.141.21.31:21000
Character Server
CH1 83.141.21.31:22000
CH2 83.141.21.30:22000
CH3 83.141.21.160:22000
CH4 83.141.21.155:22000
World Server
83.141.21.30:22000
83.141.21.31:21000
Character Server
CH1 83.141.21.31:22000
CH2 83.141.21.30:22000
CH3 83.141.21.160:22000
CH4 83.141.21.155:22000
World Server
83.141.21.30:22000
Login Server
83.141.21.153:11000
Character Server
CH1 ???
CH2 ???
CH3 ???
CH4 ???
World Server
???
83.141.21.153:11000
Character Server
CH1 ???
CH2 ???
CH3 ???
CH4 ???
World Server
???
Login Server
83.141.21.141:21000
Character Server
CH1 83.141.21.141:22000
CH2 83.141.21.140:22000
CH3 83.141.21.142:22000
CH4 83.141.21.143:22000
World Server
83.141.21.140:22000
83.141.21.141:21000
Character Server
CH1 83.141.21.141:22000
CH2 83.141.21.140:22000
CH3 83.141.21.142:22000
CH4 83.141.21.143:22000
World Server
83.141.21.140:22000
Login Server
83.141.21.147:21000
Character Server
CH1 83.141.21.147:22000
CH2 83.141.21.148:22000
CH3 83.141.21.149:22000
CH4 83.141.21.150:22000
World Server
83.141.21.148:22000
83.141.21.147:21000
Character Server
CH1 83.141.21.147:22000
CH2 83.141.21.148:22000
CH3 83.141.21.149:22000
CH4 83.141.21.150:22000
World Server
83.141.21.148:22000
Login Server
79.110.84.172:11000
Character Server
CH1 79.110.84.172:12000
CH2 79.110.84.173:12000
CH3 79.110.84.174:12000
CH4 79.110.84.175:12000
World Server
79.110.84.173:12000
79.110.84.172:11000
Character Server
CH1 79.110.84.172:12000
CH2 79.110.84.173:12000
CH3 79.110.84.174:12000
CH4 79.110.84.175:12000
World Server
79.110.84.173:12000
Login Server
79.110.84.185:31000
Character Server
CH1 79.110.84.185:32000
CH2 79.110.84.183:32000
CH3 79.110.84.184:32000
CH4 79.110.84.186:32000
World Server
79.110.84.183:32000
79.110.84.185:31000
Character Server
CH1 79.110.84.185:32000
CH2 79.110.84.183:32000
CH3 79.110.84.184:32000
CH4 79.110.84.186:32000
World Server
79.110.84.183:32000
Login Server
79.110.84.194:11000
Character Server
CH1 79.110.84.194:12000
CH2 79.110.84.195:12000
CH3 79.110.84.196:12000
CH4 79.110.84.193:12000
World Server
79.110.84.195:12000
79.110.84.194:11000
Character Server
CH1 79.110.84.194:12000
CH2 79.110.84.195:12000
CH3 79.110.84.196:12000
CH4 79.110.84.193:12000
World Server
79.110.84.195:12000
Login Server
79.110.84.205:21000
Character Server
CH1 79.110.84.205:22000
CH2 79.110.84.204:22000
CH3 79.110.84.203:22000
CH3 79.110.84.202:22000
World Server
79.110.84.204:22000
79.110.84.205:21000
Character Server
CH1 79.110.84.205:22000
CH2 79.110.84.204:22000
CH3 79.110.84.203:22000
CH3 79.110.84.202:22000
World Server
79.110.84.204:22000
Login Server
79.110.85.34:11000
Character Server
CH1 79.110.85.34:12000
CH2 79.110.85.35:12000
CH3 79.110.85.36:12000
CH4 79.110.85.36:12000
World Server
79.110.85.35:12000
79.110.85.34:11000
Character Server
CH1 79.110.85.34:12000
CH2 79.110.85.35:12000
CH3 79.110.85.36:12000
CH4 79.110.85.36:12000
World Server
79.110.85.35:12000
Login Server
79.110.85.47:31000
Character Server
CH1 79.110.85.47:32000
CH2 79.110.85.48:32000
CH3 79.110.85.49:32000
CH4 79.110.85.46:32000
World Server
79.110.85.48:32000
79.110.85.47:31000
Character Server
CH1 79.110.85.47:32000
CH2 79.110.85.48:32000
CH3 79.110.85.49:32000
CH4 79.110.85.46:32000
World Server
79.110.85.48:32000
Login Server
79.110.85.75:31000
Character Server
CH1 79.110.85.75:32000
CH2 79.110.85.76:32000
CH3 79.110.85.73:32000
CH4 79.110.85.74:32000
World Server
79.110.85.76:32000
79.110.85.75:31000
Character Server
CH1 79.110.85.75:32000
CH2 79.110.85.76:32000
CH3 79.110.85.73:32000
CH4 79.110.85.74:32000
World Server
79.110.85.76:32000
Login Server
79.110.85.60:31000
Character Server
CH1 79.110.85.60:32000
CH2 79.110.85.59:32000
CH3 79.110.85.58:32000
CH4 79.110.85.57:32000
World Server
79.110.85.59:32000
79.110.85.60:31000
Character Server
CH1 79.110.85.60:32000
CH2 79.110.85.59:32000
CH3 79.110.85.58:32000
CH4 79.110.85.57:32000
World Server
79.110.85.59:32000
Source Code
M2Loader.h
Code:
#pragma once
#include "resource.h"
struct Pointers
{
Pointers():
Pointer1(0),
Pointer2(0),
Pointer3(0){}
DWORD Pointer1;
DWORD Pointer2;
DWORD Pointer3;
};
namespace ServerInfo
{
char *LoginServerIP = new char[50];
USHORT LoginServerPort;
char *CharacterServerIP = new char[50];
USHORT CharacterServerPort;
char *WorldServerIP = new char[50];
USHORT WorldServerPort;
}
M2Loader.cpp
Code:
// M2Loader.cpp : Definiert den Einstiegspunkt für die Anwendung.
//
#include "stdafx.h"
#include "M2Loader.h"
#include <iostream>
#include <Winsock2.h>
#pragma comment (lib, "WS2_32.lib")
BOOL CALLBACK Dlgproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
DWORD ShowDialog(HINSTANCE hInstance);
void ChangeIPAndPort();
void ChangeIPAndPortEnd();
void PatchCode(void *Code, DWORD Offset);
void LoadConfig();
bool RunMetin2(PROCESS_INFORMATION *ProcessInformation);
void LoadConnectionData(HWND hWnd, void *buf);
void WriteBytesToBuffer(HWND hWnd, void *buf, DWORD MyFunctionOffset);
DWORD GetBufferLength();
void SaveConfig();
__declspec(naked) void ChangeIPAndPort()
{
__asm
{
pushad
mov eax, 0x00000000
mov edx, eax
mov ecx, [esp+0x2C]
cmp [eax], ecx
je Jump4
cmp dword ptr ds:[eax], 0x00000000
jne Jump1
mov [eax], ecx
add edx, 0x0C
jmp Jump3
Jump1:
cmp [eax+0x04], ecx
je Jump4
cmp dword ptr ds:[eax+0x04], 0x00000000
jne Jump2
mov [eax+0x04], ecx
add edx, 0x1C
jmp jump3
Jump2:
cmp [eax+0x08], ecx
je Jump4
cmp dword ptr ds:[eax+0x08], 0x00000000
jne Jump4
mov [eax+0x08], ecx
add edx, 0x2C
Jump3:
mov [esp+0x2C], edx
Jump4:
popad
sub esp, 0x04
push eax
mov eax, [esp+0x08]
mov [esp+0x04], eax
mov [esp+0x08], ebp
pop eax
mov ebp, esp
add ebp, 0x04
ret
}
}
__declspec(naked) void ChangeIPAndPortEnd()
{
}
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
LoadLibrary("WS2_32.dll");
LoadConfig();
ShowDialog(hInstance);
return 0;
}
BOOL CALLBACK Dlgproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
using namespace ServerInfo;
switch(uMsg)
{
case WM_COMMAND:
PROCESS_INFORMATION *ProcessInformation = new PROCESS_INFORMATION;
switch(LOWORD(wParam))
{
case IDC_MYICON:
DestroyWindow(hWnd);
break;
case IDC_BUTTON1:
if (!RunMetin2(ProcessInformation))
{
DWORD ErrorCode = GetLastError();
char *buf = new char[1000];
sprintf_s(buf, 1000, "CreateProcess() failed!\n(Error Code: %d)", ErrorCode);
if (ErrorCode == 2)
strcat_s(buf, 1000, "\n\nDid you copy M2Loader into your Metin2 folder?");
MessageBox(hWnd, buf, "Error!", 0);
}
else
{
HMODULE ModuleHandle = GetModuleHandle("WS2_32.dll");
DWORD ConnectOffset = (DWORD)GetProcAddress(ModuleHandle, "connect");
if (!ConnectOffset)
MessageBox(hWnd, "Can't find the function \"connect\" in \"WS2_32.dll\"!", "Error!", 0);
else
{
DWORD temp;
DWORD SizeOfCode = (DWORD)ChangeIPAndPortEnd - (DWORD)ChangeIPAndPort;
DWORD MyFunctionOffset = (DWORD)VirtualAllocEx(ProcessInformation->hProcess, NULL, (SIZE_T)(sizeof(Pointers) + (sizeof(sockaddr_in) * 3) + SizeOfCode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
if (!MyFunctionOffset)
{
DWORD ErrorCode = GetLastError();
char *test = new char[1000];
sprintf_s(test, 1000, "VirtualAllocEx() failed!\n(Error Code: %d)", ErrorCode);
MessageBox(hWnd, test, "Error!", 0);
}
else
{
BYTE *buf = new BYTE[GetBufferLength()];
WriteBytesToBuffer(hWnd, buf, MyFunctionOffset);
WriteProcessMemory(ProcessInformation->hProcess, (void *)MyFunctionOffset, buf, GetBufferLength(), &temp);
VirtualProtectEx(ProcessInformation->hProcess, (void *)ConnectOffset, 5, PAGE_EXECUTE_READWRITE, &temp);
BYTE FunctionCall[5] = {0xE8, 0x00, 0x00, 0x00, 0x00};
DWORD Address = (MyFunctionOffset - ConnectOffset - 0x05) + sizeof(Pointers) + (sizeof(sockaddr_in) * 3);
*(DWORD *)(FunctionCall + 1) = Address;
bool b = true;
while (b)
{
if (!WriteProcessMemory(ProcessInformation->hProcess, (void *)ConnectOffset, FunctionCall, sizeof(FunctionCall), (SIZE_T *)&temp))
{
DWORD ErrorCode = GetLastError();
if (ErrorCode != 487)
{
char *buf = new char[1000];
sprintf_s(buf, 1000, "WriteProcessMemory() failed!\n(Error Code: %d)", ErrorCode);
MessageBox(hWnd, buf, "Error!", 0);
b = false;
}
}
else
b = false;
Sleep(1);
}
}
}
DestroyWindow(hWnd);
}
break;
case IDC_BUTTON2:
HWND LoginServerIPEdit = GetDlgItem(hWnd, IDC_EDIT1);
HWND LoginServerPortEdit = GetDlgItem(hWnd, IDC_EDIT2);
HWND CharacterServerIPEdit = GetDlgItem(hWnd, IDC_EDIT3);
HWND CharacterServerPortEdit = GetDlgItem(hWnd, IDC_EDIT4);
HWND WorldServerIPEdit = GetDlgItem(hWnd, IDC_EDIT5);
HWND WorldServerPortEdit = GetDlgItem(hWnd, IDC_EDIT6);
HWND Button = GetDlgItem(hWnd, IDC_BUTTON2);
char *ButtonText = new char[20];
GetWindowText(Button, ButtonText, 20);
if (!strcmp(ButtonText, "Edit"))
{
EnableWindow(LoginServerIPEdit, true);
EnableWindow(LoginServerPortEdit, true);
EnableWindow(CharacterServerIPEdit, true);
EnableWindow(CharacterServerPortEdit, true);
EnableWindow(WorldServerIPEdit, true);
EnableWindow(WorldServerPortEdit, true);
EnableWindow(GetDlgItem(hWnd, IDC_BUTTON1), false);
SetWindowText(Button, "Save");
}
else
{
EnableWindow(LoginServerIPEdit, false);
EnableWindow(LoginServerPortEdit, false);
EnableWindow(CharacterServerIPEdit, false);
EnableWindow(CharacterServerPortEdit, false);
EnableWindow(WorldServerIPEdit, false);
EnableWindow(WorldServerPortEdit, false);
EnableWindow(GetDlgItem(hWnd, IDC_BUTTON1), true);
char Port[20];
GetWindowText(LoginServerIPEdit, LoginServerIP, 50);
GetWindowText(LoginServerPortEdit, Port, 20);
LoginServerPort = atoi(Port);
GetWindowText(CharacterServerIPEdit, CharacterServerIP, 50);
GetWindowText(CharacterServerPortEdit, Port, 20);
CharacterServerPort = atoi(Port);
GetWindowText(WorldServerIPEdit, WorldServerIP, 50);
GetWindowText(WorldServerPortEdit, Port, 20);
WorldServerPort = atoi(Port);
SaveConfig();
SetWindowText(Button, "Edit");
}
}
}
return FALSE;
}
DWORD ShowDialog(HINSTANCE hInstance)
{
using namespace ServerInfo;
MSG msg;
HWND hWnd;
hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)Dlgproc);
HWND LoginServerIPEdit = GetDlgItem(hWnd, IDC_EDIT1);
HWND LoginServerPortEdit = GetDlgItem(hWnd, IDC_EDIT2);
HWND CharacterServerIPEdit = GetDlgItem(hWnd, IDC_EDIT3);
HWND CharacterServerPortEdit = GetDlgItem(hWnd, IDC_EDIT4);
HWND WorldServerIPEdit = GetDlgItem(hWnd, IDC_EDIT5);
HWND WorldServerPortEdit = GetDlgItem(hWnd, IDC_EDIT6);
char *buf = new char[20];
SetWindowText(LoginServerIPEdit, LoginServerIP);
sprintf_s(buf, 20, "%d", LoginServerPort);
SetWindowText(LoginServerPortEdit, buf);
SetWindowText(CharacterServerIPEdit, CharacterServerIP);
sprintf_s(buf, 20, "%d", CharacterServerPort);
SetWindowText(CharacterServerPortEdit, buf);
SetWindowText(WorldServerIPEdit, WorldServerIP);
sprintf_s(buf, 20, "%d", WorldServerPort);
SetWindowText(WorldServerPortEdit, buf);
ShowWindow(hWnd, SW_SHOW);
while(GetMessage(&msg, hWnd, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return true;
}
void PatchCode(void *Code, DWORD Offset)
{
*(DWORD *)((DWORD)Code + 0x02) = Offset;
}
void LoadConfig()
{
using namespace ServerInfo;
char *Directory = new char[1024];
GetCurrentDirectory(1024, Directory);
strcat_s(Directory, 1024, "\\M2Loader_config.ini");
GetPrivateProfileString("LoginServer", "IP", "127.0.0.1", LoginServerIP, 1024, Directory);
LoginServerPort = GetPrivateProfileInt("LoginServer", "Port", 1000, Directory);
GetPrivateProfileString("CharacterServer", "IP", "127.0.0.1", CharacterServerIP, 1024, Directory);
CharacterServerPort = GetPrivateProfileInt("CharacterServer", "Port", 1000, Directory);
GetPrivateProfileString("WorldServer", "IP", "127.0.0.1", WorldServerIP, 1024, Directory);
WorldServerPort = GetPrivateProfileInt("WorldServer", "Port", 1000, Directory);
}
bool RunMetin2(PROCESS_INFORMATION *ProcessInformation)
{
STARTUPINFO myStartupinfo;
myStartupinfo.cb = 0x00000044;
myStartupinfo.lpReserved = NULL;
myStartupinfo.lpDesktop = NULL;
myStartupinfo.lpTitle = NULL;
myStartupinfo.dwX = 0x00000000;
myStartupinfo.dwY = 0x00000000;
myStartupinfo.dwXSize = 0x00000000;
myStartupinfo.dwYSize = 0x00000000;
myStartupinfo.dwXCountChars = 0x00000000;
myStartupinfo.dwYCountChars = 0x00000000;
myStartupinfo.dwFillAttribute = 0x00000000;
myStartupinfo.dwFlags = STARTF_USESHOWWINDOW;
myStartupinfo.wShowWindow = SW_SHOW;
myStartupinfo.cbReserved2 = 0x0000;
myStartupinfo.lpReserved2 = NULL;
myStartupinfo.hStdInput = NULL;
myStartupinfo.hStdOutput = NULL;
myStartupinfo.hStdError = NULL;
if (!CreateProcess("metin2.bin", "metin2.bin", NULL, NULL, false, 0, NULL, NULL, &myStartupinfo, ProcessInformation))
return false;
else
return true;
}
void LoadConnectionData(HWND hWnd, void *buf)
{
using namespace ServerInfo;
sockaddr_in *myConnection = new sockaddr_in[3];
memset(myConnection, 0, sizeof(sockaddr_in) * 3);
for (int i = 0; i <= 3; i++)
myConnection[i].sin_family = AF_INET;
myConnection[0].sin_addr.s_addr = inet_addr(LoginServerIP);
myConnection[0].sin_port = htons(LoginServerPort);
myConnection[1].sin_addr.s_addr = inet_addr(CharacterServerIP);
myConnection[1].sin_port = htons(CharacterServerPort);
myConnection[2].sin_addr.s_addr = inet_addr(WorldServerIP);
myConnection[2].sin_port = htons(WorldServerPort);
memcpy(buf, myConnection, sizeof(sockaddr_in) * 3);
}
void WriteBytesToBuffer(HWND hWnd, void *buf, DWORD MyFunctionOffset)
{
Pointers *myPointers = new Pointers;
memcpy(buf, myPointers, sizeof(Pointers));
BYTE *ConnectionData = new BYTE[sizeof(sockaddr_in) * 3];
LoadConnectionData(hWnd, ConnectionData);
memcpy((void *)((DWORD)buf + sizeof(Pointers)), ConnectionData, sizeof(sockaddr_in) * 3);
DWORD SizeOfCode = (DWORD)ChangeIPAndPortEnd - (DWORD)ChangeIPAndPort;
BYTE *myCode = new BYTE[SizeOfCode];
memcpy(myCode, ChangeIPAndPort, SizeOfCode);
PatchCode(myCode, MyFunctionOffset);
memcpy((void *)((DWORD)buf + sizeof(Pointers) + (sizeof(sockaddr_in) * 3)), myCode, SizeOfCode);
}
DWORD GetBufferLength()
{
return sizeof(Pointers) + sizeof(sockaddr_in) * 3 + (DWORD)ChangeIPAndPortEnd - (DWORD)ChangeIPAndPort;
}
void SaveConfig()
{
using namespace ServerInfo;
char *Directory = new char[1024];
GetCurrentDirectory(1024, Directory);
strcat_s(Directory, 1024, "\\M2Loader_config.ini");
char Port[20];
WritePrivateProfileString("LoginServer", "IP", LoginServerIP, Directory);
sprintf_s(Port, 20, "%d", LoginServerPort);
WritePrivateProfileString("LoginServer", "Port", Port, Directory);
WritePrivateProfileString("CharacterServer", "IP", CharacterServerIP, Directory);
sprintf_s(Port, 20, "%d", CharacterServerPort);
WritePrivateProfileString("CharacterServer", "Port", Port, Directory);
WritePrivateProfileString("WorldServer", "IP", WorldServerIP, Directory);
sprintf_s(Port, 20, "%d", WorldServerPort);
WritePrivateProfileString("WorldServer", "Port", Port, Directory);
}
IDD_DIALOG1 ist das Dialog, IDC_EDIT1 - IDC_EDIT6 sind die Editfelder (von links nach rechts, oben nach unten), IDC_BUTTON1 ist der mittlere Button und IDC_BUTTON2 ist der Button unten links.






