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.