aboutsummaryrefslogtreecommitdiff
path: root/src/win
diff options
context:
space:
mode:
authorBen Noordhuis <info@bnoordhuis.nl>2025-07-16 20:18:29 +0200
committerGitHub <noreply@github.com>2025-07-16 20:18:29 +0200
commit7484ab251f58fdbc4fbc4313de70a7696e8c02b9 (patch)
treeb6e0595cd15b619a2b27ec1c194b342325b3e00a /src/win
parent917c1ad1d1dee1c714d001e8fd1f276a6e06dd52 (diff)
downloadlibuv-main.tar.gz
libuv-main.zip
win: use ProcessPrng (#4836)HEADv1.xmain
Refs: https://github.com/libuv/libuv/pull/2762#issuecomment-3065018271
Diffstat (limited to 'src/win')
-rw-r--r--src/win/fs.c2
-rw-r--r--src/win/internal.h2
-rw-r--r--src/win/util.c5
-rw-r--r--src/win/winapi.c13
-rw-r--r--src/win/winapi.h5
5 files changed, 24 insertions, 3 deletions
diff --git a/src/win/fs.c b/src/win/fs.c
index 4e156930..acaa5689 100644
--- a/src/win/fs.c
+++ b/src/win/fs.c
@@ -1269,7 +1269,7 @@ void fs__mktemp(uv_fs_t* req, uv__fs_mktemp_func func) {
tries = TMP_MAX;
do {
- if (uv__random_rtlgenrandom((void *)&v, sizeof(v)) < 0) {
+ if (uv__random_winrandom(&v, sizeof(v)) < 0) {
SET_REQ_UV_ERROR(req, UV_EIO, ERROR_IO_DEVICE);
goto clobber;
}
diff --git a/src/win/internal.h b/src/win/internal.h
index be408af6..db488be7 100644
--- a/src/win/internal.h
+++ b/src/win/internal.h
@@ -269,7 +269,7 @@ int uv__getsockpeername(const uv_handle_t* handle,
int* namelen,
int delayed_error);
-int uv__random_rtlgenrandom(void* buf, size_t buflen);
+int uv__random_winrandom(void* buf, size_t buflen);
/*
diff --git a/src/win/util.c b/src/win/util.c
index 06fbefc4..9e3daac8 100644
--- a/src/win/util.c
+++ b/src/win/util.c
@@ -1747,10 +1747,13 @@ int uv_gettimeofday(uv_timeval64_t* tv) {
return 0;
}
-int uv__random_rtlgenrandom(void* buf, size_t buflen) {
+int uv__random_winrandom(void* buf, size_t buflen) {
if (buflen == 0)
return 0;
+ if (pProcessPrng != NULL && pProcessPrng(buf, buflen))
+ return 0;
+
if (SystemFunction036(buf, buflen) == FALSE)
return UV_EIO;
diff --git a/src/win/winapi.c b/src/win/winapi.c
index 758164f6..7ed08dd2 100644
--- a/src/win/winapi.c
+++ b/src/win/winapi.c
@@ -39,6 +39,9 @@ sNtQueryInformationProcess pNtQueryInformationProcess;
/* Powrprof.dll function pointer */
sPowerRegisterSuspendResumeNotification pPowerRegisterSuspendResumeNotification;
+/* bcryptprimitives.dll function pointer */
+sProcessPrng pProcessPrng;
+
/* User32.dll function pointer */
sSetWinEventHook pSetWinEventHook;
@@ -53,6 +56,7 @@ void uv__winapi_init(void) {
HMODULE powrprof_module;
HMODULE user32_module;
HMODULE ws2_32_module;
+ HMODULE bcryptprimitives_module;
HMODULE api_win_core_file_module;
union {
@@ -67,6 +71,7 @@ void uv__winapi_init(void) {
sNtQuerySystemInformation pNtQuerySystemInformation;
sNtQueryInformationProcess pNtQueryInformationProcess;
sPowerRegisterSuspendResumeNotification pPowerRegisterSuspendResumeNotification;
+ sProcessPrng pProcessPrng;
sSetWinEventHook pSetWinEventHook;
uv_sGetHostNameW pGetHostNameW;
sGetFileInformationByName pGetFileInformationByName;
@@ -138,6 +143,14 @@ void uv__winapi_init(void) {
u.pPowerRegisterSuspendResumeNotification;
}
+ bcryptprimitives_module = LoadLibraryExA("bcryptprimitives.dll",
+ NULL,
+ LOAD_LIBRARY_SEARCH_SYSTEM32);
+ if (bcryptprimitives_module != NULL) {
+ u.proc = GetProcAddress(bcryptprimitives_module, "ProcessPrng");
+ pProcessPrng = u.pProcessPrng;
+ }
+
user32_module = GetModuleHandleW(L"user32.dll");
if (user32_module != NULL) {
u.proc = GetProcAddress(user32_module, "SetWinEventHook");
diff --git a/src/win/winapi.h b/src/win/winapi.h
index b9c9f1ab..a7e1b179 100644
--- a/src/win/winapi.h
+++ b/src/win/winapi.h
@@ -4751,6 +4751,8 @@ typedef DWORD (WINAPI *sPowerRegisterSuspendResumeNotification)
HANDLE Recipient,
_PHPOWERNOTIFY RegistrationHandle);
+typedef BOOL (WINAPI *sProcessPrng)(/*_Out_*/PBYTE pbData, SIZE_T cbData);
+
/* from Winuser.h */
typedef VOID (CALLBACK* WINEVENTPROC)
(HWINEVENTHOOK hWinEventHook,
@@ -4815,6 +4817,9 @@ extern sNtQueryInformationProcess pNtQueryInformationProcess;
/* Powrprof.dll function pointer */
extern sPowerRegisterSuspendResumeNotification pPowerRegisterSuspendResumeNotification;
+/* bcryptprimitives.dll function pointer */
+extern sProcessPrng pProcessPrng;
+
/* User32.dll function pointer */
extern sSetWinEventHook pSetWinEventHook;