MiSetVadFlags
NTSTATUS __stdcall MiSetVadFlags(_MI_PARTITION *Partition, UINT64 Color, INT16 a3){
char v3;
char v4;
unsigned __int8 CurrentIrql;
signed __int32 Flink;
signed __int32 v8;
signed __int32 v9;
int v10;
int v11;
int v12;
int v13;
signed __int32 v14;
signed __int32 v15;
NTSTATUS result;
UINT64 SpinCount;
v3 = a3;
LODWORD(SpinCount) = 0;
v4 = Color;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
Flink = (signed __int32)Partition->Core.PfnUnmapWorkItem.List.Flink;
do
{
while( (Flink & 1) != 0 )
{
if( (Flink & 2) != 0 )
{
LODWORD(SpinCount) = 0;
do
{
KeYieldProcessorEx(&SpinCount);
Flink = (signed __int32)Partition->Core.PfnUnmapWorkItem.List.Flink;
}
while( (Flink & 1) != 0 );
}
else
{
Flink = _InterlockedCompareExchange(
(volatile signed __int32 *)&Partition->Core.PfnUnmapWorkItem,
Flink | 2,
Flink);
}
}
v8 = Flink;
Flink = _InterlockedCompareExchange(
(volatile signed __int32 *)&Partition->Core.PfnUnmapWorkItem,
Flink & 0xFFFFFFFC | 1,
Flink);
}
while( v8 != Flink );
v9 = (signed __int32)Partition->Core.PfnUnmapWorkItem.List.Flink;
v10 = v4 & 1;
v11 = v4 & 2;
v12 = v4 & 4;
v13 = v3 & 1;
do
{
v14 = v9;
if( v10 )
{
v13 = v3 & 1;
v14 = v9 & 0xFFFFFFF7 | (8 * v13);
}
if( v11 )
v14 = (4 * v13) | v14 & 0xFFFFFFFB;
else
v13 = v3 & 1;
if( v12 )
v14 = v14 & 0xFFBFFFFF | (v13 << 22);
v15 = v9;
v9 = _InterlockedCompareExchange((volatile signed __int32 *)&Partition->Core.PfnUnmapWorkItem, v14, v9);
}
while( v15 != v9 );
_InterlockedAnd((volatile signed __int32 *)&Partition->Core.PfnUnmapWorkItem, 0xFFFFFFFC);
result = CurrentIrql;
__writecr8(CurrentIrql);
return result;
}Referenced by:
MiAddSecureEntry
MiDeleteVad
MiRemoveSecureEntry
MiSetImageHotPatchAllowed