MiAllocatePartitionId
INT16 __stdcall MiAllocatePartitionId(INT64 Pool){
_ETHREAD *CurrentThread;
ULONG ClearBitsAndSet;
unsigned __int16 v4;
int v5;
ULONG v6;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx((UINT64)&qword_140C4E348, 0i64);
ClearBitsAndSet = RtlFindClearBitsAndSet(qword_140C4E368, 1u, 0);
v4 = ClearBitsAndSet;
if( ClearBitsAndSet == 0xFFFFFFFFi64 )
{
while( 1 )
{
MiExpandPartitionIds();
if( !v5 )
break;
v6 = RtlFindClearBitsAndSet(qword_140C4E368, 1u, 0);
v4 = v6;
if( v6 != 0xFFFFFFFFi64 )
goto LABEL_4;
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&qword_140C4E348, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&qword_140C4E348);
KeAbPostRelease(&qword_140C4E348);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return 0;
}
else
{
LABEL_4:
byte_140C4E39C = 1;
*(_QWORD *)(qword_140C4E388 + 8i64 * v4) = Pool;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&qword_140C4E348, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&qword_140C4E348);
KeAbPostRelease(&qword_140C4E348);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return v4;
}
}Referenced by:
No references.