MiFillPoolCommitPageTable

CHAR __fastcall MiFillPoolCommitPageTable(INT64 a1){
  void **CurrentThread; 
  char v3; 
  ULONG_PTR v4; 
  _MMPTE *PteBase; 
  UINT64 v6; 
  unsigned __int64 v7; 
  BOOL v8; 
  __int16 v9; 
  unsigned __int64 v10; 
  int v11; 
  unsigned __int64 v12; 
  void *retaddr; 
  CurrentThread = &retaddr;
  if( (*(_BYTE *)(a1 + 78) & 4) == 0 )
  {
    v3 = 0;
    v4 = *(_QWORD *)(a1 + 32);
    if( v4 )
    {
      PteBase = MmGetPteBase();
      do
      {
        v6 = *(_QWORD *)(a1 + 64);
        if( v6 )
        {
          if( (_MMPTE *)((char *)PteBase + ((v4 >> 9) & 0x7FFFFFFFF8i64)) == (_MMPTE *)v6 )
            goto LABEL_6;
          MiUnlockPageTableInternal(*(_QWORD *)(a1 + 48), v6);
          *(_QWORD *)(a1 + 64) = 0i64;
        }
        if( !(unsigned int)MiLockPoolCommitPageTable(a1, (INT64 *)v4) )
          KeBugCheckEx(0x1Au, 0x5310ui64, v4, 0i64, 0i64);
LABEL_6:
        v7 = *(_QWORD *)v4;
        v8 = MiPteInShadowRange(v4);
        if( !v7 )
          goto LABEL_11;
        if( qword_140C4DC80 && (v7 & 0x10) == 0 )
          v7 &= ~qword_140C4DC80;
        v7 >>= 28;
        if( v7 == 0xFFFFFFFFFi64 )
          CurrentThread = 0i64;
        else
LABEL_11:
          CurrentThread = (void **)((char *)PteBase + 8 * v7 + 0x4000000000i64);
        *(_QWORD *)(a1 + 32) = CurrentThread;
        v9 = *(_WORD *)(a1 + 78);
        if( (v9 & 1) != 0 )
        {
          v12 = ZeroPte;
          if( v8 )
          {
            CurrentThread = (void **)KeGetCurrentThread();
            if( (*((_DWORD *)CurrentThread[23] + 543) & 0x1000) != 0 && (ZeroPte & 1) != 0 )
            {
              LOBYTE(CurrentThread) = 0;
              v12 = ZeroPte | 0x8000000000000000ui64;
            }
          }
          *(_QWORD *)v4 = v12;
          goto LABEL_17;
        }
        if( (v9 & 2) != 0 )
        {
          CurrentThread = (void **)MiSwizzleInvalidPte(4i64 * ((unsigned __int8)v9 & 0xF8));
          v10 = (unsigned __int64)CurrentThread;
          if( v11 )
          {
            CurrentThread = (void **)KeGetCurrentThread();
            if( (*((_DWORD *)CurrentThread[23] + 543) & 0x1000) != 0 && (v10 & 1) != 0 )
            {
              LOBYTE(CurrentThread) = 0;
              v10 |= 0x8000000000000000ui64;
            }
          }
          *(_QWORD *)v4 = v10;
LABEL_16:
          ++*(_QWORD *)(a1 + 24);
          goto LABEL_17;
        }
        LODWORD(CurrentThread) = MiAssignNonPagedPoolPte(a1, (__int64)((v4 << 25) - ((_QWORD)PteBase << 25)) >> 16);
        if( (_DWORD)CurrentThread )
          goto LABEL_16;
LABEL_17:
        ++v3;
        if( *(_QWORD *)(a1 + 32) )
        {
          if( (v3 & 0xF) == 0 && *(_BYTE *)(a1 + 76) < 2u )
          {
            if( MiWorkingSetIsContended(*(_QWORD *)(a1 + 48))
              || (LODWORD(CurrentThread) = KeShouldYieldProcessor(), (_DWORD)CurrentThread) )
            {
              MiUnlockPoolCommitWs(a1);
              LOBYTE(CurrentThread) = MiLockPoolCommitWs(a1);
            }
          }
        }
        v4 = *(_QWORD *)(a1 + 32);
      }
      while( v4 );
    }
  }
  return(char)CurrentThread;
}

Referenced by:

MiCommitPoolMemory