MiZeroPageCalibrateIsr
ULONG_PTR __fastcall MiZeroPageCalibrateIsr(ULONG_PTR Argument){
struct _KPRCB *CurrentPrcb;
unsigned int v2;
__int64 v3;
__int64 v4;
unsigned int v5;
int v6;
__int64 v7;
__int64 v8;
__int64 v9;
__int64 v10;
_DWORD *MmInternal;
__int64 v12;
signed __int32 v13;
unsigned int v14;
signed __int32 v15;
unsigned int v16;
unsigned int *v17;
unsigned __int64 v18;
unsigned int v19;
unsigned __int64 v20;
unsigned int v21;
int v22;
ULONG_PTR result;
unsigned __int32 v24;
__int64 v25;
VOID *v26;
unsigned int v27;
unsigned __int16 v28;
_DWORD *v29;
unsigned int i;
__int64 v31;
signed __int32 v32;
unsigned int v33;
unsigned int v34;
_DWORD *v35;
UINT64 *v36;
__int128 v37;
__int64 v38;
UINT64 *v39;
__int64 v40;
signed __int32 v41[8];
__int64 v42;
struct _KPRCB *v43;
__int64 v44;
__int64 CurrentIrql;
UINT64 v46;
UINT64 SpinCount;
UINT64 v48;
UINT64 v49;
CurrentPrcb = KeGetCurrentPrcb();
v2 = 0;
v3 = *(_QWORD *)&Argument;
v4 = *(_QWORD *)(*(_QWORD *)&Argument + 72i64);
v5 = 0;
v42 = v4;
v43 = CurrentPrcb;
v6 = 1;
if( KeNumberNodes )
{
v7 = *(_QWORD *)(v4 + 16);
do
{
v8 = 4544i64 * v5;
if( CurrentPrcb->Group == *(_WORD *)(v8 + v7 + 4480)
&& (*(_QWORD *)(v8 + v7 + 4472) & CurrentPrcb->GroupSetMember) != 0 )
{
break;
}
++v5;
}
while( v5 < (unsigned __int16)KeNumberNodes );
v2 = 0;
}
v9 = *(_QWORD *)(v4 + 16) + 4544i64 * v5;
v44 = *(_QWORD *)(v9 + 4432);
*(_DWORD *)(v9 + 4440) = *(_DWORD *)(v44 + 128);
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
v10 = v44;
while( 1 )
{
MmInternal = CurrentPrcb->MmInternal;
v12 = *(_QWORD *)(v3 + 32) + 16i64 * (unsigned int)(*(_DWORD *)(v3 + 40) - 1);
LODWORD(SpinCount) = 0;
MmInternal[3121] = 0;
v13 = _InterlockedDecrement((volatile signed __int32 *)v3);
v14 = ~v13 & 0x80000000;
if( (v13 & 0x7FFFFFFF) != 0 )
{
while( (*(_DWORD *)v3 & 0x80000000) != v14 )
KeYieldProcessorEx(&SpinCount);
v2 = 0;
LODWORD(v48) = 0;
v15 = _InterlockedDecrement((volatile signed __int32 *)v3);
v16 = ~v15 & 0x80000000;
if( (v15 & 0x7FFFFFFF) == 0 )
{
*(_DWORD *)v3 = v16 | *(_DWORD *)(v3 + 4);
goto LABEL_23;
}
while( (*(_DWORD *)v3 & 0x80000000) != v16 )
KeYieldProcessorEx(&v48);
LABEL_22:
v2 = 0;
LABEL_23:
v4 = v42;
CurrentPrcb = v43;
goto LABEL_24;
}
*(_DWORD *)v3 = *(_DWORD *)(v3 + 4) | v14;
if( KeNumberNodes )
{
v17 = (unsigned int *)(*(_QWORD *)(v4 + 16) + 4440i64);
do
{
if( *v17 )
v18 = (*((_QWORD *)v17 - 3) / (unsigned __int64)*v17) & 0xFFFFFFFFFFFFF000ui64;
else
v18 = 0i64;
*((_QWORD *)v17 - 2) = v18;
++v2;
v19 = (unsigned __int16)KeNumberNodes;
v17[1] = 0;
v17 += 1136;
}
while( v2 < v19 );
}
v2 = 0;
*(_DWORD *)(v3 + 44) = 0;
v20 = __rdtsc();
*(_QWORD *)(v3 + 56) = ((unsigned __int64)HIDWORD(v20) << 32) | (unsigned int)v20;
_InterlockedOr(v41, 0);
LODWORD(v46) = 0;
LODWORD(v20) = _InterlockedDecrement((volatile signed __int32 *)v3);
v21 = ~(_DWORD)v20 & 0x80000000;
if( (v20 & 0x7FFFFFFF) != 0 )
{
while( (*(_DWORD *)v3 & 0x80000000) != v21 )
KeYieldProcessorEx(&v46);
goto LABEL_22;
}
*(_DWORD *)v3 = *(_DWORD *)(v3 + 4) | v21;
LABEL_24:
if( CurrentPrcb->Group == *(_WORD *)(v10 + 120) && (CurrentPrcb->GroupSetMember & *(_QWORD *)(v10 + 112)) != 0 )
{
v24 = _InterlockedIncrement((volatile signed __int32 *)(v9 + 4444));
if( v24 <= *(_DWORD *)(v9 + 4440) )
{
v25 = *(_QWORD *)(v9 + 4424);
v26 = (VOID *)(*(_QWORD *)(v9 + 4408) + v25 * (v24 - 1));
if( *(_DWORD *)(v3 + 48) == 1 )
KeZeroPages(v26, *(_QWORD *)(v9 + 4424));
else
memset(v26, 0i64, v25);
v32 = _InterlockedExchangeAdd((volatile signed __int32 *)(v9 + 4448), 1u);
v4 = v42;
v2 = 0;
if( v32 + 1 == *(_DWORD *)(v9 + 4440) )
{
_InterlockedOr(v41, 0);
*(_QWORD *)(16i64 * (unsigned int)(*(_DWORD *)(v9 + 4440) - 1)
+ *(_QWORD *)(v9 + 4384)
+ 8i64 * *(int *)(v3 + 48)) = __rdtsc() - *(_QWORD *)(v3 + 56);
*(_DWORD *)(v9 + 4448) = 0;
}
}
}
v22 = KeNumberProcessors_0;
if( _InterlockedIncrement((volatile signed __int32 *)(v3 + 44)) == v22 )
{
_InterlockedOr(v41, 0);
v27 = 0;
*(_QWORD *)(v12 + 8i64 * *(int *)(v3 + 48)) = __rdtsc() - *(_QWORD *)(v3 + 56);
v28 = KeNumberNodes;
if( KeNumberNodes )
{
v29 = (_DWORD *)(*(_QWORD *)(v4 + 16) + 4440i64);
do
{
if( *v29 )
{
--*v29;
--*(_DWORD *)(v3 + 40);
}
v28 = KeNumberNodes;
v29 += 1136;
++v27;
}
while( v27 < (unsigned __int16)KeNumberNodes );
}
if( !*(_DWORD *)(v3 + 40) )
{
if( *(_DWORD *)(v3 + 48) )
{
v36 = (UINT64 *)(v4 + 6368);
v37 = *(_OWORD *)(v3 + 8);
*(_QWORD *)(v3 + 64) = *(_QWORD *)(v4 + 6392);
v6 = 2;
v38 = *(_QWORD *)(v4 + 16);
*(_OWORD *)(v4 + 6368) = v37;
*(_OWORD *)(v4 + 6384) = *(_OWORD *)(v3 + 24);
if( v28 )
{
v39 = (UINT64 *)(v38 + 4360);
v40 = v28;
do
{
MiComputeOptimalWriteProcessors(v39);
v39 += 568;
--v40;
}
while( v40 );
}
MiComputeOptimalWriteProcessors(v36);
v4 = v42;
v2 = 0;
}
else
{
*(_DWORD *)(v3 + 48) = 1;
v33 = 0;
v34 = (unsigned __int16)KeNumberNodes;
*(_DWORD *)(v3 + 40) = *(_DWORD *)(v4 + 6404);
if( (_WORD)v34 )
{
v35 = (_DWORD *)(*(_QWORD *)(v4 + 16) + 4440i64);
do
{
++v33;
*v35 = *(v35 - 20);
v35 += 1136;
}
while( v33 < v34 );
}
}
}
for( i = 0; i < (unsigned int)KeNumberProcessors_0; *((_DWORD *)(*(&KiProcessorBlock + v31))->MmInternal + 3121) = v6 )
v31 = i++;
}
else
{
LODWORD(v49) = 0;
while( 1 )
{
v6 = MmInternal[3121];
if( v6 )
break;
KeYieldProcessorEx(&v49);
v2 = 0;
}
v4 = v42;
}
CurrentPrcb = v43;
if( v6 != 1 )
break;
v6 = 1;
}
result = (unsigned __int8)CurrentIrql;
__writecr8((unsigned __int8)CurrentIrql);
return result;
}Referenced by:
No references.