ExInitLicenseData
VOID __stdcall ExInitLicenseData(){
__int64 v0;
char v1;
_EJOB *CurrentServerSilo;
_ETHREAD *CurrentThread;
volatile signed __int64 *v4;
_ETHREAD *v5;
_ETHREAD *v6;
int v7;
char v8;
INT64 v9;
__int128 *v10;
__int64 v11;
unsigned __int64 v12;
_ETHREAD *v13;
_ETHREAD *v14;
_EJOB *v15;
int ExpirationDate;
_LARGE_INTEGER v17;
union _LARGE_INTEGER Time;
__int64 v19[5];
char v20;
int v21;
__int16 v22;
char v23;
__int128 v24;
Time.QuadPart = 0i64;
v0 = PsGetCurrentServerSiloGlobals()[113];
v1 = *(_BYTE *)(v0 + 46992);
CurrentServerSilo = PsGetCurrentServerSilo();
if( PsIsHostSilo(CurrentServerSilo) )
{
ClipInitHandles();
sub_140A5D438();
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v4 = (volatile signed __int64 *)(v0 + 46840);
ExAcquirePushLockExclusiveEx(v0 + 46840, 0i64);
v21 = 0;
v22 = 0;
v23 = 0;
memset(v19, 0, 32);
v19[4] = 10800i64;
v20 = 1;
if( InitSafeBootMode || InitIsWinPEMode )
v20 = 0;
ExpSetKernelDataProtection(v0, (__int64)v19, -1, 1);
if( (_InterlockedExchangeAdd64(v4, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v0 + 46840));
KeAbPostRelease((PVOID)(v0 + 46840));
KeLeaveCriticalRegion();
v5 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v5 + 242);
ExAcquirePushLockExclusiveEx(v0 + 46840, 0i64);
*(_DWORD *)(v0 + 8) = 0;
if( (_InterlockedExchangeAdd64(v4, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v0 + 46840));
KeAbPostRelease((PVOID)(v0 + 46840));
KeLeaveCriticalRegion();
if( *(_QWORD *)v0 )
{
v6 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v6 + 242);
ExAcquirePushLockExclusiveEx(v0 + 46840, 0i64);
v7 = sub_1407A2000((UINT64 **)v0);
if( v7 == -1073741762 )
{
*(_BYTE *)(v0 + 46992) = 1;
v8 = 1;
}
else
{
v8 = *(_BYTE *)(v0 + 46992);
}
if( (_InterlockedExchangeAdd64(v4, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v0 + 46840));
KeAbPostRelease((PVOID)(v0 + 46840));
KeLeaveCriticalRegion();
if( !v1 && v8 )
ntoskrnl_24(&KernelLicensingCacheCorrupt);
if( v7 >= 0 && !v8 )
{
v9 = *(unsigned int *)(*(_QWORD *)v0 + 81920i64);
if( qword_140D2C520 )
((void(__fastcall *)(__int64, INT64))qword_140D2C520)(v0, v9);
else
SLUpdateLicenseDataInternal(v0, v9, *(UINT8 **)v0);
}
v10 = &v24;
v11 = 16i64;
do
{
v12 = __rdtsc();
*(_BYTE *)v10 = v12;
v10 = (__int128 *)((char *)v10 + 1);
--v11;
}
while( v11 );
v13 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v13 + 242);
ExAcquirePushLockExclusiveEx(v0 + 46840, 0i64);
*(_OWORD *)(v0 + 46993) = v24;
if( (_InterlockedExchangeAdd64(v4, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v0 + 46840));
KeAbPostRelease((PVOID)(v0 + 46840));
KeLeaveCriticalRegion();
v14 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v14 + 242);
ExAcquirePushLockExclusiveEx(v0 + 46840, 0i64);
v15 = PsGetCurrentServerSilo();
if( !PsIsHostSilo(v15) && *(_QWORD *)v0 )
ExFreePoolWithTag(*(PVOID *)v0, 0x69534C53u);
*(_QWORD *)v0 = 0i64;
if( !*(_QWORD *)(v0 + 46832) && *(_DWORD *)(v0 + 46824) )
{
memset(v0 + 24, 0i64);
*(_DWORD *)(v0 + 46824) = 0;
}
if( (_InterlockedExchangeAdd64(v4, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v0 + 46840));
KeAbPostRelease((PVOID)(v0 + 46840));
KeLeaveCriticalRegion();
}
if( !ExpSystemSetupInProgress )
{
ExpirationDate = ExGetExpirationDate(&Time);
v17 = Time;
if( ExpirationDate < 0 )
v17.QuadPart = 0i64;
KUSER_SHARED_DATA.SystemExpirationDate = v17;
}
}Referenced by:
Phase1InitializationIoReady
sub_1405B03A8