MiRestoreTransitionPte
VOID __stdcall MiRestoreTransitionPte(_MMPFN *Pfn1, UINT64 RepurposingFlags){
char v2;
_QWORD *v4;
BOOL IsPfnFileOnly;
UNICODE_STRING *v6;
UINT8 v7;
PWCHAR v8;
int v9;
_MMPFN *PfnDb;
__int64 v11;
unsigned __int64 v12;
UINT64 TopLevelPfn;
unsigned __int64 v14;
__int64 v15;
UINT8 *v16;
UINT8 v17;
WCHAR *v18;
volatile signed __int64 *v19;
__int64 v20;
int v21;
UINT64 v22;
__int64 v23;
WORK_QUEUE_TYPE v24;
void *v25;
unsigned __int64 v26;
unsigned __int64 v27;
_BYTE LockHandle[72];
UINT64 v29;
memset(LockHandle, 0, 24);
v2 = RepurposingFlags;
v4 = 0i64;
IsPfnFileOnly = MiIsPfnFileOnly((INT64)Pfn1);
MiClearPfnImageVerified((UINT64)Pfn1, 12);
LOBYTE(v9) = MI_PFN_IS_PROTO((UNICODE_STRING *)Pfn1, v6, v7, v8);
PfnDb = MmGetPfnDb();
if( v9 )
{
if( (*((_QWORD *)Pfn1 + 5) & 0x1000000000i64) != 0 || (v11 = *((_QWORD *)Pfn1 + 1), v11 <= 0) )
{
v12 = *((_QWORD *)Pfn1 + 5);
if( (*((_DWORD *)Pfn1 + 4) & 0x400i64) == 0
&& !(unsigned int)MiGetPagingFileOffset((MMPTE *)((char *)Pfn1 + 16))
&& MI_IS_RESET_PTE(*((_QWORD *)Pfn1 + 2)) )
{
MI_CLEAR_RESET_PTE((MMPTE *)((char *)Pfn1 + 16));
v12 = *((_QWORD *)Pfn1 + 5);
}
}
else
{
v12 = *((_QWORD *)Pfn1 + 5);
*((_QWORD *)Pfn1 + 1) = v11 | 0x8000000000000000ui64;
}
}
else
{
if( (*((_DWORD *)Pfn1 + 4) & 4) == 0 )
{
if( MI_IS_RESET_PTE(*((_QWORD *)Pfn1 + 2)) )
MI_CLEAR_RESET_PTE((MMPTE *)((char *)Pfn1 + 16));
TopLevelPfn = MiGetTopLevelPfn((UINT64)Pfn1);
v14 = (*(_QWORD *)TopLevelPfn >> 13) & 0x7FFFFFFFFFF0i64 | 0xFFFF800000000000ui64;
if( (_MMPFN *)TopLevelPfn != Pfn1 )
_InterlockedAnd64((volatile signed __int64 *)(TopLevelPfn + 24), 0x7FFFFFFFFFFFFFFFui64);
_InterlockedExchangeAdd64((volatile signed __int64 *)(v14 + 1272), 0xFFFFFFFFFFFFFFFFui64);
if( (*(_BYTE *)(v14 + 1851) & 0x60) == 64 )
_InterlockedIncrement64((volatile signed __int64 *)(v14 + 1872));
}
v12 = *((_QWORD *)Pfn1 + 5);
if( (v12 & 0xFFFFFFFFFi64) == (Pfn1 - PfnDb) / 48 )
v4 = (_QWORD *)(*((_QWORD *)Pfn1 + 1) | 0x8000000000000000ui64);
}
v15 = *(_QWORD *)(qword_140C4E388 + 8 * ((v12 >> 39) & 0x3FF));
v29 = *((_QWORD *)Pfn1 + 2);
MiSetNonResidentPteHeat(&v29, 0i64);
if( v4 )
{
v19 = 0i64;
}
else
{
v19 = (volatile signed __int64 *)((char *)MmGetPfnDb() + 48 * (v12 & 0xFFFFFFFFFi64));
LODWORD(v20) = MiMapPageInHyperSpaceWorker(v12 & 0xFFFFFFFFFi64, v16, 0x80000000ui64);
v4 = (_QWORD *)(v20 + 8i64 * ((*((_DWORD *)Pfn1 + 2) >> 3) & 0x1FF));
}
*v4 = v29;
if( v19 )
MiUnmapPageInHyperSpaceWorker(v4, 0x11u, 0x80000000ui64);
LOBYTE(v21) = MI_PFN_IS_PROTO((UNICODE_STRING *)Pfn1, (UNICODE_STRING *)v16, v17, v18);
if( v21 )
{
v23 = *((_QWORD *)Pfn1 + 2);
if( (v23 & 0x400) != 0 )
{
if( qword_140C4DC80 && (v23 & 0x10) == 0 )
v23 &= ~qword_140C4DC80;
MiDereferenceControlAreaPfnList(*(_CONTROL_AREA **)(v23 >> 16), (_SUBSECTION *)(v23 >> 16), v22, 3ui64);
}
}
if( v19 )
{
MiLockNestedPageAtDpcInline((INT64)v19);
MiDecrementShareCount((UINT64)v19);
_InterlockedAnd64(v19 + 3, 0x7FFFFFFFFFFFFFFFui64);
}
if( !IsPfnFileOnly )
{
*((_QWORD *)Pfn1 + 5) &= 0x8FFFFFFFFFFFFFFFui64;
if( (v2 & 1) != 0 )
{
*((_BYTE *)Pfn1 + 35) &= 0xF8u;
}
else
{
_InterlockedIncrement((volatile signed __int32 *)(v15 + 4i64 * (unsigned int)MiGetPfnPriority((INT64)Pfn1) + 4280));
*((_BYTE *)Pfn1 + 35) &= 0xF8u;
if( P )
{
*(_QWORD *)LockHandle = 0i64;
*(_QWORD *)&LockHandle[8] = &qword_140C4E580;
KxAcquireQueuedSpinLock((PIO_WORKITEM)LockHandle, (PIO_WORKITEM_ROUTINE)&qword_140C4E580, v24, v25);
v26 = (unsigned __int64)P;
if( !P )
goto LABEL_44;
v27 = (__int64)P[2].Next & 0xFFF;
if( ((__int64)P[2].Next & 0xFFF) != 0 )
{
P[2].Next->Next = (_SLIST_ENTRY *)((Pfn1 - MmGetPfnDb()) / 48);
*(_QWORD *)(v26 + 32) += 8i64;
v27 = *(_QWORD *)(v26 + 32) & 0xFFFi64;
}
if( v27 < 0xC00 )
{
if( v27 )
v26 = 0i64;
else
*(_QWORD *)(v26 + 24) = KUSER_SHARED_DATA.TickCountQuad;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
}
else
{
LABEL_44:
v26 = (unsigned int)dword_140C4E568;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
}
}
else
{
v26 = (unsigned int)dword_140C4E568;
}
if( v26 )
KeInsertQueueDpc(&stru_140C4E708, 0i64, 0i64);
}
}
}Referenced by:
MiDiscardTransitionPteEx
MiHandleInPageError
MiInsertPageInList
MiRelinkStandbyPage
MiRemoveLowestPriorityStandbyPage
MiReuseStandbyPage
MiWriteCompletePfn