xref: /aosp_15_r20/external/crosvm/win_util/src/large_integer.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2022 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker use std::ops::Deref;
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker use winapi::um::winnt::LARGE_INTEGER;
8*bb4ee6a4SAndroid Build Coastguard Worker 
9*bb4ee6a4SAndroid Build Coastguard Worker pub struct LargeInteger {
10*bb4ee6a4SAndroid Build Coastguard Worker     large_integer: LARGE_INTEGER,
11*bb4ee6a4SAndroid Build Coastguard Worker }
12*bb4ee6a4SAndroid Build Coastguard Worker 
13*bb4ee6a4SAndroid Build Coastguard Worker impl LargeInteger {
new(value: i64) -> LargeInteger14*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(value: i64) -> LargeInteger {
15*bb4ee6a4SAndroid Build Coastguard Worker         // SAFETY: We are zero-initializing a struct with only primitive member fields.
16*bb4ee6a4SAndroid Build Coastguard Worker         let mut large_integer_val: LARGE_INTEGER = unsafe { std::mem::zeroed() };
17*bb4ee6a4SAndroid Build Coastguard Worker         // SAFETY: We uniquely own this variable
18*bb4ee6a4SAndroid Build Coastguard Worker         let large_integer_val_mut: &mut i64 = unsafe { large_integer_val.QuadPart_mut() };
19*bb4ee6a4SAndroid Build Coastguard Worker         *large_integer_val_mut = value;
20*bb4ee6a4SAndroid Build Coastguard Worker 
21*bb4ee6a4SAndroid Build Coastguard Worker         LargeInteger {
22*bb4ee6a4SAndroid Build Coastguard Worker             large_integer: large_integer_val,
23*bb4ee6a4SAndroid Build Coastguard Worker         }
24*bb4ee6a4SAndroid Build Coastguard Worker     }
25*bb4ee6a4SAndroid Build Coastguard Worker }
26*bb4ee6a4SAndroid Build Coastguard Worker 
27*bb4ee6a4SAndroid Build Coastguard Worker impl Deref for LargeInteger {
28*bb4ee6a4SAndroid Build Coastguard Worker     type Target = LARGE_INTEGER;
29*bb4ee6a4SAndroid Build Coastguard Worker 
deref(&self) -> &Self::Target30*bb4ee6a4SAndroid Build Coastguard Worker     fn deref(&self) -> &Self::Target {
31*bb4ee6a4SAndroid Build Coastguard Worker         &self.large_integer
32*bb4ee6a4SAndroid Build Coastguard Worker     }
33*bb4ee6a4SAndroid Build Coastguard Worker }
34