SLUpdateLicenseDataInternal

INT64 __fastcall SLUpdateLicenseDataInternal(INT64 a1, INT64 rdx0, UINT8 *a3){
  int v4; 
  struct _DMA_ADAPTER *v6; 
  WCHAR *v7; 
  int v8; 
  __int64 v9; 
  unsigned int v10; 
  UINT8 *v11; 
  char v12; 
  volatile signed __int64 *v13; 
  _DWORD *v14; 
  unsigned int v15; 
  _ETHREAD *v16; 
  bool v17; 
  UINT64 *v18; 
  __int64 v19; 
  NTSTATUS updated; 
  UINT8 *v21; 
  NTSTATUS v22; 
  PVOID v23; 
  char *v24; 
  char *v25; 
  int v26; 
  _ETHREAD *v27; 
  size_t v28; 
  WCHAR *PoolWithTag; 
  unsigned int v30; 
  __int64 v31; 
  __int64 v32; 
  int v33; 
  __int64 v34; 
  __int64 v35; 
  _ETHREAD *v36; 
  UINT64 *v37; 
  PVOID v38; 
  __int64 v39; 
  NTSTATUS v40; 
  UINT8 *v41; 
  _EJOB *CurrentServerSilo; 
  char v43; 
  bool v44; 
  PVOID v45; 
  _ETHREAD *v46; 
  _ETHREAD *v47; 
  UINT64 SectionPageProtection; 
  UINT64 AllocationAttributes; 
  signed int v51; 
  bool v52; 
  char v53; 
  bool v54; 
  UINT8 *v55; 
  size_t NumOfElements; 
  struct _DMA_ADAPTER *v57; 
  unsigned int v58; 
  unsigned int v59; 
  PVOID MappedBase; 
  int a2; 
  PVOID v62; 
  PVOID v63; 
  union _LARGE_INTEGER MaximumSize; 
  void *SectionHandle; 
  PVOID Object; 
  PVOID v67; 
  __int128 v68; 
  __int128 v69; 
  __int128 v70; 
  __int128 v71; 
  __int128 v72; 
  __int128 v73; 
  int v74; 
  ULONG_PTR ViewSize; 
  void *Src; 
  __int64 v77; 
  __int128 v78; 
  __int128 v79; 
  __int128 v80; 
  struct _OBJECT_ATTRIBUTES ObjectAttributes; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v83; 
  __int64 v84; 
  __int128 v85[7]; 
  char v86; 
  v4 = rdx0;
  v54 = 0;
  v52 = 0;
  v86 = 0;
  SectionHandle = 0i64;
  memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
  MaximumSize.QuadPart = 0i64;
  MappedBase = 0i64;
  v67 = 0i64;
  v63 = 0i64;
  v6 = 0i64;
  v57 = 0i64;
  NumOfElements = 0i64;
  v7 = 0i64;
  v55 = 0i64;
  a2 = 0;
  v78 = 0i64;
  v79 = 0i64;
  v80 = 0i64;
  if( !a3 || (unsigned int)(rdx0 - 25) > 0x13FE7 || ((unsigned __int8)a3 & 3) != 0 )
  {
    v51 = -1073741811;
    goto LABEL_148;
  }
  v8 = *(_DWORD *)a3;
  if( *(_DWORD *)a3 > 0x14000u
    || (v9 = *((unsigned int *)a3 + 1), (unsigned int)v9 > 0x14000)
    || (v10 = *((_DWORD *)a3 + 2), v10 > 0x14000) )
  {
    v51 = -1073741760;
    goto LABEL_148;
  }
  v11 = &a3[v9 + 20];
  Src = v11;
  if( ((unsigned __int8)v11 & 3) != 0 )
  {
    v51 = -1073741811;
    v7 = 0i64;
LABEL_148:
    v12 = 1;
    goto LABEL_124;
  }
  v12 = 1;
  if( v10 + (_DWORD)v9 + 20 != v8 || v8 != v4 || *((_DWORD *)a3 + 4) != 1 )
  {
    v51 = -1073741811;
    v7 = 0i64;
    goto LABEL_124;
  }
  v51 = 0;
  *(_BYTE *)(a1 + 46856) = 0;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v13 = (volatile signed __int64 *)(a1 + 46840);
  ExAcquirePushLockSharedEx(a1 + 46840, 0i64);
  v62 = *(PVOID *)a1;
  v52 = v62 == 0i64;
  if( !ExpReducedLicenseData() )
  {
    if( !v62 && (*((_DWORD *)a3 + 3) & 1) != 0 )
    {
      v51 = -1073741811;
      goto LABEL_29;
    }
LABEL_19:
    v54 = 0;
    if( !v62 )
    {
      v14 = *(_DWORD **)(a1 + 46832);
      if( v14 )
      {
        if( !*(_BYTE *)(a1 + 46992) && *(_DWORD *)a3 == *v14 )
        {
          v15 = *((_DWORD *)a3 + 1);
          if( v15 == v14[1]
            && *((_DWORD *)a3 + 2) == v14[2]
            && *((_DWORD *)a3 + 3) == v14[3]
            && *((_DWORD *)a3 + 4) == v14[4]
            && RtlCompareMemory(v14 + 5, a3 + 20, v15) == *((_DWORD *)a3 + 1) )
          {
            v54 = RtlCompareMemory(
                    (VOID *)(*(unsigned int *)(*(_QWORD *)(a1 + 46832) + 4i64) + *(_QWORD *)(a1 + 46832) + 20i64),
                    v11,
                    *((unsigned int *)a3 + 2)) == *((unsigned int *)a3 + 2);
          }
        }
      }
    }
    goto LABEL_29;
  }
  if( v62 )
    goto LABEL_19;
  v51 = -1073741823;
LABEL_29:
  if( _InterlockedCompareExchange64(v13, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared((INT64 *)(a1 + 46840));
  KeAbPostRelease((PVOID)(a1 + 46840));
  KeLeaveCriticalRegion();
  if( v51 < 0 )
    goto LABEL_146;
  if( v54 )
  {
    v16 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v16 + 242);
    ExAcquirePushLockExclusiveEx(a1 + 46840, 0i64);
    ExpGetLicenseTamperState(a1, (_DWORD *)&NumOfElements + 1);
    v17 = HIDWORD(NumOfElements) != 0;
    v18 = (UINT64 *)*(unsigned int *)(a1 + 46824);
    HIDWORD(v68) = 0;
    *(_DWORD *)((char *)&v70 + 9) = 0;
    *(_WORD *)((char *)&v70 + 13) = 0;
    HIBYTE(v70) = 0;
    if( !(_DWORD)v18 || a1 != -24 )
    {
      *(_QWORD *)&v68 = 0i64;
      v69 = 0ui64;
      DWORD2(v68) = 0;
      *(_QWORD *)&v70 = 10800i64;
      BYTE8(v70) = 1;
      updated = ExpLicUpdateChecksum(a3 + 20, v18);
      if( !updated )
      {
        if( (_DWORD)v19 )
        {
          updated = (unsigned __int64)(16 * v19) > 0xFFFFFFFF ? 0xC0000095 : 0;
          if( (unsigned __int64)(16 * v19) <= 0xFFFFFFFF )
            updated = ExpLicUpdateChecksum(v21, (UINT64 *)0xFFFFFFFFi64);
        }
      }
      if( updated )
      {
        *(_QWORD *)&v68 = 0i64;
        DWORD2(v68) = 4;
      }
      v78 = v68;
      v79 = v69;
      v80 = v70;
      ExpSetKernelDataProtection(a1, (__int64)&v78, 7, 1);
    }
    if( (_InterlockedExchangeAdd64(v13, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)(a1 + 46840));
    KeAbPostRelease((PVOID)(a1 + 46840));
    KeLeaveCriticalRegion();
    if( v17 )
      SLSendPolicyChangeNotifications(a1);
    v51 = 0x40000000;
LABEL_47:
    v7 = 0i64;
LABEL_48:
    v6 = 0i64;
    goto LABEL_124;
  }
  ObjectAttributes.Length = 48;
  ObjectAttributes.RootDirectory = 0i64;
  ObjectAttributes.Attributes = 544;
  ObjectAttributes.ObjectName = 0i64;
  *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
  MaximumSize.QuadPart = *(unsigned int *)a3;
  LODWORD(AllocationAttributes) = 0x8000000;
  LODWORD(SectionPageProtection) = 4;
  v51 = ZwCreateSection(
          &SectionHandle,
          0xF0007ui64,
          &ObjectAttributes,
          &MaximumSize,
          SectionPageProtection,
          AllocationAttributes,
          0i64);
  if( v51 < 0 )
    goto LABEL_146;
  Object = 0i64;
  v22 = ObReferenceObjectByHandle(SectionHandle, 0, 0i64, 0, &Object, 0i64);
  v23 = Object;
  v63 = Object;
  v51 = v22;
  ZwClose(SectionHandle);
  if( v22 < 0 || (ViewSize = 0i64, v51 = MmMapViewInSystemSpace(v23, &MappedBase, &ViewSize), v51 < 0) )
  {
LABEL_146:
    v7 = 0i64;
    v6 = 0i64;
    goto LABEL_124;
  }
  v24 = (char *)MappedBase;
  *(_OWORD *)MappedBase = *(_OWORD *)a3;
  *((_DWORD *)v24 + 4) = *((_DWORD *)a3 + 4);
  memmove((UINT8 *)v24 + 20, a3 + 20, *((unsigned int *)a3 + 1));
  memmove((UINT8 *)&v24[*((unsigned int *)a3 + 1) + 20], (UINT8 *)Src, *((unsigned int *)a3 + 2));
  v25 = &v24[*((unsigned int *)v24 + 1) + 20];
  v26 = 0;
  if( *((_DWORD *)v24 + 2) != 4 || !v25 || *(_DWORD *)v25 != 69 )
  {
    v51 = -1073741761;
    v7 = 0i64;
    v6 = 0i64;
    goto LABEL_124;
  }
  v51 = sub_1407A2064((INT64)v24, 1, 0i64, 0i64, &NumOfElements);
  if( v51 == -1073741789 )
  {
    v27 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v27 + 242);
    ExAcquirePushLockSharedEx(a1 + 46840, 0i64);
    v51 = (unsigned int)NumOfElements > 0xB6D ? 0xC000000D : 0;
    if( _InterlockedCompareExchange64(v13, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((INT64 *)(a1 + 46840));
    KeAbPostRelease((PVOID)(a1 + 46840));
    KeLeaveCriticalRegion();
    if( v51 < 0 )
      goto LABEL_47;
    v28 = (unsigned int)NumOfElements;
    PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 16i64 * (unsigned int)NumOfElements, 0x20534C53ui64);
    v7 = PoolWithTag;
    v55 = (UINT8 *)PoolWithTag;
    if( !PoolWithTag )
    {
      v51 = -1073741801;
      goto LABEL_48;
    }
    v51 = sub_1407A2064((INT64)MappedBase, 0, PoolWithTag, (unsigned int)NumOfElements, 0i64);
    if( v51 >= 0 )
      qsort(v7, v28, (const WCHAR *)0x10, sub_1407A6B40);
  }
  else
  {
    v7 = 0i64;
  }
  if( v51 < 0 )
  {
    v6 = 0i64;
    if( v51 == -1073741762 )
      v51 = -1073741811;
    goto LABEL_124;
  }
  v53 = 0;
  v83 = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)v83 + 242);
  ExAcquirePushLockSharedEx(a1 + 46840, 0i64);
  if( !v62 )
  {
    v30 = 0;
    v59 = 0;
    v31 = 0i64;
    v58 = 0;
    while( v30 < (unsigned int)NumOfElements )
    {
      if( (unsigned int)v31 >= *(_DWORD *)(a1 + 46824) )
      {
        while( v30 < (unsigned int)NumOfElements )
        {
          v77 = *(_QWORD *)&v55[16 * v30 + 8];
          if( (*(_DWORD *)(v77 + 8) & 2) != 0 )
            goto LABEL_73;
          v59 = ++v30;
        }
        break;
      }
      v32 = (unsigned int)v31;
      v33 = sub_1407A6B40(&v55[16 * v30], (const void *)(16 * v31 + a1 + 24));
      v74 = v33;
      v34 = *(_QWORD *)&v55[16 * v30 + 8];
      v77 = v34;
      v35 = *(_QWORD *)(a1 + 16 * (v32 + 2));
      v84 = v35;
      v26 = 0;
      if( v33 >= 0 )
      {
        if( v33 <= 0 )
        {
          if( (*(_DWORD *)(v34 + 8) & 2) != 0
            && (*(_WORD *)(v34 + 6) != *(_WORD *)(v35 + 6)
             || memcmp(
                  (PVOID)(*(unsigned __int16 *)(v34 + 2) + v34 + 16),
                  (PVOID)(*(unsigned __int16 *)(v35 + 2) + 16i64 + v35),
                  *(unsigned __int16 *)(v35 + 6))) )
          {
LABEL_73:
            v53 = 1;
            break;
          }
          v59 = ++v30;
        }
        v31 = ++v58;
      }
      else
      {
        if( (*(_DWORD *)(v34 + 8) & 2) != 0 )
          goto LABEL_73;
        v59 = ++v30;
        v31 = v58;
      }
    }
  }
  if( _InterlockedCompareExchange64(v13, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared((INT64 *)(a1 + 46840));
  KeAbPostRelease((PVOID)(a1 + 46840));
  KeLeaveCriticalRegion();
  ObfReferenceObject(v63);
  v36 = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)v36 + 242);
  ExAcquirePushLockExclusiveEx(a1 + 46840, 0i64);
  HIDWORD(v71) = 0;
  *(_DWORD *)((char *)&v73 + 9) = 0;
  *(_WORD *)((char *)&v73 + 13) = 0;
  HIBYTE(v73) = 0;
  v38 = MappedBase;
  if( MappedBase )
  {
    v39 = (unsigned int)NumOfElements;
    if( !(_DWORD)NumOfElements || v55 )
    {
      *(_QWORD *)&v71 = 0i64;
      v72 = 0ui64;
      DWORD2(v71) = 0;
      *(_QWORD *)&v73 = 10800i64;
      BYTE8(v73) = 1;
      v40 = ExpLicUpdateChecksum((UINT8 *)MappedBase + 20, v37);
      if( !v40 )
      {
        if( (_DWORD)v39 )
        {
          v40 = (unsigned __int64)(16 * v39) > 0xFFFFFFFF ? 0xC0000095 : 0;
          if( (unsigned __int64)(16 * v39) <= 0xFFFFFFFF )
            v40 = ExpLicUpdateChecksum(v41, (UINT64 *)0xFFFFFFFFi64);
        }
      }
      if( v40 )
      {
        *(_QWORD *)&v71 = 0i64;
        DWORD2(v71) = 4;
      }
      v78 = v71;
      v79 = v72;
      v80 = v73;
      goto LABEL_98;
    }
  }
  else
  {
    LODWORD(v39) = NumOfElements;
  }
  v26 = -1073741811;
LABEL_98:
  v51 = v26;
  if( v26 < 0 )
  {
    v44 = 0;
  }
  else
  {
    ExpSetKernelDataProtection(a1, (__int64)&v78, 7, 1);
    v57 = *(struct _DMA_ADAPTER **)(a1 + 16);
    v67 = *(PVOID *)(a1 + 46832);
    *(_QWORD *)(a1 + 16) = v63;
    *(_QWORD *)(a1 + 46832) = v38;
    MappedBase = 0i64;
    CurrentServerSilo = PsGetCurrentServerSilo();
    if( !PsIsHostSilo(CurrentServerSilo) && *(_QWORD *)a1 )
      ExFreePoolWithTag(*(PVOID *)a1, 0x69534C53u);
    *(_QWORD *)a1 = 0i64;
    v86 = *(_BYTE *)(a1 + 46992);
    *(_BYTE *)(a1 + 46992) = 0;
    memset(a1 + 24, 0i64);
    *(_DWORD *)(a1 + 46824) = 0;
    if( v55 )
    {
      memmove((UINT8 *)(a1 + 24), v55, 16i64 * (unsigned int)v39);
      *(_DWORD *)(a1 + 46824) = v39;
    }
    *(_BYTE *)(a1 + 46828) = 1;
    ExpGetLicenseTamperState(a1, &a2);
    v43 = v52;
    if( (*(_DWORD *)(*(_QWORD *)(a1 + 46832) + 12i64) & 1) != 0 )
      v43 = 1;
    v52 = v43;
    ExpSetLicenseTamperState(a1, 2 * (*(_DWORD *)(*(_QWORD *)(a1 + 46832) + 12i64) & 1u));
    ExpGetLicenseTamperState(a1, (_DWORD *)&NumOfElements + 1);
    v44 = a2 != HIDWORD(NumOfElements) && (!a2 || !HIDWORD(NumOfElements));
  }
  if( (_InterlockedExchangeAdd64(v13, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)(a1 + 46840));
  KeAbPostRelease((PVOID)(a1 + 46840));
  KeLeaveCriticalRegion();
  if( v26 < 0 )
    goto LABEL_123;
  v45 = v62;
  if( v62 )
    goto LABEL_118;
  v51 = sub_14094DC8C(a1);
  if( v51 < 0 )
  {
LABEL_123:
    v6 = v57;
    v7 = (WCHAR *)v55;
    goto LABEL_124;
  }
  v45 = v62;
LABEL_118:
  if( v44 || !v45 )
    SLSendPolicyChangeNotifications(a1);
  v51 = 0;
  v7 = (WCHAR *)v55;
  v6 = v57;
  if( v53 == 1 )
    v51 = 263;
LABEL_124:
  if( v86 && !*(_BYTE *)(a1 + 46992) )
    ntoskrnl_24(&KernelLicensingCacheCorruptionFixed);
  if( v52 )
  {
    v46 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v46 + 242);
    ExAcquirePushLockExclusiveEx(a1 + 46840, 0i64);
    memset(v85, 0, 48);
    ExpSetKernelDataProtection(a1, (__int64)v85, 32, 0);
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 46840), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)(a1 + 46840));
    KeAbPostRelease((PVOID)(a1 + 46840));
    KeLeaveCriticalRegion();
  }
  if( v63 )
    HalPutDmaAdapter((PADAPTER_OBJECT)v63);
  if( v6 )
    HalPutDmaAdapter(v6);
  if( MappedBase )
    MmUnmapViewInSystemSpace(MappedBase);
  if( v67 )
    MmUnmapViewInSystemSpace(v67);
  if( v7 )
    ExFreePoolWithTag(v7, 0);
  if( v51 == -1073741811 || (unsigned int)(v51 + 1073741761) <= 1 )
  {
    v47 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v47 + 242);
    ExAcquirePushLockExclusiveEx(a1 + 46840, 0i64);
    ExpGetLicenseTamperState(a1, (_DWORD *)&NumOfElements + 1);
    if( HIDWORD(NumOfElements) )
      v12 = 0;
    else
      ExpSetLicenseTamperState(a1, 5i64);
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 46840), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)(a1 + 46840));
    KeAbPostRelease((PVOID)(a1 + 46840));
    KeLeaveCriticalRegion();
    if( v12 )
      SLSendPolicyChangeNotifications(a1);
  }
  return(unsigned int)v51;
}

Referenced by:

ExInitLicenseData
ExUpdateLicenseData