MiSectionCreated
INT64 __fastcall MiSectionCreated(INT64 a1, INT64 a2, INT64 *a3){
INT64 *v3;
INT64 *v5;
INT64 v6;
unsigned __int64 v7;
_QWORD *v8;
_QWORD *v9;
INT64 *v10;
INT64 *v11;
__int64 v13;
unsigned int v14;
UINT64 v15;
UINT64 *v16;
unsigned __int64 v17;
INT64 v18;
UINT64 v19;
_MMPFN *PfnDb;
char *v21;
_MMPFN *v22;
__int16 v23;
bool v24;
__int64 v25;
unsigned int v26;
unsigned int v27;
int v28;
char SpinCount[12];
__int64 v30;
INT64 v31;
INT64 *v33;
UINT8 PageIrql;
v33 = a3;
v3 = (INT64 *)(a2 + 72);
PageIrql = 0;
v5 = a3;
v6 = a2;
v7 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(a2 + 72));
if( (*((_BYTE *)KeGetCurrentThread() + 1304) & 0x40) != 0 )
*(_DWORD *)(v6 + 56) |= 0x200u;
v8 = *(_QWORD **)(a1 + 40);
if( (*(_DWORD *)(v6 + 56) & 0x20) != 0 )
{
v9 = (_QWORD *)v8[2];
v10 = v9 + 9;
ExAcquireSpinLockExclusiveAtDpcLevel(v9 + 9);
v25 = v9[10];
v31 = 0i64;
*(_QWORD *)(v6 + 80) = v25;
}
else
{
v9 = (_QWORD *)*v8;
v10 = v9 + 9;
ExAcquireSpinLockExclusiveAtDpcLevel(v9 + 9);
v31 = v9[10];
}
*(_QWORD *)(v6 + 64) = v9[8];
ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&dword_140C4C6C0);
v11 = *(INT64 **)(a1 + 40);
if( (*(_DWORD *)(v6 + 56) & 0x20) != 0 )
{
v11[2] = v6;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C4C6C0);
ExReleaseSpinLockExclusiveFromDpcLevel(v10);
ExReleaseSpinLockExclusiveFromDpcLevel(v3);
__writecr8(v7);
v13 = *(_QWORD *)(v6 + 136);
v14 = *(_DWORD *)(v6 + 172);
v30 = v13;
v26 = v14;
while( 1 )
{
if( !v5 )
return v31;
if( (*((_BYTE *)v5 + 10) & 4) != 0 )
goto LABEL_29;
MmUnmapLockedPages((PVOID)v5[3], (PMDL)v5);
v16 = (UINT64 *)(v5 + 6);
v17 = 0i64;
v27 = *((_DWORD *)v5 + 4);
v15 = v27;
v28 = *((_DWORD *)v5 + 10) >> 12;
v18 = v13 + 8i64 * v27;
PageIrql = 17;
*(_QWORD *)&SpinCount[4] = 0i64;
if( !v28 )
goto LABEL_29;
do
{
v19 = *v16;
PfnDb = MmGetPfnDb();
v21 = (char *)PfnDb + 48 * *v16;
if( (unsigned int)v15 < v14 )
{
if( (v18 & 0xFFFFFFFFFFFFF000ui64) != v17 )
{
if( v17 )
{
LOBYTE(v15) = PageIrql;
MiUnlockProtoPoolPage(*(_MMPFN **)&SpinCount[4], v15);
}
while( 1 )
{
*(_QWORD *)&SpinCount[4] = MiLockProtoPoolPage((_MMPTE *)v18, &PageIrql);
if( *(_QWORD *)&SpinCount[4] )
break;
MmAccessFault(2ui64, (PVOID)v18, 0, 0i64);
}
v6 = a2;
v17 = v18 & 0xFFFFFFFFFFFFF000ui64;
}
v22 = MiLockLeafPage((_MMPTE *)v18, 0i64);
v23 = MI_READ_PTE_LOCK_FREE(v18);
if( v22 )
{
_InterlockedAnd64((volatile signed __int64 *)v22 + 3, 0x7FFFFFFFFFFFFFFFui64);
}
else if( (v23 & 0x400) != 0 )
{
*(_DWORD *)SpinCount = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v21 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)SpinCount);
while( *((__int64 *)v21 + 3) < 0 );
}
MiInitializeTransitionPfn(v19, (MMPTE *)v18);
_InterlockedAnd64((volatile signed __int64 *)v21 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( (*((_DWORD *)v21 + 4) & 0x400i64) != 0 )
MiReferenceControlAreaPfn((_CONTROL_AREA *)v6, 0i64, 1ui64);
goto LABEL_24;
}
MiReturnPfnReferenceCount((_MMPFN *)v21);
*v16 = -1i64;
LABEL_24:
v14 = v26;
goto LABEL_25;
}
MiReturnPfnReferenceCount((_MMPFN *)((char *)PfnDb + 48 * *v16));
*v16 = -1i64;
LABEL_25:
v18 += 8i64;
v15 = v27 + 1;
++v16;
v24 = v28-- == 1;
++v27;
}
while( !v24 );
v5 = v33;
if( v17 )
{
LOBYTE(v15) = PageIrql;
MiUnlockProtoPoolPage(*(_MMPFN **)&SpinCount[4], v15);
}
v13 = v30;
LABEL_29:
v5 = (INT64 *)*v5;
v33 = v5;
}
}
*v11 = v6;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C4C6C0);
ExReleaseSpinLockExclusiveFromDpcLevel(v10);
*(_DWORD *)(v6 + 56) &= ~2u;
ExReleaseSpinLockExclusiveFromDpcLevel(v3);
__writecr8(v7);
KeAbPostRelease(v11);
return v31;
}Referenced by:
No references.