MmGetControlAreaPartition
NTSTATUS __stdcall MmGetControlAreaPartition(INT64 a1){
UINT8 CurrentIrql;
signed __int32 v3;
_MI_PARTITION *v4;
bool v6;
signed __int32 v7;
UINT64 SpinCount;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
if( _interlockedbittestandset((volatile signed __int32 *)&SpinLock, 0x1Fu) )
LODWORD(SpinCount) = ExpWaitForSpinLockExclusiveAndAcquire(&SpinLock, CurrentIrql);
v3 = SpinLock;
while( (v3 & 0xBFFFFFFF) != 0x80000000 )
{
if( (v3 & 0x40000000) == 0 )
{
v7 = _InterlockedCompareExchange((volatile signed __int32 *)&SpinLock, v3 | 0x40000000, v3);
v6 = v3 == v7;
v3 = v7;
if( !v6 )
continue;
}
KeYieldProcessorEx(&SpinCount);
v3 = SpinLock;
}
if( *(_QWORD *)a1 )
v4 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * (*(_WORD *)(*(_QWORD *)a1 + 60i64) & 0x3FF));
else
v4 = &Irp;
LODWORD(SpinLock) = 0;
__writecr8(CurrentIrql);
return(NTSTATUS)v4->Core.PartitionObject;
}Referenced by:
CcChargeDirtyPages
CcDeleteSectionsForPartition
CcGetFlushedValidData
CcMapAndCopyInToCache
CcNotifyOfMappedWriteComplete
CcPurgeCacheSection
CcSetDirtyInMask