[CRT]
[reactos.git] / reactos / lib / sdk / crt / math / rand.c
1 /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
2 #include <precomp.h>
3 #include <ntsecapi.h>
4 #include <internal/tls.h>
5
6 /*
7 * @implemented
8 */
9 int
10 rand(void)
11 {
12 thread_data_t *data = msvcrt_get_thread_data();
13
14 /* this is the algorithm used by MSVC, according to
15 * http://en.wikipedia.org/wiki/List_of_pseudorandom_number_generators */
16 data->random_seed = data->random_seed * 214013 + 2531011;
17 return (data->random_seed >> 16) & RAND_MAX;
18 }
19
20 /*
21 * @implemented
22 */
23 void
24 srand(unsigned int seed)
25 {
26 thread_data_t *data = msvcrt_get_thread_data();
27 data->random_seed = seed;
28 }
29
30 /*********************************************************************
31 * rand_s (MSVCRT.@)
32 */
33 int CDECL rand_s(unsigned int *pval)
34 {
35 BOOLEAN (WINAPI *pSystemFunction036)(PVOID, ULONG); // RtlGenRandom
36 HINSTANCE hadvapi32;
37
38 if (!pval)
39 {
40 _invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
41 *_errno() = EINVAL;
42 return EINVAL;
43 }
44
45 *pval = 0;
46 hadvapi32 = LoadLibraryA("advapi32.dll");
47 if (!hadvapi32)
48 {
49 _invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
50 *_errno() = EINVAL;
51 return EINVAL;
52 }
53
54 pSystemFunction036 = (void*)GetProcAddress(hadvapi32, "SystemFunction036");
55 if (!pSystemFunction036)
56 {
57 _invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
58 *_errno() = EINVAL;
59 FreeLibrary(hadvapi32);
60 return EINVAL;
61 }
62
63 if (!pSystemFunction036(pval, sizeof(*pval)))
64 {
65 _invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
66 *_errno() = EINVAL;
67 FreeLibrary(hadvapi32);
68 return EINVAL;
69 }
70
71 FreeLibrary(hadvapi32);
72 return 0;
73 }