MiFindFreePageFileSpace
NTSTATUS __stdcall MiFindFreePageFileSpace(
_MI_PARTITION *Partition,
_MMPTE *PageFileInfo,
UINT64 NumberOfPages,
UINT64 Flags){
unsigned int v4;
unsigned __int64 Long_high;
_MMPAGING_FILE *v8;
NTSTATUS v9;
volatile unsigned int NumberOfPagingFiles;
unsigned int v11;
_MMPAGING_FILE **v12;
__int64 i;
__int16 bf_cc;
_MMPAGING_FILE *v15;
int v16;
int v17;
_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *v18;
unsigned __int8 v19;
unsigned __int8 v20;
UINT64 v21;
bool v22;
unsigned __int64 Root;
_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *v24;
_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *v25;
_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *v26;
unsigned int v27;
char v28;
int v29;
volatile int *v30;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v31;
_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *v33;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v34;
_MI_PAGING_FILE_SPACE_BITMAPS *Bitmaps;
int v36;
unsigned int v37;
unsigned int v38;
volatile int *p_SpinLock;
NTSTATUS FreePageFileSpaceForward;
UINT64 MaximumRunLengthInBitmaps;
unsigned int v42;
unsigned __int64 v43;
unsigned __int64 v44;
unsigned __int64 j;
UINT64 StartIndexInOut;
int v47;
__int128 v48;
__int128 v49;
__int128 v50;
__int64 v51;
unsigned int Flagsa;
Flagsa = Flags;
v51 = 0i64;
v4 = Flags;
v48 = 0i64;
v49 = 0i64;
v50 = 0i64;
if( NumberOfPages < 0xFFFFFFFF )
{
LODWORD(Long_high) = -1;
if( (Flags & 0x10) != 0 )
goto LABEL_3;
v8 = Partition->Vp.PagingFile[(unsigned __int8)HIBYTE(LOWORD(PageFileInfo->u.Long)) >> 4];
if( (Flags & 0x65) == 1
&& (unsigned int)MiPageFileLargestBitmapsRun(Partition->Vp.PagingFile[(unsigned __int8)HIBYTE(LOWORD(PageFileInfo->u.Long)) >> 4]) < NumberOfPages )
{
v4 |= 0x10u;
Flagsa = v4;
}
else
{
v34.Long = (unsigned __int64)PageFileInfo->u;
if( *(&stru_140C4DB30 + 42) && (v34.Long & 0x10) == 0 )
v34.Long &= ~*(&stru_140C4DB30 + 42);
Long_high = HIDWORD(v34.Long);
}
if( (v4 & 0x10) != 0 )
{
LABEL_3:
v8 = Partition->Vp.PagingFile[0];
v9 = MiPageFileLargestBitmapsRun(v8);
NumberOfPagingFiles = Partition->Vp.NumberOfPagingFiles;
v11 = v9;
if( NumberOfPagingFiles > 1 )
{
v12 = &Partition->Vp.PagingFile[1];
for( i = NumberOfPagingFiles - 1; i; --i )
{
bf_cc = v8->_bf_cc;
v15 = *v12;
if( (bf_cc & 0x10) != 0 && (v15->_bf_cc & 0x10) == 0 || (bf_cc & 0x20) != 0 && (v15->_bf_cc & 0x20) == 0 )
{
v8 = *v12;
v42 = MiPageFileLargestBitmapsRun(*v12);
}
else
{
if( (v15->_bf_cc & 0x30) != 0 )
goto LABEL_8;
v42 = MiPageFileLargestBitmapsRun(*v12);
if( v42 <= v11 )
goto LABEL_8;
v8 = v15;
}
v11 = v42;
LABEL_8:
++v12;
}
}
v4 = Flagsa;
}
v16 = 0;
LODWORD(StartIndexInOut) = 0;
v17 = v4 & 4;
v47 = v17;
while( 1 )
{
v18 = 0i64;
HIDWORD(StartIndexInOut) = 0;
if( v17 )
{
v20 = 0;
}
else
{
if( (v4 & 1) != 0 || v16 )
{
v19 = ExAcquireSpinLockExclusive((INT64 *)&v8->SpinLock);
}
else
{
HIDWORD(StartIndexInOut) = 1;
v19 = ExAcquireSpinLockShared((INT64 *)&v8->SpinLock);
}
v20 = v19;
}
if( (v8->_bf_cc & 0x1000000) != 0 )
{
LABEL_87:
if( !v47 )
{
p_SpinLock = &v8->SpinLock;
if( HIDWORD(StartIndexInOut) )
ExReleaseSpinLockSharedFromDpcLevel(p_SpinLock);
else
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)p_SpinLock);
__writecr8(v20);
}
return 0;
}
if( (_DWORD)Long_high == -1 )
goto LABEL_17;
Bitmaps = v8->Bitmaps;
if( (unsigned int)Long_high >= Bitmaps->ReservationBitmap.SizeOfBitMap )
{
if( (v4 & 0x48) == 0 )
{
LABEL_17:
v21 = NumberOfPages;
goto LABEL_18;
}
goto LABEL_87;
}
if( _bittest64((const signed __int64 *)Bitmaps->ReservationBitmap.Buffer, (unsigned int)Long_high)
|| _bittest64((const signed __int64 *)Bitmaps->AllocationBitmap.Buffer, (unsigned int)Long_high) )
{
v21 = NumberOfPages;
v27 = 0;
v36 = v4 & 0x40;
}
else
{
v37 = RtlLengthCurrentClearRunForward(
&Bitmaps->ReservationBitmap,
(unsigned int)Long_high,
(unsigned int)NumberOfPages);
v21 = NumberOfPages;
v36 = v4 & 0x40;
if( v37 != (_DWORD)NumberOfPages && !v36
|| (v38 = RtlLengthCurrentClearRunForward(&v8->Bitmaps->AllocationBitmap, (unsigned int)Long_high, v37),
v21 = NumberOfPages,
v27 = v38,
v38 != (_DWORD)NumberOfPages)
&& !v36 )
{
v27 = 0;
}
}
if( v27 == v21 || v36 )
{
LODWORD(StartIndexInOut) = Long_high;
goto LABEL_42;
}
v4 = Flagsa;
LABEL_18:
while( 2 )
{
if( (v4 & 8) != 0 )
{
LODWORD(StartIndexInOut) = Long_high;
FreePageFileSpaceForward = MiFindFreePageFileSpaceForward(v8, &StartIndexInOut, (unsigned int)v21, v4);
LODWORD(Long_high) = StartIndexInOut;
v27 = FreePageFileSpaceForward;
goto LABEL_42;
}
LODWORD(v51) = 0;
v22 = (v8->BitmapsCacheLengthTree._bf_0 & 1) == 0;
Root = (unsigned __int64)v8->BitmapsCacheLengthTree.Root;
HIDWORD(v51) = v21;
if( !v22 && Root )
Root ^= (unsigned __int64)&v8->BitmapsCacheLengthTree;
v18 = 0i64;
while( 1 )
{
if( !Root )
goto LABEL_40;
if( (unsigned int)v21 < *(_DWORD *)(Root + 52) )
goto LABEL_54;
if( (unsigned int)v21 <= *(_DWORD *)(Root + 52) )
break;
v33 = *(_MI_PAGEFILE_BITMAPS_CACHE_ENTRY **)(Root + 8);
LABEL_55:
if( (v8->BitmapsCacheLengthTree._bf_0 & 1) != 0 && v33 )
Root ^= (unsigned __int64)v33;
else
Root = (unsigned __int64)v33;
}
if( *(_DWORD *)(Root + 48) )
{
LABEL_54:
v33 = *(_MI_PAGEFILE_BITMAPS_CACHE_ENTRY **)Root;
v18 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)Root;
goto LABEL_55;
}
v24 = *(_MI_PAGEFILE_BITMAPS_CACHE_ENTRY **)Root;
v18 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)Root;
if( (v8->BitmapsCacheLengthTree._bf_0 & 1) != 0 && v24 )
v24 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)(Root ^ (unsigned __int64)v24);
v25 = 0i64;
if( v24 )
{
while( 1 )
{
if( (unsigned int)v21 < v24->Length )
goto LABEL_34;
if( (unsigned int)v21 <= v24->Length )
break;
v26 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)v24->LengthTreeNode.Children[1];
LABEL_35:
if( (v8->BitmapsCacheLengthTree._bf_0 & 1) != 0 && v26 )
v24 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)((unsigned __int64)v26 ^ (unsigned __int64)v24);
else
v24 = v26;
if( !v24 )
{
if( v25 )
v18 = v25;
goto LABEL_40;
}
}
if( !v24->StartingIndex )
v25 = v24;
LABEL_34:
v26 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)v24->LengthTreeNode.Children[0];
goto LABEL_35;
}
LABEL_40:
if( v18->Length != -1 )
goto LABEL_41;
MaximumRunLengthInBitmaps = v8->MaximumRunLengthInBitmaps;
if( MaximumRunLengthInBitmaps < v21 || (unsigned int)MaximumRunLengthInBitmaps < 0x20 )
{
if( (v4 & 0x80u) != 0 )
goto LABEL_87;
v43 = (unsigned __int64)v18->LengthTreeNode.Children[0];
v44 = (unsigned __int64)v18;
if( v18->LengthTreeNode.Children[0] )
{
for( ; *(_QWORD *)(v43 + 8); v43 = *(_QWORD *)(v43 + 8) )
;
}
else
{
for( j = v18->LengthTreeNode.ParentValue; ; j = *(_QWORD *)(v43 + 16) )
{
v43 = j & 0xFFFFFFFFFFFFFFFCui64;
if( !v43 || *(_QWORD *)(v43 + 8) == v44 )
break;
v44 = v43;
}
}
if( !v43 )
{
if( (unsigned int)MaximumRunLengthInBitmaps < 0x20 )
goto LABEL_87;
goto LABEL_99;
}
v18 = (_MI_PAGEFILE_BITMAPS_CACHE_ENTRY *)v43;
if( (unsigned int)MaximumRunLengthInBitmaps > *(_DWORD *)(v43 + 52)
&& (unsigned int)MaximumRunLengthInBitmaps >= 0x20 )
{
goto LABEL_99;
}
LODWORD(v21) = *(_DWORD *)(v43 + 52);
LABEL_41:
LODWORD(Long_high) = v18->StartingIndex;
v27 = v21;
LODWORD(StartIndexInOut) = Long_high;
LABEL_42:
if( v27 )
{
v28 = Flagsa;
v29 = 0;
if( (Flagsa & 1) != 0 )
{
v29 = 2;
RtlSetBits(&v8->Bitmaps->ReservationBitmap, (unsigned int)Long_high, v27);
v8->FreeReservationSpace -= v27;
v28 = Flagsa;
}
if( (v28 & 2) != 0 )
{
v29 |= 1u;
MiSetPageFileAllocationBits(v8, (unsigned int)Long_high, v27);
}
if( v29 )
MiInvalidatePageFileBitmapsCache(v8, (unsigned int)Long_high, v27, v18);
if( !v47 )
{
v30 = &v8->SpinLock;
if( HIDWORD(StartIndexInOut) )
ExReleaseSpinLockSharedFromDpcLevel(v30);
else
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v30);
__writecr8(v20);
}
LODWORD(v31.Long) = MiTransferSoftwarePte(PageFileInfo->u.Long, (INT64)v8, (unsigned int)Long_high);
PageFileInfo->u.Long = v31.Long;
return v27;
}
goto LABEL_87;
}
LABEL_99:
if( !HIDWORD(StartIndexInOut) )
{
MiRescanPagefileBitmaps(v8);
v21 = NumberOfPages;
continue;
}
break;
}
ExReleaseSpinLockSharedFromDpcLevel(&v8->SpinLock);
__writecr8(v20);
v17 = v47;
v16 = 1;
}
}
return 0;
}Referenced by:
MiFindPageFileWriteCluster
MiGetKernelStackSwapSupport
MiReservePageFileSpace
MiReserveWorkingSetSwapSpaceRuns
MiTrimUnusedPageFileRegionsApc