00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
#include <ntrtlp.h>
00026
00027
#if defined(ALLOC_PRAGMA) && defined(NTOS_KERNEL_RUNTIME)
00028
#pragma alloc_text(PAGE, RtlRandom)
00029
#endif
00030
00031 #define Multiplier ((ULONG)(0x80000000ul - 19)) // 2**31 - 19
00032 #define Increment ((ULONG)(0x80000000ul - 61)) // 2**31 - 61
00033 #define Modulus ((ULONG)(0x80000000ul - 1)) // 2**31 - 1
00034
00035
#if !defined(NTOS_KERNEL_RUNTIME)
00036
ULONG
00037 RtlUniform (
00038 IN OUT PULONG Seed
00039 )
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 {
00059 *
Seed = ((
Multiplier * (*Seed)) +
Increment) %
Modulus;
00060
return *
Seed;
00061 }
00062
#endif
00063
00064 #define UniformMacro(Seed) ( \
00065
*Seed = (((Multiplier * (*Seed)) + Increment) % Modulus) \
00066
)
00067
00068
00069 extern ULONG
RtlpRandomConstantVector[];
00070
00071 ULONG
00072 RtlRandom (
00073 IN OUT PULONG Seed
00074 )
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092 {
00093 ULONG X;
00094 ULONG Y;
00095 ULONG j;
00096 ULONG Result;
00097
00098
RTL_PAGED_CODE();
00099
00100 X =
UniformMacro(
Seed);
00101 Y =
UniformMacro(
Seed);
00102
00103 j = Y % 128;
00104
00105 Result =
RtlpRandomConstantVector[j];
00106
00107
RtlpRandomConstantVector[j] = X;
00108
00109
return Result;
00110
00111 }
00112