@@ -112,59 +112,18 @@ Rand_RdRand16(
112112
113113#endif /* _RAND_HAS_RDRAND_ */
114114
115- static int g_iFallbackToSW = -1 ;
116-
117- __forceinline
118- LOGICAL
119- _Rand_FallbackToSW (VOID)
120- {
121- if (g_iFallbackToSW != -1 )
122- {
123- return !!g_iFallbackToSW;
124- }
125-
126- /*
127- * RDRAND is not emulated on WoA yet,
128- * and SharedUserData->NativeProcessorArchitecture is avaliable since NT 6.2.
129- */
130- if (SharedUserData->NtMajorVersion < 10 )
131- {
132- /* WoA since NT 10 */
133- g_iFallbackToSW = FALSE ;
134- } else if (NtReadTebPVOID (WowTebOffset) == NULL )
135- {
136- /* Not in WOW */
137- g_iFallbackToSW = FALSE ;
138- } else if (SharedUserData->NativeProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
139- SharedUserData->NativeProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
140- {
141- /* RDRAND is supported natively */
142- g_iFallbackToSW = FALSE ;
143- } else
144- {
145- g_iFallbackToSW = TRUE ;
146- }
147- return !!g_iFallbackToSW;
148- }
149-
150115__forceinline
151116_Success_ (return != FALSE )
152117LOGICAL
153118Rand_HW32(
154119 _Out_ unsigned __int32* Random)
155120{
156- #if _RAND_HAS_RDRAND_
157- if (_Rand_FallbackToSW ())
158- {
159- #endif
160- *Random = Rand_SW32 ();
161- return TRUE ;
162- #if _RAND_HAS_RDRAND_
163- } else
121+ if (_RAND_HAS_RDRAND_ && _Inline_RtlIsProcessorFeaturePresent (PF_RDRAND_INSTRUCTION_AVAILABLE))
164122 {
165123 return Rand_RdRand32 (Random);
166124 }
167- #endif
125+ *Random = Rand_SW32 ();
126+ return TRUE ;
168127}
169128
170129__forceinline
@@ -173,18 +132,12 @@ LOGICAL
173132Rand_HW64(
174133 _Out_ unsigned __int64* Random)
175134{
176- #if _RAND_HAS_RDRAND_
177- if (_Rand_FallbackToSW ())
178- {
179- #endif
180- *Random = Rand_SW64 ();
181- return TRUE ;
182- #if _RAND_HAS_RDRAND_
183- } else
135+ if (_RAND_HAS_RDRAND_ && _Inline_RtlIsProcessorFeaturePresent (PF_RDRAND_INSTRUCTION_AVAILABLE))
184136 {
185137 return Rand_RdRand64 (Random);
186138 }
187- #endif
139+ *Random = Rand_SW64 ();
140+ return TRUE ;
188141}
189142
190143__forceinline
@@ -193,18 +146,12 @@ LOGICAL
193146Rand_HW16(
194147 _Out_ unsigned __int16* Random)
195148{
196- #if _RAND_HAS_RDRAND_
197- if (_Rand_FallbackToSW ())
198- {
199- #endif
200- *Random = Rand_SW16 ();
201- return TRUE ;
202- #if _RAND_HAS_RDRAND_
203- } else
149+ if (_RAND_HAS_RDRAND_ && _Inline_RtlIsProcessorFeaturePresent (PF_RDRAND_INSTRUCTION_AVAILABLE))
204150 {
205151 return Rand_RdRand16 (Random);
206152 }
207- #endif
153+ *Random = Rand_SW16 ();
154+ return TRUE ;
208155}
209156
210157__forceinline
0 commit comments