RtlpWalkWowStack

CHAR __fastcall RtlpWalkWowStack(
        INT64 a1,
        UINT64 *a2,
        INT64 a3,
        UINT64 *a4,
        UINT64 a5,
        UINT64 a6,
        UINT64 a7,
        UINT64 a8){
  unsigned int v10; 
  unsigned int v11; 
  unsigned int v12; 
  unsigned int i; 
  unsigned int v14; 
  char j; 
  BOOL v16; 
  unsigned int v17; 
  unsigned __int64 v18; 
  CHAR v20; 
  unsigned int v21; 
  v20 = 1;
  v10 = *(_DWORD *)(a3 + 8196);
  v21 = v10;
  if( v10 <= (unsigned int)a8 )
    return 0;
  if( (a8 & 3) != 0 )
    ExRaiseDatatypeMisalignment();
  if( (unsigned int)a8 + (unsigned __int64)(v10 - (unsigned int)a8) < (unsigned int)a8 )
    MEMORY[0x7FFFFFFF0000] = 0;
  v11 = *(_DWORD *)a4;
  if( a2 )
  {
    if( (unsigned int)a5 > v11 )
    {
      if( v11 >= (unsigned int)a6 )
      {
        *(_QWORD *)(a1 + 8i64 * (v11 - (unsigned int)a6)) = *(unsigned int *)a2;
        v11 = *(_DWORD *)a4;
      }
      *(_DWORD *)a4 = ++v11;
    }
  }
  else
  {
    v12 = a8;
    for( i = 0; i < 2 && v11 < (unsigned int)a5 && v12 < v10 && v12 >= (unsigned int)a8 && v10 - v12 >= 4; ++i )
    {
      if( v11 >= (unsigned int)a6 )
        *(_QWORD *)(a1 + 8i64 * (v11 - (unsigned int)a6)) = *(unsigned int *)v12;
      v12 += 4;
      ++v11;
    }
    *(_DWORD *)a4 = v11;
    if( v11 >= (unsigned int)a5 )
      return v20;
  }
  v14 = a7;
  for( j = 1; v11 < (unsigned int)a5 && v14 < v10; j = 0 )
  {
    if( j )
    {
      v16 = v14 < (unsigned int)a8;
    }
    else
    {
      if( v14 <= (unsigned int)a8 )
        break;
      v16 = 0;
    }
    if( v16 )
      break;
    if( v10 - v14 < 8 )
      break;
    v17 = *(_DWORD *)v14;
    v18 = *(unsigned int *)(v14 + 4i64);
    if( (unsigned int)v18 < v10 && (unsigned int)a8 <= (unsigned int)v18 )
      break;
    if( v18 >= *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1496i64) || (unsigned int)v18 < 0x10000 )
      break;
    if( v11 >= (unsigned int)a6 )
      *(_QWORD *)(a1 + 8i64 * (v11 - (unsigned int)a6)) = *(unsigned int *)(v14 + 4i64);
    if( v14 >= v17 || (v10 = v21, v17 >= v21) )
    {
      ++v11;
      break;
    }
    v14 = v17;
    ++v11;
  }
  *(_DWORD *)a4 = v11;
  return v20;
}

Referenced by:

RtlpWalkFrameChain