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