pokemon shuffle c sorce

本文详细解析了gmThread::PushStackFrame函数的工作流程,包括处理非函数类型调用、栈溢出情况及线程状态切换等核心逻辑。通过分析源代码,深入探讨了内存管理和信号创建机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

signed int __fastcall gmThread::PushStackFrame(int a1, int a2, int a3, int a4)
{
  int v4; // r6@1
  int v5; // r8@1
  int v6; // r12@1
  int v7; // r4@5
  int v8; // r1@6
  int v9; // r5@7
  int v10; // r11@8
  int v11; // r10@8
  int v12; // r0@8
  int v13; // r7@8
  int v14; // r9@8
  int v15; // r5@9
  int v16; // r4@10
  int v17; // r3@12
  int v18; // r2@12
  signed int v19; // r3@12
  int v20; // r1@13
  signed int result; // r0@19
  int v22; // r9@21
  int v23; // r3@22
  int v24; // r3@24
  int v25; // r0@24
  int v26; // r2@25
  int v27; // r3@26
  int v28; // r3@26
  int v29; // r3@30
  int v30; // r3@33
  int v31; // r2@33
  int v32; // r1@33
  int v33; // r3@33
  int v34; // r3@34
  int v35; // r4@36
  int v36; // r2@49
  int v37; // r1@49
  int v38; // r0@51
  int v39; // r0@53
  int v40; // [sp+8h] [bp-30h]@1
  int v41; // [sp+Ch] [bp-2Ch]@1


  v4 = a1;
  v5 = a2;
  v6 = *(_DWORD *)(a1 + 40);
  v40 = a3;
  v41 = a4;
  while ( 1 )
  {
    v7 = v6 - v5;
    if ( v6 - v5 == 2 )
    {
      *(_DWORD *)(v4 + 44) = 2;
      gmMachine::Sys_SignalCreateThread(*(_DWORD *)(v4 + 28), v4);
    }
    v8 = *(_DWORD *)(v4 + 32) + 8 * (v7 + 536870911);
    if ( *(_DWORD *)v8 != 5 )
    {
      gmLog::LogEntry(*(_DWORD *)(v4 + 28) + 568, "attempt to call non function type");
      return 7;
    }
    v9 = *(_DWORD *)(v8 + 4);
    if ( !*(_DWORD *)(v9 + 16) )
    {
      v22 = *(_DWORD *)(v9 + 48) - v5;
      if ( gmThread::Touch(v4, v22 + *(_DWORD *)(v9 + 36)) )
      {
        v23 = *(_DWORD *)(v9 + 44);
        if ( v23 < v5 )
          memset((void *)(*(_DWORD *)(v4 + 32) + 8 * (v7 + v23)), 0, 8 * *(_DWORD *)(v9 + 40));
        else
          memset((void *)(*(_DWORD *)(v4 + 32) + 8 * *(_DWORD *)(v4 + 40)), 0, 8 * v22);
        v24 = *(_DWORD *)(v4 + 28);
        v25 = *(_DWORD *)(v24 + 220);
        if ( v25 )
        {
          v26 = *(_DWORD *)v25;
          *(_DWORD *)(v24 + 220) = *(_DWORD *)v25;
        }
        else
        {
          v25 = gmMemChain::Alloc(v24 + 224);
        }
        *(_DWORD *)v25 = *(_DWORD *)(v4 + 48);
        v27 = *(_DWORD *)(v4 + 44);
        *(_DWORD *)(v4 + 48) = v25;
        *(_DWORD *)(v25 + 8) = v27;
        result = 0;
        v28 = *(_DWORD *)(v4 + 48);
        if ( v40 )
          v26 = *(_DWORD *)v40;
        else
          *(_DWORD *)(v28 + 4) = 0;
        if ( v40 )
        {
          *(_DWORD *)(v28 + 4) = v26;
          v29 = *(_DWORD *)(v9 + 28);
          *(_DWORD *)v40 = v29;
          *(_DWORD *)v41 = v29;
        }
        *(_DWORD *)(v4 + 44) = v7;
        *(_DWORD *)(v4 + 40) = v7 + *(_DWORD *)(v9 + 48);
      }
      else
      {
        gmLog::LogEntry(*(_DWORD *)(v4 + 28) + 568, "stack overflow");
        result = 7;
      }
      return result;
    }
    *(_WORD *)(v4 + 84) = v5;
    v10 = *(_DWORD *)(v4 + 44);
    *(_DWORD *)(v4 + 44) = v7;
    v11 = *(_DWORD *)(v4 + 40);
    v12 = (*(int (__fastcall **)(int))(v9 + 16))(v4);
    v13 = *(_DWORD *)(*(_DWORD *)(v4 + 28) + 24);
    v14 = v12;
    if ( *(_BYTE *)(v13 + 112) )
    {
      v6 = *(_DWORD *)(v4 + 40);
    }
    else
    {
      v15 = *(_DWORD *)(v4 + 44);
      v6 = *(_DWORD *)(v4 + 40);
      if ( v15 < v6 )
      {
        v16 = 8 * v15;
        do
        {
          v17 = *(_DWORD *)(v4 + 32);
          ++v15;
          v18 = v17 + v16;
          v19 = *(_DWORD *)(v17 + v16);
          v16 += 8;
          if ( v19 > 2 )
          {
            v20 = *(_DWORD *)(v18 + 4);
            if ( !*(_BYTE *)(v13 + 112) )
            {
              if ( v20 && !*(_BYTE *)(v20 + 13) && *(_DWORD *)(v13 + 96) != *(_BYTE *)(v20 + 12) )
              {
                gmGCColorSet::GrayThisObject(v13 + 4);
                v6 = *(_DWORD *)(v4 + 40);
              }
            }
          }
        }
        while ( v15 < v6 );
      }
    }
    if ( v14 != -6 )
      break;
    --v5;
  }
  if ( v6 == v11 )
  {
    v36 = *(_DWORD *)(v4 + 32);
    v37 = *(_DWORD *)(v4 + 44) + 536870910;
    *(_DWORD *)(v36 + 8 * v37) = 0;
    *(_DWORD *)(v36 + 8 * v37 + 4) = 0;
  }
  else
  {
    v30 = *(_DWORD *)(v4 + 32);
    v31 = v30 + 8 * (v6 + 536870911);
    v32 = *(_DWORD *)(v31 + 4);
    v33 = v30 + 8 * (*(_DWORD *)(v4 + 44) + 536870910);
    *(_DWORD *)v33 = *(_DWORD *)v31;
    *(_DWORD *)(v33 + 4) = v32;
  }
  v34 = *(_DWORD *)(v4 + 44);
  *(_DWORD *)(v4 + 44) = v10;
  *(_DWORD *)(v4 + 40) = v34 - 1;
  if ( v14 )
  {
    if ( v40 )
      v35 = *(_DWORD *)v40;
    else
      v35 = 0;
    if ( v14 == -2 )
    {
      gmMachine::Sys_RemoveSignals(*(_DWORD *)(v4 + 28), v4);
      *(_DWORD *)(v4 + 68) = v35;
      result = 6;
    }
    else if ( v14 == -3 )
    {
      v38 = *(_DWORD *)(v4 + 28);
      *(_DWORD *)(v4 + 68) = v35;
      gmMachine::Sys_SwitchState(v38, v4, 2);
      result = 2;
    }
    else
    {
      if ( v14 != -4 )
      {
        if ( v14 != -5 )
          return 7;
        return 3;
      }
      v39 = *(_DWORD *)(v4 + 28);
      *(_DWORD *)(v4 + 68) = v35;
      gmMachine::Sys_SwitchState(v39, v4, 1);
      result = 1;
    }
  }
  else
  {
    if ( !*(_DWORD *)(v4 + 48) )
      return 3;
    result = 0;
  }
  return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值