diff options
Diffstat (limited to 'third_party/rust/zeitstempel/src/win.rs')
-rw-r--r-- | third_party/rust/zeitstempel/src/win.rs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/third_party/rust/zeitstempel/src/win.rs b/third_party/rust/zeitstempel/src/win.rs new file mode 100644 index 0000000000..37e8553498 --- /dev/null +++ b/third_party/rust/zeitstempel/src/win.rs @@ -0,0 +1,42 @@ +//! Timestamp implementation for Windows 10+ or Windows Server 2016+. +//! +//! Lower versions don't have the necessary API and should use the fallback. + +#![cfg(feature = "win10plus")] + +/// [PULONGLONG] is a pointer to [ULONGLONG], a 64-bit unsigned integer. +/// +/// [PULONGLONG]: https://docs.microsoft.com/en-us/windows/win32/winprog/windows-data-types#PULONGLONG +/// [ULONGLONG]: https://docs.microsoft.com/en-us/windows/win32/winprog/windows-data-types#ulonglong +type PULONGLONG = *mut u64; + +/// Link against Windows' `mincore`. +#[link(name = "mincore")] +extern "system" { + /// Gets the current interrupt-time count. + /// + /// See [`QueryInterruptTime`]. + /// + /// [`QueryInterruptTime`]: https://docs.microsoft.com/en-us/windows/win32/api/realtimeapiset/nf-realtimeapiset-queryinterrupttime + /// + /// Note: we define it ourselves, because it's not actually included in `winapi`. + fn QueryInterruptTime(InterruptTime: PULONGLONG); +} + +/// Windows counts time in a system time unit of 100 nanoseconds. +const SYSTEM_TIME_UNIT: u64 = 100; + +/// The time based on the current interrupt-time count. +/// This includes the suspend time. +/// +/// See [`QueryInterruptTime`]. +/// +/// [`QueryInterruptTime`]: https://docs.microsoft.com/en-us/windows/win32/api/realtimeapiset/nf-realtimeapiset-queryinterrupttime +pub fn now_including_suspend() -> u64 { + let mut interrupt_time = 0; + unsafe { + QueryInterruptTime(&mut interrupt_time); + } + + interrupt_time * SYSTEM_TIME_UNIT +} |