www.pudn.com > llllew.zip > DBSMain.pas


unit DBSMain; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, 
  Controls, Forms, Dialogs, StdCtrls, ExtCtrls, JSocket, Buttons, IniFiles, 
  Menus,Grobal2; 
type 
  TServerInfo = record 
    nSckHandle :Integer;           //0x00 
    sStr       :String;            //0x04 
    bo08       :Boolean;           //0x08 
    Socket     :TCustomWinSocket;  //0x0C 
  end; 
  pTServerInfo =^TServerInfo; 
  THumSession = record 
    sChrName   :String[14]; 
    nIndex     :Integer; 
    Socket     :TCustomWinSocket; //0x20 
    bo24       :Boolean; 
    bo2C       :Boolean; 
    dwTick30   :LongWord; 
  end; 
  pTHumSession = ^THumSession; 
  TLoadHuman = record 
    sAccount        :String[12]; 
    sChrName        :String[14]; 
    sUserAddr       :String[15]; 
    nSessionID      :Integer; 
  end; 
  TFrmDBSrv=class(TForm) 
    ServerSocket: TServerSocket; 
    Timer1: TTimer; 
    AniTimer: TTimer; 
    StartTimer: TTimer; 
    Timer2: TTimer; 
    MemoLog: TMemo; 
    Panel1: TPanel; 
    Label1: TLabel; 
    Label3: TLabel; 
    Label4: TLabel; 
    LbAutoClean: TLabel; 
    Panel2: TPanel; 
    BtnUserDBTool: TSpeedButton; 
    LbTransCount: TLabel; 
    Label2: TLabel; 
    Label5: TLabel; 
    Label6: TLabel; 
    LbUserCount: TLabel; 
    BtnReloadAddr: TButton; 
    BtnEditAddrs: TButton; 
    Label8: TLabel; 
    Label9: TLabel; 
    Label10: TLabel; 
    Label11: TLabel; 
    CkViewHackMsg: TCheckBox; 
    MainMenu: TMainMenu; 
    MENU_CONTROL: TMenuItem; 
    V1: TMenuItem; 
    MENU_OPTION: TMenuItem; 
    MENU_MANAGE: TMenuItem; 
    MENU_OPTION_GENERAL: TMenuItem; 
    MENU_OPTION_GAMEGATE: TMenuItem; 
    MENU_CONTROL_START: TMenuItem; 
    T1: TMenuItem; 
    N1: TMenuItem; 
    G1: TMenuItem; 
    MENU_MANAGE_DATA: TMenuItem; 
    MENU_MANAGE_TOOL: TMenuItem; 
    MENU_TEST: TMenuItem; 
    MENU_TEST_SELGATE: TMenuItem; 
    procedure Timer1Timer(Sender : TObject); 
    procedure FormCreate(Sender : TObject); 
    procedure FormDestroy(Sender : TObject); 
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
    procedure AniTimerTimer(Sender : TObject); 
    procedure FormShow(Sender : TObject); 
    procedure StartTimerTimer(Sender : TObject); 
    procedure Timer2Timer(Sender : TObject); 
    procedure BtnUserDBToolClick(Sender : TObject); 
    procedure BtnReloadAddrClick(Sender : TObject); 
    procedure BtnEditAddrsClick(Sender : TObject); 
    procedure CkViewHackMsgClick(Sender : TObject); 
    procedure WriteLogMsg(sMsg:String); 
    procedure OutMainMessageA(sMsg:String); 
    procedure ServerSocketClientConnect(Sender: TObject; 
      Socket: TCustomWinSocket); 
    procedure ServerSocketClientDisconnect(Sender: TObject; 
      Socket: TCustomWinSocket); 
    procedure ServerSocketClientError(Sender: TObject; 
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; 
      var ErrorCode: Integer); 
    procedure ServerSocketClientRead(Sender: TObject; 
      Socket: TCustomWinSocket); 
    procedure MENU_MANAGE_DATAClick(Sender: TObject); 
    procedure MENU_MANAGE_TOOLClick(Sender: TObject); 
    procedure V1Click(Sender: TObject); 
    procedure MENU_TEST_SELGATEClick(Sender: TObject); 
    procedure MENU_CONTROL_STARTClick(Sender: TObject); 
  private 
    n334:Integer; 
    m_DefMsg:TDefaultMessage; 
    n344:integer; 
    n348:integer; 
    s34C:String; 
 
    ServerList:TList; //0x354 
    HumSessionList:TList; //0x358 
    m_boRemoteClose:Boolean; 
    procedure MainOutMessage(sMsg:String); 
    procedure ProcessServerPacket(ServerInfo: pTServerInfo); 
    procedure ProcessServerMsg(sMsg: String; nLen: Integer; 
      Socket: TCustomWinSocket); 
    procedure SendSocket(Socket: TCustomWinSocket; sMsg: String); 
    procedure LoadHumanRcd(sMsg: String; Socket: TCustomWinSocket); 
    procedure SaveHumanRcd(nRecog: Integer;sMsg: String; 
      Socket: TCustomWinSocket); 
    procedure SaveHumanRcdEx(sMsg: String; nRecog: Integer; 
      Socket: TCustomWinSocket); 
    procedure ClearSocket(Socket:TCustomWinSocket); 
 
    { Private declarations } 
  public 
    function  CopyHumData(sSrcChrName,sDestChrName,sUserID:String):Boolean; 
    procedure DelHum(sChrName:String); 
    procedure MyMessage(var MsgData:TWmCopyData);message WM_COPYDATA; 
    { Public declarations } 
  end ; 
 
var 
  FrmDBSrv: TFrmDBSrv; 
 
implementation 
 
uses HumDB, DBShare, FIDHum, UsrSoc, AddrEdit, HUtil32, EDcode, 
  IDSocCli, DBTools, TestSelGate, RouteManage; 
 
{$R *.DFM} 
 
procedure TFrmDBSrv.ServerSocketClientConnect(Sender: TObject; 
  Socket: TCustomWinSocket); 
var 
  ServerInfo: pTServerInfo; 
  sIPaddr:String; 
begin 
  sIPaddr:=Socket.RemoteAddress; 
  if not CheckServerIP(sIPaddr) then begin 
    OutMainMessage('·Ç·¨·þÎñÆ÷Á¬½Ó: ' + sIPaddr); 
    Socket.Close; 
    exit; 
  end; 
     
  if not boOpenDBBusy then begin 
    New(ServerInfo); 
    ServerInfo.bo08:=True; 
    ServerInfo.nSckHandle:=Socket.SocketHandle; 
    ServerInfo.sStr:=''; 
    ServerInfo.Socket:=Socket; 
    ServerList.Add(ServerInfo); 
  end else begin 
    Socket.Close; 
  end; 
end; 
 
procedure TFrmDBSrv.ServerSocketClientDisconnect(Sender: TObject; 
  Socket: TCustomWinSocket); 
var 
  i:Integer; 
  ServerInfo: pTServerInfo; 
begin 
  for i:=0 to ServerList.Count -1 do begin 
    ServerInfo:=ServerList.Items[i]; 
    if ServerInfo.nSckHandle = Socket.SocketHandle then begin 
      Dispose(ServerInfo); 
      ServerList.Delete(i); 
      ClearSocket(Socket); 
      break; 
    end; 
  end; 
end; 
 
procedure TFrmDBSrv.ServerSocketClientError(Sender: TObject; 
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; 
  var ErrorCode: Integer); 
begin 
  ErrorCode:=0; 
  Socket.Close; 
end; 
 
procedure TFrmDBSrv.ServerSocketClientRead(Sender: TObject; 
  Socket: TCustomWinSocket); 
var 
  i:integer; 
  ServerInfo: pTServerInfo; 
  s10:String; 
begin 
  g_CheckCode.dwThread0:=1001000; 
  for i:=0 to ServerList.Count -1 do begin 
    g_CheckCode.dwThread0:=1001001; 
    ServerInfo:=ServerList.Items[i]; 
    g_CheckCode.dwThread0:=1001002; 
    if ServerInfo.nSckHandle = Socket.SocketHandle then begin 
      g_CheckCode.dwThread0:=1001003; 
      s10:=Socket.ReceiveText; 
      Inc(n4ADBF4); 
      if s10 <> '' then begin 
        g_CheckCode.dwThread0:=1001004; 
        ServerInfo.sStr:=ServerInfo.sStr + s10; 
        g_CheckCode.dwThread0:=1001005; 
        if Pos('!',s10) > 0 then begin 
          g_CheckCode.dwThread0:=1001006; 
          ProcessServerPacket(ServerInfo); 
          g_CheckCode.dwThread0:=1001007; 
          Inc(n4ADBF8); 
          Inc(n348); 
          Break; 
        end else begin//004A7DC7 
          if Length(ServerInfo.sStr) > 81920 then begin 
            ServerInfo.sStr:=''; 
            Inc(n4ADC2C); 
          end; 
        end; 
      end; 
      Break; 
    end; 
  end; 
  g_CheckCode.dwThread0:=1001008; 
end; 
procedure TFrmDBSrv.ProcessServerPacket(ServerInfo:pTServerInfo); 
var 
  bo25:Boolean; 
  sC,s1C,s20,s24:String; 
  n14,n18:Integer; 
  wE,w10:Word; 
  DefMsg:TDefaultMessage; 
begin 
  g_CheckCode.dwThread0:=1001100; 
  if boOpenDBBusy then exit; 
  try 
    bo25:=False; 
    s1C:=ServerInfo.sStr; 
    ServerInfo.sStr:=''; 
    s20:=''; 
    g_CheckCode.dwThread0:=1001101; 
    s1C:=ArrestStringEx(s1C,'#','!',s20); 
    g_CheckCode.dwThread0:=1001102; 
    if s20 <> '' then begin 
      g_CheckCode.dwThread0:=1001103; 
      s20:=GetValidStr3(s20,s24,['/']); 
      n14:=length(s20); 
      if (n14 >= DEFBLOCKSIZE) and (s24 <> '') then begin 
        wE:=Str_ToInt(s24,0) xor 170; 
        w10:=n14; 
        n18:=MakeLong(wE,w10); 
        sC:=EncodeBuffer(@n18,SizeOf(Integer)); 
        s34C:=s24; 
        if CompareBackLStr(s20,sC,Length(sC)) then begin 
          g_CheckCode.dwThread0:=1001104; 
          ProcessServerMsg(s20,n14,ServerInfo.Socket); 
          g_CheckCode.dwThread0:=1001105; 
          bo25:=True; 
        end; 
      end; //0x004A7F7B 
    end; //0x004A7F7B 
    if s1C <> '' then begin 
      Inc(n4ADC00); 
      Label4.Caption:='Error ' + IntToStr(n4ADC00); 
    end; //0x004A7FB5 
    if not bo25 then begin 
      m_DefMsg:=MakeDefaultMsg(DBR_FAIL,0,0,0,0); 
      { 
      DefMsg:=MakeDefaultMsg(DBR_FAIL,0,0,0,0); 
      n338:=DefMsg.Recog; 
      n33C:=DefMsg.Ident; 
      n340:=DefMsg.Tag; 
      } 
      SendSocket(ServerInfo.Socket,EncodeMessage(m_DefMsg)); 
      Inc(n4ADC00); 
      Label4.Caption:='Error ' + IntToStr(n4ADC00); 
    end; //0x004A8048 
  finally 
  end; 
  g_CheckCode.dwThread0:=1001106; 
end; 
procedure TFrmDBSrv.SendSocket(Socket:TCustomWinSocket;sMsg:String);//0x004A8764 
var 
  n10:Integer; 
  s18:String; 
begin 
  Inc(n4ADBFC); 
  n10:=MakeLong(Str_ToInt(s34C,0) xor 170,Length(sMsg) + 6); 
  s18:=EncodeBuffer(@n10,SizeOf(Integer)); 
  Socket.SendText('#' + s34C + '/' + sMsg + s18 + '!') 
end; 
procedure TFrmDBSrv.ProcessServerMsg(sMsg:String;nLen:Integer;Socket:TCustomWinSocket);//0x004A9278 
var 
  sDefMsg,sData:String; 
  DefMsg:TDefaultMessage; 
begin 
  if nLen = DEFBLOCKSIZE then begin 
    sDefMsg:=sMsg; 
    sData:=''; 
  end else begin 
    sDefMsg:=Copy(sMsg,1,DEFBLOCKSIZE); 
    sData:=Copy(sMsg,DEFBLOCKSIZE + 1, Length(sMsg)- DEFBLOCKSIZE - 6); 
  end; //0x004A9304 
  DefMsg:=DecodeMessage(sDefMsg); 
  case DefMsg.Ident of 
    DB_LOADHUMANRCD: begin 
      LoadHumanRcd(sData,Socket); 
    end; 
    DB_SAVEHUMANRCD: begin 
      SaveHumanRcd(DefMsg.Recog,sData,Socket); 
    end; 
    DB_SAVEHUMANRCDEX: begin 
      SaveHumanRcdEx(sData,DefMsg.Recog,Socket); 
    end; 
    else begin 
      m_DefMsg:=MakeDefaultMsg(DBR_FAIL,0,0,0,0); 
      SendSocket(Socket,EncodeMessage(m_DefMsg)); 
      Inc(n4ADC04); 
      MemoLog.Lines.Add('Fail ' + IntToStr(n4ADC04)); 
    end; 
  end; 
  g_CheckCode.dwThread0:=1001216; 
end; 
procedure TFrmDBSrv.LoadHumanRcd(sMsg:String;Socket:TCustomWinSocket); 
var 
  sHumName       :String; 
  sAccount       :String; 
  sIPaddr        :String; 
  nIndex         :Integer; 
  nSessionID     :Integer; 
  nCheckCode     :Integer; 
  DefMsg         :TDefaultMessage; 
  HumanRCD       :THumDataInfo; 
  LoadHuman      :TLoadHuman; 
  boFoundSession :Boolean; 
begin 
  DecodeBuffer(sMsg,@LoadHuman,SizeOf(TLoadHuman)); 
  sAccount:=LoadHuman.sAccount; 
  sHumName:=LoadHuman.sChrName; 
  sIPaddr:=LoadHuman.sUserAddr; 
  nSessionID:=LoadHuman.nSessionID; 
  nCheckCode:= -1; 
  if (sAccount <> '') and (sHumName <> '') then begin 
    if (FrmIDSoc.CheckSessionLoadRcd(sAccount,sIPaddr,nSessionID,boFoundSession)) then begin 
      nCheckCode:= 1; 
    end else begin 
      if boFoundSession then begin 
        OutMainMessage('[·Ç·¨Öظ´ÇëÇó] ' + 'ÕʺÅ: ' + sAccount + ' IP: ' + sIPaddr + ' ±êʶ: ' + IntToStr(nSessionID)); 
      end else begin 
        OutMainMessage('[·Ç·¨ÇëÇó] ' + 'ÕʺÅ: ' + sAccount + ' IP: ' + sIPaddr + ' ±êʶ: ' + IntToStr(nSessionID)); 
      end; 
      //nCheckCode:= 1; //²âÊÔÓã¬Õý³£È¥µô 
    end; 
  end; 
  if nCheckCode = 1 then begin 
    try 
      if HumDataDB.OpenEx then begin 
        nIndex:=HumDataDB.Index(sHumName); 
        if nIndex >= 0 then begin 
          if HumDataDB.Get(nIndex,HumanRCD) < 0 then nCheckCode:= -2; 
        end else nCheckCode:= -3; 
      end else nCheckCode:= -4; 
    finally 
      HumDataDB.Close(); 
    end; 
  end; 
  if nCheckCode = 1 then begin 
    m_DefMsg:=MakeDefaultMsg(DBR_LOADHUMANRCD,1,0,0,1); 
    SendSocket(Socket,EncodeMessage(m_DefMsg) + EncodeString(sHumName) + '/' + EncodeBuffer(@HumanRCD,SizeOf(THumDataInfo))); 
  end else begin //0x004A8C7E 
    m_DefMsg:=MakeDefaultMsg(DBR_LOADHUMANRCD,nCheckCode,0,0,0); 
    SendSocket(Socket,EncodeMessage(m_DefMsg)); 
  end; 
end; 
//004A8D38 
procedure TFrmDBSrv.SaveHumanRcd(nRecog:Integer;sMsg: String;Socket:TCustomWinSocket); 
var 
  sChrName   :String; 
  sUserID    :String; 
  sHumanRCD  :String; 
  I          :Integer; 
  nIndex     :Integer; 
  bo21       :Boolean; 
  DefMsg     :TDefaultMessage; 
  HumanRCD   :THumDataInfo; 
  HumSession :pTHumSession; 
begin 
  sHumanRCD :=GetValidStr3(sMsg,sUserID,['/']); 
  sHumanRCD :=GetValidStr3(sHumanRCD,sChrName,['/']); 
  sUserID   :=DecodeString(sUserID); 
  sChrName  :=DecodeString(sChrName); 
  bo21      :=False; 
  FillChar(HumanRCD.Data,SizeOf(THumData),#0); 
  if Length(sHumanRCD) = GetCodeMsgSize(SizeOf(THumDataInfo)*4/3) then 
    DecodeBuffer(sHumanRCD,@HumanRCD,SizeOf(THumDataInfo)) 
  else bo21:=True; 
  if not bo21 then begin 
    bo21:=True; 
    try 
      if HumDataDB.Open then begin 
        nIndex:=HumDataDB.Index(sChrName); 
        if nIndex < 0 then begin 
          HumanRCD.Header.sName:=sChrName; 
          HumDataDB.Add(HumanRCD); 
          nIndex:=HumDataDB.Index(sChrName); 
        end; 
        if nIndex >= 0 then begin 
          HumanRCD.Header.sName:=sChrName; 
          HumDataDB.Update(nIndex,HumanRCD); 
          bo21:=False; 
        end; 
      end; 
    finally 
      HumDataDB.Close; 
    end; 
    FrmIDSoc.SetSessionSaveRcd(sUserID); 
  end; 
  if not bo21 then begin 
    for i := 0 to HumSessionList.Count - 1 do begin 
      HumSession:=HumSessionList.Items[i]; 
      if (HumSession.sChrName = sChrName) and (HumSession.nIndex = nRecog) then begin 
        HumSession.dwTick30:=GetTickCount(); 
        break; 
      end; 
    end; 
    m_DefMsg:=MakeDefaultMsg(DBR_SAVEHUMANRCD,1,0,0,0); 
    SendSocket(Socket,EncodeMessage(m_DefMsg)); 
  end else begin 
    m_DefMsg:=MakeDefaultMsg(DBR_LOADHUMANRCD,0,0,0,0); 
    SendSocket(Socket,EncodeMessage(m_DefMsg)); 
  end; 
end; 
//004A9104 
procedure TFrmDBSrv.SaveHumanRcdEx(sMsg:String;nRecog:Integer;Socket:TCustomWinSocket); 
var 
  sChrName     :String; 
  sUserID      :String; 
  sHumanRCD    :String; 
  I            :Integer; 
  bo21         :Boolean; 
  DefMsg       :TDefaultMessage; 
  HumanRCD     :THumDataInfo; 
  HumSession   :pTHumSession; 
begin 
  sHumanRCD:=GetValidStr3(sMsg,sUserID,['/']); 
  sHumanRCD:=GetValidStr3(sHumanRCD,sChrName,['/']); 
  sUserID:=DecodeString(sUserID); 
  sChrName:=DecodeString(sChrName); 
  for i := 0 to HumSessionList.Count - 1 do begin 
    HumSession:=HumSessionList.Items[i]; 
    if (HumSession.sChrName = sChrName) and (HumSession.nIndex = nRecog) then begin 
      HumSession.bo24:=False; 
      HumSession.Socket:=Socket; 
      HumSession.bo2C:=True; 
      HumSession.dwTick30:=GetTickCount(); 
      break; 
    end; 
  end; 
  SaveHumanRcd(nRecog,sMsg,Socket); 
end; 
procedure TFrmDBSrv.Timer1Timer(Sender : TObject); 
begin 
  LbTransCount.Caption:=IntToStr(n348); 
  n348:=0; 
  if ServerList.Count > 0 then 
    Label1.Caption:='ÒÑÁ¬½Ó...' 
  else Label1.Caption:='δÁ¬½Ó !!'; 
  Label2.Caption:='Á¬½ÓÊý: ' + IntToStr(ServerList.Count); 
  LbUserCount.Caption:=IntToStr(FrmUserSoc.GetUserCount); 
  if boOpenDBBusy then begin 
    if n4ADB18 > 0 then begin 
      if not bo4ADB1C then begin 
        Label4.Caption:='[1/4] ' + IntToStr(ROUND((n4ADB10/n4ADB18) * 1.0e2)) + '% ' + 
                        IntToStr(n4ADB14) + '/' + 
                        IntToStr(n4ADB18); 
      end;//004A82CA 
    end;//004A82CA 
    if n4ADB04 > 0 then begin 
      if not boHumDBReady then begin 
        Label4.Caption:='[3/4] ' + IntToStr(ROUND((n4ADAFC/n4ADB04) * 1.0e2)) + '% ' + 
                        IntToStr(n4ADB00) + '/' + 
                        IntToStr(n4ADB04); 
      end;//004A835B 
    end;//004A835B 
    if n4ADAF0 > 0 then begin 
      if not boDataDBReady then begin 
        Label4.Caption:='[4/4] ' + IntToStr(ROUND((n4ADAE4/n4ADAF0) * 1.0e2)) + '% ' + 
                        IntToStr(n4ADAE8) + '/' + 
                        IntToStr(n4ADAEC) + '/' + 
                        IntToStr(n4ADAF0); 
      end; 
    end; 
  end;//004A8407 
 
  LbAutoClean.Caption:=IntToStr(g_nClearIndex) + '/(' + IntToStr(g_nClearCount) + '/' + IntToStr(g_nClearItemIndexCount) + ')/' + IntToStr(g_nClearRecordCount); 
 
  Label8.Caption:='H-QyChr=' + IntToStr(g_nQueryChrCount); 
  Label9.Caption:='H-NwChr=' + IntToStr(nHackerNewChrCount); 
  Label10.Caption:='H-DlChr=' + IntToStr(nHackerDelChrCount); 
  Label11.Caption:='Dubb-Sl=' + IntToStr(nHackerSelChrCount); 
  if MemoLog.Lines.Count > 500 then MemoLog.Lines.Clear; 
end; 
 
procedure TFrmDBSrv.FormCreate(Sender : TObject); 
var 
  Conf:TIniFile; 
  nX,nY:Integer; 
begin 
  g_dwGameCenterHandle:=Str_ToInt(ParamStr(1),0); 
  nX:=Str_ToInt(ParamStr(2),-1); 
  nY:=Str_ToInt(ParamStr(3),-1); 
  if (nX >= 0) or (nY >= 0) then begin 
    Left:=nX; 
    Top:=nY; 
  end; 
 
  m_boRemoteClose:=False; 
 
  SendGameCenterMsg(SG_FORMHANDLE,IntToStr(Self.Handle)); 
 
  boOpenDBBusy:=True; 
  label4.Caption:=''; 
  LbAutoClean.Caption:='-/-'; 
  HumChrDB:=nil; 
  HumDataDB:=nil; 
  { 
  Conf:=TIniFile.Create('sConfFileName'); 
  if Conf <> nil then begin 
    sDataDBFilePath:=Conf.ReadString('DB','Dir',sDataDBFilePath); 
    sHumDBFilePath:=Conf.ReadString('DB','HumDir',sHumDBFilePath); 
    sFeedPath:=Conf.ReadString('DB','FeeDir',sFeedPath); 
    sBackupPath:=Conf.ReadString('DB','Backup',sBackupPath); 
    sConnectPath:=Conf.ReadString('DB','ConnectDir',sConnectPath); 
    sLogPath:=Conf.ReadString('DB','LogDir',sLogPath); 
    nServerPort:=Conf.ReadInteger('Setup','ServerPort',nServerPort); 
    sServerAddr:=Conf.ReadString('Setup','ServerAddr',sServerAddr); 
    boViewHackMsg:=Conf.ReadBool('Setup','ViewHackMsg',boViewHackMsg); 
    sServerName:=Conf.ReadString('Setup','ServerName',sServerName); 
    Conf.Free; 
  end; 
  } 
  LoadConfig(); 
  ServerList:=TList.Create; 
  HumSessionList:=TList.Create; 
  Label5.Caption:='FDB: ' + sDataDBFilePath + 'Mir.DB  ' + 'Backup: ' + sBackupPath; 
  n334:=0; 
  ServerSocket.Address:=sServerAddr; 
  ServerSocket.Port:=nServerPort; 
  ServerSocket.Active:=True; 
  n4ADBF4:=0; 
  n4ADBF8:=0; 
  n4ADBFC:=0; 
  n4ADC00:=0; 
  n4ADC04:=0; 
  n344:=2; 
  n348:=0; 
  nHackerNewChrCount:=0; 
  nHackerDelChrCount:=0; 
  nHackerSelChrCount:=0; 
  n4ADC1C:=0; 
  n4ADC20:=0; 
  n4ADC24:=0; 
  n4ADC28:=0; 
end; 
 
procedure TFrmDBSrv.FormDestroy(Sender : TObject); 
var 
  i:Integer; 
  ServerInfo: pTServerInfo; 
  HumSession:pTHumSession; 
begin 
  if HumDataDB <> nil then HumDataDB.Free; 
  if HumChrDB <> nil then HumChrDB.Free; 
  for i:=0 to ServerList.Count -1 do begin 
    ServerInfo:=ServerList.Items[i]; 
    Dispose(ServerInfo); 
  end; 
  ServerList.Free; 
 
  for i:=0 to HumSessionList.Count -1 do begin 
    HumSession:=HumSessionList.Items[i]; 
    Dispose(HumSession); 
  end; 
 
  HumSessionList.Free; 
end; 
 
procedure TFrmDBSrv.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
  if m_boRemoteClose then exit; 
     
//  if MessageDlg('ÊÇ·ñÈ·¶¨Í˳öÊý¾Ý¿â·þÎñÆ÷£¿', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin 
  if Application.MessageBox('ÊÇ·ñÈ·¶¨Í˳öÊý¾Ý¿â·þÎñÆ÷ ?','È·ÈÏÐÅÏ¢',MB_YESNO + MB_ICONQUESTION) = mrYes then begin 
    CanClose:=True; 
    ServerSocket.Active:=False; 
    MainOutMessage('ÕýÔڹرշþÎñÆ÷...'); 
  end else begin 
    CanClose:=False; 
  end; 
end; 
 
procedure TFrmDBSrv.AniTimerTimer(Sender : TObject); 
begin 
  if n334 > 7 then 
    n334:=0 
  else 
   Inc(n334); 
 
  case n334 of 
    0: Label3.Caption:='|'; 
    1: Label3.Caption:='/'; 
    2: Label3.Caption:='--'; 
    3: Label3.Caption:='\'; 
    4: Label3.Caption:='|'; 
    5: Label3.Caption:='/'; 
    6: Label3.Caption:='--'; 
    7: Label3.Caption:='\'; 
  end; 
end; 
 
procedure TFrmDBSrv.FormShow(Sender : TObject); 
begin 
  StartTimer.Enabled:=True; 
end; 
 
procedure TFrmDBSrv.StartTimerTimer(Sender : TObject); 
//0x004A79DC 
begin 
  SendGameCenterMsg(SG_STARTNOW,'ÕýÔÚÆô¶¯Êý¾Ý¿â·þÎñÆ÷...'); 
  StartTimer.Enabled:=False; 
  boOpenDBBusy:=True; 
  HumChrDB:=TFileHumDB.Create(sHumDBFilePath + 'Hum.DB'); 
  HumDataDB:=TFileDB.Create(sDataDBFilePath + 'Mir.DB'); 
  boOpenDBBusy:=False; 
  boAutoClearDB:=True; 
  Label4.Caption:=''; 
  FrmIDSoc.OpenConnect(); 
  OutMainMessage('·þÎñÆ÷ÒÑÆô¶¯...'); 
  SendGameCenterMsg(SG_STARTOK,'Êý¾Ý¿â·þÎñÆ÷Æô¶¯Íê³É...'); 
  SendGameCenterMsg(SG_CHECKCODEADDR,IntToStr(Integer(@g_CheckCode))); 
end; 
 
procedure TFrmDBSrv.Timer2Timer(Sender : TObject); 
var 
  i:Integer; 
  HumSession:pTHumSession; 
begin 
  i:=0; 
 
  while (True) do begin 
    if HumSessionList.Count <= i then break; 
    HumSession:= HumSessionList.Items[i]; 
    if not HumSession.bo24 then begin 
      if HumSession.bo2C then begin 
        if (GetTickCount - HumSession.dwTick30) > 20 * 1000 then begin 
          Dispose(HumSession); 
          HumSessionList.Delete(i); 
          Continue; 
        end; 
      end else begin//004A868F 
        if (GetTickCount - HumSession.dwTick30) > 2 * 60 * 1000 then begin 
          Dispose(HumSession); 
          HumSessionList.Delete(i); 
          Continue; 
        end; 
      end; 
    end;//004A86D2 
    if (GetTickCount - HumSession.dwTick30) > 40 * 60 * 1000 then begin 
      Dispose(HumSession); 
      HumSessionList.Delete(i); 
      Continue; 
    end; 
    Inc(i); 
  end; 
 
end; 
 
procedure TFrmDBSrv.BtnUserDBToolClick(Sender : TObject); 
begin 
  if boHumDBReady and boDataDBReady then 
    FrmIDHum.Show; 
end; 
 
procedure TFrmDBSrv.BtnReloadAddrClick(Sender : TObject); 
begin 
  FrmUserSoc.LoadServerInfo(); 
  LoadIPTable(); 
  LoadGateID(); 
end; 
 
procedure TFrmDBSrv.BtnEditAddrsClick(Sender : TObject); 
begin 
  FrmEditAddr.Open(); 
end; 
 
procedure TFrmDBSrv.CkViewHackMsgClick(Sender : TObject); 
var 
  Conf:TIniFile; 
begin 
  Conf:=TIniFile.Create(sConfFileName); 
  if Conf <> nil then begin 
    Conf.WriteBool('Setup','ViewHackMsg',CkViewHackMsg.Checked); 
    Conf.Free; 
  end; 
end; 
 
procedure TFrmDBSrv.WriteLogMsg(sMsg:String); 
begin 
(* 
004A7321   8BEC                   mov     ebp, esp 
004A7323   81C404FDFFFF           add     esp, $FFFFFD04 
004A7329   53                     push    ebx 
004A732A   56                     push    esi 
004A732B   57                     push    edi 
004A732C   33D2                   xor     edx, edx 
004A732E   899508FDFFFF           mov     [ebp+$FFFFFD08], edx 
004A7334   899504FDFFFF           mov     [ebp+$FFFFFD04], edx 
004A733A   899510FDFFFF           mov     [ebp+$FFFFFD10], edx 
004A7340   89950CFDFFFF           mov     [ebp+$FFFFFD0C], edx 
004A7346   8955E8                 mov     [ebp-$18], edx 
004A7349   8955E4                 mov     [ebp-$1C], edx 
004A734C   8945FC                 mov     [ebp-$04], eax 
 
* Reference to FrmDBSrv 
| 
004A734F   8B45FC                 mov     eax, [ebp-$04] 
 
* Reference to: system.@LStrAddRef; 
| 
004A7352   E8DDCCF5FF             call    00404034 
004A7357   33C0                   xor     eax, eax 
004A7359   55                     push    ebp 
 
* Possible String Reference to: 'éËÀõÿëÓ_^[‹å]Ã' 
| 
004A735A   6844754A00             push    $004A7544 
 
***** TRY 
| 
004A735F   64FF30                 push    dword ptr fs:[eax] 
004A7362   648920                 mov     fs:[eax], esp 
004A7365   837DFC00               cmp     dword ptr [ebp-$04], +$00 
004A7369   0F84A2010000           jz      004A7511 
004A736F   33C0                   xor     eax, eax 
004A7371   55                     push    ebp 
004A7372   6807754A00             push    $004A7507 
 
***** TRY 
| 
004A7377   64FF30                 push    dword ptr fs:[eax] 
004A737A   648920                 mov     fs:[eax], esp 
 
* Reference to: Unit_00407FB4.Proc_0040A530 
| 
004A737D   E8AE31F6FF             call    0040A530 
004A7382   83C4F8                 add     esp, -$08 
004A7385   DD1C24                 fstp    qword ptr [esp] 
004A7388   9B                     wait 
004A7389   8D4DF6                 lea     ecx, [ebp-$0A] 
004A738C   8D55F8                 lea     edx, [ebp-$08] 
004A738F   8D45FA                 lea     eax, [ebp-$06] 
 
* Reference to: Unit_00407FB4.Proc_0040A4E8 
| 
004A7392   E85131F6FF             call    0040A4E8 
 
* Reference to: Unit_00407FB4.Proc_0040A55C 
| 
004A7397   E8C031F6FF             call    0040A55C 
004A739C   83C4F8                 add     esp, -$08 
004A739F   DD1C24                 fstp    qword ptr [esp] 
004A73A2   9B                     wait 
004A73A3   8D45EE                 lea     eax, [ebp-$12] 
004A73A6   50                     push    eax 
004A73A7   8D4DF0                 lea     ecx, [ebp-$10] 
004A73AA   8D55F2                 lea     edx, [ebp-$0E] 
004A73AD   8D45F4                 lea     eax, [ebp-$0C] 
 
* Reference to: Unit_00407FB4.Proc_0040A1D0 
| 
004A73B0   E81B2EF6FF             call    0040A1D0 
004A73B5   FF3520BE4A00           push    dword ptr [$004ABE20] 
004A73BB   8D9510FDFFFF           lea     edx, [ebp+$FFFFFD10] 
004A73C1   0FB745FA               movzx   eax, word ptr [ebp-$06] 
 
* Reference to: Unit_00407FB4.Proc_004090F0 
| 
004A73C5   E8261DF6FF             call    004090F0 
004A73CA   FFB510FDFFFF           push    dword ptr [ebp+$FFFFFD10] 
004A73D0   685C754A00             push    $004A755C 
004A73D5   55                     push    ebp 
004A73D6   8D950CFDFFFF           lea     edx, [ebp+$FFFFFD0C] 
004A73DC   0FB745F8               movzx   eax, word ptr [ebp-$08] 
 
* Reference to: DBSMain.Proc_004A72A4 
| 
004A73E0   E8BFFEFFFF             call    004A72A4 
004A73E5   59                     pop     ecx 
004A73E6   FFB50CFDFFFF           push    dword ptr [ebp+$FFFFFD0C] 
004A73EC   8D45E8                 lea     eax, [ebp-$18] 
004A73EF   BA04000000             mov     edx, $00000004 
 
* Reference to: system.@LStrCatN; 
| 
004A73F4   E847CBF5FF             call    00403F40 
004A73F9   A120BE4A00             mov     eax, dword ptr [$004ABE20] 
 
* Reference to: Buttons.Proc_0048A028 
| 
004A73FE   E8252CFEFF             call    0048A028 
004A7403   84C0                   test    al, al 
004A7405   751F                   jnz     004A7426 
004A7407   8D85E4FEFFFF           lea     eax, [ebp+$FFFFFEE4] 
004A740D   8B1520BE4A00           mov     edx, [$004ABE20] 
 
* Reference to: Unit_00407FB4.Proc_00409624 
| 
004A7413   E80C22F6FF             call    00409624 
004A7418   6A00                   push    $00 
004A741A   8D85E4FEFFFF           lea     eax, [ebp+$FFFFFEE4] 
004A7420   50                     push    eax 
 
* Reference to: kernel32.CreateDirectoryA() 
| 
004A7421   E8F2FBF5FF             call    00407018 
004A7426   8B45E8                 mov     eax, [ebp-$18] 
 
* Reference to: Buttons.Proc_0048A028 
| 
004A7429   E8FA2BFEFF             call    0048A028 
004A742E   84C0                   test    al, al 
004A7430   751C                   jnz     004A744E 
004A7432   8D85E4FEFFFF           lea     eax, [ebp+$FFFFFEE4] 
004A7438   8B55E8                 mov     edx, [ebp-$18] 
 
* Reference to: Unit_00407FB4.Proc_00409624 
| 
004A743B   E8E421F6FF             call    00409624 
004A7440   6A00                   push    $00 
004A7442   8D85E4FEFFFF           lea     eax, [ebp+$FFFFFEE4] 
004A7448   50                     push    eax 
 
* Reference to: kernel32.CreateDirectoryA() 
| 
004A7449   E8CAFBF5FF             call    00407018 
004A744E   FF75E8                 push    dword ptr [ebp-$18] 
004A7451   6868754A00             push    $004A7568 
004A7456   8D9508FDFFFF           lea     edx, [ebp+$FFFFFD08] 
004A745C   0FB745F8               movzx   eax, word ptr [ebp-$08] 
 
* Reference to: Unit_00407FB4.Proc_004090F0 
| 
004A7460   E88B1CF6FF             call    004090F0 
004A7465   FFB508FDFFFF           push    dword ptr [ebp+$FFFFFD08] 
004A746B   685C754A00             push    $004A755C 
004A7470   55                     push    ebp 
004A7471   8D9504FDFFFF           lea     edx, [ebp+$FFFFFD04] 
004A7477   0FB745F6               movzx   eax, word ptr [ebp-$0A] 
 
* Reference to: DBSMain.Proc_004A72A4 
| 
004A747B   E824FEFFFF             call    004A72A4 
004A7480   59                     pop     ecx 
004A7481   FFB504FDFFFF           push    dword ptr [ebp+$FFFFFD04] 
 
* Possible String Reference to: '.txt' 
| 
004A7487   6874754A00             push    $004A7574 
004A748C   8D45E4                 lea     eax, [ebp-$1C] 
004A748F   BA06000000             mov     edx, $00000006 
 
* Reference to: system.@LStrCatN; 
| 
004A7494   E8A7CAF5FF             call    00403F40 
004A7499   8B55E4                 mov     edx, [ebp-$1C] 
004A749C   8D8518FDFFFF           lea     eax, [ebp+$FFFFFD18] 
 
* Reference to: system.@Assign(Text;Text;ShortString); 
| 
004A74A2   E863F0F5FF             call    0040650A 
004A74A7   8B45E4                 mov     eax, [ebp-$1C] 
 
* Reference to: Unit_00407FB4.Proc_004092E0 
| 
004A74AA   E8311EF6FF             call    004092E0 
004A74AF   84C0                   test    al, al 
004A74B1   7512                   jnz     004A74C5 
004A74B3   8D8518FDFFFF           lea     eax, [ebp+$FFFFFD18] 
 
* Reference to: System.Proc_0040662A 
| 
004A74B9   E86CF1F5FF             call    0040662A 
 
* Reference to: System.Proc_00402868 
| 
004A74BE   E8A5B3F5FF             call    00402868 
004A74C3   EB10                   jmp     004A74D5 
004A74C5   8D8518FDFFFF           lea     eax, [ebp+$FFFFFD18] 
 
* Reference to: System.Proc_00406631 
| 
004A74CB   E861F1F5FF             call    00406631 
 
* Reference to: System.Proc_00402868 
| 
004A74D0   E893B3F5FF             call    00402868 
 
* Reference to FrmDBSrv 
| 
004A74D5   8B55FC                 mov     edx, [ebp-$04] 
004A74D8   8D8518FDFFFF           lea     eax, [ebp+$FFFFFD18] 
 
* Reference to: system.@Write0Bool; 
|           or: system.@Write0Long; 
|           or: system.@Write0LString; 
| 
004A74DE   E835CDF5FF             call    00404218 
 
* Reference to: System.Proc_00406703 
| 
004A74E3   E81BF2F5FF             call    00406703 
 
* Reference to: System.Proc_00402868 
| 
004A74E8   E87BB3F5FF             call    00402868 
004A74ED   8D8518FDFFFF           lea     eax, [ebp+$FFFFFD18] 
 
* Reference to: system.@Close; 
| 
004A74F3   E8B4F0F5FF             call    004065AC 
 
* Reference to: System.Proc_00402868 
| 
004A74F8   E86BB3F5FF             call    00402868 
004A74FD   33C0                   xor     eax, eax 
004A74FF   5A                     pop     edx 
004A7500   59                     pop     ecx 
004A7501   59                     pop     ecx 
004A7502   648910                 mov     fs:[eax], edx 
004A7505   EB0A                   jmp     004A7511 
 
* Reference to: system.@HandleAnyException; 
| 
004A7507   E954BEF5FF             jmp     00403360 
 
* Reference to: system.@DoneExcept; 
| 
004A750C   E8ABC1F5FF             call    004036BC 
 
****** END 
| 
004A7511   33C0                   xor     eax, eax 
004A7513   5A                     pop     edx 
004A7514   59                     pop     ecx 
004A7515   59                     pop     ecx 
004A7516   648910                 mov     fs:[eax], edx 
 
****** FINALLY 
| 
 
* Possible String Reference to: '_^[‹å]Ã' 
| 
004A7519   684B754A00             push    $004A754B 
004A751E   8D8504FDFFFF           lea     eax, [ebp+$FFFFFD04] 
004A7524   BA04000000             mov     edx, $00000004 
 
* Reference to: system.@LStrArrayClr; 
| 
004A7529   E8F6C6F5FF             call    00403C24 
004A752E   8D45E4                 lea     eax, [ebp-$1C] 
004A7531   BA02000000             mov     edx, $00000002 
 
* Reference to: system.@LStrArrayClr; 
| 
004A7536   E8E9C6F5FF             call    00403C24 
004A753B   8D45FC                 lea     eax, [ebp-$04] 
 
* Reference to: system.@LStrClr(String;String); 
| 
004A753E   E8BDC6F5FF             call    00403C00 
004A7543   C3                     ret 
 
 
* Reference to: system.@HandleFinally; 
| 
004A7544   E9CBC0F5FF             jmp     00403614 
004A7549   EBD3                   jmp     004A751E 
 
****** END 
| 
004A754B   5F                     pop     edi 
004A754C   5E                     pop     esi 
004A754D   5B                     pop     ebx 
004A754E   8BE5                   mov     esp, ebp 
004A7550   5D                     pop     ebp 
004A7551   C3                     ret 
 
*) 
end; 
 
procedure TFrmDBSrv.OutMainMessageA(sMsg:String); 
begin 
(* 
004A757D   8BEC                   mov     ebp, esp 
004A757F   51                     push    ecx 
004A7580   8945FC                 mov     [ebp-$04], eax 
 
* Reference to FrmDBSrv 
| 
004A7583   8B45FC                 mov     eax, [ebp-$04] 
 
* Reference to: system.@LStrAddRef; 
| 
004A7586   E8A9CAF5FF             call    00404034 
004A758B   33C0                   xor     eax, eax 
004A758D   55                     push    ebp 
004A758E   68D0754A00             push    $004A75D0 
 
***** TRY 
| 
004A7593   64FF30                 push    dword ptr fs:[eax] 
004A7596   648920                 mov     fs:[eax], esp 
 
* Reference to FrmDBSrv 
| 
004A7599   8B45FC                 mov     eax, [ebp-$04] 
 
* Reference to: DBSMain.Proc_004A7320 
| 
004A759C   E87FFDFFFF             call    004A7320 
 
* Reference to FrmDBSrv 
| 
004A75A1   A1D0DB4A00             mov     eax, dword ptr [$004ADBD0] 
 
* Reference to control EdChrName : N.A. 
| 
004A75A6   8B80E4020000           mov     eax, [eax+$02E4] 
 
* Reference to field N.A..OFFS_0208 
| 
004A75AC   8B8008020000           mov     eax, [eax+$0208] 
 
* Reference to FrmDBSrv 
| 
004A75B2   8B55FC                 mov     edx, [ebp-$04] 
004A75B5   8B08                   mov     ecx, [eax] 
004A75B7   FF5134                 call    dword ptr [ecx+$34] 
004A75BA   33C0                   xor     eax, eax 
004A75BC   5A                     pop     edx 
004A75BD   59                     pop     ecx 
004A75BE   59                     pop     ecx 
004A75BF   648910                 mov     fs:[eax], edx 
 
****** FINALLY 
| 
004A75C2   68D7754A00             push    $004A75D7 
004A75C7   8D45FC                 lea     eax, [ebp-$04] 
 
* Reference to: system.@LStrClr(String;String); 
| 
004A75CA   E831C6F5FF             call    00403C00 
004A75CF   C3                     ret 
 
 
* Reference to: system.@HandleFinally; 
| 
004A75D0   E93FC0F5FF             jmp     00403614 
004A75D5   EBF0                   jmp     004A75C7 
 
****** END 
| 
004A75D7   59                     pop     ecx 
004A75D8   5D                     pop     ebp 
004A75D9   C3                     ret 
 
*) 
end; 
 
 
 
 
 
 
procedure TFrmDBSrv.MainOutMessage(sMsg: String); 
begin 
  MemoLog.Lines.Add(sMsg) 
end; 
//004A80DC 
procedure TFrmDBSrv.ClearSocket(Socket: TCustomWinSocket); 
 
var 
  nIndex:integer; 
  HumSession:pTHumSession; 
begin 
  nIndex:=0; 
 
  while (True) do begin 
    if HumSessionList.Count <= nIndex then break; 
    HumSession:=HumSessionList.Items[nIndex]; 
    if HumSession.Socket = Socket then begin 
      Dispose(HumSession); 
      HumSessionList.Delete(nIndex); 
      Continue; 
    end; 
    Inc(nIndex); 
  end; 
 
end; 
 
function TFrmDBSrv.CopyHumData(sSrcChrName, sDestChrName, 
  sUserID: String): Boolean;//0x004A8864 
var 
  n14      :Integer; 
  bo15     :Boolean; 
  HumanRCD :THumDataInfo; 
begin 
  Result:=False; 
  bo15:=False; 
  try 
    if HumDataDB.Open then begin 
      n14:=HumDataDB.Index(sSrcChrName); 
      if (n14 >= 0) and (HumDataDB.Get(n14,HumanRCD) >= 0) then bo15:=True; 
      if bo15 then begin 
        n14:=HumDataDB.Index(sDestChrName); 
        if (n14 >= 0) then begin 
          HumanRCD.Header.sName  := sDestChrName; 
          HumanRCD.Data.sChrName := sDestChrName; 
          HumanRCD.Data.sAccount := sUserID; 
          HumDataDB.Update(n14,HumanRCD); 
          Result:=True; 
        end; 
      end; 
    end; 
  finally 
    HumDataDB.Close; 
  end; 
end; 
 
procedure TFrmDBSrv.DelHum(sChrName: String); 
//0x004A89F4 
begin 
  try 
    if HumChrDB.Open then HumChrDB.Delete(sChrName); 
  finally 
    HumChrDB.Close; 
  end; 
end; 
 
 
 
procedure TFrmDBSrv.MENU_MANAGE_DATAClick(Sender: TObject); 
begin 
  if boHumDBReady and boDataDBReady then 
    FrmIDHum.Show; 
end; 
 
procedure TFrmDBSrv.MENU_MANAGE_TOOLClick(Sender: TObject); 
begin 
  frmDBTool.Top:=Self.Top + 20; 
  frmDBTool.Left:=Self.Left; 
  frmDBTool.Open(); 
end; 
 
procedure TFrmDBSrv.MyMessage(var MsgData: TWmCopyData); 
var 
  sData:String; 
  ProgramType:TProgamType; 
  wIdent:Word; 
begin 
  wIdent:=HiWord(MsgData.From); 
//  ProgramType:=TProgamType(LoWord(MsgData.From)); 
  sData:=StrPas(MsgData.CopyDataStruct^.lpData); 
  case wIdent of    // 
    GS_QUIT: begin 
      ServerSocket.Active:=False; 
      m_boRemoteClose:=True; 
      Close(); 
    end; 
    1: ; 
    2: ; 
    3: ; 
  end;    // case 
end; 
 
procedure TFrmDBSrv.V1Click(Sender: TObject); 
begin 
//showmessage(BoolToStr(CheckChrName('½­ºþÀË¿Í'))); 
end; 
 
procedure TFrmDBSrv.MENU_TEST_SELGATEClick(Sender: TObject); 
begin 
  frmTestSelGate:=TfrmTestSelGate.Create(Owner); 
  frmTestSelGate.ShowModal; 
  frmTestSelGate.Free; 
end; 
 
procedure TFrmDBSrv.MENU_CONTROL_STARTClick(Sender: TObject); 
begin 
  if Sender = MENU_CONTROL_START then begin 
 
  end else 
  if Sender = MENU_OPTION_GAMEGATE then begin 
    frmRouteManage.Open; 
  end; 
 
end; 
 
end.