5 #if defined(_WIN32) || defined(_WIN64)
10 typedef BOOLEAN (WINAPI
*rtlgenrandom_t
)(PVOID buf
, ULONG buflen
);
12 rtlgenrandom_t rtlgenrandom_fn
;
19 if(rtlgenrandom_fn
) return;
20 advapi
= LoadLibraryA("advapi32.dll");
22 throw std::runtime_error("Can't load advapi32.dll");
23 rtlgenrandom_fn
= (rtlgenrandom_t
)GetProcAddress(advapi
, "SystemFunction036");
25 throw std::runtime_error("Can't find rtlgenrandom");
28 void generate(void* buffer
, size_t buffersize
)
32 while(!rtlgenrandom_fn(buffer
, buffersize
));
44 void try_file(const char* name
)
47 while(fd
< 0 && err
!= ENOENT
&& err
!= ENXIO
) {
48 fd
= open(name
, O_RDONLY
);
49 if(fd
< 0) err
= errno
;
58 if(fd
< 0) try_file("/dev/urandom");
59 if(fd
< 0) try_file("/dev/random");
60 if(fd
< 0) throw std::runtime_error("Can't open /dev/urandom");
63 void generate(void* buffer
, size_t buffersize
)
68 while(out
< buffersize
) {
69 ssize_t r
= read(fd
, (char*)buffer
+ out
, buffersize
- out
);