+time_t
+wim_timestamp_to_time_t(u64 timestamp)
+{
+ return (timestamp / TICKS_PER_SECOND) - EPOCH_DISTANCE;
+}
+
+struct timeval
+wim_timestamp_to_timeval(u64 timestamp)
+{
+ return (struct timeval) {
+ .tv_sec = wim_timestamp_to_time_t(timestamp),
+ .tv_usec = (timestamp % TICKS_PER_SECOND) / TICKS_PER_MICROSECOND,
+ };
+}
+
+struct timespec
+wim_timestamp_to_timespec(u64 timestamp)
+{
+ return (struct timespec) {
+ .tv_sec = wim_timestamp_to_time_t(timestamp),
+ .tv_nsec = (timestamp % TICKS_PER_SECOND) * NANOSECONDS_PER_TICK,
+ };
+}
+
+/* UNIX timestamps to Windows NT timestamps */
+
+u64
+time_t_to_wim_timestamp(time_t t)
+{
+ return ((u64)t + EPOCH_DISTANCE) * TICKS_PER_SECOND;
+}
+
+u64
+timeval_to_wim_timestamp(const struct timeval *tv)
+{
+ return time_t_to_wim_timestamp(tv->tv_sec) +
+ (u32)tv->tv_usec * TICKS_PER_MICROSECOND;
+}
+
+u64
+timespec_to_wim_timestamp(const struct timespec *ts)
+{
+ return time_t_to_wim_timestamp(ts->tv_sec) +
+ (u32)ts->tv_nsec / NANOSECONDS_PER_TICK;
+}
+
+/* Retrieve the current time as a WIM timestamp. */