MiJoinSession

__int64 __fastcall MiJoinSession(volatile signed __int32 **a1){
  _ETHREAD *CurrentThread; 
  __int64 v2; 
  volatile signed __int32 *v3; 
  signed __int32 v4; 
  signed __int32 v5; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  *a1 = 0i64;
  v2 = *((_QWORD *)CurrentThread + 23);
  if( (*(_DWORD *)(v2 + 2172) & 0x1000) != 0 )
    return 1i64;
  v3 = *(volatile signed __int32 **)(v2 + 1368);
  if( !v3 )
    return 1i64;
  v4 = *v3;
  while( v4 )
  {
    v5 = v4;
    v4 = _InterlockedCompareExchange(v3, v4 + 1, v4);
    if( v5 == v4 )
    {
      _InterlockedIncrement(v3 + 3);
      *a1 = v3;
      return 1i64;
    }
  }
  return 0i64;
}

Referenced by:

MmCreateProcessAddressSpace