MiInitializeReadInProgressPfn
char __fastcall MiInitializeReadInProgressPfn(
unsigned __int64 a1,
_QWORD *a2,
int a3,
__int64 *a4,
__int64 a5,
char a6){
unsigned __int64 v6;
_QWORD *v7;
unsigned __int64 v8;
char *v9;
unsigned __int64 v10;
unsigned __int64 Pml4eBase;
_MMPFN *PfnDb;
unsigned __int64 PxeUserLimit;
INT64 v14;
UINT64 v15;
unsigned __int64 v16;
bool v17;
int v18;
unsigned __int64 v19;
__int64 v20;
unsigned __int64 v21;
unsigned __int64 v22;
__int64 Address;
char v24;
unsigned int v25;
__int64 v26;
unsigned __int8 CurrentIrql;
__int64 v28;
unsigned __int8 v29;
unsigned __int64 v30;
__int64 v31;
int v33;
UINT64 SpinCount;
INT64 v35;
unsigned __int64 v36;
unsigned __int64 v37;
_QWORD *v39;
__int64 *v40;
v40 = a4;
v39 = a2;
v6 = (unsigned __int64)a4;
v7 = a2;
v8 = a1;
v9 = 0i64;
v10 = 0xFFFFFFFFFi64;
Pml4eBase = (unsigned __int64)&a2[a3];
v37 = Pml4eBase;
if( (unsigned __int64)a2 < Pml4eBase )
{
PfnDb = MmGetPfnDb();
PxeUserLimit = (unsigned __int64)MmGetPxeUserLimit();
while( 1 )
{
LOBYTE(Pml4eBase) = (_BYTE)PfnDb;
v14 = (INT64)PfnDb + 48 * *v7;
if( v14 != qword_140C4EAB0 )
break;
LABEL_70:
v6 += 8i64;
v7 = v39 + 1;
v40 = (__int64 *)v6;
v39 = v7;
if( (unsigned __int64)v7 >= v37 )
return Pml4eBase;
}
v15 = *(_QWORD *)v6;
v35 = v15;
v16 = v15;
v17 = (a6 & 0x40) != 0;
LOBYTE(v33) = 0;
v18 = 0;
if( (a6 & 0x40) != 0 )
{
if( MiIsPrototypePteVadLookup(v15) )
{
v19 = v15;
}
else
{
v20 = v15;
if( qword_140C4DC80 && (v15 & 0x10) == 0 )
v20 = v15 & ~qword_140C4DC80;
v35 = MI_READ_PTE_LOCK_FREE(v20 >> 16);
v21 = MI_READ_PTE_LOCK_FREE((INT64)&v35);
v19 = MI_READ_PTE_LOCK_FREE((INT64)MmGetPfnDb() + 48 * ((v21 >> 12) & 0xFFFFFFFFFi64) + 16);
}
v33 = MmMakeProtectNotWriteCopy[(v19 >> 5) & 0x1F];
v16 = MiSwizzleInvalidPte(32i64 * (v33 & 0x1F));
}
else
{
v22 = v15;
if( (v15 & 0x400) != 0 || (v15 & 0x800) == 0 )
goto LABEL_19;
if( qword_140C4DC80 && (v15 & 0x10) == 0 )
v16 = v15 & ~qword_140C4DC80;
v16 = *((_QWORD *)MmGetPfnDb() + 6 * ((v16 >> 12) & 0xFFFFFFFFFi64) + 2);
}
v22 = v16;
v35 = v16;
LABEL_19:
*(_QWORD *)(v14 + 16) = v16;
if( v17 )
{
LODWORD(Address) = v18;
}
else
{
if( (a6 & 0x10) == 0
|| (*(_QWORD *)(v14 + 40) |= 0x8000000000000000ui64, &v35 < (INT64 *)MmGetPml4eBase())
|| (unsigned __int64)&v35 > PxeUserLimit )
{
PxeUserLimit = v22;
}
v33 = (PxeUserLimit >> 5) & 0x1F;
Address = (PxeUserLimit >> 5) & 0x1F;
if( v33 == 24 )
{
LOBYTE(v33) = 24;
if( v8 <= 0x7FFFFFFEFFFFi64 )
{
Address = (__int64)MiLocateAddress(v8);
LOBYTE(v33) = v24;
LODWORD(Address) = (*(_DWORD *)(Address + 48) >> 7) & 0x1F;
}
}
}
if( (_DWORD)Address )
{
if( (_DWORD)Address == 31 )
{
v25 = 1;
}
else if( (unsigned int)Address >> 3 == 3 && (Address & 7) != 0 )
{
v25 = 2;
}
else
{
v25 = (unsigned int)Address >> 3 != 1;
}
}
else
{
v25 = 3;
}
if( v10 == 0xFFFFFFFFFi64 )
{
v36 = *(_QWORD *)((char *)MmGetPteBase() + ((v6 >> 9) & 0x7FFFFFFFF8i64));
v10 = (v36 >> 12) & 0xFFFFFFFFFi64;
v9 = (char *)MmGetPfnDb() + 48 * v10;
}
v26 = v6;
if( (a6 & 0x20) != 0 )
v26 = v6 & 0x7FFFFFFFFFFFFFFFi64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v14 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)(v14 + 24) < 0 );
}
*(_BYTE *)(v14 + 34) |= 0x20u;
v28 = a5;
if( a5 )
v28 = a5 + 32;
*(_QWORD *)v14 = v28;
v29 = *(_BYTE *)(v14 + 34);
if( v29 >> 6 != v25 )
{
MiChangePageAttribute(v14, v25, 1);
v29 = *(_BYTE *)(v14 + 34);
}
*(_QWORD *)(v14 + 24) &= 0xC000000000000000ui64;
*(_WORD *)(v14 + 32) = 1;
if( (a6 & 8) != 0 )
*(_BYTE *)(v14 + 35) ^= (*(_BYTE *)(v14 + 35) ^ a6) & 7;
v30 = v10 ^ *(_QWORD *)(v14 + 40);
*(_QWORD *)(v14 + 8) = v26;
*(_QWORD *)(v14 + 40) ^= v30 & 0xFFFFFFFFFi64;
*(_BYTE *)(v14 + 34) = v29 & 0xF8 | 2;
if( a6 < 0 )
*(_BYTE *)(v14 + 35) |= 0x20u;
_InterlockedAnd64((volatile signed __int64 *)(v14 + 24), 0x7FFFFFFFFFFFFFFFui64);
LOBYTE(Pml4eBase) = CurrentIrql;
__writecr8(CurrentIrql);
if( (v15 & 0x400) == 0 && (v15 & 0x800) != 0 )
{
v6 = (unsigned __int64)v40;
}
else
{
v31 = 32 * (((*v39 & 0xFFFFFFFFFi64) << 7) | v33 & 0x1F | 0x40);
if( qword_140C4DC80 )
{
if( (qword_140C4DC80 & v31) != 0 )
v31 |= 0x10ui64;
else
v31 |= qword_140C4DC80;
}
Pml4eBase = (unsigned __int64)MmGetPml4eBase();
v6 = (unsigned __int64)v40;
if( (unsigned __int64)v40 >= Pml4eBase )
{
Pml4eBase = (unsigned __int64)MmGetPxeUserLimit();
if( (unsigned __int64)v40 <= Pml4eBase )
{
Pml4eBase = (unsigned __int64)KeGetCurrentThread();
if( (*(_DWORD *)(*(_QWORD *)(Pml4eBase + 184) + 2172i64) & 0x1000) != 0 && (v31 & 1) != 0 )
{
LOBYTE(Pml4eBase) = 0;
v31 |= 0x8000000000000000ui64;
}
}
}
*v40 = v31;
}
if( (a6 & 0x40) == 0 )
{
HIDWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v9 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
while( *((__int64 *)v9 + 3) < 0 );
}
Pml4eBase = *((_QWORD *)v9 + 3);
*((_QWORD *)v9 + 3) = Pml4eBase ^ (Pml4eBase ^ (Pml4eBase + 1)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)v9 + 3, 0x7FFFFFFFFFFFFFFFui64);
v6 = (unsigned __int64)v40;
}
v8 = a1;
PfnDb = MmGetPfnDb();
PxeUserLimit = (unsigned __int64)MmGetPxeUserLimit();
goto LABEL_70;
}
return Pml4eBase;
}Referenced by:
MiPfPutPagesInTransition
MiPrivateFixup
MiResolvePageFileFault