MiScanRelocationPage

INT64 MiScanRelocationPage(void){
  unsigned int v0; 
  __int64 v1; 
  int v2; 
  _WORD *v3; 
  __int64 v4; 
  _WORD *a6; 
  __int64 v6; 
  int v7; 
  unsigned int a5; 
  int v9; 
  int v10; 
  int v11; 
  __int64 v12; 
  unsigned int i; 
  __int16 v14; 
  unsigned __int16 v15; 
  unsigned int v16; 
  INT64 result; 
  int v18; 
  __int64 v19; 
  __int64 a1; 
  _QWORD *a7; 
  v19 = v1;
  v4 = a1;
  a6 = v3;
  v6 = v0;
  v7 = 0;
  a5 = 0;
  v9 = 0;
  v10 = 0;
  v11 = v2;
  v12 = v1;
  for( i = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)a1 + 56i64) + 64i64); v11; ++a6 )
  {
    --v11;
    v14 = *a6 >> 12;
    v15 = *a6 & 0xFFF;
    if( v14 )
    {
      if( v14 == 3 )
      {
        if( v15 > 0xFFCu )
        {
          v9 = 1;
          v7 = 2;
          a5 = 4;
        }
      }
      else
      {
        if( v14 != 10 )
          return 3221226089i64;
        if( v15 > 0xFF8u )
        {
          v9 = 1;
          a5 = 8;
        }
        v18 = 0;
        if( v15 <= 0xFF8u )
          v18 = v7;
        v7 = v18;
      }
    }
    if( v14 )
    {
      if( (v6 & 0xFFF) != 0 && v15 + (unsigned int)(v6 & 0xFFF) > 0xFFE )
        return 3221226089i64;
      v16 = v15 + (_DWORD)v6;
      if( v16 < i )
        return 3221226089i64;
    }
    else
    {
      v16 = v6 + v15;
    }
    if( v9 == 1 )
    {
      if( v10 == 1 )
        return 3221225595i64;
      result = MiCreateFixupRecord(v4, v12, v16, v7, a5, a6, a7);
      if( (int)result < 0 )
        return result;
      if( (MiFlags & 0x40000) != 0 && (*(_DWORD *)(v4 + 92) & 0xC0000) != 0 )
      {
        a1 = 0i64;
        if( (*((_BYTE *)MiOffsetToProtos((_CONTROL_AREA *)v4, v6 + v15 + (unsigned __int64)a5, (UINT64 *)&a1) + 32) & 4) != 0 )
          return 3221225595i64;
      }
      v12 = v19;
      v9 = 0;
      v10 = 1;
    }
  }
  return 0i64;
}

Referenced by:

MiRelocateImage