ExpLoadAndSortLicensingCacheDescriptors
NTSTATUS __stdcall ExpLoadAndSortLicensingCacheDescriptors(){
_EX_PUSH_LOCK *v0;
INT64 v1;
_EX_PUSH_LOCK *v2;
int v3;
NTSTATUS v4;
unsigned int *v6;
int v7;
_DWORD *v8;
UINT64 v9;
char v10;
INT64 *v11;
UINT64 v12;
UINT64 v13;
_ETHREAD *CurrentThread;
_ETHREAD *v15;
char v16;
char v17;
v1 = (INT64)v0;
LODWORD(v13) = 0;
v17 = 0;
v16 = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v2 = v0 + 5855;
ExAcquirePushLockSharedEx(v0 + 5855, 0i64);
if( *(_BYTE *)(v1 + 46992) )
{
LODWORD(v13) = -1073741762;
}
else if( *(_BYTE *)(v1 + 46828) )
{
v3 = 0;
if( !*(_DWORD *)(v1 + 46824) )
v3 = -1073741772;
LODWORD(v13) = v3;
}
else
{
v17 = 1;
}
if( _InterlockedCompareExchange64(&v2->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v2);
KeAbPostRelease(v2);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v4 = v13;
if( (v13 & 0x80000000) == 0i64 && v17 == 1 )
{
v15 = (_ETHREAD *)KeGetCurrentThread();
--v15->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(v2, 0i64);
if( *(_BYTE *)(v1 + 46828) == 1 )
goto LABEL_30;
v6 = *(unsigned int **)v1;
if( *(_QWORD *)v1 )
{
v7 = sub_1407A2000((unsigned int **)v1);
LODWORD(v13) = v7;
if( v7 < 0 )
goto LABEL_30;
}
else
{
v6 = *(unsigned int **)(v1 + 46832);
if( !v6 )
goto LABEL_28;
v7 = v13;
}
if( (v6[3] & 1) != 0 )
ExpSetLicenseTamperState(v1, 2i64);
v8 = (_DWORD *)(v1 + 46824);
v9 = v1 + 24;
if( !*(_DWORD *)(v1 + 46824) )
{
v7 = sub_1407A2064((__int64)v6, 1, (VOID *)(v1 + 24), 0xB6Du, (unsigned int *)(v1 + 46824));
LODWORD(v13) = v7;
v9 = v1 + 24;
}
if( v7 >= 0 )
{
if( *v8 )
{
qsort(v9, (unsigned int)*v8, 0x10ui64, (INT64)sub_1407A6B40, v11, v12, v13);
*(_BYTE *)(v1 + 46828) = 1;
}
else
{
*(_BYTE *)(v1 + 46828) = 1;
LODWORD(v13) = -1073741772;
}
goto LABEL_30;
}
if( v7 != -1073741789 )
{
LABEL_30:
v10 = _InterlockedExchangeAdd64(&v2->_bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v10 & 2) != 0 && (v10 & 4) == 0 )
ExfTryToWakePushLock(v2);
KeAbPostRelease(v2);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v4 = v13;
goto LABEL_12;
}
LABEL_28:
LODWORD(v13) = -1073741762;
*(_BYTE *)(v1 + 46992) = 1;
v16 = 1;
goto LABEL_30;
}
LABEL_12:
if( v16 )
ntoskrnl_24(&KernelLicensingCacheCorrupt);
return v4;
}Referenced by:
SLQueryLicenseValueInternal