MiGatherMappedPages
NTSTATUS __stdcall MiGatherMappedPages(_MI_PARTITION *Partition, UINT64 i, _MMMOD_WRITER_MDL_ENTRY *ModWriterEntry){
unsigned int v4;
unsigned __int64 *p_Flink;
int v7;
_MDL *v8;
unsigned __int64 Flink;
_MMPFN *PfnDb;
_MMPFN *v11;
unsigned __int64 v12;
__int64 bf_0;
__int64 v14;
INT64 v15;
int v16;
__int64 v17;
volatile signed __int64 *Priority;
_FILE_OBJECT *v19;
bool v20;
_FILE_OBJECT *v21;
_SECTION_OBJECT_POINTERS *v22;
NTSTATUS v23;
_MDL *v24;
_MDL *v25;
_LARGE_INTEGER v26;
_MODWRITER_FLAGS u1;
_LARGE_INTEGER v28;
__int64 ByteCount;
_ERESOURCE **p_FileResource;
_MODWRITER_FLAGS v31;
unsigned int v32;
int v33;
NTSTATUS v34;
int v35;
_MMMOD_WRITER_MDL_ENTRY *v36;
union {_IO_STATUS_BLOCK IoStatus;} *p_u;
unsigned __int8 CurrentIrql;
UINT8 v40;
UINT64 v41;
unsigned int MappedWriteBurstCount;
volatile unsigned __int64 AvailablePages;
union {_IO_STATUS_BLOCK IoStatus;} *HybridPriority;
int v45;
int v46;
_MDL *v47;
VOID *v48;
INT64 *p_ClusterRestrictionLock;
unsigned __int64 v50;
INT64 v51;
unsigned __int64 v52;
unsigned __int64 v53;
__int64 v54;
char v55;
__int64 v56;
int v57;
UINT64 v58;
unsigned int v59;
unsigned __int8 v60;
_IO_STATUS_BLOCK *v61;
UINT64 v62;
VOID *ApcContext;
VOID *v64;
_LARGE_INTEGER FileOffset;
_MDL *MemoryDescriptorList;
_LARGE_INTEGER EndingOffset;
_SECTION_OBJECT_POINTERS *SectionObjectPointer;
unsigned int v69;
INT64 v71;
v71 = 0i64;
EndingOffset.QuadPart = 0i64;
v4 = i;
FileOffset.QuadPart = 0i64;
if( (unsigned int)i >= 0x10 )
{
v4 = 0;
p_Flink = &Partition->PageLists.MappedPageListHead[0].Flink;
do
{
if( *p_Flink != 0xFFFFFFFFFi64 )
break;
++v4;
p_Flink += 5;
}
while( v4 < 0x10 );
if( v4 == 16 )
return 0;
}
v7 = 0;
if( Partition->Modwriter.ClusterRestrictions[1].MaximumClusterPages )
{
p_ClusterRestrictionLock = (INT64 *)&Partition->Modwriter.ClusterRestrictionLock;
v50 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&Partition->Modwriter.ClusterRestrictionLock);
if( Partition->Modwriter.ClusterRestrictions[1].ImposeDelay )
{
Partition->Modwriter.ClusterRestrictions[1].ImposeDelay = 0;
Partition->Modwriter.ClusterRestrictions[1].MaximumClusterPages = 0;
v7 = 1;
}
ExReleaseSpinLockExclusiveFromDpcLevel(p_ClusterRestrictionLock);
__writecr8(v50);
}
if( Partition->Modwriter.DelayMappedWrite == 1 )
v7 = 1;
if( v7 )
KeDelayExecutionThread(0, 0, (_LARGE_INTEGER *)&Mi10Milliseconds);
v8 = (_MDL *)(5i64 * v4);
Flink = Partition->PageLists.MappedPageListHead[v4].Flink;
MemoryDescriptorList = v8;
if( Flink == 0xFFFFFFFFFi64 )
return 0;
PfnDb = MmGetPfnDb();
while( 1 )
{
v11 = &PfnDb[Flink];
v12 = MiLockPageInline(v11);
if( Flink == *(&Partition->PageLists.MappedPageListHead[0].Flink + (_QWORD)MemoryDescriptorList) )
break;
LABEL_38:
_InterlockedAnd64(&v11->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
PfnDb = MmGetPfnDb();
Flink = *(&Partition->PageLists.MappedPageListHead[0].Flink + (_QWORD)MemoryDescriptorList);
if( Flink == 0xFFFFFFFFFi64 )
return 0;
}
bf_0 = v11->OriginalPte.u.Hard.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
if( *(&stru_140C4DB30 + 42) && (bf_0 & 0x10) == 0 )
bf_0 &= ~*(&stru_140C4DB30 + 42);
v14 = bf_0 >> 16;
v15 = *(_QWORD *)v14;
v16 = *(_DWORD *)(*(_QWORD *)v14 + 56i64);
if( (v16 & 0x20) != 0 )
{
MiUnlinkPageFromList(v11, 0i64);
LODWORD(v51) = MI_READ_PTE_LOCK_FREE((INT64)&v11->OriginalPte.u.Hard);
v71 = v51;
LODWORD(v52) = MI_READ_PTE_LOCK_FREE((INT64)&v71);
v53 = v52 >> 5;
if( (((unsigned __int64)v11->u4._bf_0 >> 60) & 7) == 3 )
{
MiClearPfnImageVerified(v11, 0x1Cui64);
if( (MiFlags & 0x10000) != 0 && (v53 & 2) != 0 && (*(_DWORD *)(v15 + 92) & 0xC0000) != 0 )
MiMarkPfnVerified(v11, 32 * (unsigned int)((((unsigned int)MiFlags >> 17) & 1) == 0) + 6);
}
v54 = MiSwizzleInvalidPte(32 * (v53 & 0x1F));
v55 = v54;
v71 = v54;
v56 = v54;
LOBYTE(v57) = MiPteInShadowRange((UINT64)&v11->OriginalPte.u.Long);
if( v57 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v55 & 1) != 0 )
v56 |= 0x8000000000000000ui64;
v11->OriginalPte.u.Long = v56;
MiDereferenceControlAreaPfnList((_CONTROL_AREA *)v15, 0i64, v58, 3ui64);
v41 = 8i64;
goto LABEL_37;
}
if( (v16 & 8) != 0 )
{
LABEL_36:
MiUnlinkPageFromList(v11, 0i64);
v41 = 16i64;
LABEL_37:
MiInsertPageInList(v11, v41, v40);
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);
Priority = (volatile signed __int64 *)(8 * v17);
if( Priority && _InterlockedIncrement64(Priority + 4) <= 1 )
__fastfail(0xEu);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v15 + 72));
MiReferencePageForModifiedWrite(v11, 1ui64);
_InterlockedAnd64(&v11->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
v19 = MiReferenceControlAreaFile((_CONTROL_AREA *)v15);
v20 = Partition->Modwriter.ClusterRestrictions[1].MaximumClusterPages == 0;
v21 = v19;
v22 = v19->SectionObjectPointer;
SectionObjectPointer = v22;
if( v20 )
v23 = CcNotifyOfMappedWrite(v22, FileOffset, 0i64);
else
v23 = 0;
v24 = MiBuildMappedCluster(v11, &ModWriterEntry->Mdl, v23);
ModWriterEntry->PointerMdl = v24;
v25 = v24;
ModWriterEntry->ControlArea = (_CONTROL_AREA *)v15;
MemoryDescriptorList = v24;
v26.anonymous_0.LowPart = MiStartingOffset(
(_SUBSECTION *)v14,
(_MMPTE *)(MmGetPfnDb()[(__int64)v24[1].Next].PteLong | 0x8000000000000000ui64),
0xFFFFFFFFui64);
u1 = ModWriterEntry->u1;
v28 = v26;
FileOffset = v26;
v26.anonymous_0.LowPart = v25->ByteCount;
ModWriterEntry->ByteCount = v26.anonymous_0.LowPart;
v69 = v26.anonymous_0.LowPart >> 12;
ModWriterEntry->ChargedPages = (v26.anonymous_0.LowPart >> 12) - 1;
ByteCount = v25->ByteCount;
p_FileResource = &ModWriterEntry->FileResource;
ModWriterEntry->FileResource = 0i64;
EndingOffset.QuadPart = v28.QuadPart + ByteCount;
if( (v21->DeviceObject->Characteristics & 0x10) != 0 )
v31 = (_MODWRITER_FLAGS)(*(_DWORD *)&u1 | 2);
else
v31 = (_MODWRITER_FLAGS)(*(_DWORD *)&u1 & 0xFFFFFFFD);
ModWriterEntry->u1 = v31;
v32 = 0;
v33 = *(_DWORD *)(v15 + 56);
if( (v33 & 4) != 0 )
{
MiDereferenceControlAreaFile((_CONTROL_AREA *)v15, v21);
LABEL_30:
v35 = -1073741740;
goto LABEL_31;
}
if( (v33 & 0x10) != 0 )
{
MiDereferenceControlAreaFile((_CONTROL_AREA *)v15, v21);
v35 = -1073741672;
LABEL_31:
v32 = 1;
goto LABEL_32;
}
ModWriterEntry->File = v21;
if( FsRtlAcquireFileForModWriteEx(v21, &EndingOffset, p_FileResource) < 0 )
{
v35 = -1073741740;
MiDereferenceControlAreaFile((_CONTROL_AREA *)v15, v21);
*p_FileResource = 0i64;
LABEL_47:
if( (v35 & 0xC0000000) != -1073741824 )
goto LABEL_33;
LABEL_32:
v36 = ModWriterEntry;
ModWriterEntry->u.IoStatus.Information = 0i64;
p_u = &ModWriterEntry->u;
ModWriterEntry->u.IoStatus.Status = v35;
CurrentIrql = KeGetCurrentIrql();
__writecr8(1ui64);
MiWriteComplete(v36, &p_u->IoStatus, v32);
__writecr8(CurrentIrql);
goto LABEL_33;
}
v34 = CcNotifyOfMappedWrite(SectionObjectPointer, v28, MemoryDescriptorList->ByteCount);
if( !v34 )
{
FsRtlReleaseFileForModWrite(v21, *p_FileResource);
MiDereferenceControlAreaFile((_CONTROL_AREA *)v15, v21);
*p_FileResource = 0i64;
goto LABEL_30;
}
if( v34 == 1 )
*p_FileResource = (_ERESOURCE *)((unsigned __int64)*p_FileResource | 1);
ModWriterEntry->WriteOffset = v28;
MappedWriteBurstCount = Partition->Modwriter.MappedWriteBurstCount;
AvailablePages = Partition->Vp.AvailablePages;
if( MappedWriteBurstCount )
{
if( AvailablePages >= 0x420 )
v59 = 0;
else
v59 = MappedWriteBurstCount - 1;
Partition->Modwriter.MappedWriteBurstCount = v59;
}
else if( AvailablePages < 0x120 )
{
Partition->Modwriter.MappedWriteBurstCount = AvailablePages < 0xA0 ? 32 : 8;
}
__incgsdword(0x2EB4u);
HybridPriority = &ModWriterEntry->u;
__addgsdword(0x2EB0u, v69);
LOBYTE(v45) = MiControlAreaUsingExtents(v15);
if( !v45 )
{
LOBYTE(ApcContext) = 0;
LODWORD(v62) = 0;
LODWORD(v61) = v46;
v35 = IoAsynchronousPageWrite(
v21,
MemoryDescriptorList,
&FileOffset,
MiWriteComplete,
v48,
v61,
v62,
ApcContext,
(_IO_PRIORITY_HINT)Priority,
(UINT64)HybridPriority,
(_BYTE)v48 + 32,
v64,
(_IO_STATUS_BLOCK *)FileOffset.QuadPart,
(_IRP **)MemoryDescriptorList);
goto LABEL_47;
}
MiFlushFileOnlyMdl(v47, (_IO_STATUS_BLOCK *)MemoryDescriptorList);
v60 = KeGetCurrentIrql();
__writecr8(1ui64);
MiWriteComplete(ModWriterEntry, &HybridPriority->IoStatus, 0i64);
__writecr8(v60);
LABEL_33:
if( Priority )
IoDiskIoAttributionDereference((VOID *)Priority);
return 1;
}Referenced by:
MiMappedPageWriter