MiInitializeCacheFlushing
INT64 __stdcall MiInitializeCacheFlushing(){
INT64 result;
INT64 v1;
unsigned __int64 v2;
char *v3;
unsigned __int8 CurrentIrql;
__int64 v5;
INT64 v6;
unsigned __int64 v7;
_BYTE *v8;
unsigned __int64 v9;
unsigned __int64 v10;
__int64 v11;
unsigned int v12;
void *v13;
void *v14;
__int64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
signed __int32 v18[8];
UINT64 SpinCount;
size_t Size;
__int128 v21;
__int128 v22;
v21 = 0i64;
v22 = 0i64;
if( (int)ZwQuerySystemInformation() >= 0 && (BYTE8(v21) & 1) != 0 )
byte_140C4DC28 = 1;
result = MiGetPage((_MI_PARTITION *)&MiSystemPartition, 0i64, 0i64);
v1 = result;
if( result != -1 )
{
v2 = 0i64;
v3 = (char *)MmGetPfnDb() + 48 * result;
MiFinalizePageAttribute((_MMPFN *)v3, MiCached, 0i64);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v5 = 4i64;
do
{
MiZeroPhysicalPage(v1, 1ui64, MiNonCached);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v3 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v3 + 3) < 0 );
}
v3[34] &= 0x3Fu;
_InterlockedAnd64((volatile signed __int64 *)v3 + 3, 0x7FFFFFFFFFFFFFFFui64);
Size = __rdtsc();
_InterlockedOr(v18, 0);
MiFlushCacheForAttributeChange(v1, 1i64, 0i64);
_InterlockedOr(v18, 0);
v7 = __rdtsc();
v8 = (_BYTE *)((unsigned __int64)HIDWORD(v7) << 32);
HIDWORD(SpinCount) = 0;
v9 = v7;
while( _interlockedbittestandset64((volatile signed __int32 *)v3 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
while( *((__int64 *)v3 + 3) < 0 );
}
v3[34] = v3[34] & 0x3F | 0x40;
_InterlockedAnd64((volatile signed __int64 *)v3 + 3, 0x7FFFFFFFFFFFFFFFui64);
MiFlushEntireTbDueToAttributeChange(v6, v8);
v2 += v9 - Size;
--v5;
}
while( v5 );
v10 = v2 >> 2;
v11 = 0i64;
if( v10 )
{
v12 = dword_140C4DC18;
if( !dword_140C4DC18 )
v12 = 256;
Size = 3 * (v12 >> 2);
LODWORD(v13) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v14 = v13;
if( v13 )
{
v15 = 2i64;
do
{
memset((INT64)v14, 0i64);
v16 = __rdtsc();
_InterlockedOr(v18, 0);
++dword_140C4DC44;
KeInvalidateAllCaches();
_InterlockedOr(v18, 0);
v17 = __rdtsc();
_InterlockedOr(v18, 0);
v11 += (((unsigned __int64)HIDWORD(v17) << 32) | (unsigned int)v17) - v16;
--v15;
}
while( v15 );
ExFreePoolWithTag(v14, 0);
dword_140C4DC4C = (v11 & 0xFFFFFFFFFFFFFFFEui64) / v10;
}
}
__writecr8(CurrentIrql);
MiReleaseFreshPage((_MMPFN *)v3);
}
return result;
}Referenced by:
MiInitSystem