MiInitializeCacheFlushing
VOID __stdcall MiInitializeCacheFlushing(){
int v0;
UINT64 v1;
UINT64 v2;
unsigned __int64 v3;
_MMPFN *v4;
unsigned __int8 CurrentIrql;
__int64 v6;
unsigned __int64 v7;
unsigned __int64 v8;
__int64 v9;
unsigned int v10;
VOID *Pool;
size_t v12;
__int64 v13;
unsigned __int64 v14;
unsigned __int64 v15;
signed __int32 v16[8];
UINT64 SpinCount;
size_t Size[2];
__int128 v19;
__int128 v20;
v19 = 0i64;
v20 = 0i64;
ZwQuerySystemInformation();
if( v0 >= 0 && (BYTE8(v19) & 1) != 0 )
*(&stru_140C4DB30 + 248) = 1;
LODWORD(v1) = MiGetPage((ULONG_PTR *)&Irp.Core.PartitionId, 0i64, 0i64);
v2 = v1;
if( v1 != -1i64 )
{
v3 = 0i64;
v4 = &MmGetPfnDb()[v1];
MiFinalizePageAttribute(v4, MiCached, 0i64);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v6 = 4i64;
do
{
MiZeroPhysicalPage(v2, 1ui64, MiNonCached);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v4->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v4->u2._bf_0 < 0 );
}
*((_BYTE *)&v4->u3 + 2) &= 0x3Fu;
_InterlockedAnd64(&v4->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
*(_QWORD *)Size = __rdtsc();
_InterlockedOr(v16, 0);
MiFlushCacheForAttributeChange(v2, 1ui64, MiNonCached);
_InterlockedOr(v16, 0);
HIDWORD(SpinCount) = 0;
v7 = __rdtsc();
while( _interlockedbittestandset64((volatile signed __int32 *)&v4->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
while( v4->u2._bf_0 < 0 );
}
*((_BYTE *)&v4->u3 + 2) = *(_BYTE *)(&v4->u3 + 1) & 0x3F | 0x40;
_InterlockedAnd64(&v4->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
MiFlushEntireTbDueToAttributeChange();
v3 += v7 - *(_QWORD *)Size;
--v6;
}
while( v6 );
v8 = v3 >> 2;
v9 = 0i64;
if( v8 )
{
v10 = *(&stru_140C4DB30 + 58);
if( !*(&stru_140C4DB30 + 58) )
v10 = 256;
*(_QWORD *)Size = 3 * (v10 >> 2);
Pool = MiAllocatePool(64i64, *(UINT64 *)Size, 0x20206D4Dui64);
if( Pool )
{
v12 = Size[0];
v13 = 2i64;
do
{
memset(Pool, 0i64, v12);
v14 = __rdtsc();
_InterlockedOr(v16, 0);
++*(&stru_140C4DB30 + 69);
KeInvalidateAllCaches();
_InterlockedOr(v16, 0);
v15 = __rdtsc();
_InterlockedOr(v16, 0);
v9 += (((unsigned __int64)HIDWORD(v15) << 32) | (unsigned int)v15) - v14;
--v13;
}
while( v13 );
ExFreePoolWithTag(Pool, 0);
*(&stru_140C4DB30 + 71) = (v9 & 0xFFFFFFFFFFFFFFFEui64) / v8;
}
}
__writecr8(CurrentIrql);
MiReleaseFreshPage(v4);
}
}Referenced by:
MiInitSystem