ExpParseAndUpdateLeapSecondData
INT64 __fastcall ExpParseAndUpdateLeapSecondData(INT64 a1, INT64 a2){
UINT8 *v2;
unsigned __int64 v5;
unsigned __int64 v6;
unsigned int v7;
unsigned int v8;
UINT8 *PoolWithTag;
int v11[14];
v2 = 0i64;
if( *(_DWORD *)(a1 + 4) == 3 && (v5 = *(unsigned int *)(a1 + 8), v5 == 12 * (v5 / 0xC)) )
{
v6 = v5 / 0xC;
v7 = 8 * (*(_DWORD *)(a1 + 8) / 0xCu) + 8;
if( v7 > 0x1000 )
return 2;
if( !(_DWORD)v6 )
return 0;
if( (unsigned int)v6 <= *(_DWORD *)(a2 + 4) )
return(unsigned int)v6 < *(_DWORD *)(a2 + 4) ? 3 : 0;
PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v7, 0x6453704Cui64);
v2 = PoolWithTag;
if( !PoolWithTag )
return 7;
memset((INT64)PoolWithTag, 0i64);
v8 = RtlParseLeapSecondData(a1 + 12, (unsigned int)v6, a2, (INT64)v2);
if( !v8 )
{
memmove((UINT8 *)(a2 + 8), v2 + 8, 8i64 * (unsigned int)v6);
_InterlockedOr(v11, 0);
*(_DWORD *)(a2 + 4) = v6;
}
}
else
{
v8 = 1;
}
if( v2 )
ExFreePoolWithTag(v2, 0x6453704Cu);
return v8;
}Referenced by:
ExpReadLeapSecondData