ReactOS  0.4.14-dev-593-g1793dcc
rand.c
Go to the documentation of this file.
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 {
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 {
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 }
Definition: arc.h:39
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryA(LPCSTR lpLibFileName)
Definition: loader.c:111
smooth NULL
Definition: ftsmooth.c:416
void srand(unsigned int seed)
Definition: rand.c:24
void * PVOID
Definition: retypes.h:9
#define FreeLibrary(x)
Definition: compat.h:413
int CDECL rand_s(unsigned int *pval)
Definition: rand.c:33
#define WINAPI
Definition: msvc.h:6
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
_CRTIMP int *__cdecl _errno(void)
Definition: errno.c:19
#define RAND_MAX
Definition: stdlib.h:99
thread_data_t * msvcrt_get_thread_data(void)
Definition: tls.c:31
#define CDECL
Definition: compat.h:21
int rand(void)
Definition: rand.c:10
#define BOOLEAN
Definition: pedump.c:73
unsigned int ULONG
Definition: retypes.h:1
#define GetProcAddress(x, y)
Definition: compat.h:418
#define _CRT_WIDE(_String)
Definition: crtdefs.h:43
void _invalid_parameter(const wchar_t *expression, const wchar_t *function, const wchar_t *file, unsigned int line, uintptr_t pReserved)
Definition: errno.c:137