MiInitializePfn
VOID __fastcall MiInitializePfn(_RTL_BITMAP_EX *BitMapHeader, UINT64 *BitMapBuffer, UINT64 SizeOfBitMap){
char v3;
UINT64 v4;
char v6;
unsigned int v7;
INT64 v9;
__int64 v10;
unsigned __int64 v11;
unsigned int v12;
UINT64 v13;
_ETHREAD *CurrentThread;
char *v15;
unsigned int v16;
unsigned int v17;
unsigned __int8 v18;
unsigned __int8 v19;
unsigned __int64 *Buffer;
char v21;
UINT64 v22;
UINT64 v23;
UINT64 SpinCount;
v4 = *BitMapBuffer;
v6 = v3;
v7 = SizeOfBitMap;
if( (v3 & 4) != 0 )
{
v9 = 32 * (SizeOfBitMap & 0x1F);
if( v4 )
v4 = v9 | v4 & 0xFFFFFFFFFFFFFC1Fui64;
else
v4 = MiSwizzleInvalidPte(v9);
}
v10 = -9i64;
if( (v4 & 0x400) != 0 )
v10 = -2049i64;
v11 = v4 & v10;
BitMapHeader[1].SizeOfBitMap = v11;
if( (v6 & 2) != 0 )
{
BitMapHeader[2].Buffer = (unsigned __int64 *)((unsigned __int64)BitMapHeader[2].Buffer | 0x8000000000000000ui64);
}
else if( (v6 & 8) == 0 )
{
BitMapHeader->SizeOfBitMap &= 0xFFFFFFFFFFFFC00Fui64;
BitMapHeader[1].SizeOfBitMap = v11 & 0xFFFFFFFFFC00FFFFui64;
}
v12 = MiProtectionToCacheAttribute(v7);
LOWORD(BitMapHeader[2].SizeOfBitMap) = 1;
v23 = *(_QWORD *)((char *)MmGetPteBase() + (((unsigned __int64)BitMapBuffer >> 9) & 0x7FFFFFFFF8i64));
v13 = (v23 >> 12) & 0xFFFFFFFFFi64;
BitMapHeader[2].Buffer = (unsigned __int64 *)(v13 | (unsigned __int64)BitMapHeader[2].Buffer & 0xFFFFFFF000000000ui64);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v15 = (char *)MmGetPfnDb() + 48 * v13;
v16 = *((_DWORD *)CurrentThread + 326);
if( (v16 & 0x100) != 0 )
v17 = v16 >> 9;
else
LOBYTE(v17) = PsGetPagePriorityThread((__int64)CurrentThread);
v18 = 17;
if( (v6 & 1) == 0 )
{
if( (v6 & 0x10) != 0 )
{
LODWORD(SpinCount) = v6 & 1;
while( _interlockedbittestandset64((volatile signed __int32 *)&BitMapHeader[1].Buffer, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( (__int64)BitMapHeader[1].Buffer < 0 );
}
}
else
{
v18 = MiLockPageInline((INT64)BitMapHeader);
}
}
LODWORD(v22) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v15 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v22);
while( *((__int64 *)v15 + 3) < 0 );
}
*((_QWORD *)v15 + 3) ^= ((*((_QWORD *)v15 + 3) + 1i64) ^ *((_QWORD *)v15 + 3)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)v15 + 3, 0x7FFFFFFFFFFFFFFFui64);
v19 = BYTE2(BitMapHeader[2].SizeOfBitMap);
if( v19 >> 6 != v12 )
{
MiChangePageAttribute((INT64)BitMapHeader, v12, 1);
v19 = BYTE2(BitMapHeader[2].SizeOfBitMap);
}
Buffer = BitMapHeader[1].Buffer;
v21 = v19 & 0xF8 | 6;
BitMapHeader->Buffer = BitMapBuffer;
BitMapHeader[1].Buffer = (unsigned __int64 *)((unsigned __int64)Buffer & 0xC000000000000000ui64 | 1);
BYTE3(BitMapHeader[2].SizeOfBitMap) ^= (v17 ^ BYTE3(BitMapHeader[2].SizeOfBitMap)) & 7;
BYTE2(BitMapHeader[2].SizeOfBitMap) = v21;
if( (v6 & 0x20) == 0 )
BYTE2(BitMapHeader[2].SizeOfBitMap) = v21 | 0x10;
if( (v6 & 0x40) != 0 )
BYTE3(BitMapHeader[2].SizeOfBitMap) |= 0x20u;
if( (v6 & 1) == 0 )
{
_InterlockedAnd64((volatile signed __int64 *)&BitMapHeader[1].Buffer, 0x7FFFFFFFFFFFFFFFui64);
if( (v6 & 0x10) == 0 )
__writecr8(v18);
}
}Referenced by:
MiCreateSharedZeroPages
MiInitializeProtoPfn
MiMapNewSession
MmAllocateIndependentPagesEx
MmCheckCachedPageStates