MiGatherMappedPages
__int64 __fastcall MiGatherMappedPages(__int64 a1, unsigned int a2, __int64 a3){
unsigned int v4;
_QWORD *v6;
int v7;
IO_STATUS_BLOCK *v8;
__int64 v9;
_MMPFN *PfnDb;
UINT64 v11;
unsigned __int64 v12;
__int64 v13;
__int64 v14;
__int64 v15;
int v16;
__int64 v17;
volatile signed __int64 *v18;
unsigned __int8 *v19;
_FILE_OBJECT *v20;
bool v21;
_FILE_OBJECT *v22;
_SECTION_OBJECT_POINTERS *v23;
int v24;
IO_STATUS_BLOCK *v25;
IO_STATUS_BLOCK *v26;
unsigned __int64 v27;
int v28;
LARGE_INTEGER v29;
__int64 Information_low;
ERESOURCE **v31;
unsigned int v32;
unsigned int v33;
int v34;
int v35;
NTSTATUS v36;
void *v37;
IO_STATUS_BLOCK *v38;
unsigned __int8 CurrentIrql;
UINT64 v41;
int v42;
unsigned __int64 v43;
IO_STATUS_BLOCK *v44;
int v45;
MDL *v46;
__int64 v47;
INT64 *v48;
unsigned __int64 v49;
unsigned __int64 v50;
UINT64 v51;
int v52;
unsigned __int8 v53;
LARGE_INTEGER FileOffset;
IO_STATUS_BLOCK *IoStatus;
LARGE_INTEGER EndingOffset;
_SECTION_OBJECT_POINTERS *SectionObjectPointer;
unsigned int v58;
INT64 v60;
v60 = 0i64;
EndingOffset.QuadPart = 0i64;
v4 = a2;
FileOffset.QuadPart = 0i64;
if( a2 >= 0x10 )
{
v4 = 0;
v6 = (_QWORD *)(a1 + 3472);
do
{
if( *v6 != 0xFFFFFFFFFi64 )
break;
++v4;
v6 += 5;
}
while( v4 < 0x10 );
if( v4 == 16 )
return 0i64;
}
v7 = 0;
if( *(_BYTE *)(a1 + 1003) )
{
v48 = (INT64 *)(a1 + 996);
v49 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(a1 + 996));
if( *(_BYTE *)(a1 + 1005) )
{
*(_BYTE *)(a1 + 1005) = 0;
*(_BYTE *)(a1 + 1003) = 0;
v7 = 1;
}
ExReleaseSpinLockExclusiveFromDpcLevel(v48);
__writecr8(v49);
}
if( *(_BYTE *)(a1 + 1032) == 1 )
v7 = 1;
if( v7 )
KeDelayExecutionThread(0, 0, (PLARGE_INTEGER)&Mi10Milliseconds);
v8 = (IO_STATUS_BLOCK *)(5i64 * v4);
v9 = *(_QWORD *)(a1 + 40i64 * v4 + 3472);
IoStatus = v8;
if( v9 == 0xFFFFFFFFFi64 )
return 0i64;
PfnDb = MmGetPfnDb();
while( 1 )
{
v11 = (UINT64)PfnDb + 48 * v9;
v12 = (unsigned __int8)MiLockPageInline(v11);
if( v9 == *(_QWORD *)(a1 + 8i64 * (_QWORD)IoStatus + 3472) )
break;
LABEL_38:
_InterlockedAnd64((volatile signed __int64 *)(v11 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
PfnDb = MmGetPfnDb();
v9 = *(_QWORD *)(a1 + 8i64 * (_QWORD)IoStatus + 3472);
if( v9 == 0xFFFFFFFFFi64 )
return 0i64;
}
v13 = *(_QWORD *)(v11 + 16);
if( qword_140C4DC80 && (v13 & 0x10) == 0 )
v13 &= ~qword_140C4DC80;
v14 = v13 >> 16;
v15 = *(_QWORD *)v14;
v16 = *(_DWORD *)(*(_QWORD *)v14 + 56i64);
if( (v16 & 0x20) != 0 )
{
MiUnlinkPageFromList((_MMPFN *)v11, 0i64);
v60 = MI_READ_PTE_LOCK_FREE(v11 + 16);
v50 = (unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v60) >> 5;
if( ((*(_QWORD *)(v11 + 40) >> 60) & 7) == 3 )
{
MiClearPfnImageVerified(v11, 28);
if( (MiFlags & 0x10000) != 0 && (v50 & 2) != 0 && (*(_DWORD *)(v15 + 92) & 0xC0000) != 0 )
MiMarkPfnVerified(v11, 32 * ((((unsigned int)MiFlags >> 17) & 1) == 0) + 6);
}
v60 = MiSwizzleInvalidPte(32 * (v50 & 0x1F));
*(_QWORD *)(v11 + 16) = v60;
MiDereferenceControlAreaPfnList((_CONTROL_AREA *)v15, 0i64, v51, 3ui64);
v41 = 8i64;
goto LABEL_37;
}
if( (v16 & 8) != 0 )
{
LABEL_36:
MiUnlinkPageFromList((_MMPFN *)v11, 0i64);
v41 = 16i64;
LABEL_37:
MiInsertPageInList((_MMPFN *)v11, v41);
goto LABEL_38;
}
ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(v15 + 72));
if( (*(_DWORD *)(v15 + 56) & 8) != 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v15 + 72));
goto LABEL_36;
}
v17 = *(_QWORD *)(v15 + 120);
++*(_DWORD *)(v15 + 76);
v18 = (volatile signed __int64 *)(8 * v17);
if( v18 && _InterlockedIncrement64(v18 + 4) <= 1 )
__fastfail(0xEu);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v15 + 72));
MiReferencePageForModifiedWrite((_MMPFN *)v11, 1u, v19);
_InterlockedAnd64((volatile signed __int64 *)(v11 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
v20 = MiReferenceControlAreaFile((_CONTROL_AREA *)v15);
v21 = *(_BYTE *)(a1 + 1003) == 0;
v22 = v20;
v23 = v20->SectionObjectPointer;
SectionObjectPointer = v23;
if( v21 )
v24 = CcNotifyOfMappedWrite(v23, FileOffset, 0i64);
else
v24 = 0;
v25 = (IO_STATUS_BLOCK *)MiBuildMappedCluster((char *)v11, (unsigned __int64 *)(a3 + 208), v24);
*(_QWORD *)(a3 + 200) = v25;
v26 = v25;
*(_QWORD *)(a3 + 160) = v15;
IoStatus = v25;
v27 = MiStartingOffset(
v14,
*((_QWORD *)MmGetPfnDb() + 6 * (__int64)v25[3].Pointer + 1) | 0x8000000000000000ui64,
0xFFFFFFFF);
v28 = *(_DWORD *)(a3 + 40);
v29.QuadPart = v27;
FileOffset.QuadPart = v27;
LODWORD(v27) = v26[2].Information;
*(_DWORD *)(a3 + 136) = v27;
v58 = (unsigned int)v27 >> 12;
*(_DWORD *)(a3 + 140) = ((unsigned int)v27 >> 12) - 1;
Information_low = LODWORD(v26[2].Information);
v31 = (ERESOURCE **)(a3 + 168);
*(_QWORD *)(a3 + 168) = 0i64;
EndingOffset.QuadPart = v29.QuadPart + Information_low;
if( (*((_DWORD *)v22->DeviceObject + 13) & 0x10) != 0 )
v32 = v28 | 2;
else
v32 = v28 & 0xFFFFFFFD;
*(_DWORD *)(a3 + 40) = v32;
v33 = 0;
v34 = *(_DWORD *)(v15 + 56);
if( (v34 & 4) != 0 )
{
MiDereferenceControlAreaFile(v15, (unsigned __int64)v22);
LABEL_30:
v36 = -1073741740;
goto LABEL_31;
}
if( (v34 & 0x10) != 0 )
{
MiDereferenceControlAreaFile(v15, (unsigned __int64)v22);
v36 = -1073741672;
LABEL_31:
v33 = 1;
goto LABEL_32;
}
*(_QWORD *)(a3 + 152) = v22;
if( FsRtlAcquireFileForModWriteEx(v22, &EndingOffset, v31) < 0 )
{
v36 = -1073741740;
MiDereferenceControlAreaFile(v15, (unsigned __int64)v22);
*v31 = 0i64;
LABEL_47:
if( (v36 & 0xC0000000) != -1073741824 )
goto LABEL_33;
LABEL_32:
v37 = (void *)a3;
*(_QWORD *)(a3 + 24) = 0i64;
v38 = (IO_STATUS_BLOCK *)(a3 + 16);
*(_DWORD *)(a3 + 16) = v36;
CurrentIrql = KeGetCurrentIrql();
__writecr8(1ui64);
MiWriteComplete(v37, v38, v33);
__writecr8(CurrentIrql);
goto LABEL_33;
}
v35 = CcNotifyOfMappedWrite(SectionObjectPointer, v29, LODWORD(IoStatus[2].Information));
if( !v35 )
{
FsRtlReleaseFileForModWrite(v22, *v31);
MiDereferenceControlAreaFile(v15, (unsigned __int64)v22);
*v31 = 0i64;
goto LABEL_30;
}
if( v35 == 1 )
*v31 = (ERESOURCE *)((unsigned __int64)*v31 | 1);
*(LARGE_INTEGER *)(a3 + 176) = v29;
v42 = *(_DWORD *)(a1 + 688);
v43 = *(_QWORD *)(a1 + 7104);
if( v42 )
{
if( v43 >= 0x420 )
v52 = 0;
else
v52 = v42 - 1;
*(_DWORD *)(a1 + 688) = v52;
}
else if( v43 < 0x120 )
{
*(_DWORD *)(a1 + 688) = v43 < 0xA0 ? 32 : 8;
}
__incgsdword(0x2EB4u);
v44 = (IO_STATUS_BLOCK *)(a3 + 16);
__addgsdword(0x2EB0u, v58);
if( !MiControlAreaUsingExtents(v15) )
{
v36 = IoAsynchronousPageWrite(
v22,
(__int64)IoStatus,
&FileOffset,
(void(__fastcall *)(__int64, __int64, _QWORD))MiWriteComplete,
v47,
v45,
0,
0,
(__int64)v18,
(__int64)v44,
(_QWORD *)(v47 + 32));
goto LABEL_47;
}
MiFlushFileOnlyMdl(v46, IoStatus);
v53 = KeGetCurrentIrql();
__writecr8(1ui64);
MiWriteComplete((PVOID)a3, v44, 0i64);
__writecr8(v53);
LABEL_33:
if( v18 )
IoDiskIoAttributionDereference((PVOID)v18);
return 1i64;
}Referenced by:
MiMappedPageWriter