Skip to content

Commit 1d62b41

Browse files
committed
Back to raw-dylib
Signed-off-by: Joe Richey <[email protected]>
1 parent 08f2741 commit 1d62b41

File tree

1 file changed

+49
-33
lines changed

1 file changed

+49
-33
lines changed

src/windows.rs

+49-33
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,64 @@
11
//! Implementation for Windows
22
use crate::Error;
3-
use core::{
4-
ffi::c_void,
5-
mem,
6-
mem::MaybeUninit,
7-
ptr,
8-
sync::atomic::{fence, AtomicPtr, Ordering},
9-
};
3+
use core::mem::MaybeUninit;
4+
// use core::{
5+
// ffi::c_void,
6+
// mem,
7+
// ptr,
8+
// sync::atomic::{fence, AtomicPtr, Ordering},
9+
// };
1010

11-
type HMODULE = isize;
1211
type BOOL = i32;
1312
const TRUE: BOOL = 1;
13+
// type HMODULE = isize;
1414

15-
#[link(name = "kernel32")]
16-
extern "system" {
17-
fn LoadLibraryA(libfilename: *const u8) -> HMODULE;
18-
fn GetProcAddress(hmodule: HMODULE, procname: *const u8) -> *mut c_void;
19-
}
15+
// #[link(name = "kernel32")]
16+
// extern "system" {
17+
// fn LoadLibraryA(libfilename: *const u8) -> HMODULE;
18+
// fn GetProcAddress(hmodule: HMODULE, procname: *const u8) -> *mut c_void;
19+
// }
2020

21-
type ProcessPrng = unsafe extern "system" fn(*mut u8, usize) -> BOOL;
21+
// type ProcessPrng = unsafe extern "system" fn(*mut u8, usize) -> BOOL;
2222

23-
static PROCESS_PRNG_PTR: AtomicPtr<c_void> = AtomicPtr::new(ptr::null_mut());
23+
// static PROCESS_PRNG_PTR: AtomicPtr<c_void> = AtomicPtr::new(ptr::null_mut());
2424

25-
fn get_process_prng() -> Result<ProcessPrng, Error> {
26-
let mut p = PROCESS_PRNG_PTR.load(Ordering::Relaxed);
27-
if p.is_null() {
28-
let dll = unsafe { LoadLibraryA(b"bcryptprimitives.dll\0".as_ptr()) };
29-
if dll == 0 {
30-
return Err(Error::WINDOWS_LOAD_DLL);
31-
}
32-
p = unsafe { GetProcAddress(dll, b"ProcessPrng\0".as_ptr()) };
33-
if p.is_null() {
34-
return Err(Error::WINDOWS_LOAD_DLL);
35-
}
36-
PROCESS_PRNG_PTR.store(p, Ordering::Release);
37-
} else {
38-
fence(Ordering::Acquire);
39-
}
40-
Ok(unsafe { mem::transmute(p) })
25+
// fn get_process_prng() -> Result<ProcessPrng, Error> {
26+
// let mut p = PROCESS_PRNG_PTR.load(Ordering::Relaxed);
27+
// if p.is_null() {
28+
// let dll = unsafe { LoadLibraryA(b"bcryptprimitives.dll\0".as_ptr()) };
29+
// if dll == 0 {
30+
// return Err(Error::WINDOWS_LOAD_DLL);
31+
// }
32+
// p = unsafe { GetProcAddress(dll, b"ProcessPrng\0".as_ptr()) };
33+
// if p.is_null() {
34+
// return Err(Error::WINDOWS_LOAD_DLL);
35+
// }
36+
// PROCESS_PRNG_PTR.store(p, Ordering::Release);
37+
// } else {
38+
// fence(Ordering::Acquire);
39+
// }
40+
// Ok(unsafe { mem::transmute(p) })
41+
// }
42+
43+
#[cfg_attr(
44+
target_arch = "x86",
45+
link(
46+
name = "bcryptprimitives",
47+
kind = "raw-dylib",
48+
import_name_type = "undecorated"
49+
)
50+
)]
51+
#[cfg_attr(
52+
not(target_arch = "x86"),
53+
link(name = "bcryptprimitives", kind = "raw-dylib")
54+
)]
55+
extern "system" {
56+
fn ProcessPrng(pbdata: *mut u8, cbdata: usize) -> BOOL;
4157
}
4258

4359
pub fn getrandom_inner(dest: &mut [MaybeUninit<u8>]) -> Result<(), Error> {
44-
let process_prng = get_process_prng()?;
45-
match unsafe { process_prng(dest.as_mut_ptr() as *mut u8, dest.len()) } {
60+
// let process_prng = get_process_prng()?;
61+
match unsafe { ProcessPrng(dest.as_mut_ptr() as *mut u8, dest.len()) } {
4662
TRUE => Ok(()),
4763
_ => Err(Error::WINDOWS_PROCESS_PRNG),
4864
}

0 commit comments

Comments
 (0)