MiSectionCreated
_MI_CONTROL_AREA_WAIT_BLOCK *__stdcall MiSectionCreated(
_FILE_OBJECT *File,
_CONTROL_AREA *ControlArea,
_MMPFN *ImageHeaderPage){
INT64 *p_ControlAreaLock;
_MMPFN *bf_0;
_CONTROL_AREA *v6;
unsigned __int64 v7;
_SECTION_OBJECT_POINTERS *SectionObjectPointer;
_QWORD *ImageSectionObject;
INT64 *v10;
_SECTION_OBJECT_POINTERS *v11;
__int64 v13;
unsigned int NumberOfMappedViews_high;
unsigned int v15;
UINT64 *v16;
unsigned __int64 v17;
INT64 v18;
UINT64 v19;
_MMPFN *PfnDb;
_MMPFN *v21;
_MMPFN *v22;
__int16 v23;
bool v24;
_MI_CONTROL_AREA_WAIT_BLOCK *v25;
unsigned int v26;
unsigned int v27;
int v28;
char SpinCount[12];
__int64 v30;
_MI_CONTROL_AREA_WAIT_BLOCK *v31;
_MMPFN *v33;
UINT8 PageIrql;
v33 = ImageHeaderPage;
p_ControlAreaLock = (INT64 *)&ControlArea->ControlAreaLock;
PageIrql = 0;
bf_0 = ImageHeaderPage;
v6 = ControlArea;
v7 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&ControlArea->ControlAreaLock);
if( ((__int64)KeGetCurrentThread()[1].Queue & 0x40) != 0 )
v6->u.LongFlags |= 0x200u;
SectionObjectPointer = File->SectionObjectPointer;
if( (v6->u.LongFlags & 0x20) != 0 )
{
ImageSectionObject = SectionObjectPointer->ImageSectionObject;
v10 = ImageSectionObject + 9;
ExAcquireSpinLockExclusiveAtDpcLevel(ImageSectionObject + 9);
v25 = (_MI_CONTROL_AREA_WAIT_BLOCK *)ImageSectionObject[10];
v31 = 0i64;
v6->WaitList = v25;
}
else
{
ImageSectionObject = SectionObjectPointer->DataSectionObject;
v10 = ImageSectionObject + 9;
ExAcquireSpinLockExclusiveAtDpcLevel(ImageSectionObject + 9);
v31 = (_MI_CONTROL_AREA_WAIT_BLOCK *)ImageSectionObject[10];
}
v6->FilePointer.Value = ImageSectionObject[8];
ExAcquireSpinLockExclusiveAtDpcLevel(&SpinLock);
v11 = File->SectionObjectPointer;
if( (v6->u.LongFlags & 0x20) != 0 )
{
v11->ImageSectionObject = v6;
ExReleaseSpinLockExclusiveFromDpcLevel(&SpinLock);
ExReleaseSpinLockExclusiveFromDpcLevel(v10);
ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
__writecr8(v7);
v13 = *(_QWORD *)v6[1].gap8;
NumberOfMappedViews_high = HIDWORD(v6[1].NumberOfMappedViews);
v30 = v13;
v26 = NumberOfMappedViews_high;
while( 1 )
{
if( !bf_0 )
return v31;
if( (bf_0->PteLong & 0x40000) != 0 )
goto LABEL_29;
MmUnmapLockedPages((VOID *)bf_0->u2._bf_0, (_MDL *)bf_0);
v16 = (UINT64 *)&bf_0[1];
v17 = 0i64;
v27 = *((_DWORD *)&bf_0->3 + 4);
v15 = v27;
v28 = LODWORD(bf_0->u4._bf_0) >> 12;
v18 = v13 + 8i64 * v27;
PageIrql = 17;
*(_QWORD *)&SpinCount[4] = 0i64;
if( !v28 )
goto LABEL_29;
do
{
v19 = *v16;
PfnDb = MmGetPfnDb();
v21 = &PfnDb[*v16];
if( v15 < NumberOfMappedViews_high )
{
if( (v18 & 0xFFFFFFFFFFFFF000ui64) != v17 )
{
if( v17 )
MiUnlockProtoPoolPage(*(ULONG_PTR *)&SpinCount[4], PageIrql);
while( 1 )
{
*(_QWORD *)&SpinCount[4] = MiLockProtoPoolPage((_MMPTE *)v18, &PageIrql);
if( *(_QWORD *)&SpinCount[4] )
break;
MmAccessFault(2ui64, (PVOID)v18, 0, 0i64);
}
v6 = ControlArea;
v17 = v18 & 0xFFFFFFFFFFFFF000ui64;
}
v22 = MiLockLeafPage((_MMPTE *)v18, 0i64);
v23 = MI_READ_PTE_LOCK_FREE(v18);
if( v22 )
{
_InterlockedAnd64(&v22->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}
else if( (v23 & 0x400) != 0 )
{
*(_DWORD *)SpinCount = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v21->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)SpinCount);
while( v21->u2._bf_0 < 0 );
}
MiInitializeTransitionPfn(v19, (_MMPTE *)v18);
_InterlockedAnd64(&v21->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( (*(_DWORD *)(&v21->3 + 1) & 0x400i64) != 0 )
MiReferenceControlAreaPfn(v6, 0i64, 1ui64);
goto LABEL_24;
}
MiReturnPfnReferenceCount(v21);
*v16 = -1i64;
LABEL_24:
NumberOfMappedViews_high = v26;
goto LABEL_25;
}
MiReturnPfnReferenceCount(&PfnDb[*v16]);
*v16 = -1i64;
LABEL_25:
v18 += 8i64;
v15 = v27 + 1;
++v16;
v24 = v28-- == 1;
++v27;
}
while( !v24 );
bf_0 = v33;
if( v17 )
MiUnlockProtoPoolPage(*(ULONG_PTR *)&SpinCount[4], PageIrql);
v13 = v30;
LABEL_29:
bf_0 = (_MMPFN *)bf_0->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
v33 = bf_0;
}
}
v11->DataSectionObject = v6;
ExReleaseSpinLockExclusiveFromDpcLevel(&SpinLock);
ExReleaseSpinLockExclusiveFromDpcLevel(v10);
v6->u.LongFlags &= ~2u;
ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
__writecr8(v7);
KeAbPostRelease(v11);
return v31;
}Referenced by:
No references.