RtlParseLeapSecondData
NTSTATUS __stdcall RtlParseLeapSecondData(INT64 a1, UINT64 a2, INT64 a3, INT64 a4){
NTSTATUS v4;
signed __int64 v7;
unsigned int v8;
UINT64 *v9;
INT64 v10;
int v11;
UINT64 v12;
__int64 v13;
UINT64 v15;
INT64 v16;
__int64 v17;
__int16 v18[4];
__int64 v19;
unsigned int v20;
int v21;
v20 = a2;
v4 = 0;
v15 = 0i64;
*(_DWORD *)(a4 + 4) = 0;
v7 = 0i64;
v21 = 0;
v8 = 0;
if( (_DWORD)a2 )
{
v9 = (UINT64 *)(a4 + 8);
v10 = a1 + 4;
v16 = a3 - a4;
while( 1 )
{
v18[0] = *(_WORD *)(v10 - 4);
v18[1] = *(_WORD *)(v10 - 2);
v18[2] = *(_WORD *)v10;
v18[3] = *(_WORD *)(v10 + 2);
v17 = v10;
v19 = 3866683i64;
if( !RtlpTimeFieldsToTimeNoLeapSeconds(v18, &v15) )
break;
if( (__int64)v15 <= v7 )
return 5;
v7 = v15;
if( RtlLongLongAdd(v15, 10000000i64 * v21, &v15) < 0 )
return 7;
v12 = v15;
if( (*(_BYTE *)(v10 + 4) & 1) != 0 )
{
v12 = v15 | 0x8000000000000000ui64;
v15 |= 0x8000000000000000ui64;
}
if( a3 && v8 < *(_DWORD *)(a3 + 4) && v12 != *(UINT64 *)((char *)v9 + v16) )
return 6;
*v9 = v12;
++v8;
v13 = v17;
++v9;
++*(_DWORD *)(a4 + 4);
v10 += 12i64;
v21 = v11 + 2 * ((*(_WORD *)(v13 + 4) & 1) == 0) - 1;
if( v8 >= v20 )
return v4;
}
return 4;
}
return v4;
}Referenced by:
ExpParseAndUpdateLeapSecondData