win: use ProcessPrng (#4836)

Refs: https://github.com/libuv/libuv/pull/2762#issuecomment-3065018271
This commit is contained in:
Ben Noordhuis 2025-07-16 20:18:29 +02:00 committed by GitHub
parent 917c1ad1d1
commit 7484ab251f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 25 additions and 4 deletions

View File

@ -61,7 +61,7 @@ static int uv__random(void* buf, size_t buflen) {
# endif
#elif defined(_WIN32)
uv__once_init();
rc = uv__random_rtlgenrandom(buf, buflen);
rc = uv__random_winrandom(buf, buflen);
#else
rc = uv__random_devurandom(buf, buflen);
#endif

View File

@ -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;
}

View File

@ -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);
/*

View File

@ -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;

View File

@ -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");

View File

@ -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;