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 a5;
INT64 a6;
INT64 a7;
__int16 v18;
UINT64 SpinCount;
UINT64 v20;
__int64 v21;
__int64 v22;
LODWORD(v20) = 0;
KeGetCurrentIrql();
CurrentIrql = KeGetCurrentIrql();
v22 = CurrentIrql;
__writecr8(0xFui64);
v3 = v18;
_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(&v20);
}
else
{
*(_DWORD *)Argument = v7 | *((_DWORD *)Argument + 1);
v21 = *(_QWORD *)(v4 + 24);
v8 = 8 * ((KiSpeculationFeatures & 0x2000000) == 0);
if( (unsigned int)KeIsNmiCallbackRegistered() )
{
v9 = -1073741637;
goto LABEL_13;
}
v10 = 0;
v11 = (*(_DWORD *)(v4 + 40) >> 12) + ((*(_DWORD *)(v4 + 40) & 0xFFF) != 0);
if( v11 )
{
v12 = v21;
v13 = 56i64;
do
{
a5 = *((_QWORD *)Argument + 4);
a6 = *(_QWORD *)(v13 + a5);
if( a6
&& (*((_BYTE *)MmGetPteBase() + ((((unsigned __int64)(v10 << 12) + v12) >> 9) & 0x7FFFFFFFF8i64)) & 1) != 0 )
{
LODWORD(a7) = v8;
MiApplyRetpolineFixups((v10 << 12) + v12, a5, a6, v10 << 12, a5, a6, a7);
}
++v10;
v13 += 8i64;
}
while( v10 < v11 );
LOBYTE(CurrentIrql) = v22;
}
_InterlockedIncrement((volatile signed __int32 *)Argument + 2);
}
v9 = 0;
LABEL_13:
if( v5 )
_enable();
__writecr8((unsigned __int8)CurrentIrql);
return v9;
}Referenced by:
No references.