MiUpdateLastSubsectionSize
NTSTATUS __stdcall MiUpdateLastSubsectionSize(_SUBSECTION *LastSubsection, UINT64 *NewSectionSize, UINT64 PtesUsed){
_CONTROL_AREA *ControlArea;
UINT64 v5;
int v7;
INT64 *p_ControlAreaLock;
unsigned __int64 v9;
INT64 v10;
__int64 v11;
_SEGMENT *Segment;
unsigned __int16 Short0;
__int64 TotalNumberOfPtes;
NTSTATUS result;
ControlArea = LastSubsection->ControlArea;
v5 = (unsigned int)PtesUsed;
v7 = 0;
p_ControlAreaLock = (INT64 *)&LastSubsection->ControlArea->ControlAreaLock;
while( 1 )
{
v9 = (unsigned __int8)ExAcquireSpinLockExclusive(p_ControlAreaLock);
if( !(_DWORD)v5 )
break;
LODWORD(v10) = MiGetSubsectionHoldingCrossPartitionReferences((INT64)LastSubsection);
LODWORD(v11) = MiGetSubsectionHoldingCrossPartitionReferences(v10);
if( (*(_DWORD *)(v11 + 48) & 0x3FFFFFFF) == 0 )
{
if( v7 == 1 )
v7 = 2;
LABEL_6:
LastSubsection->_bf_34 ^= (LastSubsection->_bf_34 ^ (LastSubsection->_bf_34 - v5)) & 0x3FFFFFFF;
break;
}
if( v7 )
goto LABEL_6;
ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
__writecr8(v9);
result = MiGetSubsectionCharges((UINT8)LastSubsection);
if( result < 0 )
return result;
v7 = 1;
}
LastSubsection->NumberOfFullSectors = (*NewSectionSize >> 12)
- (LastSubsection->StartingSector | ((LastSubsection->u.SubsectionFlags._bf_0 & 0xFFC0) << 26));
LastSubsection->u.SubsectionFlags._bf_2 = LastSubsection->u.SubsectionFlags._bf_2 & 0xF | (16
* *(_WORD *)NewSectionSize);
ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
__writecr8(v9);
if( (_DWORD)v5 )
{
Segment = ControlArea->Segment;
_InterlockedExchange64(
(volatile __int64 *)&ControlArea->Segment->SizeOfSegment,
_InterlockedCompareExchange64((volatile signed __int64 *)&ControlArea->Segment->SizeOfSegment, -1i64, -1i64)
+ (v5 << 12));
Short0 = Segment->SegmentFlags.Short0;
TotalNumberOfPtes = Segment->TotalNumberOfPtes;
Segment->TotalNumberOfPtes = v5 + TotalNumberOfPtes;
Segment->SegmentFlags.Short0 = Short0 ^ (Short0 ^ ((v5
+ (TotalNumberOfPtes | ((unsigned __int64)(Short0 & 0x3FF) << 32))) >> 32)) & 0x3FF;
if( v7 == 2 )
MiReturnCrossPartitionSectionCharges(
*(_MI_CROSS_PARTITION_CHARGES **)(*(&stru_140C4DB30 + 267) + 8i64 * (ControlArea->u1.Flags._bf_0 & 0x3FF)),
1i64,
v5);
}
return 0;
}Referenced by:
MmExtendSection