L L4D2node

CRConServer::RunFrame

0x0020bd00 · 1853 bytes · __thiscall

_ZN11CRConServer8RunFrameEv

Decompiled

undefined (1 param)

/* CRConServer::RunFrame() */

void __thiscall CRConServer::RunFrame(CRConServer *this)

{
  short sVar1;
  ushort uVar2;
  int iVar3;
  char cVar4;
  CSocketCreator *this_00;
  int iVar5;
  undefined4 uVar6;
  undefined4 uVar7;
  uint uVar8;
  ssize_t sVar9;
  uint *puVar10;
  uint uVar11;
  int *piVar12;
  int iVar13;
  uint *puVar14;
  undefined1 *puVar15;
  uint uVar16;
  int iVar17;
  int iVar18;
  int in_GS_OFFSET;
  uint local_1040;
  undefined1 local_102d;
  uint local_102c;
  int local_1028;
  undefined4 local_1024;
  uint local_1020;
  undefined1 local_101c [4092];
  int local_20;
  
  puVar14 = (uint *)&stack0xffffef94;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  this_00 = (CSocketCreator *)(this + 4);
  CSocketCreator::RunFrame(this_00);
  this[0x5c] = (CRConServer)0x0;
  iVar5 = CSocketCreator::GetAcceptedSocketCount(this_00);
  local_1040 = iVar5 - 1;
  puVar15 = &stack0xffffef94;
  if (-1 < (int)local_1040) {
    do {
      puVar14[1] = local_1040;
      *puVar14 = (uint)this_00;
      puVar14[-1] = 0x20bd70;
      iVar5 = CSocketCreator::GetAcceptedSocketData((CSocketCreator *)*puVar14,puVar14[1]);
      puVar14[1] = local_1040;
      *puVar14 = (uint)this_00;
      puVar14[-1] = 0x20bd7e;
      uVar6 = CSocketCreator::GetAcceptedSocketHandle((CSocketCreator *)*puVar14,puVar14[1]);
      puVar14[1] = local_1040;
      *puVar14 = (uint)this_00;
      puVar14[-1] = 0x20bd90;
      uVar7 = CSocketCreator::GetAcceptedSocketAddress((CSocketCreator *)*puVar14,puVar14[1]);
      sVar1 = *(short *)(iVar5 + 0x56);
      while (sVar1 != 0) {
        piVar12 = (int *)((uint)*(ushort *)(iVar5 + 0x50) * 0x3c + *(int *)(iVar5 + 0x44));
        iVar18 = piVar12[3];
        puVar14[4] = 1;
        puVar14[3] = piVar12[4] - iVar18;
        puVar14[2] = (iVar18 - piVar12[8]) + *piVar12;
        puVar14[1] = local_1040;
        *puVar14 = (uint)this;
        puVar14[-1] = 0x20be33;
        cVar4 = SendRCONResponse((CRConServer *)*puVar14,puVar14[1],(void *)puVar14[2],puVar14[3],
                                 SUB41(puVar14[4],0));
        if (cVar4 == '\0') break;
        uVar2 = *(ushort *)(iVar5 + 0x50);
        puVar14[1] = (uint)uVar2;
        *puVar14 = iVar5 + 0x44;
        puVar14[-1] = 0x20bdc9;
        CUtlLinkedList<CUtlBuffer,unsigned_short,false,unsigned_short,CUtlMemory<UtlLinkedListElem_t<CUtlBuffer,unsigned_short>,unsigned_short>>
        ::Unlink((CUtlLinkedList<CUtlBuffer,unsigned_short,false,unsigned_short,CUtlMemory<UtlLinkedListElem_t<CUtlBuffer,unsigned_short>,unsigned_short>>
                  *)*puVar14,(ushort)puVar14[1]);
        iVar18 = (uint)uVar2 * 0x3c + *(int *)(iVar5 + 0x44);
        *puVar14 = iVar18;
        puVar14[-1] = 0x20bddc;
        CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)*puVar14);
        *(undefined2 *)(iVar18 + 0x3a) = *(undefined2 *)(iVar5 + 0x54);
        sVar1 = *(short *)(iVar5 + 0x56);
        *(ushort *)(iVar5 + 0x54) = uVar2;
      }
      uVar8 = *(uint *)(iVar5 + 8);
      *puVar14 = (uint)g_ServerRemoteAccess;
      puVar14[1] = uVar8;
      puVar14[-1] = 0x20be4e;
      uVar8 = CServerRemoteAccess::GetDataResponseSize((CServerRemoteAccess *)*puVar14,puVar14[1]);
      if (0 < (int)uVar8) {
        uVar16 = uVar8 + 4;
        if (uVar16 < 0x1001) {
          puVar14[3] = uVar8;
          local_1020 = uVar8;
          puVar14[2] = (uint)local_101c;
          uVar8 = *(uint *)(iVar5 + 8);
          *puVar14 = (uint)g_ServerRemoteAccess;
          puVar14[1] = uVar8;
          puVar14[-1] = 0x20be8a;
          CServerRemoteAccess::ReadDataResponse
                    ((CServerRemoteAccess *)*puVar14,puVar14[1],(void *)puVar14[2],puVar14[3]);
          puVar14[3] = uVar16;
          puVar14[2] = (uint)&local_1020;
          puVar14[4] = 0;
          puVar14[1] = local_1040;
          *puVar14 = (uint)this;
          puVar14[-1] = 0x20beb8;
          SendRCONResponse((CRConServer *)*puVar14,puVar14[1],(void *)puVar14[2],puVar14[3],
                           SUB41(puVar14[4],0));
        }
        else {
          *puVar14 = uVar16;
          puVar14[-1] = 0x20bf98;
          puVar10 = operator_new__(*puVar14);
          *puVar10 = uVar8;
          puVar14[3] = uVar8;
          puVar14[2] = (uint)(puVar10 + 1);
          uVar8 = *(uint *)(iVar5 + 8);
          *puVar14 = (uint)g_ServerRemoteAccess;
          puVar14[1] = uVar8;
          puVar14[-1] = 0x20bfc0;
          CServerRemoteAccess::ReadDataResponse
                    ((CServerRemoteAccess *)*puVar14,puVar14[1],(void *)puVar14[2],puVar14[3]);
          puVar14[3] = uVar16;
          puVar14[4] = 0;
          puVar14[1] = local_1040;
          puVar14[2] = (uint)puVar10;
          *puVar14 = (uint)this;
          puVar14[-1] = 0x20bfee;
          SendRCONResponse((CRConServer *)*puVar14,puVar14[1],(void *)puVar14[2],puVar14[3],
                           SUB41(puVar14[4],0));
          *puVar14 = (uint)puVar10;
          puVar14[-1] = 0x20bffc;
          operator_delete((void *)*puVar14);
        }
      }
      puVar14[3] = 2;
      puVar14[1] = (uint)&local_102d;
      puVar14[2] = 1;
      local_102c = 0;
      *puVar14 = uVar6;
      puVar14[-1] = 0x20beea;
      sVar9 = recv(*puVar14,(void *)puVar14[1],puVar14[2],puVar14[3]);
      if (sVar9 == -1) {
        puVar14[-1] = 0x20c00d;
        cVar4 = SocketWouldBlock();
        if (cVar4 == '\0') goto LAB_0020bf70;
      }
      else {
        if ((sVar9 != 0) && (-1 < sVar9)) {
          puVar14[1] = 0x541b;
          puVar14[2] = (uint)&local_102c;
          *puVar14 = uVar6;
          puVar14[-1] = 0x20bf19;
          ioctl(*puVar14,puVar14[1]);
          if (local_102c < 5) goto LAB_0020bf28;
          uVar8 = local_102c + *(int *)(iVar5 + 0x1c);
          iVar18 = iVar5 + 0xc;
          *puVar14 = iVar18;
          puVar14[1] = uVar8;
          puVar14[-1] = 0x20c02d;
          CUtlBuffer::EnsureCapacity((CUtlBuffer *)*puVar14,puVar14[1]);
          uVar8 = 0x400;
          if (local_102c < 0x401) {
            uVar8 = local_102c;
          }
          iVar3 = -((uVar8 + 0xf & 0xfffffff0) + 0x10);
          uVar8 = (int)puVar14 + iVar3 + 0x23 & 0xfffffff0;
          if (local_102c != 0) {
            uVar16 = 0;
            do {
              uVar11 = local_102c - uVar16;
              *(undefined4 *)((int)puVar14 + iVar3 + 0xc) = 0;
              *(uint *)((int)puVar14 + iVar3 + 4) = uVar8;
              if (0x400 < uVar11) {
                uVar11 = 0x400;
              }
              *(uint *)((int)puVar14 + iVar3 + 8) = uVar11;
              *(undefined4 *)((int)puVar14 + iVar3) = uVar6;
              *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c0c3;
              sVar9 = recv(*(int *)((int)puVar14 + iVar3),*(void **)((int)puVar14 + iVar3 + 4),
                           *(size_t *)((int)puVar14 + iVar3 + 8),
                           *(int *)((int)puVar14 + iVar3 + 0xc));
              if (sVar9 == 0) {
                *(uint *)((int)puVar14 + iVar3 + 4) = local_1040;
                *(CSocketCreator **)((int)puVar14 + iVar3) = this_00;
                *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c2e4;
                CSocketCreator::CloseAcceptedSocket
                          (*(CSocketCreator **)((int)puVar14 + iVar3),
                           *(int *)((int)puVar14 + iVar3 + 4));
                break;
              }
              if (sVar9 < 0) {
                *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c0d5;
                cVar4 = SocketWouldBlock();
                if (cVar4 == '\0') {
                  *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c0de;
                  piVar12 = __errno_location();
                  *(int *)((int)puVar14 + iVar3) = *piVar12;
                  *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c0f4;
                  uVar6 = NET_ErrorString(*(int *)((int)puVar14 + iVar3));
                  *(char **)((int)puVar14 + iVar3) = "RCON Cmd: recv error (%s)\n";
                  *(undefined4 *)((int)puVar14 + iVar3 + 4) = uVar6;
                  *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c104;
                  Warning();
                  break;
                }
              }
              *(ssize_t *)((int)puVar14 + iVar3 + 8) = sVar9;
              uVar16 = uVar16 + sVar9;
              *(uint *)((int)puVar14 + iVar3 + 4) = uVar8;
              *(int *)((int)puVar14 + iVar3) = iVar18;
              *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c088;
              CUtlBuffer::Put(*(CUtlBuffer **)((int)puVar14 + iVar3),
                              *(void **)((int)puVar14 + iVar3 + 4),
                              *(int *)((int)puVar14 + iVar3 + 8));
            } while (uVar16 < local_102c);
          }
          *(undefined4 *)((int)puVar14 + iVar3 + 8) = 0;
          *(undefined4 *)((int)puVar14 + iVar3 + 4) = 0;
          *(int *)((int)puVar14 + iVar3) = iVar18;
          *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c11c;
          CUtlBuffer::SeekGet();
          if ((*(byte *)(iVar5 + 0x21) & 1) == 0) {
            *(undefined4 *)((int)puVar14 + iVar3 + 4) = 4;
            *(int *)((int)puVar14 + iVar3) = iVar18;
            *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c290;
            cVar4 = CUtlBuffer::CheckGet
                              (*(CUtlBuffer **)((int)puVar14 + iVar3),
                               *(int *)((int)puVar14 + iVar3 + 4));
            if (cVar4 != '\0') {
              if ((*(byte *)(iVar5 + 0x40) & 1) == 0) {
                iVar13 = *(int *)(iVar5 + 0x18);
                iVar17 = *(int *)(*(int *)(iVar5 + 0xc) + (iVar13 - *(int *)(iVar5 + 0x2c)));
              }
              else {
                piVar12 = (int *)((*(int *)(iVar5 + 0x18) - *(int *)(iVar5 + 0x2c)) +
                                 *(int *)(iVar5 + 0xc));
                if (piVar12 == (int *)0x0) {
                  piVar12 = &local_1028;
                }
                local_1024 = local_1028;
                local_1024._1_3_ = (undefined3)((uint)local_1028 >> 8);
                local_1024 = CONCAT31(local_1024._1_3_,*(undefined1 *)((int)piVar12 + 3));
                local_1024._2_2_ = (undefined2)((uint)local_1028 >> 0x10);
                local_1024._0_2_ =
                     CONCAT11(*(undefined1 *)((int)piVar12 + 2),*(undefined1 *)((int)piVar12 + 3));
                local_1024._3_1_ = (undefined1)((uint)local_1028 >> 0x18);
                local_1024._0_3_ =
                     CONCAT12(*(undefined1 *)((int)piVar12 + 1),(undefined2)local_1024);
                iVar13 = *piVar12;
                *(int **)((int)puVar14 + iVar3) = &local_1028;
                *(undefined4 *)((int)puVar14 + iVar3 + 8) = 4;
                local_1024 = CONCAT13((char)iVar13,(undefined3)local_1024);
                *(undefined4 **)((int)puVar14 + iVar3 + 4) = &local_1024;
                *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c395;
                _V_memcpy(*(void **)((int)puVar14 + iVar3),*(void **)((int)puVar14 + iVar3 + 4),
                          *(int *)((int)puVar14 + iVar3 + 8));
                iVar13 = *(int *)(iVar5 + 0x18);
                iVar17 = local_1028;
              }
              *(int *)(iVar5 + 0x18) = iVar13 + 4;
              goto LAB_0020c150;
            }
            iVar17 = 0;
          }
          else {
            *(undefined **)((int)puVar14 + iVar3 + 4) = &DAT_002ad982;
            *(int **)((int)puVar14 + iVar3 + 8) = &local_1028;
            *(int *)((int)puVar14 + iVar3) = iVar18;
            local_1028 = 0;
            *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c14a;
            CUtlBuffer::Scanf(*(CUtlBuffer **)((int)puVar14 + iVar3),
                              *(char **)((int)puVar14 + iVar3 + 4));
            iVar17 = local_1028;
LAB_0020c150:
            if (0x400 < iVar17) {
              *(undefined4 *)((int)puVar14 + iVar3 + 4) = uVar7;
              *(CRConServer **)((int)puVar14 + iVar3) = this;
              *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20bf70;
              HandleFailedRconAuth
                        (*(CRConServer **)((int)puVar14 + iVar3),
                         *(netadr_s **)((int)puVar14 + iVar3 + 4));
              puVar14 = (uint *)((int)puVar14 + iVar3);
              goto LAB_0020bf70;
            }
          }
          while ((0 < iVar17 && (iVar17 <= *(int *)(iVar5 + 0x1c) - *(int *)(iVar5 + 0x18)))) {
            *(undefined4 *)((int)puVar14 + iVar3) = 3;
            *(undefined4 *)((int)puVar14 + iVar3 + 4) = uVar7;
            *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c184;
            SV_RedirectStart();
            *(int *)((int)puVar14 + iVar3 + 0x10) = iVar17;
            *(int *)((int)puVar14 + iVar3 + 0xc) =
                 (*(int *)(iVar5 + 0x18) - *(int *)(iVar5 + 0x2c)) + *(int *)(iVar5 + 0xc);
            uVar6 = *(undefined4 *)(iVar5 + 8);
            *(undefined1 **)((int)puVar14 + iVar3) = g_ServerRemoteAccess;
            *(undefined4 *)((int)puVar14 + iVar3 + 8) = uVar6;
            *(CRConServer **)((int)puVar14 + iVar3 + 4) = this;
            *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c1b2;
            CServerRemoteAccess::WriteDataRequest
                      (*(CServerRemoteAccess **)((int)puVar14 + iVar3),
                       *(CRConServer **)((int)puVar14 + iVar3 + 4),
                       *(uint *)((int)puVar14 + iVar3 + 8),*(void **)((int)puVar14 + iVar3 + 0xc),
                       *(int *)((int)puVar14 + iVar3 + 0x10));
            *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c1b7;
            SV_RedirectEnd();
            puVar15 = (undefined1 *)((int)puVar14 + iVar3);
            if (this[0x5c] != (CRConServer)0x0) goto LAB_0020bf40;
            *(int *)((int)puVar14 + iVar3 + 8) = iVar17;
            *(undefined4 *)((int)puVar14 + iVar3 + 4) = 1;
            *(int *)((int)puVar14 + iVar3) = iVar18;
            *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c1db;
            CUtlBuffer::SeekGet();
            if ((uint)(*(int *)(iVar5 + 0x1c) - *(int *)(iVar5 + 0x18)) < 4) break;
            if ((*(byte *)(iVar5 + 0x21) & 1) == 0) {
              *(undefined4 *)((int)puVar14 + iVar3 + 4) = 4;
              *(int *)((int)puVar14 + iVar3) = iVar18;
              *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c3b3;
              cVar4 = CUtlBuffer::CheckGet
                                (*(CUtlBuffer **)((int)puVar14 + iVar3),
                                 *(int *)((int)puVar14 + iVar3 + 4));
              if (cVar4 == '\0') break;
              if ((*(byte *)(iVar5 + 0x40) & 1) == 0) {
                iVar13 = *(int *)(iVar5 + 0x18);
                iVar17 = *(int *)(*(int *)(iVar5 + 0xc) + (iVar13 - *(int *)(iVar5 + 0x2c)));
              }
              else {
                piVar12 = (int *)((*(int *)(iVar5 + 0x18) - *(int *)(iVar5 + 0x2c)) +
                                 *(int *)(iVar5 + 0xc));
                if (piVar12 == (int *)0x0) {
                  piVar12 = &local_1028;
                }
                local_1024 = local_1028;
                local_1024._1_3_ = (undefined3)((uint)local_1028 >> 8);
                local_1024 = CONCAT31(local_1024._1_3_,*(undefined1 *)((int)piVar12 + 3));
                local_1024._2_2_ = (undefined2)((uint)local_1028 >> 0x10);
                local_1024._0_2_ =
                     CONCAT11(*(undefined1 *)((int)piVar12 + 2),*(undefined1 *)((int)piVar12 + 3));
                local_1024._3_1_ = (undefined1)((uint)local_1028 >> 0x18);
                local_1024._0_3_ =
                     CONCAT12(*(undefined1 *)((int)piVar12 + 1),(undefined2)local_1024);
                iVar13 = *piVar12;
                *(undefined4 *)((int)puVar14 + iVar3 + 8) = 4;
                local_1024 = CONCAT13((char)iVar13,(undefined3)local_1024);
                *(undefined4 **)((int)puVar14 + iVar3 + 4) = &local_1024;
                *(int **)((int)puVar14 + iVar3) = &local_1028;
                *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c43a;
                _V_memcpy(*(void **)((int)puVar14 + iVar3),*(void **)((int)puVar14 + iVar3 + 4),
                          *(int *)((int)puVar14 + iVar3 + 8));
                iVar13 = *(int *)(iVar5 + 0x18);
                iVar17 = local_1028;
              }
              *(int *)(iVar5 + 0x18) = iVar13 + 4;
            }
            else {
              *(undefined **)((int)puVar14 + iVar3 + 4) = &DAT_002ad982;
              *(int **)((int)puVar14 + iVar3 + 8) = &local_1028;
              *(int *)((int)puVar14 + iVar3) = iVar18;
              local_1028 = 0;
              *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c317;
              CUtlBuffer::Scanf(*(CUtlBuffer **)((int)puVar14 + iVar3),
                                *(char **)((int)puVar14 + iVar3 + 4));
              iVar17 = local_1028;
            }
          }
          *(CSocketCreator **)((int)puVar14 + iVar3) = this_00;
          *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c1f8;
          iVar13 = CSocketCreator::GetAcceptedSocketCount
                             (*(CSocketCreator **)((int)puVar14 + iVar3));
          if (((int)local_1040 <= iVar13) && (iVar13 != 0)) {
            *(uint *)((int)puVar14 + iVar3 + 4) = local_1040;
            *(CSocketCreator **)((int)puVar14 + iVar3) = this_00;
            *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c24c;
            iVar13 = CSocketCreator::GetAcceptedSocketData
                               (*(CSocketCreator **)((int)puVar14 + iVar3),
                                *(int *)((int)puVar14 + iVar3 + 4));
            if (iVar5 == iVar13) {
              *(undefined4 *)(iVar5 + 0x18) = 0;
              *(undefined4 *)(iVar5 + 0x1c) = 0;
              *(undefined4 *)(iVar5 + 0x2c) = 0;
              *(undefined4 *)(iVar5 + 0x28) = 0;
              *(undefined1 *)(iVar5 + 0x20) = 0;
              *(int *)((int)puVar14 + iVar3) = iVar18;
              *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c278;
              CUtlMemory<unsigned_char,int>::Purge
                        (*(CUtlMemory<unsigned_char,int> **)((int)puVar14 + iVar3));
              puVar14 = (uint *)((int)puVar14 + iVar3);
              goto LAB_0020bf28;
            }
          }
          *(undefined4 *)(iVar5 + 0x18) = 0;
          *(undefined4 *)(iVar5 + 0x1c) = 0;
          *(undefined4 *)(iVar5 + 0x2c) = 0;
          *(undefined4 *)(iVar5 + 0x28) = 0;
          *(undefined1 *)(iVar5 + 0x20) = 0;
          *(int *)((int)puVar14 + iVar3) = iVar18;
          *(undefined4 *)((int)puVar14 + iVar3 + -4) = 0x20c228;
          CUtlMemory<unsigned_char,int>::Purge
                    (*(CUtlMemory<unsigned_char,int> **)((int)puVar14 + iVar3));
          puVar15 = (undefined1 *)((int)puVar14 + iVar3);
          break;
        }
LAB_0020bf70:
        puVar14[1] = local_1040;
        *puVar14 = (uint)this_00;
        puVar14[-1] = 0x20bf88;
        CSocketCreator::CloseAcceptedSocket((CSocketCreator *)*puVar14,puVar14[1]);
      }
LAB_0020bf28:
      local_1040 = local_1040 - 1;
      puVar15 = (undefined1 *)puVar14;
    } while (local_1040 != 0xffffffff);
  }
LAB_0020bf40:
  if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
    return;
  }
                    /* WARNING: Subroutine does not return */
  *(undefined4 *)(puVar15 + -4) = 0x20c451;
  __stack_chk_fail();
}

SourceMod gamedata

paste into addons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)

Just a Signatures{} block, ready to drop into a gamedata file. Wire it up in your plugin however you like - SDKCall, DHooks, raw memory ops, or anything else.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)