MiTerminateWsleCluster

INT64 __fastcall MiTerminateWsleCluster(INT64 a1){
  __int64 v2; 
  unsigned __int64 PteBase; 
  INT64 v4; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 
  char v7; 
  unsigned __int8 v8; 
  int v9; 
  _MMPTE *PxeUserLimit; 
  _MMPFN *PfnDb; 
  volatile __int64 *v12; 
  _MMPTE *PteLimit; 
  _MMPTE *Pml4eBase; 
  unsigned __int64 v15; 
  volatile __int64 v16; 
  unsigned __int64 v17; 
  char v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  unsigned int v21; 
  char v22; 
  INT64 v23; 
  unsigned __int64 v24; 
  UINT64 v25; 
  INT64 v26; 
  unsigned __int64 *v27; 
  INT64 v28; 
  INT64 v29; 
  INT64 v30; 
  __int64 v31; 
  unsigned __int64 v32; 
  char v33; 
  char v34; 
  int v35; 
  unsigned __int64 v36; 
  unsigned int v37; 
  UINT64 v38; 
  int HasShadow; 
  unsigned __int64 v40; 
  __int64 v41; 
  unsigned __int64 *v42; 
  _MMPFN *v43; 
  unsigned __int64 v44; 
  INT64 v45; 
  INT64 v46; 
  INT64 v47; 
  UINT64 v48; 
  __int64 v49; 
  unsigned __int64 v50; 
  UINT64 v51; 
  INT64 v52[2]; 
  __int128 v53; 
  __int128 v54; 
  int v55; 
  __int16 v56; 
  __int16 v57; 
  __int64 v58; 
  __int64 v59; 
  __int64 Base; 
  INT64 result[20]; 
  _OWORD a3[2]; 
  v57 = 0;
  memset((INT64)result, 0i64);
  v2 = *(_QWORD *)(a1 + 8);
  v49 = v2;
  *(_OWORD *)v52 = 0i64;
  v53 = 0i64;
  v54 = 0i64;
  if( !v2 )
    return 0i64;
  PteBase = (unsigned __int64)MmGetPteBase();
  v4 = *(_QWORD *)a1;
  v5 = 0i64;
  v47 = *(_QWORD *)a1;
  v6 = (__int64)((v2 << 25) - (PteBase << 25)) >> 16;
  v7 = *(_BYTE *)(*(_QWORD *)a1 + 184i64);
  v50 = v6;
  v8 = v7 & 7;
  if( v8 )
  {
    v9 = 2;
    if( v8 >= 2u )
      v9 = 0;
  }
  else
  {
    v9 = 1;
  }
  v58 = 20i64;
  v55 = v9;
  v56 = 0;
  v59 = 0i64;
  Base = 0i64;
  PxeUserLimit = MmGetPxeUserLimit();
  PfnDb = MmGetPfnDb();
  if( (*(_BYTE *)(v4 + 184) & 7) == 0 )
  {
    if( !*(_QWORD *)(a1 + 16) )
      goto LABEL_23;
    v12 = (volatile __int64 *)v2;
    PteLimit = MmGetPteLimit();
    Pml4eBase = MmGetPml4eBase();
    v15 = v6;
    while( 1 )
    {
      v16 = *v12;
      v17 = *v12 & 0xFFFFFFFFFFFFFBFEui64 | 0x400;
      v48 = v17;
      if( v12 >= (volatile __int64 *)Pml4eBase && v12 <= (volatile __int64 *)PxeUserLimit )
      {
        HasShadow = MiPteHasShadow();
        PteLimit = MmGetPteLimit();
        if( HasShadow )
          LOBYTE(v16) = v16 | 0x20;
      }
      if( (MiFlags & 0x800) != 0 )
      {
        LOBYTE(v16) = 32;
      }
      else if( (MiFlags & 0x4000000) != 0 )
      {
        _mm_lfence();
      }
      if( (v16 & 0x20) != 0 )
      {
        *v12 = v17;
        PteBase = (unsigned __int64)MmGetPteBase();
        PteLimit = MmGetPteLimit();
      }
      else
      {
        v33 = _InterlockedExchange64(v12, v17);
        if( v12 >= (volatile __int64 *)Pml4eBase && v12 <= (volatile __int64 *)PxeUserLimit )
        {
          MiWritePteShadow();
          PteBase = (unsigned __int64)MmGetPteBase();
          PteLimit = MmGetPteLimit();
        }
        if( (v33 & 0x20) == 0 )
          goto LABEL_21;
      }
      v18 = v56;
      v19 = 1i64;
      v20 = v15;
      if( v55 != 1 && (v56 & 8) == 0 && v15 >= PteBase && v15 <= (unsigned __int64)PteLimit )
      {
        v18 = v56 | 8;
        LOBYTE(v56) = v56 | 8;
      }
      v21 = HIDWORD(v58);
      if( !HIDWORD(v58) )
      {
LABEL_31:
        if( HIDWORD(v58) >= (unsigned int)v58 )
        {
          HIBYTE(v56) = 1;
        }
        else
        {
          while( 1 )
          {
            v31 = (unsigned __int64)(v19 - 1) > 0x3FF ? 1024i64 : v19;
            v32 = v20 & 0xFFFFFFFFFFFFF000ui64 | ((_WORD)v31 - 1) & 0x3FF;
            v19 -= v31;
            v20 += v31 << 12;
            result[v21 - 1] = v32;
            v59 += v31;
            v21 = HIDWORD(v58) + 1;
            HIDWORD(v58) = v21;
            if( v21 == (_DWORD)v58 && (v56 & 4) == 0 )
            {
              qsort((WCHAR *)&Base, v21, (const WCHAR *)8, MiTbFlushSort);
              MiCompressTbFlushList((INT64)&v55);
              v21 = HIDWORD(v58);
              if( HIDWORD(v58) == (_DWORD)v58 )
                break;
            }
            if( !v19 )
              goto LABEL_21;
          }
          if( v19 )
          {
            HIBYTE(v56) = 1;
            v59 = HIDWORD(v58);
          }
        }
        goto LABEL_21;
      }
      v22 = v18 & 4;
      if( v22
        || (v23 = result[(unsigned int)(HIDWORD(v58) - 1) - 1], (v23 & 0xC00) != 0)
        || (v24 = result[(unsigned int)(HIDWORD(v58) - 1) - 1] & 0x3FF,
            (v23 & 0xFFFFFFFFFFFFF000ui64) + ((v24 + 1) << 12) != v15)
        || v24 + 1 <= v24
        || v24 + 1 > 0x3FF )
      {
        if( v22 )
          goto LABEL_31;
        v30 = result[(unsigned int)(HIDWORD(v58) - 1) - 1];
        if( (v30 & 0xC00) != 0 )
          goto LABEL_31;
        if( (v30 & 0xFFFFFFFFFFFFF000ui64) != v15 + 4096 )
          goto LABEL_31;
        v40 = result[(unsigned int)(HIDWORD(v58) - 1) - 1] & 0x3FF;
        if( v40 + 1 <= v40 || v40 + 1 > 0x3FF )
          goto LABEL_31;
        ++v59;
        result[(unsigned int)(HIDWORD(v58) - 1) - 1] = (v30 - 4096) ^ ((unsigned __int16)(v30 - 4096) ^ (unsigned __int16)(v30 - 4096 + 1)) & 0x3FF;
      }
      else
      {
        ++v59;
        result[(unsigned int)(HIDWORD(v58) - 1) - 1] = v23 ^ ((unsigned __int16)v23 ^ (unsigned __int16)(v23 + 1)) & 0x3FF;
      }
LABEL_21:
      ++v5;
      PteBase = (unsigned __int64)MmGetPteBase();
      ++v12;
      PteLimit = MmGetPteLimit();
      v15 += 4096i64;
      PxeUserLimit = MmGetPxeUserLimit();
      if( v5 >= *(_QWORD *)(a1 + 16) )
      {
        v2 = v49;
        v6 = v50;
        v4 = v47;
        PfnDb = MmGetPfnDb();
        goto LABEL_23;
      }
    }
  }
  if( (*(_BYTE *)(a1 + 28) & 0xF) == 8 && *(_QWORD *)(a1 + 16) )
  {
    v41 = (__int64)((v2 << 25) - (PteBase << 25)) >> 16;
    v42 = (unsigned __int64 *)v2;
    v43 = MmGetPfnDb();
    do
    {
      v44 = *v42;
      MiPteInShadowRange((UINT64)v42);
      MiUnlockWsle(v47, v41, (INT64)v43 + 48 * ((v44 >> 12) & 0xFFFFFFFFFi64));
      ++v5;
      ++v42;
      v41 += 4096i64;
    }
    while( v5 < *(_QWORD *)(a1 + 16) );
    v2 = v49;
    v6 = v50;
    v4 = v47;
    PfnDb = MmGetPfnDb();
  }
  if( (*(_DWORD *)(a1 + 24) & 4) == 0 )
    MiInsertTbFlushEntry((INT64)&v55, v6, *(_QWORD *)(a1 + 16), 0i64);
LABEL_23:
  LODWORD(v46) = *(_DWORD *)(a1 + 24) & 1;
  LODWORD(v45) = 10;
  MiRemoveWsle(v4, v6, *(UINT8 **)(a1 + 16), *(_BYTE *)(a1 + 28), v45, v46);
  v25 = *(_QWORD *)((char *)MmGetPdeBase() + ((v6 >> 18) & 0x3FFFFFF8));
  v51 = v25;
  MiPteInShadowRange((UINT64)&v51);
  v27 = (unsigned __int64 *)((char *)PfnDb + 48 * ((v25 >> 12) & 0xFFFFFFFFFi64));
  if( ((*(_DWORD *)v27 >> 4) & 0x3FF) == 0 )
  {
    MiCountWslesInPageTable(v26, v6, a3);
    v34 = 8;
    while( 1 )
    {
      v35 = *((_DWORD *)a3 + (unsigned __int8)--v34);
      if( v35 )
        break;
      if( !v34 )
        goto LABEL_24;
    }
    *v27 = *v27 & 0xFFFFFFFFFFFE000Fui64 | (16 * (v35 & 0x3FF | ((unsigned __int64)(v34 & 7) << 10)));
  }
LABEL_24:
  if( (*(_BYTE *)(v4 + 184) & 7) != 0 )
  {
    v36 = 0i64;
    v37 = (2 * (*(_DWORD *)(a1 + 24) & 8)) | 4;
    if( (*(_DWORD *)(a1 + 24) & 0x10) == 0 )
      v37 = 2 * (*(_DWORD *)(a1 + 24) & 8);
    if( *(_QWORD *)(a1 + 16) )
    {
      do
      {
        MiDeleteValidSystemPage(v47, (MMPTE *)v2, v37, (INT64)v52);
        if( (*(_DWORD *)(a1 + 24) & 4) != 0 )
        {
          v48 = 0i64;
          MiInitializeTbFlushStamps(&v48);
          *(_QWORD *)v2 = v48;
          v38 = v48;
          if( qword_140C4DC80 && (v48 & 0x10) == 0 )
            v38 = v48 & ~qword_140C4DC80;
          if( (v38 & 0xFFFFFFFF00000000ui64) == 0 )
            MiInsertTbFlushEntry((INT64)&v55, v6, 1i64, 0i64);
        }
        ++v36;
        v2 += 8i64;
        v6 += 4096i64;
      }
      while( v36 < *(_QWORD *)(a1 + 16) );
    }
  }
  v28 = 0i64;
  if( (*(_BYTE *)(a1 + 24) & 1) != 0 )
    v28 = v52[1];
  MiFlushTbList((__int64)&v55);
  v29 = v28;
  *(_QWORD *)(a1 + 8) = 0i64;
  *(_QWORD *)(a1 + 16) = 0i64;
  return v29;
}

Referenced by:

MiAppendWsleCluster
MiDecommitPages
MiDeletePteWsleCluster
MiDeleteSystemPagableVm
MiDeleteVa
MiDeleteVaTail
MiRemoveMappedPtes