MiDeletePerSessionProtos

UINT64 __stdcall MiDeletePerSessionProtos(_MI_PER_SESSION_PROTOS *Protos){
  __int64 *v1; 
  _MMPFN *v2; 
  UINT8 v3; 
  unsigned __int64 v4; 
  __int64 v6; 
  __int64 v7; 
  UINT64 v8; 
  UINT64 v9; 
  __int64 v10; 
  _MI_PARTITION *v11; 
  _MMPFN *v12; 
  INT64 v13; 
  UINT8 *v14; 
  INT64 v16; 
  __int128 a2[4]; 
  UINT8 PageIrql; 
  unsigned __int64 v19; 
  v1 = (__int64 *)*((_QWORD *)Protos + 8);
  v2 = 0i64;
  v3 = 17;
  v4 = *((_QWORD *)Protos + 9);
  v6 = *v1;
  v7 = v1[1];
  v8 = *((unsigned int *)v1 + 11);
  PageIrql = 17;
  v9 = *(_WORD *)(v6 + 60) & 0x3FF;
  v10 = *(_QWORD *)Protos + ((v7 - *(_QWORD *)(v6 + 136)) >> 3 << 12);
  a2[0] = (unsigned __int64)v10;
  v11 = *(_MI_PARTITION **)(qword_140C4E388 + 8 * v9);
  v19 = v4 + 8 * v8;
  if( v4 < v19 )
  {
    do
    {
      if( (v4 & 0xFFF) == 0 || v3 == 17 )
      {
        if( v3 != 17 )
        {
          LOBYTE(v9) = v3;
          MiUnlockProtoPoolPage(v2, v9);
        }
        while( 1 )
        {
          v2 = MiLockProtoPoolPage((_MMPTE *)v4, &PageIrql);
          if( v2 )
            break;
          MmAccessFault(2ui64, (PVOID)v4, 0, 0i64);
        }
        v3 = PageIrql;
      }
      v12 = MiLockLeafPage((_MMPTE *)v4, 0i64);
      v13 = MI_READ_PTE_LOCK_FREE(v4);
      v9 = v13;
      if( v12 )
      {
        if( (MiFlags & 0x10000) != 0 && (MiFlags & 0x8000) != 0 && ((*((_QWORD *)v12 + 5) >> 60) & 7) == 3 )
        {
          MiRemoveLockedPageChargeAndDecRef(v12);
          KeSetPagePrivilege((v12 - MmGetPfnDb()) / 48, a2, 16);
          MiClearPfnImageVerified((UINT64)v12, 4);
          v10 = *(_QWORD *)&a2[0];
        }
        LOBYTE(v14) = 17;
        if( (unsigned int)MiDeleteTransitionPte((_MMPTE *)v4, v12, v14, 1ui64) == 3 )
          --v8;
      }
      else
      {
        if( !v13 )
          break;
        if( (v13 & 0x400) == 0 )
        {
          v16 = MiSwizzleInvalidPte(768i64);
          if( v9 != v16 )
            MiReleasePageFileSpace(v11, v9, 1i64);
        }
      }
      v10 += 4096i64;
      v4 += 8i64;
      *(_QWORD *)&a2[0] = v10;
    }
    while( v4 < v19 );
    if( v3 != 17 )
    {
      LOBYTE(v9) = v3;
      MiUnlockProtoPoolPage(v2, v9);
    }
  }
  MiReturnCommit(v11, v8);
  MiUpdateSystemProtoPtesTree((RTL_BALANCED_NODE *)Protos + 1, 0i64);
  ExFreePoolWithTag(*((PVOID *)Protos + 9), 0);
  ExFreePoolWithTag(Protos, 0);
  return v8;
}

Referenced by:

MiDeleteSessionDriverProtos
MiFreeSubsectionProtos