[CRT]
[reactos.git] / 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 PTHREADDATA ThreadData = GetThreadData();
13
14 ThreadData->tnext = ThreadData->tnext * 0x5deece66dLL + 2531011;
15 return (int)((ThreadData->tnext >> 16) & RAND_MAX);
16 }
17
18 /*
19 * @implemented
20 */
21 void
22 srand(unsigned int seed)
23 {
24 PTHREADDATA ThreadData = GetThreadData();
25
26 ThreadData->tnext = (ULONGLONG)seed;
27 }
28
29 /*********************************************************************
30 * rand_s (MSVCRT.@)
31 */
32 int CDECL rand_s(unsigned int *pval)
33 {
34 BOOLEAN (WINAPI *pSystemFunction036)(PVOID, ULONG); // RtlGenRandom
35 HINSTANCE hadvapi32 = LoadLibraryA("advapi32.dll");
36 pSystemFunction036 = (void*)GetProcAddress(hadvapi32, "SystemFunction036");
37 #if 1
38 if (!pval || (pSystemFunction036 && !pSystemFunction036(pval, sizeof(*pval))))
39 {
40 _invalid_parameter(NULL,_CRT_WIDE("rand_s"),_CRT_WIDE(__FILE__),__LINE__, 0);
41 *_errno() = EINVAL;
42 return EINVAL;
43 }
44 #endif
45 if(hadvapi32) FreeLibrary(hadvapi32);
46 return 0;
47 }