MiUnmapRetpolineStubs

INT64 __fastcall MiUnmapRetpolineStubs(INT64 a1, INT64 a2){
  int v2; 
  char *v3; 
  INT64 AnyMultiplexedVm; 
  __int64 v5; 
  int v6; 
  INT64 v7; 
  unsigned __int64 v8; 
  __int64 v9; 
  char *v10; 
  __int64 v11; 
  UINT8 v12; 
  unsigned __int64 v13; 
  INT64 v14; 
  char WsleContents; 
  INT64 v16; 
  _MMPFN *PfnDb; 
  UINT64 ContainingPageTable; 
  UINT8 v20; 
  __int64 v21; 
  unsigned __int64 v22; 
  __int64 v23; 
  int result; 
  __int16 result_4; 
  int v26; 
  __int64 v27; 
  __int64 v28; 
  v2 = a2;
  memset((INT64)&result, 0i64);
  v3 = 0i64;
  if( v2 )
    AnyMultiplexedVm = (INT64)MiGetAnyMultiplexedVm(1i64);
  else
    AnyMultiplexedVm = MiGetSessionVm();
  v7 = AnyMultiplexedVm;
  v8 = v5 + ((((unsigned int)dword_140C4C9F0 >> 12) + v6 + ((dword_140C4C9F0 & 0xFFF) != 0)) << 12);
  v22 = v8;
  v9 = qword_140C4C990;
  v10 = (char *)MmGetPteBase() + ((v8 >> 9) & 0x7FFFFFFFF8i64);
  v23 = qword_140C4C990;
  result_4 = 0;
  v26 = 20;
  v27 = 0i64;
  v28 = 0i64;
  result = v2 == 0 ? 2 : 0;
  v11 = 0i64;
  v20 = MiLockWorkingSetShared(AnyMultiplexedVm);
  v12 = v20;
  if( dword_140C4C9C8 )
  {
    while( 1 )
    {
      v21 = *(_QWORD *)(v9 + 8 * v11 + 48);
      v13 = (unsigned __int64)&v10[8 * v11];
      if( !v3 )
        goto LABEL_8;
      if( (v13 & 0xFFF) == 0 )
        break;
LABEL_9:
      if( MI_READ_PTE_LOCK_FREE((INT64)&v10[8 * v11]) )
      {
        WsleContents = MiGetWsleContents(v14, v8 + (unsigned int)((_DWORD)v11 << 12));
        MiWriteWsle(v16, v8 + (unsigned int)((_DWORD)v11 << 12), WsleContents & 0xF0 | 0xA);
        *(_QWORD *)v13 = ZeroPte;
        MiInsertTbFlushEntry((INT64)&result, v8 + (unsigned int)((_DWORD)v11 << 12), 1i64, 0i64);
        PfnDb = MmGetPfnDb();
        MiLockAndDecrementShareCount((UINT64)PfnDb + 48 * v21, 0);
        ContainingPageTable = MiGetContainingPageTable((UINT64)&v10[8 * v11]);
        MiLockAndDecrementShareCount((UINT64)PfnDb + 48 * ContainingPageTable, 0);
        v8 = v22;
        v9 = v23;
      }
      v11 = (unsigned int)(v11 + 1);
      if( (unsigned int)v11 >= dword_140C4C9C8 )
      {
        v12 = v20;
        goto LABEL_13;
      }
    }
    MiFlushTbList((__int64)&result);
    MiUnlockPageTableInternal(v7, (UINT64)v3);
LABEL_8:
    v3 = (char *)MmGetPteBase() + ((v13 >> 9) & 0x7FFFFFFFF8i64);
    MiLockPageTableInternal(v7, (UINT64)v3, 0i64);
    goto LABEL_9;
  }
LABEL_13:
  MiFlushTbList((__int64)&result);
  if( v3 )
    MiUnlockPageTableInternal(v7, (UINT64)v3);
  return MiUnlockWorkingSetShared(v7, v12);
}

Referenced by:

MiUnloadSystemImage