diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2025-07-16 20:18:29 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-16 20:18:29 +0200 |
commit | 7484ab251f58fdbc4fbc4313de70a7696e8c02b9 (patch) | |
tree | b6e0595cd15b619a2b27ec1c194b342325b3e00a /src/win | |
parent | 917c1ad1d1dee1c714d001e8fd1f276a6e06dd52 (diff) | |
download | libuv-main.tar.gz libuv-main.zip |
Refs: https://github.com/libuv/libuv/pull/2762#issuecomment-3065018271
Diffstat (limited to 'src/win')
-rw-r--r-- | src/win/fs.c | 2 | ||||
-rw-r--r-- | src/win/internal.h | 2 | ||||
-rw-r--r-- | src/win/util.c | 5 | ||||
-rw-r--r-- | src/win/winapi.c | 13 | ||||
-rw-r--r-- | src/win/winapi.h | 5 |
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; |