mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
409 lines
18 KiB
409 lines
18 KiB
//--------------------------------------------------------------------
|
|
// w32timep - interface
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 2000
|
|
//
|
|
// Created by: Duncan Bryce (duncanb), 12-07-00
|
|
//
|
|
// Contains methods to configure or query the windows time service
|
|
//
|
|
|
|
#ifndef __W32TIMEP_H__
|
|
#define __W32TIMEP_H__ 1
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
// Configurable / queryable properties for the windows time service:
|
|
//
|
|
#ifndef MIDL_PASS
|
|
#define W32TIME_CONFIG_SPECIAL_POLL_INTERVAL 0
|
|
#define W32TIME_CONFIG_MANUAL_PEER_LIST 1
|
|
#endif // MIDL_PASS
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
// W32TimeQueryConfig
|
|
//
|
|
// Queries configuration information for the windows time service. The semantics
|
|
// of the parameters depend on which property is being query:
|
|
//
|
|
// dwProperty: W32TIME_CONFIG_SPECIAL_POLL_INTERVAL
|
|
// pdwType: REG_DWORD
|
|
// pbConfig: a DWORD-sized buffer, containing the special polling interval (in seconds).
|
|
// The special polling interval can be specified as an alternative to
|
|
// using the standard, automatically-computed polling intervals specified by
|
|
// NTP. NOTE: The special polling interval applies only to microsoft time
|
|
// providers.
|
|
// pdwSize: sizeof(DWORD)
|
|
//
|
|
//
|
|
// dwProperty: W32TIME_CONFIG_MANUAL_PEER_LIST
|
|
// pdwType: REG_SZ
|
|
// pbConfig: a space-delimited unicode string containing the list of time sources which the
|
|
// microsoft time providers should sync from. Each is an IP address
|
|
// or DNS name of an NTP server, optionally followed by a "flags" parameter.
|
|
// For example:
|
|
//
|
|
// time.windows.com,0x3 gproxy,0x2 ntdsdc9
|
|
//
|
|
// The following flags are available:
|
|
//
|
|
// 0x1 -- use the special polling interval for this source, instead of the
|
|
// standard NTP polling
|
|
// 0x2 -- use this source only when no domain hierarchy sources are available
|
|
//
|
|
// pdwSize: sizeof(WCHAR) * (wcslen(pbConfig) + 1)
|
|
//
|
|
#ifndef MIDL_PASS
|
|
HRESULT W32TimeQueryConfig(IN DWORD dwProperty,
|
|
OUT DWORD *pdwType,
|
|
IN OUT BYTE *pbConfig,
|
|
IN OUT DWORD *pdwSize);
|
|
#endif // MIDL_PASS
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
// W32TimeSetConfig
|
|
//
|
|
// Sets configuration information for the windows time service. The semantics
|
|
// of the parameters depend on which property is being query. For a description
|
|
// of the properties, see W32TimeQueryConfig().
|
|
//
|
|
#ifndef MIDL_PASS
|
|
HRESULT W32TimeSetConfig(IN DWORD dwProperty,
|
|
IN DWORD dwType,
|
|
IN BYTE *pbConfig,
|
|
IN DWORD dwSize);
|
|
#endif // MIDL_PASS
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
//
|
|
// Client-side wrappers for the w32time RPC interface
|
|
//
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
#ifndef MIDL_PASS
|
|
|
|
#define TimeSyncFlag_SoftResync 0x00
|
|
#define TimeSyncFlag_HardResync 0x01
|
|
#define TimeSyncFlag_ReturnResult 0x02
|
|
#define TimeSyncFlag_Rediscover 0x04
|
|
#define TimeSyncFlag_UpdateAndResync 0x08
|
|
|
|
#define ResyncResult_Success 0x00
|
|
#define ResyncResult_NoData 0x01
|
|
#define ResyncResult_StaleData 0x02
|
|
#define ResyncResult_Shutdown 0x03
|
|
#define ResyncResult_ChangeTooBig 0x04
|
|
|
|
#endif // MIDL_PASS
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
// W32TimeSyncNow
|
|
//
|
|
// Sends an RPC request to the windows time service to attempt to synchronize time with
|
|
// its configured time sources.
|
|
//
|
|
// wszServer: The name of the computer which should resync.
|
|
// ulWaitFlag: if 0 is specified, the call will be asynchronous. Passing non-zero value
|
|
// causes the call to block until time synchronization completes, or fails.
|
|
// ulFlags: One of the resync types, or'd with any of the other flags.
|
|
// NOTE: these flags are ignored by the Windows 2000 time service. Only
|
|
// Windows XP and later servers will use them.
|
|
//
|
|
// Resync Types:
|
|
//
|
|
// TimeSyncFlag_SoftResync -- the time service will synchronize the computer clock with
|
|
// whatever time samples it currently has available. It will
|
|
// not poll the network, or hardware providers, for more data.
|
|
// TimeSyncFlag_HardResync -- tells the time service that a time slip has occured.
|
|
// causing the time service will discard its time data.
|
|
// Microsoft default providers will attempt to acquire more
|
|
// network samples, if possible.
|
|
// TimeSyncFlag_Rediscover -- tells the time service that it needs to re-resolve its
|
|
// network sources, and attempt to acquire network time data.
|
|
//
|
|
//
|
|
// Flags:
|
|
//
|
|
// TimeSyncFlag_ReturnResult -- used only for asynchronous calls, causes the function
|
|
// to return one of its possible return status codes, or an error.
|
|
// See "Return Values".
|
|
//
|
|
// Return Values:
|
|
//
|
|
// ResyncResult_Success -- indicates that the time synchronization has succeeded. For asynchronous
|
|
// calls, this does not guarantee that the server has acquired more data,
|
|
// merely that the request has been successfully dispatched.
|
|
// ResyncResult_NoData -- Windows XP and later. For synchronous requests, or when the
|
|
// TimeSyncFlag_ReturnResult is set, indicates that the time service couldn't
|
|
// synchronize time because it failed to acquire time data.
|
|
// ResyncResult_StaleData -- Windows XP and later. For synchronous requests, or when the
|
|
// TimeSyncFlag_ReturnResult is set, indicates that the time service couldn't
|
|
// synchronize time because the data it received was stale (time stamped
|
|
// as received earlier than the last good sample)
|
|
// ResyncResult_Shutdown -- Windows XP and later. For synchronous requests, or when the
|
|
// TimeSyncFlag_ReturnResult is set, indicates that the time service couldn't
|
|
// synchronize because the service was shutting down
|
|
// ResyncResult_ChangeTooBig -- Windows XP and later. For synchronous requests, or when the
|
|
// TimeSyncFlag_ReturnResult is set, indicates that the time service couldn't
|
|
// synchronize because it would've required a change larger than that allowed
|
|
// by the w32time policy
|
|
//
|
|
// Otherwise, the function returns a standard windows error.
|
|
//
|
|
#ifndef MIDL_PASS
|
|
DWORD W32TimeSyncNow(IN const WCHAR *wszServer,
|
|
IN unsigned long ulWaitFlag,
|
|
IN unsigned long ulFlags);
|
|
|
|
#endif // MIDL_PASS
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
// W32TimeGetNetlogonServiceBits
|
|
//
|
|
// Queries the specified time service to determine what it advertises itself as in the
|
|
// DS.
|
|
//
|
|
// wszServer: The name of the computer which should resync.
|
|
// pulBits: A set of flags indicating what the specified time service is
|
|
// advertised as. Can be the OR of the following values:
|
|
//
|
|
// DS_TIMESERV_FLAG: if the service is advertising as a time service
|
|
// DS_GOOD_TIMESERV_FLAG: if the service is advertising as a reliable time service
|
|
//
|
|
// Return Values:
|
|
//
|
|
// ERROR_SUCCESS if the call succeeds, otherwise, the function returns a standard
|
|
// windows error.
|
|
//
|
|
#ifndef MIDL_PASS
|
|
DWORD W32TimeGetNetlogonServiceBits(IN const WCHAR *wszServer,
|
|
OUT unsigned long *pulBits);
|
|
#endif // MIDL_PASS
|
|
|
|
//--------------------------------------------------------------------------------
|
|
//
|
|
// NTP provider information structures
|
|
//
|
|
//--------------------------------------------------------------------------------
|
|
|
|
//
|
|
// W32TIME_NTP_PEER_INFO
|
|
//
|
|
// Represents the current state of a network provider's peer.
|
|
//
|
|
// Fields:
|
|
//
|
|
// ulSize -- sizeof(W32TIME_NTP_PEER_INFO), used for versioning
|
|
// ulResolveAttempts -- the number of times the NTP provider has attempted to
|
|
// resolve this peer unsuccessfully. Setting this
|
|
// value to 0 indicates that the peer has been successfully
|
|
// resolved.
|
|
// u64TimeRemaining -- the number of 100ns intervals until the provider will
|
|
// poll this peer again
|
|
// u64LastSuccessfulSync -- the number of 100ns intervals since (0h 1-Jan 1601) (in UTC).
|
|
// ulLastSyncError -- S_OK if the last sync with this peer was successful, otherwise,
|
|
// the error that occured attempting to sync
|
|
// ulLastSyncErrorMsgId -- the resource identifier of a string representing the last
|
|
// error that occured syncing from this peer. 0 if there is no
|
|
// string associated with this error. The strings are stored in
|
|
// the DLL in which this provider is implemented.
|
|
// ulValidDataCount -- the number of valid samples from this peer the provider
|
|
// currently has in its clock filter
|
|
// ulAuthTypeMsgId -- the resource identifier of a string representing the
|
|
// authentication mechanism used by the NTP provider to
|
|
// secure communications with this peer. 0 if none.
|
|
// The strings are stored in the DLL in which this
|
|
// provider is implemented.
|
|
// wszUniqueName -- a name uniquely identifying this peer (usually the peers
|
|
// dns name).
|
|
// ulMode -- one of the NTP modes specified in the NTPv3 spec:
|
|
//
|
|
// +------------------+---+
|
|
// | Reserved | 0 |
|
|
// | SymmetricActive | 1 |
|
|
// | SymmetricPassive | 2 |
|
|
// | Client | 3 |
|
|
// | Server | 4 |
|
|
// | Broadcast | 5 |
|
|
// | Control | 6 |
|
|
// | PrivateUse | 7 |
|
|
// +------------------+---+
|
|
//
|
|
// ulStratum -- this peer's stratum
|
|
// ulreachability -- this peer's 1-byte reachability register. Each bit represents
|
|
// whether or not a poll attempt returned valid data (set == success,
|
|
// unset == failure). The low bit indicates the most recent sync,
|
|
// the second bit represents the previous sync, etc. When this register
|
|
// is 0, the peer is assumed to be unreachable.
|
|
// ulPeerPollInterval -- the poll interval which this peer returned to the NTP provider (in log (base 2) seconds).
|
|
// ulHostPollInterval -- the interval at which the NTP provider is polling this peer (in log (base 2) seconds).
|
|
//
|
|
typedef struct _W32TIME_NTP_PEER_INFO {
|
|
unsigned __int32 ulSize;
|
|
unsigned __int32 ulResolveAttempts;
|
|
unsigned __int64 u64TimeRemaining;
|
|
unsigned __int64 u64LastSuccessfulSync;
|
|
unsigned __int32 ulLastSyncError;
|
|
unsigned __int32 ulLastSyncErrorMsgId;
|
|
unsigned __int32 ulValidDataCounter;
|
|
unsigned __int32 ulAuthTypeMsgId;
|
|
#ifdef MIDL_PASS
|
|
[string, unique]
|
|
wchar_t *wszUniqueName;
|
|
#else // MIDL_PASS
|
|
LPWSTR wszUniqueName;
|
|
#endif // MIDL_PASS
|
|
unsigned char ulMode;
|
|
unsigned char ulStratum;
|
|
unsigned char ulReachability;
|
|
unsigned char ulPeerPollInterval;
|
|
unsigned char ulHostPollInterval;
|
|
} W32TIME_NTP_PEER_INFO, *PW32TIME_NTP_PEER_INFO;
|
|
|
|
//
|
|
// W32TIME_NTP_PROVIDER_DATA
|
|
//
|
|
// Represents the state of an NTP provider.
|
|
//
|
|
// ulSize -- sizeof(W32TIME_NTP_PROVIDER_DATA), used for versioning
|
|
// ulError -- S_OK if the provider is functioning correctly,
|
|
// otherwise, the error which caused it to fail.
|
|
// ulErrorMsgId -- the resource identifier of a string representing the
|
|
// error that caused this provider to fail.
|
|
// cPeerInfo -- the number of active peers used by this provider
|
|
// pPeerInfo -- an array of W32TIME_NTP_PEER_INFO structures, representing
|
|
// the active peers this provider is currently synchronizing with
|
|
//
|
|
typedef struct _W32TIME_NTP_PROVIDER_DATA {
|
|
unsigned __int32 ulSize;
|
|
unsigned __int32 ulError;
|
|
unsigned __int32 ulErrorMsgId;
|
|
unsigned __int32 cPeerInfo;
|
|
#ifdef MIDL_PASS
|
|
[size_is(cPeerInfo)]
|
|
#endif // MIDL_PASS
|
|
W32TIME_NTP_PEER_INFO *pPeerInfo;
|
|
} W32TIME_NTP_PROVIDER_DATA, *PW32TIME_NTP_PROVIDER_DATA;
|
|
|
|
//--------------------------------------------------------------------------------
|
|
//
|
|
// HARDWARE provider structures
|
|
//
|
|
//--------------------------------------------------------------------------------
|
|
|
|
// W32TIME_HARDWARE_PROVIDER_DATA
|
|
//
|
|
// Represents the state of a HARDWARE provider.
|
|
//
|
|
// ulSize -- sizeof(W32TIME_HARDWARE_PROVIDER_DATA), used for versioning
|
|
// ulError -- S_OK if the provider is functioning correctly,
|
|
// otherwise, the error which caused it to fail.
|
|
// ulErrorMsgId -- the resource identifier of a string representing the
|
|
// error that caused this provider to fail.
|
|
// wszReferenceIdentifier -- the synchronization source (usually, the provider's
|
|
// suggested 4-byte reference ID).
|
|
//
|
|
typedef struct _W32TIME_HARDWARE_PROVIDER_DATA {
|
|
unsigned __int32 ulSize;
|
|
unsigned __int32 ulError;
|
|
unsigned __int32 ulErrorMsgId;
|
|
#ifdef MIDL_PASS
|
|
[string, unique]
|
|
wchar_t *wszReferenceIdentifier;
|
|
#else // MIDL_PASS
|
|
LPWSTR wszReferenceIdentifier;
|
|
#endif // MIDL_PASS
|
|
} W32TIME_HARDWARE_PROVIDER_DATA, *PW32TIME_HARDWARE_PROVIDER_DATA;
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
// W32TimeQueryHardwareProviderStatus
|
|
//
|
|
// Queries the specified time service for information about one of its installed
|
|
// time providers.
|
|
//
|
|
// wszServer: The name of the computer which should resync.
|
|
// dwFlags: Reserved, must be 0.
|
|
// pwszProvider: The name of the provider to query.
|
|
// ppHardwareProviderData: A structure representing the current state of this hardware provider.
|
|
// The returned buffer is allocated by the system, and should be
|
|
// freed with W32TimeBufferFree().
|
|
//
|
|
// Return Values:
|
|
//
|
|
// ERROR_SUCCESS if the call succeeds, otherwise, the function returns a standard
|
|
// windows error.
|
|
//
|
|
#ifndef MIDL_PASS
|
|
DWORD W32TimeQueryHardwareProviderStatus(IN const WCHAR *wszServer,
|
|
IN DWORD dwFlags,
|
|
IN LPWSTR pwszProvider,
|
|
OUT W32TIME_HARDWARE_PROVIDER_DATA **ppHardwareProviderData);
|
|
#endif // MIDL_PASS
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
// W32TimeQueryNTPProviderStatus
|
|
//
|
|
// Queries the specified time service for information about one of its installed
|
|
// time providers.
|
|
//
|
|
// wszServer: The name of the computer which should resync.
|
|
// dwFlags: Reserved, must be 0.
|
|
// pwszProvider: The name of the provider to query.
|
|
// ppNTPProviderData: A structure representing the current state of this hardware provider.
|
|
// The returned buffer is allocated by the system, and should be
|
|
// freed with W32TimeBufferFree().
|
|
//
|
|
// Return Values:
|
|
//
|
|
// ERROR_SUCCESS if the call succeeds, otherwise, the function returns a standard
|
|
// windows error.
|
|
//
|
|
#ifndef MIDL_PASS
|
|
DWORD W32TimeQueryNTPProviderStatus(IN LPCWSTR pwszServer,
|
|
IN DWORD dwFlags,
|
|
IN LPWSTR pwszProvider,
|
|
OUT W32TIME_NTP_PROVIDER_DATA **ppNTPProviderData);
|
|
#endif // MIDL_PASS
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
// W32TimeBufferFree
|
|
//
|
|
// Frees a buffer allocated by the w32time client API.
|
|
//
|
|
// pvBuffer: the buffer to free.
|
|
//
|
|
#ifndef MIDL_PASS
|
|
void W32TimeBufferFree(IN LPVOID pvBuffer);
|
|
#endif // MIDL_PASS
|
|
|
|
//
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
//
|
|
// W32Time named events.
|
|
// These events are ACL'd such that LocalSystem has full access.
|
|
//
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
//
|
|
// Signaling this event tells w32time that its time is off, causing the windows time
|
|
// service to attempt resynchronization. This does not guarantee that the time service
|
|
// will successfully adjust the system clock, or that resynchronization will occur
|
|
// in a timely manner.
|
|
//
|
|
#define W32TIME_NAMED_EVENT_SYSTIME_NOT_CORRECT L"W32TIME_NAMED_EVENT_SYSTIME_NOT_CORRECT"
|
|
|
|
|
|
#ifdef __cplusplus
|
|
} // balance extern "C" {
|
|
#endif
|
|
|
|
#endif // #ifndef __W32TIMEP_H__
|
|
|
|
|