3535#define CONTEXT_EXTENDED_REGISTERS 0
3636#endif
3737
38+ #define CONTEXT_EXTENDED_REGISTERS_FLAG 0x20
39+ #define CONTEXT_XSTATE_FLAG 0x40
40+
3841namespace windows_nat
3942{
4043
@@ -258,7 +261,7 @@ struct windows_process_info
258261
259262 const char *pid_to_exec_file (int );
260263
261- void initialize_context (windows_thread_info *th);
264+ void initialize_context (windows_thread_info *th, DWORD xstate_features );
262265
263266 template <typename Function>
264267 auto with_context (windows_thread_info *th, Function function)
@@ -371,6 +374,14 @@ extern BOOL create_process (const wchar_t *image, wchar_t *command_line,
371374#define InitializeProcThreadAttributeList dyn_InitializeProcThreadAttributeList
372375#define UpdateProcThreadAttribute dyn_UpdateProcThreadAttribute
373376#define DeleteProcThreadAttributeList dyn_DeleteProcThreadAttributeList
377+ #define GetEnabledXStateFeatures dyn_GetEnabledXStateFeatures
378+ #define InitializeContext dyn_InitializeContext
379+ #define GetXStateFeaturesMask dyn_GetXStateFeaturesMask
380+ #define SetXStateFeaturesMask dyn_SetXStateFeaturesMask
381+ #define LocateXStateFeature dyn_LocateXStateFeature
382+ #define RtlGetExtendedFeaturesMask dyn_RtlGetExtendedFeaturesMask
383+ #define RtlSetExtendedFeaturesMask dyn_RtlSetExtendedFeaturesMask
384+ #define RtlLocateExtendedFeature dyn_RtlLocateExtendedFeature
374385
375386typedef BOOL WINAPI (AdjustTokenPrivileges_ftype) (HANDLE, BOOL,
376387 PTOKEN_PRIVILEGES,
@@ -465,6 +476,33 @@ extern DeleteProcThreadAttributeList_ftype *DeleteProcThreadAttributeList;
465476
466477extern bool disable_randomization_available ();
467478
479+ typedef DWORD64 (WINAPI GetEnabledXStateFeatures_ftype) ();
480+ extern GetEnabledXStateFeatures_ftype *GetEnabledXStateFeatures;
481+
482+ typedef BOOL (WINAPI InitializeContext_ftype) (PVOID, DWORD,
483+ PCONTEXT*, PDWORD);
484+ extern InitializeContext_ftype *InitializeContext;
485+
486+ typedef BOOL (WINAPI GetXStateFeaturesMask_ftype) (PCONTEXT, PDWORD64);
487+ extern GetXStateFeaturesMask_ftype *GetXStateFeaturesMask;
488+
489+ typedef BOOL (WINAPI SetXStateFeaturesMask_ftype) (PCONTEXT, DWORD64);
490+ extern SetXStateFeaturesMask_ftype *SetXStateFeaturesMask;
491+
492+ typedef PVOID (WINAPI LocateXStateFeature_ftype) (PCONTEXT, DWORD, PDWORD);
493+ extern LocateXStateFeature_ftype *LocateXStateFeature;
494+
495+ #ifdef __x86_64__
496+ typedef DWORD64 (WINAPI RtlGetExtendedFeaturesMask_ftype) (PVOID);
497+ extern RtlGetExtendedFeaturesMask_ftype *RtlGetExtendedFeaturesMask;
498+
499+ typedef VOID (WINAPI RtlSetExtendedFeaturesMask_ftype) (PVOID, DWORD64);
500+ extern RtlSetExtendedFeaturesMask_ftype *RtlSetExtendedFeaturesMask;
501+
502+ typedef PVOID (WINAPI RtlLocateExtendedFeature_ftype) (PVOID, DWORD, PDWORD);
503+ extern RtlLocateExtendedFeature_ftype *RtlLocateExtendedFeature;
504+ #endif
505+
468506/* Helper classes to get the correct ContextFlags values based on the
469507 used type (CONTEXT or WOW64_CONTEXT). */
470508
@@ -528,16 +566,64 @@ enum_process_modules (CONTEXT *, HANDLE process,
528566 return EnumProcessModules (process, modules, size, needed);
529567}
530568
569+ static inline BOOL
570+ get_xstate_features_mask (CONTEXT *context, DWORD64 *mask)
571+ {
572+ return GetXStateFeaturesMask (context, mask);
573+ }
574+
575+ static inline BOOL
576+ set_xstate_features_mask (CONTEXT *context, DWORD64 mask)
577+ {
578+ return SetXStateFeaturesMask (context, mask);
579+ }
580+
581+ static inline PVOID
582+ locate_xstate_feature (CONTEXT *context, DWORD feature, DWORD *length)
583+ {
584+ return LocateXStateFeature (context, feature, length);
585+ }
586+
531587#ifdef __x86_64__
532588static inline BOOL
533589get_thread_context (HANDLE h, WOW64_CONTEXT *context)
534590{
591+ if ((context->ContextFlags & CONTEXT_XSTATE_FLAG) != 0 )
592+ {
593+ DWORD flags = context->ContextFlags ;
594+ context->ContextFlags &= ~CONTEXT_EXTENDED_REGISTERS_FLAG;
595+ BOOL ret = Wow64GetThreadContext (h, context);
596+ context->ContextFlags = flags;
597+ if (!ret)
598+ return FALSE ;
599+
600+ context->ContextFlags &= ~CONTEXT_XSTATE_FLAG;
601+ ret = Wow64GetThreadContext (h, context);
602+ context->ContextFlags = flags;
603+ return ret;
604+ }
605+
535606 return Wow64GetThreadContext (h, context);
536607}
537608
538609static inline BOOL
539610set_thread_context (HANDLE h, WOW64_CONTEXT *context)
540611{
612+ if ((context->ContextFlags & CONTEXT_XSTATE_FLAG) != 0 )
613+ {
614+ DWORD flags = context->ContextFlags ;
615+ context->ContextFlags &= ~CONTEXT_EXTENDED_REGISTERS_FLAG;
616+ BOOL ret = Wow64SetThreadContext (h, context);
617+ context->ContextFlags = flags;
618+ if (!ret)
619+ return FALSE ;
620+
621+ context->ContextFlags &= ~CONTEXT_XSTATE_FLAG;
622+ ret = Wow64SetThreadContext (h, context);
623+ context->ContextFlags = flags;
624+ return ret;
625+ }
626+
541627 return Wow64SetThreadContext (h, context);
542628}
543629
@@ -555,8 +641,33 @@ enum_process_modules (WOW64_CONTEXT *, HANDLE process,
555641 return EnumProcessModulesEx (process, modules, size, needed,
556642 LIST_MODULES_32BIT);
557643}
644+
645+ static inline BOOL
646+ get_xstate_features_mask (WOW64_CONTEXT *context, DWORD64 *mask)
647+ {
648+ *mask = RtlGetExtendedFeaturesMask (context + 1 );
649+ return TRUE ;
650+ }
651+
652+ static inline BOOL
653+ set_xstate_features_mask (WOW64_CONTEXT *context, DWORD64 mask)
654+ {
655+ RtlSetExtendedFeaturesMask (context + 1 , mask);
656+ return TRUE ;
657+ }
658+
659+ static inline PVOID
660+ locate_xstate_feature (WOW64_CONTEXT *context, DWORD feature, DWORD *length)
661+ {
662+ return RtlLocateExtendedFeature (context + 1 , feature, length);
663+ }
558664#endif
559665
666+ /* Return the available xstate features, but only if there is more than SSE
667+ available. */
668+
669+ extern DWORD64 get_xstate_features ();
670+
560671/* Load any functions which may not be available in ancient versions
561672 of Windows. */
562673
0 commit comments