ExInitLicenseData

VOID __stdcall ExInitLicenseData(){
  _KSPIN_LOCK *v0; 
  struct _EXP_LICENSE_STATE *ExpLicenseState; 
  char v2; 
  _EJOB *CurrentServerSilo; 
  _ETHREAD *CurrentThread; 
  volatile signed __int64 *v5; 
  _ETHREAD *v6; 
  _ETHREAD *v7; 
  int v8; 
  char v9; 
  __int64 v10; 
  __int128 *v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  _ETHREAD *v14; 
  _ETHREAD *v15; 
  _EJOB *v16; 
  NTSTATUS v17; 
  _LARGE_INTEGER v18; 
  int v19; 
  _LARGE_INTEGER ExpirationDate; 
  __int64 v21[5]; 
  char v22; 
  int v23; 
  __int16 v24; 
  char v25; 
  __int128 v26; 

  ExpirationDate.QuadPart = 0i64;
  ExpLicenseState = PsGetCurrentServerSiloGlobals(v0)->ExpLicenseState;
  v2 = *((_BYTE *)ExpLicenseState + 46992);
  CurrentServerSilo = PsGetCurrentServerSilo();
  if( PsIsHostSilo(CurrentServerSilo) )
  {
    ClipInitHandles();
    sub_140A5D438();
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  v5 = (volatile signed __int64 *)((char *)ExpLicenseState + 46840);
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)ExpLicenseState + 5855, 0i64);
  v23 = 0;
  v24 = 0;
  v25 = 0;
  memset(v21, 0, 32);
  v21[4] = 10800i64;
  v22 = 1;
  if( InitSafeBootMode || InitIsWinPEMode )
    v22 = 0;
  ExpSetKernelDataProtection((_EX_PUSH_LOCK *)ExpLicenseState, (__int64)v21, -1, 1);
  if( (_InterlockedExchangeAdd64(v5, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((_EX_PUSH_LOCK *)ExpLicenseState + 5855);
  KeAbPostRelease((char *)ExpLicenseState + 46840);
  KeLeaveCriticalRegion();
  v6 = (_ETHREAD *)KeGetCurrentThread();
  --v6->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)ExpLicenseState + 5855, 0i64);
  *((_DWORD *)ExpLicenseState + 2) = 0;
  if( (_InterlockedExchangeAdd64(v5, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((_EX_PUSH_LOCK *)ExpLicenseState + 5855);
  KeAbPostRelease((char *)ExpLicenseState + 46840);
  KeLeaveCriticalRegion();
  if( *(_QWORD *)ExpLicenseState )
  {
    v7 = (_ETHREAD *)KeGetCurrentThread();
    --v7->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)ExpLicenseState + 5855, 0i64);
    v8 = sub_1407A2000((unsigned int **)ExpLicenseState);
    if( v8 == -1073741762 )
    {
      *((_BYTE *)ExpLicenseState + 46992) = 1;
      v9 = 1;
    }
    else
    {
      v9 = *((_BYTE *)ExpLicenseState + 46992);
    }
    if( (_InterlockedExchangeAdd64(v5, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)ExpLicenseState + 5855);
    KeAbPostRelease((char *)ExpLicenseState + 46840);
    KeLeaveCriticalRegion();
    if( !v2 && v9 )
      ntoskrnl_24(&KernelLicensingCacheCorrupt);
    if( v8 >= 0 && !v9 )
    {
      v10 = *(unsigned int *)(*(_QWORD *)ExpLicenseState + 81920i64);
      if( qword_140D2C520 )
        ((void(__fastcall *)(struct _EXP_LICENSE_STATE *, __int64))qword_140D2C520)(ExpLicenseState, v10);
      else
        SLUpdateLicenseDataInternal((__int64)ExpLicenseState, v10, *(UINT8 **)ExpLicenseState);
    }
    v11 = &v26;
    v12 = 16i64;
    do
    {
      v13 = __rdtsc();
      *(_BYTE *)v11 = v13;
      v11 = (__int128 *)((char *)v11 + 1);
      --v12;
    }
    while( v12 );
    v14 = (_ETHREAD *)KeGetCurrentThread();
    --v14->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)ExpLicenseState + 5855, 0i64);
    *(_OWORD *)((char *)ExpLicenseState + 46993) = v26;
    if( (_InterlockedExchangeAdd64(v5, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)ExpLicenseState + 5855);
    KeAbPostRelease((char *)ExpLicenseState + 46840);
    KeLeaveCriticalRegion();
    v15 = (_ETHREAD *)KeGetCurrentThread();
    --v15->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)ExpLicenseState + 5855, 0i64);
    v16 = PsGetCurrentServerSilo();
    if( !PsIsHostSilo(v16) && *(_QWORD *)ExpLicenseState )
      ExFreePoolWithTag(*(PVOID *)ExpLicenseState, 0x69534C53u);
    *(_QWORD *)ExpLicenseState = 0i64;
    if( !*((_QWORD *)ExpLicenseState + 5854) )
    {
      v19 = *((_DWORD *)ExpLicenseState + 11706);
      if( v19 )
      {
        memset((char *)ExpLicenseState + 24, 0i64, 16 * v19);
        *((_DWORD *)ExpLicenseState + 11706) = 0;
      }
    }
    if( (_InterlockedExchangeAdd64(v5, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)ExpLicenseState + 5855);
    KeAbPostRelease((char *)ExpLicenseState + 46840);
    KeLeaveCriticalRegion();
  }
  if( !ExpSystemSetupInProgress )
  {
    v17 = ExGetExpirationDate(&ExpirationDate);
    v18 = ExpirationDate;
    if( v17 < 0 )
      v18.QuadPart = 0i64;
    KUSER_SHARED_DATA.SystemExpirationDate = v18;
  }
}

Referenced by:

Phase1InitializationIoReady
sub_1405B03A8