MiSessionCreateInternal

NTSTATUS __stdcall MiSessionCreateInternal(UINT64 *SessionId){
  _ETHREAD *CurrentThread; 
  _EPROCESS *v3; 
  UINT8 *v4; 
  unsigned int ClearBitsAndSet; 
  unsigned int v6; 
  _RTL_BITMAP *Pool; 
  _RTL_AVL_TABLE *v8; 
  UINT8 *v9; 
  _MMPTE *v10; 
  _MMPTE *v11; 
  __int64 v12; 
  unsigned __int16 v13; 
  int v14; 
  unsigned __int16 v15; 
  __int64 v16; 
  UINT64 v17; 
  UINT64 v18; 
  INT64 v19; 
  unsigned __int64 v20; 
  _EJOB *CurrentServerSilo; 
  _KTBFLUSH_TYPE v23; 
  VOID *v24; 
  VOID *v25; 
  _TABLE_SEARCH_RESULT v26; 
  _TABLE_SEARCH_RESULT v27; 
  INT64 v28; 
  UINT64 v29; 
  _EPROCESS *Process; 
  UINT64 QpcTimeStamp; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v29 = qword_140C4DB20;
  v3 = CurrentThread->Tcb.ApcState.Process;
  --CurrentThread->Tcb.SpecialApcDisable;
  Process = v3;
  ExAcquirePushLockExclusiveEx(&stru_140C4DAF8, 0i64);
  ClearBitsAndSet = (unsigned int)RtlFindClearBitsAndSet(*(&stru_140C4DB30 + 548), (VOID *)1, 0i64, v4, v24, v26);
  if( ClearBitsAndSet == -1 )
  {
    v6 = **(&stru_140C4DB30 + 548) + 128;
    if( v6 > 0x7FFFF )
      v6 = 0x7FFFF;
    Pool = (_RTL_BITMAP *)MiAllocatePool(256i64, 8 * ((v6 >> 6) + ((v6 & 0x3F) != 0) + 2), 0x20206D4Dui64);
    v8 = (_RTL_AVL_TABLE *)Pool;
    if( !Pool )
      goto LABEL_19;
    Pool->SizeOfBitMap = v6;
    Pool->Buffer = &Pool[1].SizeOfBitMap;
    RtlClearAllBits(Pool);
    memmove(
      v8->BalancedRoot.LeftChild,
      *(const VOID **)(*(&stru_140C4DB30 + 548) + 8i64),
      8 * ((**(&stru_140C4DB30 + 548) >> 6) + ((**(&stru_140C4DB30 + 548) & 0x3F) != 0)));
    ExFreePoolWithTag(*(&stru_140C4DB30 + 548), 0);
    *(&stru_140C4DB30 + 548) = v8;
    ClearBitsAndSet = (unsigned int)RtlFindClearBitsAndSet(v8, (VOID *)1, 0i64, v9, v25, v27);
  }
  if( (_InterlockedExchangeAdd64(&stru_140C4DAF8._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(&stru_140C4DAF8);
  KeAbPostRelease(&stru_140C4DAF8);
  KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
  if( MiChargeCommit((_MI_PARTITION *)SessionId, 8ui64, 0i64) )
  {
    v10 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), 1ui64);
    v11 = v10;
    if( v10 )
    {
      v12 = (__int64)(((_QWORD)v10 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
      if( MiChargeResident((ULONG_PTR *)SessionId, ClearBitsAndSet != 0 ? 1032i64 : 28i64, 0i64) )
      {
        v13 = MiMapNewSession((_MM_SESSION_SPACE *)v12);
        v14 = PsDefaultSystemLocaleId;
        v15 = v13;
        *(_DWORD *)(v12 + 4) = 0;
        *(_DWORD *)(v12 + 96) = v14;
        *(_DWORD *)v12 = 1;
        *(_DWORD *)(v12 + 8) = ClearBitsAndSet;
        LODWORD(v16) = KeQueryInterruptTimePrecise(&QpcTimeStamp);
        v17 = v29;
        v18 = v29;
        *(_QWORD *)(v12 + 1056) = v16;
        LODWORD(v19) = MI_READ_PTE_LOCK_FREE((INT64)&MmGetPml4eBase()[(v18 >> 39) & 0x1FF]);
        v28 = v19;
        LODWORD(v20) = MI_READ_PTE_LOCK_FREE((INT64)&v28);
        *(_QWORD *)(v12 + 32) = (v20 >> 12) & 0xFFFFFFFFFi64;
        *(_WORD *)(v12 + 430) = *(_WORD *)SessionId;
        if( _InterlockedIncrement64((volatile signed __int64 *)(SessionId[22] + 24)) <= 1 )
          __fastfail(0xEu);
        *(_QWORD *)(v12 + 368) = ClearBitsAndSet != 0 ? 1024i64 : 20i64;
        *(_DWORD *)(v12 + 256) = v15;
        *(_QWORD *)(v12 + 40) = 8i64;
        *(_QWORD *)(v12 + 48) = 8i64;
        *(_QWORD *)(v12 + 816) = v28;
        *(_QWORD *)(v12 + 24) = v12 + 16;
        *(_QWORD *)(v12 + 16) = v12 + 16;
        *(_QWORD *)(v12 + 824) = 0i64;
        *(_QWORD *)(v12 + 88) = 0i64;
        *(_QWORD *)(v12 + 856) = 0i64;
        *(_DWORD *)(v12 + 12) = 1;
        *(_QWORD *)(v12 + 224) = _InterlockedIncrement64(&PsNextSecurityDomain);
        CurrentServerSilo = PsGetCurrentServerSilo();
        *(_QWORD *)(v12 + 1048) = CurrentServerSilo;
        if( CurrentServerSilo )
        {
          ObfReferenceObjectWithTag(CurrentServerSilo, 0x73536D4Dui64);
          _InterlockedCompareExchange(
            (volatile signed __int32 *)PsGetServerSiloGlobals(*(_EJOB **)(v12 + 1048))->UserSharedData,
            ClearBitsAndSet,
            -1);
        }
        MiMarkSessionMasterProcess(Process, (_MM_SESSION_SPACE *)v12);
        *(_DWORD *)(v12 + 904) = 4;
        *(_QWORD *)(v12 + 896) = MiGetPteAddress((VOID *)qword_140C4CAE0);
        *(_QWORD *)(v12 + 912) = v17 + 220;
        *(_DWORD *)(v12 + 908) = 1;
        *(_QWORD *)(v12 + 928) = v12 + 856;
        *(_BYTE *)(v12 + 440) = *(_BYTE *)(v12 + 440) & 0xF8 | 1;
        return 0;
      }
    }
    MiReturnCommit((_MI_PARTITION *)SessionId, 8ui64);
    if( v11 )
      MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v11, 1ui64, v23);
  }
  --CurrentThread->Tcb.SpecialApcDisable;
  ExAcquirePushLockExclusiveEx(&stru_140C4DAF8, 0i64);
  _bittestandreset(*(signed __int32 **)(*(&stru_140C4DB30 + 548) + 8i64), ClearBitsAndSet);
LABEL_19:
  if( (_InterlockedExchangeAdd64(&stru_140C4DAF8._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(&stru_140C4DAF8);
  KeAbPostRelease(&stru_140C4DAF8);
  KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
  return -1073741801;
}

Referenced by:

MiSessionCreate