Reactos
1/*
2 * PROJECT: ReactOS CRT library
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: rand_s implementation
5 * COPYRIGHT: Copyright 2010 Sylvain Petreolle <spetreolle@yahoo.fr>
6 * Copyright 2015 Christoph von Wittich <christoph_vw@reactos.org>
7 * Copyright 2015 Pierre Schweitzer <pierre@reactos.org>
8 */
9
10#include <precomp.h>
11
12typedef BOOLEAN (WINAPI *PFN_SystemFunction036)(PVOID, ULONG); // RtlGenRandom
13PFN_SystemFunction036 g_pfnSystemFunction036 = NULL;
14
15/*********************************************************************
16 * rand_s (MSVCRT.@)
17 */
18int CDECL rand_s(unsigned int *pval)
19{
20 HINSTANCE hadvapi32;
21
22 if (!pval)
23 {
24 _invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
25 *_errno() = EINVAL;
26 return EINVAL;
27 }
28
29 *pval = 0;
30
31 if (g_pfnSystemFunction036 == NULL)
32 {
33 PFN_SystemFunction036 pSystemFunction036;
34
35 hadvapi32 = LoadLibraryA("advapi32.dll");
36 if (!hadvapi32)
37 {
38 _invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
39 *_errno() = EINVAL;
40 return EINVAL;
41 }
42
43 pSystemFunction036 = (void*)GetProcAddress(hadvapi32, "SystemFunction036");
44 if (!pSystemFunction036)
45 {
46 _invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
47 *_errno() = EINVAL;
48 FreeLibrary(hadvapi32);
49 return EINVAL;
50 }
51
52 g_pfnSystemFunction036 = pSystemFunction036;
53 }
54
55 if (!g_pfnSystemFunction036(pval, sizeof(*pval)))
56 {
57 _invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
58 *_errno() = EINVAL;
59 return EINVAL;
60 }
61
62 return 0;
63}
64
65// Small hack: import stub to allow GCC's stdc++ to link
66#if defined(__GNUC__) && (DLL_EXPORT_VERSION < 0x600)
67#ifdef WIN64
68const void* __imp_rand_s = rand_s;
69#else
70const void* _imp_rand_s = rand_s;
71#endif
72#endif