ExpParseAndUpdateLeapSecondData
NTSTATUS __stdcall ExpParseAndUpdateLeapSecondData(INT64 a1, INT64 a2){
INT64 v2;
unsigned __int64 v5;
unsigned __int64 v6;
unsigned int v7;
NTSTATUS v8;
size_t v10;
VOID **PoolWithTag;
int v12[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;
v10 = 8 * (v5 / 0xC) + 8;
PoolWithTag = ExAllocatePoolWithTag(1ui64, v7, 1683189836i64);
v2 = (INT64)PoolWithTag;
if( !PoolWithTag )
return 7;
memset(PoolWithTag, 0i64, v10);
v8 = RtlParseLeapSecondData(a1 + 12, (unsigned int)v6, a2, v2);
if( !v8 )
{
memmove((VOID *)(a2 + 8), (const VOID *)(v2 + 8), 8 * v6);
_InterlockedOr(v12, 0);
*(_DWORD *)(a2 + 4) = v6;
}
}
else
{
v8 = 1;
}
if( v2 )
ExFreePoolWithTag((PVOID)v2, 0x6453704Cu);
return v8;
}Referenced by:
ExpReadLeapSecondData