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