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