MiMakeOutswappedPageResident
UINT64 __fastcall MiMakeOutswappedPageResident(__int64 a1, __int64 a2, __int64 a3, __int64 a4, INT64 a5){
__int64 v6;
_QWORD *v7;
_MMPFN *PfnDb;
unsigned __int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
__int64 v12;
UINT64 v13;
unsigned __int64 v14;
char v15;
unsigned __int64 v16;
UINT64 v17;
INT64 v18;
signed __int32 v19;
unsigned int v20;
UINT64 Page;
UINT64 v22;
UINT64 v23;
char *v24;
MMPTE *PxeSelfRef;
MMPTE *v26;
_MMPTE *PteBase;
__int64 v28;
__int64 v29;
int IsPteInStore;
int v31;
unsigned int v32;
__int64 v33;
unsigned int PagingFileOffset;
char EntireFlags;
__int64 v36;
int v37;
int v38;
unsigned __int8 v39;
int Status;
unsigned __int8 v41;
UINT64 v42;
unsigned __int64 v43;
INT64 v44;
char v45;
INT64 v46;
UINT64 ValidPte;
PLARGE_INTEGER Timeout;
PLARGE_INTEGER Timeouta;
UINT64 Flags;
PVOID IoAttributionContext;
INT64 v53;
_MI_STORE_INPAGE_COMPLETE_FLAGS OutFlags[2];
_MI_PARTITION *Partition;
INT64 a12;
__int128 a12_8;
void *v58;
_QWORD *v59;
ULONG_PTR BugCheckParameter2[4];
struct _KEVENT Event;
IO_STATUS_BLOCK IoStatusBlock;
ULONG_PTR BugCheckParameter4[11];
int v64;
int v65;
struct _MDL MemoryDescriptorList;
__int64 v67;
OutFlags[0].EntireFlags = 0;
LOBYTE(OutFlags[1].EntireFlags) = 0;
a12_8 = 0i64;
memset((INT64)BugCheckParameter2, 0i64);
v6 = *(unsigned __int16 *)(a1 + 1838);
v7 = (_QWORD *)(a1 + 1432);
v59 = (_QWORD *)(a1 + 1432);
Partition = *(_MI_PARTITION **)(qword_140C4E388 + 8 * v6);
while( 2 )
{
PfnDb = MmGetPfnDb();
do
{
do
v9 = MI_READ_PTE_LOCK_FREE((INT64)v7);
while( !MiInvalidPteConforms(v9) );
if( (v10 & 0x800) == 0 )
{
MiInitializePageColorBase(0i64, (unsigned int)a5, (INT64)&a12_8);
v19 = _InterlockedExchangeAdd((volatile signed __int32 *)a12_8, 1u);
v20 = DWORD2(a12_8) & v19 | HIDWORD(a12_8);
while( 1 )
{
Page = MiGetPage(Partition, v20, 0x200ui64);
v12 = Page;
if( Page != -1i64 )
break;
MiWaitForFreePage(Partition, v22);
}
v24 = (char *)MmGetPfnDb() + 48 * Page;
*v7 = MiMakeTransitionPte(Page, (v9 >> 5) & 0x1F, v23);
PxeSelfRef = MmGetPxeSelfRef();
MiInitializePfnForOtherProcess(v12, PxeSelfRef, v12, 0xA00ui64);
v26 = (MMPTE *)(v24 + 16);
*((_QWORD *)v24 + 2) = v9;
PteBase = MmGetPteBase();
*((_WORD *)&OutFlags[1].1 + 1) = 8
* (((unsigned __int16)((((unsigned int)(((_DWORD)PxeSelfRef << 25)
- ((_DWORD)PteBase << 25)) >> 16) & 0xFFF)
+ 0x1FFF) >> 12)
+ 6);
v28 = ((__int64)(((_QWORD)PxeSelfRef << 25) - ((_QWORD)PteBase << 25)) >> 16) & 0xFFF;
v58 = (void *)(((__int64)(((_QWORD)PxeSelfRef << 25) - ((_QWORD)PteBase << 25)) >> 16) & 0xFFFFFFFFFFFFF000ui64);
a12 = v28;
while( 1 )
{
MiInitializeInPageSupport((__int64)BugCheckParameter2, 0);
v29 = *(_QWORD *)v26;
v65 |= 0x200000u;
IsPteInStore = MiIsPteInStore((__int64)Partition, v29);
v32 = v31 & 0xFFFFFEFF | (IsPteInStore != 0 ? 0x100 : 0);
v33 = (unsigned __int8)HIBYTE(*(_WORD *)v26) >> 4;
v65 = v32;
PagingFileOffset = MiGetPagingFileOffset(v26);
if( (v32 & 0x100) != 0 )
BugCheckParameter4[0] = PagingFileOffset | ((unsigned __int64)(unsigned int)v33 << 60);
else
BugCheckParameter4[0] = (unsigned __int64)PagingFileOffset << 12;
MiSetPageTablePfnBuddy((INT64)v24, 0xFFFF800000000030ui64, 0i64);
EntireFlags = 0;
MemoryDescriptorList.Size = *((_WORD *)&OutFlags[1].1 + 1);
MemoryDescriptorList.StartVa = v58;
MemoryDescriptorList.MdlFlags = 16386;
MemoryDescriptorList.Next = 0i64;
MemoryDescriptorList.ByteOffset = v28;
MemoryDescriptorList.ByteCount = 4096;
v64 = 4096;
v67 = v12;
v36 = *((_QWORD *)Partition + v33 + 868);
if( (*(_WORD *)(v36 + 204) & 0x800) == 0 )
{
if( (v65 & 0x100) != 0 )
{
IoStatusBlock.Status = 0;
IoStatusBlock.Information = 0i64;
v37 = SmPageRead((union MM_STORE_KEY *)BugCheckParameter4, (UINT64)&MemoryDescriptorList);
}
else
{
LODWORD(Flags) = 0;
v37 = IoPageReadEx(
*(FILE_OBJECT **)(v36 + 56),
&MemoryDescriptorList,
(LARGE_INTEGER *)BugCheckParameter4,
&Event,
&IoStatusBlock,
Flags,
0i64);
}
if( v37 < 0 )
{
IoStatusBlock.Status = v37;
IoStatusBlock.Information = 0i64;
KeSetEvent(&Event, 0);
}
}
KeWaitForSingleObject(&Event, WrPageIn, 0, 0, 0i64);
v38 = v65;
OutFlags[0].EntireFlags = 0;
if( (v65 & 0x100) != 0 )
{
MiStoreFaultComplete((_MMINPAGE_SUPPORT *)BugCheckParameter2, OutFlags);
v39 = MiLockPageInline((INT64)v24);
if( *((_WORD *)&OutFlags[0].1 + 1) )
OutFlags[0].EntireFlags = LOWORD(OutFlags[0].EntireFlags) | ((*((unsigned __int16 *)&OutFlags[0].1 + 1) - 1) << 16);
_InterlockedAnd64((volatile signed __int64 *)v24 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v39);
EntireFlags = OutFlags[0].EntireFlags;
v38 = v65;
}
Status = IoStatusBlock.Status;
if( IoStatusBlock.Status >= 0 && *(_QWORD *)(v36 + 216) )
{
v65 = v38 | 0x400000;
Status = MiValidatePagefilePageHash((__int64)BugCheckParameter2);
}
if( (MemoryDescriptorList.MdlFlags & 1) != 0 )
MmUnmapLockedPages(MemoryDescriptorList.MappedSystemVa, &MemoryDescriptorList);
MiSetPageTablePfnBuddy((INT64)v24, 0i64, 0i64);
if( Status >= 0 )
break;
if( !(unsigned int)MiIsRetryIoStatus((unsigned int)Status, 0x1000ui64) )
{
MiFlushAllFilesystemPages();
KeBugCheckEx(0x77u, Status, Status, (unsigned int)v33, LODWORD(BugCheckParameter4[0]));
}
if( (EntireFlags & 1) != 0 )
{
LODWORD(v28) = a12;
v26 = (MMPTE *)(v24 + 16);
if( (EntireFlags & 2) == 0 )
continue;
}
KeDelayExecutionThread(0, 0, (PLARGE_INTEGER)MiHalfSecond);
LODWORD(v28) = a12;
v26 = (MMPTE *)(v24 + 16);
}
if( IoStatusBlock.Information != 4096 )
{
MiFlushAllFilesystemPages();
KeBugCheckEx(0x77u, 2ui64, Status, (unsigned int)v33, LODWORD(BugCheckParameter4[0]));
}
v41 = MiLockPageInline((INT64)v24);
v42 = *((_QWORD *)v24 + 2);
v43 = v41;
v44 = MiSwizzleInvalidPte(128i64);
v45 = v24[34];
*((_QWORD *)v24 + 2) = v44;
v24[34] = v45 | 0x10;
_InterlockedAnd64((volatile signed __int64 *)v24 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v43);
MiReleasePageFileInfo(
(INT64)Partition,
v42,
0,
v46,
(INT64)Timeouta,
Flags,
(INT64)IoAttributionContext,
v53,
*(INT64 *)&OutFlags[0].EntireFlags,
(INT64)Partition,
a12,
a12_8);
v7 = v59;
goto LABEL_50;
}
v11 = v10;
if( qword_140C4DC80 )
{
if( (v9 & 0x10) != 0 )
v11 = v10 & 0xFFFFFFFFFFFFFFEFui64;
else
v11 = v10 & ~qword_140C4DC80;
}
v12 = (v11 >> 12) & 0xFFFFFFFFFi64;
}
while( (*((_QWORD *)MmGetPfnDb() + 6 * v12 + 5) & 0x4000000000000i64) == 0 );
v13 = (UINT64)PfnDb + 48 * v12;
v14 = (unsigned __int8)MiLockPageInline(v13);
if( MI_READ_PTE_LOCK_FREE((INT64)v7) != v9 )
{
LABEL_14:
_InterlockedAnd64((volatile signed __int64 *)(v13 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
continue;
}
break;
}
if( (*(_BYTE *)(v13 + 34) & 7) == 6 )
{
v16 = *(_QWORD *)(v13 + 24) ^ ((*(_QWORD *)(v13 + 24) + 1i64) ^ *(_QWORD *)(v13 + 24)) & 0x3FFFFFFFFFFFFFFFi64;
}
else
{
if( !(unsigned int)MiUnlinkPageFromList((_MMPFN *)v13, 0i64) )
{
MiDiscardTransitionPteEx(v13, 0i64);
goto LABEL_14;
}
v15 = *(_BYTE *)(v13 + 34);
++*(_WORD *)(v13 + 32);
*(_BYTE *)(v13 + 34) = v15 & 0xF8 | 6;
v16 = *(_QWORD *)(v13 + 24) & 0xC000000000000000ui64 | 1;
}
*(_QWORD *)(v13 + 24) = v16;
v17 = MiCaptureDirtyBitToPfn(v13);
_InterlockedAnd64((volatile signed __int64 *)(v13 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
if( v17 )
MiReleasePageFileInfo(
(INT64)Partition,
v17,
0,
v18,
(INT64)Timeout,
Flags,
(INT64)IoAttributionContext,
v53,
*(INT64 *)&OutFlags[0].EntireFlags,
(INT64)Partition,
a12,
a12_8);
LABEL_50:
ValidPte = MiMakeValidPte((UINT64)MmGetPxeSelfRef(), v12, 2147483652i64);
*v7 = ValidPte;
return ValidPte;
}Referenced by:
KiInSwapProcesses