MiMapMemoryDumpMdl
CHAR __stdcall MiMapMemoryDumpMdl(UINT64 a1, INT64 a2, INT64 a3, CHAR a4){
__int64 v6;
__int64 v7;
char *v8;
_XSTATE_CONFIGURATION *v9;
__int64 v10;
__int64 v11;
_XSTATE_CONFIGURATION *v12;
__int64 v13;
unsigned int v14;
unsigned __int64 CurrentThread;
__int64 v16;
UINT64 v17;
INT64 v18;
int v19;
unsigned __int64 v20;
unsigned __int64 v21;
int v22;
bool v23;
_XSTATE_CONFIGURATION *v26;
_MI_TB_FLUSH_LIST TbFlushList[48];
memset(TbFlushList, 0i64, 0xB8u);
v6 = *(unsigned int *)(a3 + 44);
v7 = ((unsigned int)(v6 + *(_DWORD *)(a3 + 40)) >> 12) + ((((_DWORD)v6 + *(_DWORD *)(a3 + 40)) & 0xFFF) != 0);
TbFlushList[2] = 20;
v26 = (_XSTATE_CONFIGURATION *)((char *)MmGetPteBase() + ((a1 >> 9) & 0x7FFFFFFFF8i64));
*(_QWORD *)(a3 + 24) = a1 + v6;
v8 = (char *)(a1 & 0xFFFFFFFFFFFFF000ui64);
LOBYTE(TbFlushList[1]) = 3;
*(_QWORD *)&TbFlushList[6] = 0i64;
v9 = v26;
do
{
LODWORD(v10) = MI_READ_PTE_LOCK_FREE((INT64)v9);
v11 = v10;
if( (v10 & 1) != 0 )
MiInsertTbFlushEntry(TbFlushList, v8, 1ui64, 0i64);
if( v11 )
{
MiPteInShadowRange((UINT64)v9);
v9->EnabledFeatures = 0i64;
}
v9 = (_XSTATE_CONFIGURATION *)((char *)v9 + 8);
v8 += 4096;
--v7;
}
while( v7 );
v12 = v26;
if( TbFlushList[3] )
MiFlushTbList(TbFlushList);
v13 = *(unsigned int *)(a3 + 44);
v14 = v13 + *(_DWORD *)(a3 + 40);
CurrentThread = (v14 & 0xFFF) != 0;
*(_QWORD *)(a3 + 24) = a1 + v13;
v16 = (v14 >> 12) + (unsigned int)CurrentThread;
if( (a4 & 2) != 0 )
{
*(_WORD *)(a3 + 10) &= 0xFFDEu;
return CurrentThread;
}
v17 = a3 - ((a1 >> 9) & 0x7FFFFFFFF8i64) - (_QWORD)MmGetPteBase();
do
{
v18 = *(INT64 *)((char *)&v12->Features[3] + v17);
v19 = 4;
if( (a4 & 1) == 0 )
MiMakeProtectionPfnCompatible((_BYTE *)4, &MmGetPfnDb()[v18]);
LODWORD(v20) = MiMakeValidPte(v12, v18, v19 | 0xA0000000);
v21 = v20;
v22 = 0;
LOBYTE(CurrentThread) = MiPteInShadowRange((UINT64)v12);
if( (_DWORD)CurrentThread )
{
LODWORD(CurrentThread) = MiPteHasShadow();
if( (_DWORD)CurrentThread )
{
v22 = 1;
if( *(&stru_140C4DB30 + 537) )
goto LABEL_14;
v23 = (v21 & 1) == 0;
}
else
{
CurrentThread = (unsigned __int64)KeGetCurrentThread();
if( (*(_DWORD *)(*(_QWORD *)(CurrentThread + 184) + 2172i64) & 0x1000) == 0 )
goto LABEL_14;
v23 = (v21 & 1) == 0;
}
if( !v23 )
v21 |= 0x8000000000000000ui64;
}
LABEL_14:
v12->EnabledFeatures = v21;
if( v22 )
LOBYTE(CurrentThread) = MiWritePteShadow();
v12 = (_XSTATE_CONFIGURATION *)((char *)v12 + 8);
--v16;
}
while( v16 );
*(_WORD *)(a3 + 10) |= 0x11u;
return CurrentThread;
}Referenced by:
MmMapMemoryDumpMdl
MmMapMemoryDumpMdlEx
MmMapMemoryDumpMdlEx2