MiAllocateFileExtents
__int64 __fastcall MiAllocateFileExtents(ULONG_PTR BugCheckParameter2, unsigned int a2, ULONG_PTR a3, int a4, int a5){
unsigned __int64 v7;
unsigned __int64 v8;
__int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
UINT64 v12;
_FILE_OBJECT *v13;
ULONG i;
PHYSICAL_EXTENTS_DESCRIPTOR *v15;
INT64 v16;
PHYSICAL_EXTENTS_DESCRIPTOR *v17;
int v19;
__int64 v20;
int v21;
unsigned __int64 v22;
UINT64 *v23;
NTSTATUS v24;
ULONG_PTR v25;
int v26;
unsigned __int64 v27;
INT64 v28;
UINT64 v29;
int v30;
UINT64 v31;
_CONTROL_AREA *v32;
_MI_PARTITION *ControlAreaPartition;
int v34;
__int64 v35;
void *v36;
unsigned int v37;
ULONG NumberOfValidRuns;
int v39;
int v40;
unsigned int v41;
ULONG_PTR BugCheckParameter2a;
ULONG_PTR BugCheckParameter2b;
UINT64 v44;
unsigned __int64 v45;
UINT64 NumberOfPages;
__int64 v47;
_LARGE_INTEGER NumberOfBytes;
_LARGE_INTEGER StartAddress;
__int128 Node;
__int128 Node_16;
__int128 v52;
INT64 a2a[2];
__int128 v54;
__int64 v55;
ULONG_PTR v56;
ULONG_PTR v57;
int v58;
int v59;
int v60;
NTSTATUS v61;
unsigned int v62;
v62 = a2;
v41 = 0;
NumberOfPages = 0i64;
v44 = 0i64;
v7 = a3;
v8 = (unsigned int)(a4 << 12);
BugCheckParameter2a = (unsigned int)v8;
*(_OWORD *)a2a = 0i64;
v55 = 0i64;
v54 = 0i64;
Node = 0i64;
Node_16 = 0i64;
v52 = 0i64;
while( 2 )
{
v9 = *(_QWORD *)BugCheckParameter2;
v10 = v8;
v47 = v9;
if( (*(_DWORD *)(v9 + 56) & 0x20) != 0 )
{
v40 = 1;
if( *(_QWORD *)(BugCheckParameter2 + 8) )
v11 = MiStartingOffset(BugCheckParameter2, v7, 0);
else
v11 = (unsigned __int64)a2 << 12;
v12 = MiEndingOffset((_SUBSECTION *)BugCheckParameter2);
v44 = v12;
if( v11 == v12 && !v11 )
return 0i64;
if( v10 + v11 > v12 )
v10 = ((unsigned int)(v12 - v11) + 511i64) & 0xFFFFFFFFFFFFFE00ui64;
}
else
{
v40 = 2;
v11 = (a2
+ (*(unsigned int *)(BugCheckParameter2 + 36) | ((unsigned __int64)(*(_WORD *)(BugCheckParameter2 + 32) & 0xFFC0) << 26))) << 12;
}
v13 = MiReferenceControlAreaFile((_CONTROL_AREA *)v9);
v39 = 1;
for( i = ((__rdtsc() >> 4) & 7) + 8; ; i = NumberOfValidRuns )
{
while( 1 )
{
if( !i )
{
LABEL_16:
MiDereferenceControlAreaFile(v9, (unsigned __int64)v13);
return 3221225626i64;
}
LODWORD(v15) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v17 = v15;
if( v15 )
break;
if( !v39 )
goto LABEL_16;
i >>= 1;
}
v15->NumberOfRuns = i;
v15->NumberOfValidRuns = 0;
v39 = 0;
v60 = 0;
if( v40 == 1 )
{
if( v10 + v11 > v44 )
v10 = (unsigned int)(v44 - v11);
v16 = *(_QWORD *)(BugCheckParameter2 + 8);
if( v16 && (*(_BYTE *)(*(_QWORD *)(v9 + 96) + 48i64) & 1) != 0 )
v11 = (v16 - *(_QWORD *)(*(_QWORD *)v9 + 64i64)) >> 3 << 12;
}
v10 = (v10 + 4095) & 0xFFFFFFFFFFFFF000ui64;
if( v40 != 1 || (*(_DWORD *)(v9 + 56) & 2) == 0 )
{
v61 = MiChangingSubsectionProtos((PVOID)BugCheckParameter2);
if( v61 < 0 )
{
MiDereferenceControlAreaFile(v9, (unsigned __int64)v13);
ExFreePoolWithTag(v17, 0);
return(unsigned int)v61;
}
v60 = 1;
}
FsRtlGetFileExtents((INT64)v13, v16);
v37 = v19;
if( v19 < 0 )
{
MiDereferenceControlAreaFile(v9, (unsigned __int64)v13);
if( v60 == 1 )
MiUnlinkSubsectionWaitBlock((__int64 *)BugCheckParameter2, (__int64)a2a, 0);
v36 = v17;
LABEL_115:
ExFreePoolWithTag(v36, 0);
return v37;
}
NumberOfValidRuns = v17->NumberOfValidRuns;
if( NumberOfValidRuns <= i )
break;
if( v60 == 1 )
{
MiUnlinkSubsectionWaitBlock((__int64 *)BugCheckParameter2, (__int64)a2a, 0);
NumberOfValidRuns = v17->NumberOfValidRuns;
}
v17->NumberOfValidRuns = i;
ExFreePoolWithTag(v17, 0);
}
MiDereferenceControlAreaFile(v9, (unsigned __int64)v13);
v20 = 0i64;
if( !(unsigned int)MiNewPfnsSuitable(v17) )
{
v24 = -1073740761;
LABEL_109:
ExFreePoolWithTag(v17, 0);
if( v60 == 1 )
MiUnlinkSubsectionWaitBlock((__int64 *)BugCheckParameter2, (__int64)a2a, 0);
return(unsigned int)v24;
}
if( v17->NumberOfValidRuns )
{
v23 = MiConvertRunsToPages(v17, &NumberOfPages);
if( v23 )
{
if( (a5 & 0x40) == 0 || v41 <= 1 )
{
v22 = NumberOfPages;
v21 = v40;
goto LABEL_41;
}
v24 = -1073741800;
}
else
{
v24 = -1073741670;
}
goto LABEL_109;
}
if( (a5 & 0x40) != 0 || (v21 = v40, v40 == 1) )
{
v24 = -1073741823;
goto LABEL_109;
}
v41 = -1;
v22 = 0i64;
NumberOfPages = 0i64;
v23 = 0i64;
LABEL_41:
if( v21 == 1 && (*(_DWORD *)(v9 + 56) & 2) != 0 )
goto LABEL_54;
v24 = MiChangingSubsectionProtos((PVOID)BugCheckParameter2);
if( v24 >= 0 )
{
if( v23 )
{
v25 = a3;
if( (a5 & 1) == 0 )
MiEliminateStaleExtents((MMPTE *)a3, v23, v22);
goto LABEL_55;
}
LABEL_54:
v25 = a3;
LABEL_55:
ExFreePoolWithTag(v17, 0);
if( v23 && (*(_BYTE *)(v9 + 56) & 0x20) == 0 && (a5 & 1) != 0 )
{
*((_QWORD *)&v52 + 1) = v22;
*(_QWORD *)&v52 = v25;
*((_QWORD *)&Node_16 + 1) = *((_QWORD *)&Node_16 + 1) & 0xFFFFFFFFFFFFFFF8ui64 | 4;
MiUpdateSystemProtoPtesTree((RTL_BALANCED_NODE *)&Node, 1i64);
}
v26 = 0;
v27 = 0i64;
v37 = 0;
v28 = -1i64;
v45 = 0i64;
v29 = 0i64;
BugCheckParameter2b = -1i64;
v30 = a5 & 0x40;
while( 1 )
{
if( (unsigned int)v20 == v22 )
{
if( !v29 )
goto LABEL_72;
}
else
{
if( !v29 )
{
v28 = v23[v20];
BugCheckParameter2b = v28;
v29 = 1i64;
goto LABEL_94;
}
v27 = v45;
if( v23[v20 - 1] + 1 == v23[v20] )
{
++v29;
goto LABEL_95;
}
v30 = a5 & 0x40;
}
if( v28 == 0x8000000000000000ui64 )
{
if( v26 >= 0 )
{
*(_QWORD *)(a3 + 8 * ((unsigned int)v20 - v29)) = MiMakeSubsectionPte(BugCheckParameter2);
if( (a5 & 2) != 0 )
{
v26 = -1073740023;
v37 = -1073740023;
LABEL_71:
v30 = a5 & 0x40;
LABEL_72:
if( v26 < 0 )
{
if( (_QWORD)v52 )
MiUpdateSystemProtoPtesTree((RTL_BALANCED_NODE *)&Node, 0i64);
LABEL_101:
v35 = v47;
}
else
{
if( (a5 & 1) == 0 )
goto LABEL_101;
if( v30 )
*(_DWORD *)(BugCheckParameter2 + 108) = 2;
MiSetSubsectionBase(BugCheckParameter2, a3, v41);
if( (_QWORD)v52 )
{
MiReplaceSystemProtoPtesNode(
(RTL_BALANCED_NODE *)&Node,
(RTL_BALANCED_NODE *)(BugCheckParameter2 + 112));
goto LABEL_101;
}
v35 = v47;
if( (*(_DWORD *)(v47 + 56) & 0x20) == 0 )
MiUpdateSystemProtoPtesTree((RTL_BALANCED_NODE *)(BugCheckParameter2 + 112), 1i64);
}
if( v40 != 1 || (*(_DWORD *)(v35 + 56) & 2) == 0 )
MiSubsectionProtosCreated((INT64 *)BugCheckParameter2, (INT64)a2a, (unsigned int)a4, 0i64);
if( v23 )
{
v36 = v23;
goto LABEL_115;
}
return v37;
}
goto LABEL_90;
}
goto LABEL_92;
}
if( (v28 & 0x4000000000000000i64) != 0 )
{
if( v26 >= 0 || (unsigned __int64)&v23[v20] > v27 )
goto LABEL_92;
if( (unsigned int)v20 == v22 )
goto LABEL_71;
v29 = 0i64;
LODWORD(v20) = v20 - 1;
}
else
{
if( v26 < 0 )
{
if( (unsigned __int64)&v23[v20] <= v27 )
{
if( (a5 & 0x40) != 0 )
MiDecrementProtoShareCounts(v28, v29);
MiRemovePhysicalMemory(BugCheckParameter2b, v29, 0x12ui64);
LABEL_90:
v26 = v37;
LABEL_91:
v28 = BugCheckParameter2b;
}
LABEL_92:
if( (unsigned int)v20 == v22 )
goto LABEL_71;
v29 = 0i64;
LODWORD(v20) = v20 - 1;
LABEL_94:
v27 = v45;
goto LABEL_95;
}
v59 = 0;
v56 = BugCheckParameter2;
v31 = (unsigned int)v20 - v29;
v58 = 2 - (v30 != 0);
v32 = *(_CONTROL_AREA **)BugCheckParameter2;
NumberOfBytes.QuadPart = v29 << 12;
v57 = a3 + 8 * v31;
StartAddress.QuadPart = v28 << 12;
ControlAreaPartition = MiGetControlAreaPartition(v32);
MiAddPhysicalMemory(ControlAreaPartition, &StartAddress, &NumberOfBytes, 2ui64);
v37 = v34;
v26 = v34;
if( v34 >= 0 )
goto LABEL_91;
v28 = BugCheckParameter2b;
v27 = (unsigned __int64)&v23[v31];
v29 = 0i64;
v45 = v27;
LODWORD(v20) = -1;
}
LABEL_95:
v20 = (unsigned int)(v20 + 1);
v30 = a5 & 0x40;
if( (unsigned int)v20 > v22 )
goto LABEL_72;
}
}
ExFreePoolWithTag(v17, 0);
if( v23 )
ExFreePoolWithTag(v23, 0);
if( v24 == -1073740748 )
{
a2 = v62;
v8 = BugCheckParameter2a;
v7 = a3;
continue;
}
return(unsigned int)v24;
}
}Referenced by:
MiAddViewsForSection
MiCreatePrototypePtes
MiFaultGetFileExtents
MiInitializeImageExtents
MiRefillPurgedExtents
MiUpdateActiveSubsection