Skip to content

Commit 87784d8

Browse files
committed
Use volatile reads in NtGetTickCount*
1 parent 1d45b0e commit 87784d8

File tree

1 file changed

+16
-9
lines changed

1 file changed

+16
-9
lines changed

src/ntexapi.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#[allow(deprecated)] //fixme
22
use core::mem::uninitialized;
3+
use core::ptr::read_volatile;
34
#[cfg(target_arch = "x86")]
45
use core::sync::atomic::spin_loop_hint;
56
use crate::ntapi_base::{CLIENT_ID, KPRIORITY, KSYSTEM_TIME, PRTL_ATOM, RTL_ATOM};
@@ -2781,13 +2782,16 @@ pub unsafe fn NtGetTickCount64() -> ULONGLONG {
27812782
#[allow(deprecated)] //fixme
27822783
let mut tick_count: ULARGE_INTEGER = uninitialized();
27832784
#[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))] {
2784-
*tick_count.QuadPart_mut() = (*USER_SHARED_DATA).u.TickCountQuad;
2785+
*tick_count.QuadPart_mut() = read_volatile(&(*USER_SHARED_DATA).u.TickCountQuad);
27852786
}
27862787
#[cfg(target_arch = "x86")] {
27872788
loop {
2788-
tick_count.s_mut().HighPart = (*USER_SHARED_DATA).u.TickCount.High1Time as u32;
2789-
tick_count.s_mut().LowPart = (*USER_SHARED_DATA).u.TickCount.LowPart;
2790-
if tick_count.s().HighPart == (*USER_SHARED_DATA).u.TickCount.High2Time as u32 {
2789+
tick_count.s_mut().HighPart =
2790+
read_volatile(&(*USER_SHARED_DATA).u.TickCount.High1Time) as u32;
2791+
tick_count.s_mut().LowPart = read_volatile(&(*USER_SHARED_DATA).u.TickCount.LowPart);
2792+
if tick_count.s().HighPart == read_volatile(&(*USER_SHARED_DATA).u.TickCount.High2Time)
2793+
as u32
2794+
{
27912795
break;
27922796
}
27932797
spin_loop_hint();
@@ -2802,16 +2806,19 @@ pub unsafe fn NtGetTickCount64() -> ULONGLONG {
28022806
#[inline]
28032807
pub unsafe fn NtGetTickCount() -> ULONG {
28042808
#[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))] {
2805-
(((*USER_SHARED_DATA).u.TickCountQuad * (*USER_SHARED_DATA).TickCountMultiplier as u64)
2806-
>> 24) as u32
2809+
((read_volatile(&(*USER_SHARED_DATA).u.TickCountQuad)
2810+
* (*USER_SHARED_DATA).TickCountMultiplier as u64) >> 24) as u32
28072811
}
28082812
#[cfg(target_arch = "x86")] {
28092813
#[allow(deprecated)] //fixme
28102814
let mut tick_count: ULARGE_INTEGER = uninitialized();
28112815
loop {
2812-
tick_count.s_mut().HighPart = (*USER_SHARED_DATA).u.TickCount.High1Time as u32;
2813-
tick_count.s_mut().LowPart = (*USER_SHARED_DATA).u.TickCount.LowPart;
2814-
if tick_count.s().HighPart == (*USER_SHARED_DATA).u.TickCount.High2Time as u32 {
2816+
tick_count.s_mut().HighPart = read_volatile(&(*USER_SHARED_DATA).u.TickCount.High1Time)
2817+
as u32;
2818+
tick_count.s_mut().LowPart = read_volatile(&(*USER_SHARED_DATA).u.TickCount.LowPart);
2819+
if tick_count.s().HighPart == read_volatile(&(*USER_SHARED_DATA).u.TickCount.High2Time)
2820+
as u32
2821+
{
28152822
break;
28162823
}
28172824
spin_loop_hint();

0 commit comments

Comments
 (0)