PsLoadVsmEnclaveData

INT64 __fastcall PsLoadVsmEnclaveData(INT64 a1, UINT64 a2, UINT64 a3, UINT64 a4, INT64 a5){
  unsigned int v5; 
  unsigned int v6; 
  _QWORD *PoolWithTag; 
  int EnclaveData; 
  unsigned int v12; 
  int v13; 
  _ETHREAD *CurrentThread; 
  INT64 v15; 
  unsigned __int64 *v16; 
  bool v17; 
  _QWORD *v18; 
  _QWORD *v19; 
  _ETHREAD *v20; 
  unsigned int SessionId; 
  char v22; 
  int v23; 
  unsigned __int64 v24; 
  bool v25; 
  __int64 v26; 
  int v27; 
  unsigned int v28; 
  __int64 v29; 
  int v30[13]; 
  INT64 a6; 
  LODWORD(a6) = 0;
  v5 = a4;
  v6 = a3;
  if( (_DWORD)a3 == 4 )
  {
    PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x28ui64, 0x74457350ui64);
    if( !PoolWithTag )
      return 3221225626i64;
  }
  else
  {
    PoolWithTag = 0i64;
  }
  EnclaveData = VslLoadEnclaveData(*(_QWORD *)(a1 + 24), a2, v6, v5, a5, (INT64)&a6);
  v12 = EnclaveData;
  if( PoolWithTag )
  {
    if( EnclaveData < 0 )
    {
      ExFreePoolWithTag(PoolWithTag, 0);
    }
    else
    {
      v13 = a6;
      *((_DWORD *)PoolWithTag + 9) = 0;
      *((_DWORD *)PoolWithTag + 8) = v13;
      PoolWithTag[3] = a2;
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)CurrentThread + 242);
      v15 = a1 + 112;
      ExAcquirePushLockExclusiveEx(a1 + 112, 0i64);
      v16 = (unsigned __int64 *)(a1 + 104);
      v17 = 0;
      v18 = *(_QWORD **)(a1 + 104);
      if( v18 )
      {
        while( 1 )
        {
          if( (int)MiHotPatchImageTreeCompare(a2, (INT64)v18) < 0 )
          {
            v19 = (_QWORD *)*v18;
            if( !*v18 )
            {
              v17 = 0;
              break;
            }
          }
          else
          {
            v19 = (_QWORD *)v18[1];
            if( !v19 )
            {
              v17 = 1;
              break;
            }
          }
          v18 = v19;
        }
      }
      RtlAvlInsertNodeEx(v16, (__int64)v18, v17, PoolWithTag);
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v15, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)v15);
      v30[0] = 0;
      v20 = (_ETHREAD *)KeGetCurrentThread();
      if( (unsigned int)MiGetSystemRegionType(v15) == 1 )
        SessionId = MmGetSessionIdEx(*((_QWORD *)v20 + 23));
      else
        SessionId = -1;
      --*((_WORD *)v20 + 243);
      v22 = ++*((_BYTE *)v20 + 794);
      v23 = (*((char *)v20 + 792) | *((char *)v20 + 870)) ^ 0x3F;
      while( 1 )
      {
        v25 = !_BitScanReverse((unsigned int *)&v26, v23);
        if( v25 )
          goto LABEL_26;
        v24 = *((_QWORD *)v20 + 100) + 96 * v26;
        v23 &= ~(1 << v26);
        if( (*(_BYTE *)(v24 + 26) & 1) != 0
          && (*(_DWORD *)(v24 + 32) & 1) == 0
          && (*(_QWORD *)(v24 + 32) & 0x7FFFFFFFFFFFFFFCi64) == (v15 & 0x7FFFFFFFFFFFFFFCi64)
          && *(_DWORD *)(v24 + 40) == SessionId )
        {
          *(_BYTE *)(v24 + 26) &= ~1u;
          if( *(_QWORD *)(v24 + 32) )
            break;
        }
      }
      if( !v24 )
      {
LABEL_26:
        if( (*((_DWORD *)v20 + 30) & 0x10000) == 0 )
          KeBugCheckEx(0x162u, (ULONG_PTR)v20, v15, SessionId, 0i64);
        goto LABEL_33;
      }
      *(_BYTE *)(v24 + 32) |= 2u;
      if( *(__int64 *)(v24 + 32) < 0 )
        KiAbEntryRemoveFromTree(v24);
      v27 = *(_DWORD *)(v24 + 88) & 0x1FFFF;
      v28 = *(_DWORD *)(v24 + 88) & 0xFFFE0000;
      *(_BYTE *)(v24 + 25) &= ~1u;
      v30[0] = v27;
      *(_DWORD *)(v24 + 88) = v28;
      *(_QWORD *)(v24 + 32) = 0i64;
      v29 = (__int64)(v24 - *((_QWORD *)v20 + 100)) / 96;
      if( v22 == 1 )
        *((_BYTE *)v20 + 792) |= 1 << v29;
      else
        _InterlockedOr8((volatile signed __int8 *)v20 + 870, 1 << v29);
LABEL_33:
      --*((_BYTE *)v20 + 794);
      KiAbThreadRemoveBoosts((ULONG_PTR)v20, v15, (unsigned int *)v30);
      v25 = (*((_WORD *)v20 + 243))++ == 0xFFFF;
      if( v25 && *((_ETHREAD **)v20 + 19) != (_ETHREAD *)((char *)v20 + 152) )
        KiCheckForKernelApcDelivery();
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    }
  }
  return v12;
}

Referenced by:

MiLoadDataIntoVsmEnclave