NtSetSystemTime
NTSTATUS __stdcall NtSetSystemTime(_LARGE_INTEGER *SystemTime, _LARGE_INTEGER *PreviousTime){
char PreviousMode;
__int64 v6;
LONGLONG QuadPart;
NTSTATUS v8;
char v9;
_LARGE_INTEGER v10;
INT64 v11;
__int64 HasCapability;
_LARGE_INTEGER OldTime;
_LARGE_INTEGER NewTime;
_LARGE_INTEGER Time;
_UNICODE_STRING CapabilityName;
_TIME_FIELDS TimeFields;
OldTime.QuadPart = 0i64;
NewTime.QuadPart = 0i64;
Time.QuadPart = 0i64;
TimeFields = 0i64;
LOBYTE(HasCapability) = 0;
*(_QWORD *)&CapabilityName.Length = 2228256i64;
CapabilityName.Buffer = L"systemManagement";
if( SystemTime )
{
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeSystemtimePrivilege, PreviousMode)
&& (RtlIsMultiSessionSku()
|| RtlCapabilityCheck(0i64, &CapabilityName, (UINT8 *)&HasCapability) < 0
|| !(_BYTE)HasCapability)
|| PsIsCurrentThreadInServerSilo() )
{
return -1073741727;
}
if( PreviousMode )
{
if( ((unsigned __int8)SystemTime & 3) != 0 )
ExRaiseDatatypeMisalignment();
v6 = 0x7FFFFFFF0000i64;
if( PreviousTime )
{
if( ((unsigned __int8)PreviousTime & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)PreviousTime < 0x7FFFFFFF0000i64 )
v6 = (__int64)PreviousTime;
*(_BYTE *)v6 = *(_BYTE *)v6;
*(_BYTE *)(v6 + 7) = *(_BYTE *)(v6 + 7);
}
QuadPart = SystemTime->QuadPart;
NewTime = *SystemTime;
}
else
{
QuadPart = SystemTime->QuadPart;
NewTime = *SystemTime;
}
if( HIDWORD(QuadPart) > 0x20000000 )
return -1073741811;
ExAcquireTimeRefreshLock(1u);
ExpSetSystemTime(1u, 0, TimeChangeApplication, NewTime, &OldTime);
SeAuditSystemTimeChange(OldTime, NewTime);
ExReleaseTimeRefreshLock();
if( PreviousTime )
*PreviousTime = OldTime;
return 0;
}
if( PsIsCurrentThreadInServerSilo() )
{
ExAcquireTimeRefreshLock(1u);
ExpRefreshTimeZoneInformation();
ExReleaseTimeRefreshLock();
return 0;
}
v8 = -1073741811;
ExAcquireTimeRefreshLock(1u);
v9 = ExpSystemIsInCmosMode;
if( (unsigned __int8)HalQueryRealTimeClock(&TimeFields)
&& RtlTimeFieldsToTime(&TimeFields, &Time)
&& ExpRefreshTimeZoneInformation() )
{
v10 = *(_LARGE_INTEGER *)&KUSER_SHARED_DATA.SystemTime.LowPart;
OldTime = *(_LARGE_INTEGER *)&KUSER_SHARED_DATA.SystemTime.LowPart;
if( !*(&stru_140CF2E80 + 1829) )
{
if( v9 )
{
ExLocalTimeToSystemTime(&Time, &NewTime);
KeSetSystemTime(&NewTime, &OldTime, 0i64);
goto LABEL_29;
}
ExSystemTimeToLocalTime(&OldTime, &Time);
RtlTimeToTimeFields((INT64 *)&Time, (WORD *)&TimeFields, v11);
HalSetRealTimeClock(&TimeFields.Year);
v10 = OldTime;
}
NewTime = v10;
LABEL_29:
PoNotifySystemTimeSet(&NewTime, &OldTime, TimeChangeTimeZone);
v8 = 0;
}
ExReleaseTimeRefreshLock();
return v8;
}Referenced by:
ExpSetTimeZoneInformation