SepSecureBootUpdateBcdDataForRule
__int64 __fastcall SepSecureBootUpdateBcdDataForRule(__int64 a1, VOID *a2, VOID *a3){
_WORD *v3;
VOID **PoolWithTag;
int PolicyDefaultValue;
UINT64 v8;
__int64 *p_DataSize;
NTSTATUS ElementDataWithFlags;
__int64 v11;
VOID *v12;
VOID *v13;
UINT64 *DataSizea;
VOID *v16;
UINT64 NumberOfBytes;
UINT64 v18;
__int64 DataSize;
v3 = (_WORD *)(qword_140CF9DA0 + *(unsigned int *)(a1 + 8));
DataSize = 0i64;
PoolWithTag = 0i64;
v16 = 0i64;
LODWORD(v18) = 0;
PolicyDefaultValue = 0;
if( (*(_BYTE *)v3 & 0x1F) == 8 )
{
if( !v3[1] )
{
PolicyDefaultValue = BiDeleteElement(a2, *(unsigned int *)(a1 + 4));
if( PolicyDefaultValue == -1073741275 )
return 0;
}
}
else
{
v8 = *(unsigned int *)(a1 + 4);
LODWORD(NumberOfBytes) = 8;
p_DataSize = &DataSize;
ElementDataWithFlags = BcdGetElementDataWithFlags(a2, v8, a3, &DataSize, &NumberOfBytes);
PolicyDefaultValue = ElementDataWithFlags;
if( ElementDataWithFlags != -1073741789 && ElementDataWithFlags != -2147483643 )
goto LABEL_19;
PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1649632595i64);
if( !PoolWithTag )
return(unsigned int)-1073741670;
p_DataSize = (__int64 *)PoolWithTag;
PolicyDefaultValue = BcdGetElementDataWithFlags(a2, *(unsigned int *)(a1 + 4), v12, PoolWithTag, &NumberOfBytes);
if( PolicyDefaultValue >= 0 )
{
LABEL_19:
if( PolicyDefaultValue < 0
|| (PolicyDefaultValue = SepSecureBootValidateBcdDataAgainstBcdRule(a1, p_DataSize, NumberOfBytes),
PolicyDefaultValue < 0) )
{
PolicyDefaultValue = SepSecureBootGetPolicyDefaultValue(v3, v11, &v16, (int *)&v18);
if( PolicyDefaultValue >= 0 )
{
LODWORD(DataSizea) = v18;
PolicyDefaultValue = BcdSetElementDataWithFlags(a2, *(unsigned int *)(a1 + 4), v13, v16, (UINT64)DataSizea);
}
}
}
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x62536553u);
}
return(unsigned int)PolicyDefaultValue;
}Referenced by:
SepSecureBootCorrectBcd