MiSetVadFlags
INT64 __fastcall MiSetVadFlags(INT64 a1, CHAR a2, CHAR a3){
unsigned __int8 CurrentIrql;
signed __int32 v7;
signed __int32 v8;
signed __int32 v9;
int v10;
int v11;
int v12;
int v13;
signed __int32 v14;
signed __int32 v15;
INT64 result;
UINT64 SpinCount;
LODWORD(SpinCount) = 0;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v7 = *(_DWORD *)(a1 + 48);
do
{
while( (v7 & 1) != 0 )
{
if( (v7 & 2) != 0 )
{
LODWORD(SpinCount) = 0;
do
{
KeYieldProcessorEx(&SpinCount);
v7 = *(_DWORD *)(a1 + 48);
}
while( (v7 & 1) != 0 );
}
else
{
v7 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 48), v7 | 2, v7);
}
}
v8 = v7;
v7 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 48), v7 & 0xFFFFFFFC | 1, v7);
}
while( v8 != v7 );
v9 = *(_DWORD *)(a1 + 48);
v10 = a2 & 1;
v11 = a2 & 2;
v12 = a2 & 4;
v13 = a3 & 1;
do
{
v14 = v9;
if( v10 )
{
v13 = a3 & 1;
v14 = v9 & 0xFFFFFFF7 | (8 * v13);
}
if( v11 )
v14 = (4 * v13) | v14 & 0xFFFFFFFB;
else
v13 = a3 & 1;
if( v12 )
v14 = v14 & 0xFFBFFFFF | (v13 << 22);
v15 = v9;
v9 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 48), v14, v9);
}
while( v15 != v9 );
_InterlockedAnd((volatile signed __int32 *)(a1 + 48), 0xFFFFFFFC);
result = CurrentIrql;
__writecr8(CurrentIrql);
return result;
}Referenced by:
MiAddSecureEntry
MiDeleteVad
MiRemoveSecureEntry
MiSetImageHotPatchAllowed