Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Mengaktifkan atau menonaktifkan penyesuaian waktu berkala pada jam waktu hari sistem. Ketika diaktifkan, penyesuaian waktu tersebut dapat digunakan untuk menyinkronkan waktu hari dengan beberapa sumber informasi waktu lainnya.
Sintaks
BOOL SetSystemTimeAdjustmentPrecise(
[in] DWORD64 dwTimeAdjustment,
[in] BOOL bTimeAdjustmentDisabled
);
Parameter
[in] dwTimeAdjustment
Memasok frekuensi pembaruan jam yang disesuaikan.
[in] bTimeAdjustmentDisabled
Menyediakan bendera yang menentukan mode penyesuaian waktu yang akan digunakan sistem.
Nilai TRUE menunjukkan bahwa sistem harus menyinkronkan time-of-day menggunakan mekanisme internalnya sendiri. Dalam hal ini, nilai dwTimeAdjustment diabaikan.
Nilai FALSE menunjukkan bahwa aplikasi berada dalam kontrol, dan bahwa nilai dwTimeAdjustment yang ditentukan akan ditambahkan ke jam time-of-day pada setiap interupsi pembaruan jam.
Menampilkan nilai
Jika fungsi berhasil, nilai yang dikembalikan bukan nol.
Jika fungsi gagal, nilai yang dikembalikan adalah nol. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError. Salah satu cara fungsi dapat gagal adalah jika pemanggil tidak memiliki hak istimewa SE_SYSTEMTIME_NAME.
Keterangan
Untuk menggunakan fungsi ini, pemanggil harus memiliki hak istimewa waktu sistem (SE_SYSTEMTIME_NAME). Hak istimewa ini dinonaktifkan secara default. Gunakan fungsi AdjustTokenPrivileges untuk mengaktifkan hak istimewa sebelum memanggil fungsi ini, lalu nonaktifkan hak istimewa setelah panggilan fungsi. Untuk informasi selengkapnya, lihat contoh kode di bawah ini.
Contoh
Sampel ini menunjukkan cara mengaktifkan hak istimewa waktu sistem, menyesuaikan jam sistem menggunakan GetSystemTimeAdjustmentPrecise dan SetSystemTimeAdjustmentPrecise, dan cara mencetak penyesuaian waktu sistem saat ini dengan rapi.
/******************************************************************
*
* ObtainRequiredPrivileges
*
* Enables system time adjustment privilege.
*
******************************************************************/
HRESULT
ObtainRequiredPrivileges()
{
HRESULT hr;
HANDLE hProcToken = NULL;
TOKEN_PRIVILEGES tp = {0};
LUID luid;
if (!LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME, &luid))
{
hr = HRESULT_FROM_WIN32(GetLastError());
printf("Failed to lookup privilege value. hr=0x%08x\n", hr);
return hr;
}
// get the token for our process
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
&hProcToken))
{
hr = HRESULT_FROM_WIN32(GetLastError());
printf("Failed to open process token. hr=0x%08x\n", hr);
return hr;
}
// Enable just the SYSTEMTIME privilege
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hProcToken, FALSE, &tp, 0, NULL, NULL))
{
hr = HRESULT_FROM_WIN32(GetLastError());
printf("Failed to adjust process token privileges. hr=0x%08x\n", hr);
}
else
{
hr = S_OK;
printf("Added SYSTEMTIME privilege to the process token\n");
}
if (NULL != hProcToken)
{
CloseHandle(hProcToken);
}
return hr;
}
/******************************************************************
*
* PrintCurrentClockAdjustments
*
* Prints current values of the system time adjustments.
*
******************************************************************/
void
PrintCurrentClockAdjustments()
{
// More granular clock adjustments
DWORD64 ullCurrentAdjustment = 0;
DWORD64 ullTimeIncrement = 0;
BOOL bEnabledPrecise = 0;
HRESULT hrPrecise = S_OK;
// Legacy clock adjustments
DWORD dwCurrentAdjustment = 0;
DWORD dwTimeIncrement = 0;
BOOL bEnabled = 0;
HRESULT hr = S_OK;
if (!GetSystemTimeAdjustmentPrecise(&ullCurrentAdjustment, &ullTimeIncrement, &bEnabledPrecise))
{
hrPrecise = HRESULT_FROM_WIN32(GetLastError());
}
if (!GetSystemTimeAdjustment(&dwCurrentAdjustment, &dwTimeIncrement, &bEnabled))
{
hr = HRESULT_FROM_WIN32(GetLastError());
}
printf("Precise_ADJ:%I64u Precise_INCR:%I64u Precise_EN:%d Precise_hr:0x%08x ADJ:%u INCR:%u EN:%d hr:0x%08x\n",
ullCurrentAdjustment, ullTimeIncrement, bEnabledPrecise, hrPrecise,
dwCurrentAdjustment, dwTimeIncrement, bEnabled, hr);
}
/******************************************************************
*
* RunNewAdjustmentSequence
*
* Adjust the system time using high-resolution
* GetSystemTimeAdjustmentPrecise() and SetSystemTimeAdjustmentPrecise() API.
*
******************************************************************/
void
RunNewAdjustmentSequence(DWORD dwPPMAdjustment)
{
DWORD64 ullCurrentAdjustment = 0;
DWORD64 ullTimeIncrement = 0;
BOOL bEnabledPrecise = 0;
LARGE_INTEGER liPerfCounterFrequency = {0};
DWORD dwNewAdjustmentUnits;
const DWORD cMicroSecondsPerSecond = 1000000;
if (dwPPMAdjustment > 1000)
{
printf("Adjustment too large. Skipping new adjustment sequence.\n");
return;
}
printf("Starting adjustment sequence using new API...\n");
if (!GetSystemTimeAdjustmentPrecise(&ullCurrentAdjustment, &ullTimeIncrement, &bEnabledPrecise))
{
printf("Failed to read the system time adjustment. Adjustment sequence aborted. hr:0x%08x\n",
HRESULT_FROM_WIN32(GetLastError()));
return;
}
(void)QueryPerformanceFrequency(&liPerfCounterFrequency);
printf("System Performance Counter Frequency: %I64u\n",
liPerfCounterFrequency.QuadPart);
dwNewAdjustmentUnits = (DWORD)(((float) dwPPMAdjustment * liPerfCounterFrequency.QuadPart/ cMicroSecondsPerSecond));
printf("Adjusting the system clock by +%d PPM (+%d new units)\n",
dwPPMAdjustment, dwNewAdjustmentUnits);
if (!SetSystemTimeAdjustmentPrecise(ullCurrentAdjustment + dwNewAdjustmentUnits, FALSE))
{
printf("Failed to set the system time adjustment. hr:0x%08x\n",
HRESULT_FROM_WIN32(GetLastError()));
}
PrintCurrentClockAdjustments();
printf("Restoring system clock adjustment settings\n");
if (!SetSystemTimeAdjustmentPrecise(ullCurrentAdjustment, FALSE))
{
printf("Failed to set the system time adjustment. hr:0x%08x\n",
HRESULT_FROM_WIN32(GetLastError()));
}
PrintCurrentClockAdjustments();
printf("Adjusting the system clock by -%d PPM (-%d new units)\n",
dwPPMAdjustment, dwNewAdjustmentUnits);
if (!SetSystemTimeAdjustmentPrecise(ullCurrentAdjustment - dwNewAdjustmentUnits, FALSE))
{
printf("Failed to set the system time adjustment. hr:0x%08x\n",
HRESULT_FROM_WIN32(GetLastError()));
}
PrintCurrentClockAdjustments();
printf("Restoring system clock adjustment settings\n");
if (!SetSystemTimeAdjustmentPrecise(ullCurrentAdjustment, FALSE))
{
printf("Failed to set the system time adjustment. hr:0x%08x\n",
HRESULT_FROM_WIN32(GetLastError()));
}
PrintCurrentClockAdjustments();
printf("Adjustment sequence complete\n\n");
}
Persyaratan
| Klien minimum yang didukung | Windows 10 [khusus aplikasi desktop] |
| Server minimum yang didukung | Windows Server 2016 [hanya aplikasi desktop] |
| Target Platform | Windows |
| Header | sysinfoapi.h |
| Pustaka | Mincore.lib |
| DLL | Api-ms-win-core-version-l1-2-3.dll |