MmRemoveImportOptimizationWorker
NTSTATUS __stdcall MmRemoveImportOptimizationWorker(PVOID Argument){
__int64 CurrentIrql;
__int16 v3;
__int64 v4;
bool v5;
signed __int32 v6;
unsigned int v7;
int v8;
NTSTATUS v9;
unsigned int v10;
unsigned int v11;
__int64 v12;
__int64 v13;
__int64 v14;
__int64 v15;
__int16 v17;
UINT64 SpinCount;
UINT64 v19;
__int64 v20;
__int64 v21;
LODWORD(v19) = 0;
KeGetCurrentIrql();
CurrentIrql = KeGetCurrentIrql();
v21 = CurrentIrql;
__writecr8(0xFui64);
v3 = v17;
_disable();
v4 = *((_QWORD *)Argument + 3);
v5 = (v3 & 0x200) != 0;
LODWORD(SpinCount) = 0;
v6 = _InterlockedDecrement((volatile signed __int32 *)Argument);
v7 = ~v6 & 0x80000000;
if( (v6 & 0x7FFFFFFF) != 0 )
{
while( (*(_DWORD *)Argument & 0x80000000) != v7 )
KeYieldProcessorEx(&SpinCount);
while( *((_DWORD *)Argument + 2) )
KeYieldProcessorEx(&v19);
}
else
{
*(_DWORD *)Argument = v7 | *((_DWORD *)Argument + 1);
v20 = *(_QWORD *)(v4 + 24);
v8 = 8 * ((KiSpeculationFeatures & 0x2000000) == 0);
if( KeIsNmiCallbackRegistered() )
{
v9 = -1073741637;
goto LABEL_13;
}
v10 = 0;
v11 = (*(_DWORD *)(v4 + 40) >> 12) + ((*(_DWORD *)(v4 + 40) & 0xFFF) != 0);
if( v11 )
{
v12 = v20;
v13 = 56i64;
do
{
v14 = *((_QWORD *)Argument + 4);
v15 = *(_QWORD *)(v13 + v14);
if( v15
&& (*((_BYTE *)&MmGetPteBase()->u.Long + ((((unsigned __int64)(v10 << 12) + v12) >> 9) & 0x7FFFFFFFF8i64)) & 1) != 0 )
{
MiApplyRetpolineFixups((v10 << 12) + v12, v14, v15, v10 << 12, v14, v15, v8);
}
++v10;
v13 += 8i64;
}
while( v10 < v11 );
LOBYTE(CurrentIrql) = v21;
}
_InterlockedIncrement((volatile signed __int32 *)Argument + 2);
}
v9 = 0;
LABEL_13:
if( v5 )
_enable();
__writecr8((unsigned __int8)CurrentIrql);
return v9;
}Referenced by:
No references.