VmpAccessFaultBatchResolve

INT64 __fastcall VmpAccessFaultBatchResolve(_QWORD *a1, UINT64 a2, INT64 a3, CHAR a4, CHAR a5, INT64 a6){
  CHAR v6; 
  __int64 v8; 
  char *v9; 
  unsigned int v10; 
  int v11; 
  int v12; 
  int v13; 
  int v14; 
  int v15; 
  _QWORD *v16; 
  unsigned int v17; 
  __int64 v18; 
  _QWORD *i; 
  __int64 v20; 
  INT64 v21; 
  __int64 v22; 
  INT64 result; 
  char *v24; 
  unsigned int PageFrameNumber; 
  int PageFrameNumber_4; 
  int v27; 
  _QWORD *v29; 
  __int64 VirtualAddress; 
  __int64 v31; 
  char v32; 
  v31 = 0i64;
  v6 = a4;
  v8 = (unsigned int)a2;
  if( a3 )
  {
    v9 = *(char **)(a3 + 16);
    v10 = *(_DWORD *)a3;
  }
  else
  {
    v9 = &v32;
    v10 = 16;
  }
  v11 = v6 & 1 | 2;
  v12 = v6 & 2;
  if( (v6 & 2) == 0 )
    v11 = v6 & 1;
  v27 = v6 & 4;
  if( (v6 & 4) != 0 )
    v11 |= 1u;
  v13 = v11 | 8;
  if( (v6 & 8) == 0 )
    v13 = v11;
  v14 = v13 | 0x10;
  if( (v6 & 0x10) == 0 )
    v14 = v13;
  PageFrameNumber_4 = v6 & 0x20;
  v15 = v14 | 0x20;
  if( (v6 & 0x20) == 0 )
    v15 = v14;
  v16 = &a1[6 * v8];
  PageFrameNumber = v15;
  v17 = 0;
  v29 = v16;
  while( a1 < v16 )
  {
    v18 = a1[3] & 0xFFFFFFFFFFFFFi64;
    VirtualAddress = a1[3] << 12;
    if( !v17 )
    {
      v17 = 1;
      for( i = a1 + 6; i < v16; i += 6 )
      {
        if( v17 >= v10 )
          break;
        v20 = i[3] & 0xFFFFFFFFFFFFFi64;
        if( v20 != v18 + 1 )
          break;
        v18 = v20;
        ++v17;
      }
      if( (v6 & 0x40) != 0 && v17 == 512 && !MmGetNodeFastLargePageCounts((INT64)i, (unsigned int)(a6 - 1)) )
        MmBuildLargePages(v21, (unsigned int)(a6 - 1));
    }
    v22 = 8i64 * v17;
    v31 = v17 << 12;
    memset((INT64)v9, 0i64);
    LODWORD(result) = MmVirtualAccessFault(&VirtualAddress, (UINT64)v9, (UINT64 *)PageFrameNumber);
    if( (int)result >= 0 )
    {
      v24 = v9;
      if( v9 < &v9[v22] )
      {
        do
        {
          if( (*(_QWORD *)v24 & 0x10000000000000i64) == 0 )
            break;
          a1[5] = *(_QWORD *)v24 & 0xFFFFFFFFFFFFFi64;
          if( v12 || (*(_QWORD *)v24 & 0x20000000000000i64) != 0 && (a5 & 2) != 0 )
            a1[4] |= 0x10000000000000ui64;
          if( v27 )
            a1[4] |= 0x20000000000000ui64;
          if( (*(_QWORD *)v24 & 0x80000000000000i64) != 0 )
            a1[4] |= 0x40000000000000ui64;
          v24 += 8;
          a1 += 6;
          --v17;
        }
        while( v24 < &v9[v22] );
        v6 = a4;
        v16 = v29;
      }
    }
    else
    {
      if( !PageFrameNumber_4 )
        return result;
      a1[4] |= 0x100000000000000ui64;
      a1 += 6;
      v17 = 0;
      v10 = 1;
    }
  }
  return 0i64;
}

Referenced by:

VmpAccessFaultBatch