KiIntersectFeaturesWithPolicy
VOID __stdcall KiIntersectFeaturesWithPolicy(
_LOADER_PARAMETER_BLOCK *LoaderBlock,
_XSTATE_CONFIGURATION *Configuration){
unsigned int v3;
__int64 v4;
struct _KPRCB *CurrentPrcb;
unsigned __int64 EnabledSupervisorFeatures;
unsigned __int64 EnabledFeatures;
unsigned __int64 v8;
char *v9;
__int64 v10;
unsigned int v11;
unsigned int v12;
_DWORD *v13;
char IsXSaveFeatureAllowed;
UINT64 ProcessorFeatures;
UINT64 ExtendedFeatures;
PVOID Policy;
UINT64 PolicyLength;
unsigned __int64 v19;
UINT64 Vendor[2];
_LARGE_INTEGER UpdateSignature;
v3 = 0;
UpdateSignature.QuadPart = 0i64;
v4 = 0i64;
LODWORD(ExtendedFeatures) = 0;
*(_OWORD *)Vendor = 0i64;
LODWORD(ProcessorFeatures) = 0;
Policy = 0i64;
PolicyLength = 0i64;
if( Configuration->EnabledFeatures )
{
if( KiLoadPolicyFromImage(LoaderBlock, &Policy, &PolicyLength) == -1073741204 )
{
Configuration->ControlFlags &= 0xFFFFFFFC;
Configuration->EnabledFeatures = 0i64;
Configuration->EnabledSupervisorFeatures = 0i64;
}
else
{
KiGetProcessorInformation(Vendor, (UINT64 *)((char *)&Vendor[1] + 4), &ExtendedFeatures, &ProcessorFeatures);
CurrentPrcb = KeGetCurrentPrcb();
EnabledSupervisorFeatures = Configuration->EnabledSupervisorFeatures;
EnabledFeatures = Configuration->EnabledFeatures;
v8 = Configuration->EnabledFeatures | EnabledSupervisorFeatures;
v19 = EnabledSupervisorFeatures;
UpdateSignature = CurrentPrcb->UpdateSignature;
if( v8 )
{
v9 = (char *)Policy;
do
{
if( v3 >= 0x40 )
break;
if( (v8 & 1) != 0 )
{
v10 = *((_QWORD *)v9 + 2);
if( _bittest64(&v10, v3) )
{
v11 = 0;
LODWORD(ProcessorFeatures) = *((_DWORD *)v9 + 6);
if( (_DWORD)ProcessorFeatures )
{
v12 = ProcessorFeatures;
v13 = v9 + 32;
ExtendedFeatures = (UINT64)(v9 + 32);
do
{
if( *v13 == v3 )
{
IsXSaveFeatureAllowed = KiIsXSaveFeatureAllowed(
(__int64)v9,
v11,
(__int64)CurrentPrcb,
(__int64)Vendor);
v12 = ProcessorFeatures;
if( IsXSaveFeatureAllowed )
_bittestandset64(&v4, v3);
v13 = (_DWORD *)ExtendedFeatures;
}
v13 += 4;
++v11;
ExtendedFeatures = (UINT64)v13;
}
while( v11 < v12 );
}
}
}
++v3;
v8 >>= 1;
}
while( v8 );
EnabledSupervisorFeatures = v19;
}
Configuration->EnabledFeatures = v4 & EnabledFeatures;
Configuration->EnabledSupervisorFeatures = v4 & EnabledSupervisorFeatures;
}
}
}Referenced by:
KiInitializeXSave