|
|
|
In this article we will have lots of fun with system clock. I will explain you how to retrive and change your system clock setting to make your system clock slower/faster using SetSystemTimeAdjustment and GetSystemTimeAdjustment APIs. You will also learn how to assign special privilege to an application to perform specific task.
Let's start with GetSystemTimeAdjustment function.
The GetSystemTimeAdjustment function determines whether the system is applying periodic time adjustments to its time-of-day clock at each clock interrupt, along with the value and period of any such adjustments. Note that the period of such adjustments is equivalent to the time period between clock interrupts. |
- lpTimeAdjustment : Indicates system's current periodic time adjustment which is number of 100-nanosecond units added to the time-of-day clock at each clock interrupt
- lpTimeIncrement : Indicates system's current interrupt frequency (number of 100-nanosecond units). This value tells you how often your system receive interrupt. You should set lpTimeAdjustment to lpTimeIncrement for 100% accurate system clock.
- lpTimeAdjustmentDisabled : Indicates whether periodic time adjustment is in effect.
Now what if you want to set your system clock time adjustment value ????
The SetSystemTimeAdjustment function enables or disables periodic time adjustments to the system's time-of-day clock. Such time adjustments are used to synchronize the time of day with some other source of time information. When periodic time adjustments are enabled, they are applied at each clock interrupt. |
- dwTimeAdjustment : Number of 100-nanosecond units added to the time-of-day clock at each clock interrupt if periodic time adjustment is enabled.
- bTimeAdjustmentDisabled : Time adjustment mode that the system is to use. Periodic system time adjustments can be disabled or enabled.
Note : An application must have system-time privilege (the SE_SYSTEMTIME_NAME privilege) for this function to succeed. The SE_SYSTEMTIME_NAME privilege is disabled by default. Use the AdjustTokenPrivileges function to enable the privilege before calling SetSystemTimeAdjustment, and then to disable the privilege after the SetSystemTimeAdjustment call.
Step-By-Step Example
- Create a standard exe project - Add four textbox controls (Set Multiline=True and Scrollbar=Verticle for Text1) on the form1 - Add one checkbox and one timer control on the form1 - Add the following code in form1 |
Click here to copy the following block | Option Explicit
Private Const SE_PRIVILEGE_ENABLED = &H2 Private Const SE_SYSTEMTIME_NAME = "SeSystemtimePrivilege" Private Const TOKEN_ADJUST_PRIVILEGES = &H20 Private Const TOKEN_QUERY = &H8
Private Type LARGE_INTEGER LowPart As Long HighPart As Long End Type
Private Type LUID LowPart As Long HighPart As Long End Type
Private Type LUID_AND_ATTRIBUTES pLuid As LUID Attributes As Long End Type
Private Type TOKEN_PRIVILEGES PrivilegeCount As Long Privileges(1) As LUID_AND_ATTRIBUTES End Type
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" ( _ ByVal TokenHandle As Long, _ ByVal DisableAllPrivileges As Long, _ ByRef NewState As TOKEN_PRIVILEGES, _ ByVal BufferLength As Long, _ ByRef PreviousState As TOKEN_PRIVILEGES, _ ByRef ReturnLength As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" ( _ ByVal lpSystemName As String, _ ByVal lpName As String, _ ByRef lpLuid As LUID) As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" ( _ ByVal ProcessHandle As Long, _ ByVal DesiredAccess As Long, _ ByRef TokenHandle As Long) As Long Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long
Private Const LOCALE_SYSTEM_DEFAULT& = &H800 Private Const LOCALE_USER_DEFAULT& = &H400
Private Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer wMilliseconds As Integer End Type
Private Type TIME_ZONE_INFORMATION Bias As Long StandardName As String * 64 StandardDate As SYSTEMTIME StandardBias As Long DaylightName As String * 64 DaylightDate As SYSTEMTIME DaylightBias As Long End Type
Private Declare Function GetSystemTime Lib "kernel32" ( _ lpSystemTime As SYSTEMTIME) As Long
Private Declare Function GetLocalTime Lib "kernel32" ( _ lpSystemTime As SYSTEMTIME) As Long
Private Declare Function GetSystemTimeAdjustment Lib "kernel32" ( _ lpTimeAdjustment As Long, _ lpTimeIncrement As Long, _ lpTimeAdjustmentDisabled As Long) As Long
Private Declare Function GetTimeZoneInformation Lib "kernel32" ( _ lpTimeZoneInformation As TIME_ZONE_INFORMATION) As Long
Private Declare Function SetSystemTimeAdjustment Lib "kernel32.dll" ( _ ByVal dwTimeAdjustment As Long, _ ByVal bTimeAdjustmentDisabled As Boolean) As Long
Private Declare Function GetTimeFormat Lib "kernel32" Alias "GetTimeFormatA" ( _ ByVal Locale As Long, _ ByVal dwFlags As Long, _ lpTime As SYSTEMTIME, _ ByVal lpFormat As Long, _ ByVal lpTimeStr As String, _ ByVal cchTime As Long) As Long
Private Sub Check1_Click() Dim ret
If SetPrivilege(SE_SYSTEMTIME_NAME, True) Then Dim TimeAdjustment As Currency If Check1.Value = 1 Then TimeAdjustment = MiliToNeno(CDbl(Text4) / 100) ret = SetSystemTimeAdjustment(TimeAdjustment, True) Else TimeAdjustment = MiliToNeno(CDbl(Text4) / 100) ret = SetSystemTimeAdjustment(TimeAdjustment, False) If Err.LastDllError = 1314 Then MsgBox "Application does not have enough Privilege to change the AdjustTime setting" End If End If Else MsgBox "Failed to set SE_SYSTEMTIME_NAME Privilege for current application" End If End Sub
Function MiliToNeno(v) As Long MiliToNeno = v * 1000000 End Function Function NenoToMili(v) As Currency NenoToMili = v / (1000000) End Function
Public Function SetPrivilege(ByVal strPrivilege As String, _ ByVal booEnable As Boolean) As Boolean Dim lngRet As Long Dim hToken As Long Dim tLUID As LUID Dim tTP As TOKEN_PRIVILEGES Dim tTP_Prev As TOKEN_PRIVILEGES Dim lngReturnLength As Long
SetPrivilege = False
If Not CBool(OpenProcessToken(GetCurrentProcess(), _ TOKEN_ADJUST_PRIVILEGES Or _ TOKEN_QUERY, _ hToken)) Then Exit Function End If
If LookupPrivilegeValue("", strPrivilege, tLUID) = 0 Then Exit Function
With tTP .PrivilegeCount = 1 .Privileges(0).pLuid = tLUID If booEnable Then .Privileges(0).Attributes = SE_PRIVILEGE_ENABLED Else .Privileges(0).Attributes = 0 End If End With
Call AdjustTokenPrivileges(hToken, _ False, _ tTP, _ Len(tTP_Prev), _ tTP_Prev, _ lngReturnLength)
If Err.LastDllError = 0 Then SetPrivilege = True End Function
Private Sub Form_Load() Call LoadInfo
Timer1.Enabled = True Timer1.Interval = 100 End Sub
Sub LoadInfo() Dim myTZ As TIME_ZONE_INFORMATION Dim myAdj As Long, myIncr As Long, myDisabled As Long Dim strMsg As String, dl As Long, s As String
Dim ClockInterruptTime As Double, ClockAdjTime As Double Dim strClockIntRate As String Text1 = ""
GetSystemTimeAdjustment myAdj, myIncr, myDisabled
ClockInterruptTime = NenoToMili(myIncr * 100) strClockIntRate = CStr(Format(ClockInterruptTime, "##.##0")) ClockAdjTime = NenoToMili(myAdj * 100) Text4 = Format(ClockAdjTime, "##.##0") If myDisabled = 0 Then strMsg = strMsg & "InterruptRate: " & strClockIntRate & " ms (i.e. one interrupt every " & strClockIntRate & " ms)" & vbCrLf strMsg = strMsg & "AutoAdjust : Periodic time adjustment is disabled" & vbCrLf Check1.Value = 0 Else strMsg = strMsg & "InterruptRate: " & strClockIntRate & " ms (i.e. one interrupt every " & strClockIntRate & " ms)" & vbCrLf strMsg = strMsg & "AutoAdjust : " & "Every " & strClockIntRate & " ms, computer adds " & Text4 & " ms to your time-of-day clock." & vbCrLf Check1.Value = 1 End If
dl = GetTimeZoneInformation(myTZ)
strMsg = strMsg & "Bias : " & CInt(myTZ.Bias / 60) & " hours (This is UTC and Local Time difference)" & vbCrLf strMsg = strMsg & "StandardName : " & Replace(StrConv(myTZ.StandardName, vbFromUnicode), vbNullChar, "") & vbCrLf strMsg = strMsg & "DaylightName : " & Replace(StrConv(myTZ.DaylightName, vbFromUnicode), vbNullChar, "") & vbCrLf strMsg = strMsg & "DaylightBias : " & myTZ.DaylightBias & vbCrLf
Text1.Text = strMsg If ClockInterruptTime < ClockAdjTime Then Me.Caption = "Your System Clock is running " & (ClockInterruptTime / ClockAdjTime) * 100 & "% faster" ElseIf ClockInterruptTime > ClockAdjTime Then Me.Caption = "Your System Clock is running " & (ClockAdjTime / ClockInterruptTime) * 100 & "% slower" Else Me.Caption = "Your System Clock is OK [ every " & ClockInterruptTime & " ms system is adding " & ClockAdjTime & " ms ]" End If End Sub
Private Sub Timer1_Timer() Dim myTime As SYSTEMTIME, s As String, dl As Long
GetLocalTime myTime
s = String$(255, Chr$(0)) dl = GetTimeFormat&(LOCALE_SYSTEM_DEFAULT, 0, myTime, 0, s, 254) Text2 = s
GetSystemTime myTime
s = String$(255, Chr$(0)) dl = GetTimeFormat&(LOCALE_SYSTEM_DEFAULT, 0, myTime, 0, s, 254) Text3 = s End Sub |
|
|
|
Submitted By :
Nayan Patel
(Member Since : 5/26/2004 12:23:06 PM)
|
|
|
Job Description :
He is the moderator of this site and currently working as an independent consultant. He works with VB.net/ASP.net, SQL Server and other MS technologies. He is MCSD.net, MCDBA and MCSE. In his free time he likes to watch funny movies and doing oil painting. |
View all (893) submissions by this author
(Birth Date : 7/14/1981 ) |
|
|