MiUnmapRetpolineStubs
NTSTATUS __stdcall MiUnmapRetpolineStubs(INT64 a1, INT64 a2){
int v2;
INT64 v4;
char *v5;
VOID *v6;
_MMSUPPORT_INSTANCE *AnyMultiplexedVm;
__int64 v8;
int v9;
_MMSUPPORT_INSTANCE *v10;
unsigned __int64 v11;
__int64 v12;
char *v13;
__int64 v14;
char v15;
char v16;
unsigned __int64 *v17;
VOID *v18;
__int64 v19;
INT64 v20;
char WsleContents;
INT64 v22;
unsigned __int64 Long;
int v24;
_MMPFN *PfnDb;
__int64 v26;
UINT64 v27;
NTSTATUS result;
char v29;
__int64 v30;
unsigned __int64 v31;
__int64 v32;
_MI_TB_FLUSH_LIST TbFlushList[48];
v2 = a2;
memset(TbFlushList, 0i64, 0xB8u);
v5 = 0i64;
v6 = *(VOID **)(a1 + 48);
if( v2 )
AnyMultiplexedVm = MiGetAnyMultiplexedVm(MiWorkingSetTypeSystemViews, v6);
else
AnyMultiplexedVm = MiGetSessionVm(v4, (INT64)v6, *(_DWORD *)(a1 + 64) >> 12);
v10 = AnyMultiplexedVm;
v11 = v8 + ((((unsigned int)dword_140C4C9F0 >> 12) + v9 + ((dword_140C4C9F0 & 0xFFF) != 0)) << 12);
v31 = v11;
v12 = qword_140C4C990;
v13 = (char *)MmGetPteBase() + ((v11 >> 9) & 0x7FFFFFFFF8i64);
v32 = qword_140C4C990;
LOWORD(TbFlushList[1]) = 0;
TbFlushList[2] = 20;
*(_QWORD *)&TbFlushList[4] = 0i64;
*(_QWORD *)&TbFlushList[6] = 0i64;
TbFlushList[0] = v2 == 0 ? 2 : 0;
MiLockWorkingSetShared();
v14 = 0i64;
v29 = v15;
v16 = v15;
if( dword_140C4C9C8 )
{
while( 1 )
{
v30 = *(_QWORD *)(v12 + 8 * v14 + 48);
v17 = (unsigned __int64 *)&v13[8 * v14];
v18 = (VOID *)(v11 + (unsigned int)((_DWORD)v14 << 12));
if( !v5 )
goto LABEL_8;
if( ((unsigned __int16)v17 & 0xFFF) == 0 )
break;
LABEL_9:
LODWORD(v19) = MI_READ_PTE_LOCK_FREE((INT64)&v13[8 * v14]);
if( v19 )
{
WsleContents = MiGetWsleContents(v20, v11 + (unsigned int)((_DWORD)v14 << 12));
MiWriteWsle(v22, v11 + (unsigned int)((_DWORD)v14 << 12), WsleContents & 0xF0 | 0xA);
Long = ZeroPte.u.Long;
LOBYTE(v24) = MiPteInShadowRange((UINT64)&v13[8 * v14]);
if( v24 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
*v17 = Long;
MiInsertTbFlushEntry(TbFlushList, v18, 1ui64, 0i64);
PfnDb = MmGetPfnDb();
MiLockAndDecrementShareCount(&PfnDb[v30], 0i64);
LODWORD(v26) = MiGetContainingPageTable((UINT64)&v13[8 * v14]);
MiLockAndDecrementShareCount(&PfnDb[v26], 0i64);
v11 = v31;
v12 = v32;
}
v14 = (unsigned int)(v14 + 1);
if( (unsigned int)v14 >= dword_140C4C9C8 )
{
v16 = v29;
goto LABEL_17;
}
}
MiFlushTbList(TbFlushList);
MiUnlockPageTableInternal((INT64)v10, (UINT64)v5);
LABEL_8:
v5 = (char *)MmGetPteBase() + (((unsigned __int64)v17 >> 9) & 0x7FFFFFFFF8i64);
MiLockPageTableInternal((INT64)v10, (UINT64)v5, 0i64);
goto LABEL_9;
}
LABEL_17:
MiFlushTbList(TbFlushList);
if( v5 )
MiUnlockPageTableInternal((INT64)v10, (UINT64)v5);
LOBYTE(v27) = v16;
MiUnlockWorkingSetShared(v10, v27);
return result;
}Referenced by:
No references.