|  | #define _CRT_RAND_S | 
|  | #include <stdlib.h> | 
|  | #include <windows.h> | 
|  | #include <ntsecapi.h> | 
|  | #include <errno.h> | 
|  | #include <msvcrt.h> | 
|  |  | 
|  | static BOOLEAN (WINAPI *pRtlGenRandom)(void*,ULONG); | 
|  |  | 
|  | static errno_t mingw_rand_s(unsigned int *pval) | 
|  | { | 
|  | return !pval || !pRtlGenRandom || !pRtlGenRandom(pval, sizeof(*pval)) ? EINVAL : 0; | 
|  | } | 
|  |  | 
|  | static errno_t __cdecl init_rand_s(unsigned int*); | 
|  |  | 
|  | errno_t (__cdecl *__MINGW_IMP_SYMBOL(rand_s))(unsigned int*) = init_rand_s; | 
|  |  | 
|  | errno_t __cdecl | 
|  | rand_s(unsigned int *val) | 
|  | { | 
|  | return __MINGW_IMP_SYMBOL(rand_s)(val); | 
|  | } | 
|  |  | 
|  | static errno_t __cdecl init_rand_s(unsigned int *val) | 
|  | { | 
|  | int (__cdecl *func)(unsigned int*); | 
|  |  | 
|  | func = (void*)GetProcAddress(__mingw_get_msvcrt_handle(), "rand_s"); | 
|  | if(!func) { | 
|  | func = mingw_rand_s; | 
|  | pRtlGenRandom = (void*)GetProcAddress(LoadLibraryW(L"advapi32.dll"), "SystemFunction036"); | 
|  | } | 
|  |  | 
|  | return (__MINGW_IMP_SYMBOL(rand_s) = func)(val); | 
|  | } |