📄 lmain.pas
字号:
unit LMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, ExtCtrls, JSocket, SyncObjs,
Grids, Buttons, IniFiles, MudUtil, SDK, Parse,
Menus, Grobal2, LSShare, ComCtrls;
type
TConnInfo = record //Size 0x20 Address: 0x00468601
sAccount: string; //0x00
sIPaddr: string; //0x04
sServerName: string; //0x08
nSessionID: integer; //0x0C
boPayCost: boolean; //0x10
dwKickTick: longword; //0x14
dwStartTick: longword;//0x18
boKicked: boolean; //0x1C
nLockCount: integer;
end;
pTConnInfo = ^TConnInfo;
pTGateInfo = ^TGateInfo;
TGateInfo = record //Size 0x14 Address: 0x004686A0
Socket: TCustomWinSocket; //0x00
sIPaddr: string; //0x04
sReceiveMsg: string; //0x08
UserList: TList; //0x0C
dwKeepAliveTick: longword; //0x10
end;
pTUserInfo = ^TUserInfo;
TUserInfo = record //Size 0x68 Address: 0x004686C8
sAccount: string; //0x00
sUserIPaddr: string; //0x0B
sGateIPaddr: string; //用户连接到网关,网关的连接IP
sSockIndex: string; //0x20
nVersionDate: integer; //0x24
boCertificationOK: boolean; //0x28
bo29: boolean; //0x29
bo2A: boolean; //0x2A
bo2B: boolean; //0x2B
nSessionID: integer; //0x2C
boPayCost: boolean; //0x30
nIDDay: integer; //0x34
nIDHour: integer; //0x38
nIPDay: integer; //0x3C
nIPHour: integer; //0x40
dtDateTime: TDateTime; //0x48
boSelServer: boolean; //0x50
bo51: boolean; //0x51
Socket: TCustomWinSocket; //0x54
sReceiveMsg: string; //0x58
dwTime5C: longword; //0x5C
bo60: boolean; //0x60
bo61: boolean; //0x61
bo62: boolean; //0x62
bo63: boolean; //0x63
dwClientTick: longword; //0x64
Gate: pTGateInfo;
end;
TFrmMain = class(TForm)
GSocket: TServerSocket;
ExecTimer: TTimer;
Timer1: TTimer;
StartTimer: TTimer;
WebLogTimer: TTimer;
LogTimer: TTimer;
CountLogTimer: TTimer;
MonitorTimer: TTimer;
MainMenu: TMainMenu;
MENU_CONTROL: TMenuItem;
MENU_CONTROL_EXIT: TMenuItem;
MENU_VIEW: TMenuItem;
MENU_OPTION: TMenuItem;
MENU_HELP: TMenuItem;
MENU_HELP_ABOUT: TMenuItem;
MENU_OPTION_ROUTE: TMenuItem;
MENU_VIEW_SESSION: TMenuItem;
R1: TMenuItem;
C1: TMenuItem;
G1: TMenuItem;
BtnDump: TSpeedButton;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
Memo1: TMemo;
TabSheet2: TTabSheet;
MonitorGrid: TStringGrid;
TabSheet3: TTabSheet;
LbMasCount: TLabel;
Label1: TLabel;
CkLogin: TCheckBox;
CbViewLog: TCheckBox;
Button1: TButton;
BtnView: TButton;
BtnShowServerUsers: TButton;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ExecTimerTimer(Sender: TObject);
procedure Memo1DblClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure StartTimerTimer(Sender: TObject);
procedure BtnViewClick(Sender: TObject);
procedure CountLogTimerTimer(Sender: TObject);
procedure BtnShowServerUsersClick(Sender: TObject);
procedure MonitorTimerTimer(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
procedure GSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure GSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure GSocketClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: integer);
procedure GSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Panel2DblClick(Sender: TObject);
procedure CbViewLogClick(Sender: TObject);
procedure MENU_CONTROL_EXITClick(Sender: TObject);
procedure MENU_OPTION_ROUTEClick(Sender: TObject);
procedure MENU_VIEW_SESSIONClick(Sender: TObject);
procedure R1Click(Sender: TObject);
procedure C1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure G1Click(Sender: TObject);
procedure MENU_HELP_ABOUTClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
//sGateIPaddr :String; //0x334
//GateList :TList; //0x338
//SessionList :TList; //0x33C
//ServerNameList :TStringList; //0x340
SList_0344: TStringList; //0x344
//AccountCostList :TQuickList; //0x348
//IPaddrCostList :TQuickList; //0x34C
ParseList: TThreadParseList; //0x350
//m_boRemoteClose :Boolean;
procedure GameCenterGetUserAccount(sData: string);
procedure GameCenterChangeAccountInfo(sData: string);
procedure OpenRouteConfig();
public
{ Public declarations }
end;
procedure StartService(Config: pTConfig);
procedure StopService(Config: pTConfig);
procedure InitializeConfig(Config: pTConfig);
procedure UnInitializeConfig(Config: pTConfig);
procedure LoadConfig(Config: pTConfig);
procedure LoadAddrTable(Config: pTConfig);
procedure GenServerNameList(Config: pTConfig);
procedure WriteLogMsg(Config: pTConfig; sType: string; var UserEntry: TUserEntry;
var UserAddEntry: TUserEntryAdd);
procedure SaveContLogMsg(Config: pTConfig; sLogMsg: string);
procedure SendGateMsg(Socket: TCustomWinSocket; sSockIndex, sMsg: string);
procedure SendGateKickMsg(Socket: TCustomWinSocket; sSockIndex: string);
procedure SendKeepAlivePacket(Socket: TCustomWinSocket);
procedure SessionAdd(Config: pTConfig; sAccount, sIPaddr: string;
nSessionID: integer; boPayCost: boolean);
procedure SessionDel(Config: pTConfig; nSessionID: integer);
procedure SessionKick(Config: pTConfig; sLoginID: string);
procedure SessionUpdate(Config: pTConfig; nSessionID: integer;
sServerName: string; boPayCost: boolean);
procedure SessionClearKick(Config: pTConfig);
function IsPayMent(Config: pTConfig; sIPaddr, sAccount: string): boolean;
procedure SessionClearNoPayMent(Config: pTConfig);
function IsLogin(Config: pTConfig; sLoginID: string): boolean; overload;
function IsLogin(Config: pTConfig; nSessionID: integer): boolean; overload;
function GetServerListInfo(): string;
procedure GetSelGateInfo(Config: pTConfig; sServerName, sIPaddr: string;
var sSelGateIP: string; var nSelGatePort: integer);
function KickUser(Config: pTConfig; UserInfo: pTUserInfo): boolean;
procedure CloseUser(Config: pTConfig; sAccount: string; nSessionID: integer);
procedure AccountCreate(Config: pTConfig; UserInfo: pTUserInfo; sData: string);
procedure AccountChangePassword(Config: pTConfig; UserInfo: pTUserInfo; sData: string);
procedure AccountCheckProtocol(UserInfo: pTUserInfo; nDate: integer);
procedure AccountLogin(Config: pTConfig; UserInfo: pTUserInfo; sData: string);
procedure AccountSelectServer(Config: pTConfig; UserInfo: pTUserInfo; sData: string);
procedure AccountUpdateUserInfo(Config: pTConfig; UserInfo: pTUserInfo; sData: string);
procedure AccountGetBackPassword(UserInfo: pTUserInfo; sData: string);
procedure ReceiveSendUser(Config: pTConfig; sSockIndex: string;
GateInfo: pTGateInfo; sData: string);
procedure ReceiveOpenUser(Config: pTConfig; sSockIndex: string;
sIPaddr: string; GateInfo: pTGateInfo);
procedure ReceiveCloseUser(Config: pTConfig; sSockIndex: string; GateInfo: pTGateInfo);
procedure ProcessUserMsg(Config: pTConfig; UserInfo: pTUserInfo; sMsg: string);
procedure DecodeGateData(Config: pTConfig; GateInfo: pTGateInfo);
procedure DecodeUserData(Config: pTConfig; UserInfo: pTUserInfo);
procedure ProcessGate(Config: pTConfig);
procedure LoadAccountCostList(Config: pTConfig; QuickList: TQuickList);
procedure LoadIPaddrCostList(Config: pTConfig; QuickList: TQuickList);
var
FrmMain: TFrmMain;
implementation
uses
SQLIDDB, MasSock, FrmFindId, HUtil32, EDcode, GateSet,
FAccountView, GrobalSession, BasicSet;
{$R *.DFM}
procedure TFrmMain.OpenRouteConfig;
begin
FrmGateSetting := TFrmGateSetting.Create(nil);
FrmGateSetting.Open;
FrmGateSetting.Free;
end;
{
procedure TFrmMain.OpenRouteConfig;
var
Config :pTConfig;
begin
Config:=@g_Config;
if FrmGateSetting.Open then begin
LoadAddrTable(Config);
end;
end;
}
procedure TFrmMain.MENU_OPTION_ROUTEClick(Sender: TObject);
begin
OpenRouteConfig();
end;
procedure TFrmMain.MENU_VIEW_SESSIONClick(Sender: TObject);
begin
frmGrobalSession := TfrmGrobalSession.Create(nil);
frmGrobalSession.Open;
frmGrobalSession.Free;
end;
procedure TFrmMain.CbViewLogClick(Sender: TObject);
var
Config: pTConfig;
begin
Config := @g_Config;
Config.boShowDetailMsg := CbViewLog.Checked;
end;
//00469778
procedure TFrmMain.GSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var
GateInfo: pTGateInfo;
Config: pTConfig;
begin
Config := @g_Config;
if not ExecTimer.Enabled then begin
Socket.Close;
exit;
end;
New(GateInfo);
GateInfo.Socket := Socket;
GateInfo.sIPaddr := GetGatePublicAddr(Config, Socket.RemoteAddress);
GateInfo.sReceiveMsg := '';
GateInfo.UserList := TList.Create;
GateInfo.dwKeepAliveTick := GetTickCount();
EnterCriticalSection(Config.GateCriticalSection);
try
Config.GateList.Add(GateInfo);
finally
LeaveCriticalSection(Config.GateCriticalSection);
end;
end;
//0x00469898
procedure TFrmMain.GSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
var
I: integer;
II: integer;
GateInfo: pTGateInfo;
UserInfo: pTUserInfo;
Config: pTConfig;
begin
Config := @g_Config;
EnterCriticalSection(Config.GateCriticalSection);
try
for I := 0 to Config.GateList.Count - 1 do begin
GateInfo := Config.GateList.Items[I];
if GateInfo.Socket = Socket then begin
for II := 0 to GateInfo.UserList.Count - 1 do begin
UserInfo := GateInfo.UserList.Items[II];
if Config.boShowDetailMsg then
MainOutMessage('Close: ' + UserInfo.sUserIPaddr);
Dispose(UserInfo);
end;
GateInfo.UserList.Free;
Dispose(GateInfo);
Config.GateList.Delete(i);
break;
end;
end;
finally
LeaveCriticalSection(Config.GateCriticalSection);
end;
end;
procedure TFrmMain.GSocketClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: integer);
begin
ErrorCode := 0;
Socket.Close;
end;
//00469A60
procedure TFrmMain.GSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
I: integer;
GateInfo: pTGateInfo;
Config: pTConfig;
begin
Config := @g_Config;
EnterCriticalSection(Config.GateCriticalSection);
try
for I := 0 to Config.GateList.Count - 1 do begin
GateInfo := Config.GateList.Items[I];
if GateInfo.Socket = Socket then begin
GateInfo.sReceiveMsg := GateInfo.sReceiveMsg + Socket.ReceiveText;
break;
end;
end;
finally
LeaveCriticalSection(Config.GateCriticalSection);
end;
end;
//0046D19C
procedure LoadAddrTable(Config: pTConfig);
var
LoadList: TStringList;
sFileName: string;
i: integer;
nRouteIdx: integer;
nSelGateIdx: integer;
sLineText, sTitle, sServerName, sGate, sRemote, sPublic, sGatePort: string;
begin
sFileName := '.\!addrtable.txt';
LoadList := TStringList.Create;
if FileExists(sFileName) then begin
LoadList.LoadFromFile(sFileName);
nRouteIdx := 0;
for i := 0 to LoadList.Count - 1 do begin
sLineText := LoadList.Strings[i];
if (sLineText <> '') and (sLineText[1] <> ';') then begin
sLineText := GetValidStr3(sLineText, sServerName, [' ']);
sLineText := GetValidStr3(sLineText, sTitle, [' ']);
sLineText := GetValidStr3(sLineText, sRemote, [' ']);
sLineText := GetValidStr3(sLineText, sPublic, [' ']);
sLineText := Trim(sLineText);
if (sTitle <> '') and (sRemote <> '') and (sPublic <> '') and
(nRouteIdx < 60) then begin
Config.GateRoute[nRouteIdx].sServerName := sServerName;
Config.GateRoute[nRouteIdx].sTitle := sTitle;
Config.GateRoute[nRouteIdx].sRemoteAddr := sRemote;
Config.GateRoute[nRouteIdx].sPublicAddr := sPublic;
nSelGateIdx := 0;
while (sLineText <> '') do begin
if nSelGateIdx > 9 then break;
sLineText := GetValidStr3(sLineText, sGate, [' ']);
if sGate <> '' then begin
if sGate[1] = '*' then begin
sGate := Copy(sGate, 2, length(sGate) - 1);
Config.GateRoute[nRouteIdx].Gate[nSelGateIdx].boEnable := False;
end else begin
Config.GateRoute[nRouteIdx].Gate[nSelGateIdx].boEnable := True;
end;
sGatePort := GetValidStr3(sGate, sGate, [':']);
Config.GateRoute[nRouteIdx].Gate[nSelGateIdx].sIPaddr := sGate;
Config.GateRoute[nRouteIdx].Gate[nSelGateIdx].nPort :=
Str_ToInt(sGatePort, 0);
Config.GateRoute[nRouteIdx].nSelIdx := 0;
Inc(nSelGateIdx);
end;//0046D44B
sLineText := Trim(sLineText);
end;
Inc(nRouteIdx);
end;
end;
end;
Config.nRouteCount := nRouteIdx;
end;//0046D482
LoadList.Free;
GenServerNameList(Config);
end;
//00468F84
procedure TFrmMain.FormCreate(Sender: TObject);
var
Config: pTConfig;
begin
Config := @g_Config;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -