SeSecureBootRegisterPolicy
INT64 __fastcall SeSecureBootRegisterPolicy(VOID *PolicyBlob, UINT64 PolicyBlobSize){
ULONG_PTR v2;
unsigned int v4;
unsigned int v5;
UINT8 *v6;
int v7;
UINT8 *PoolWithTag;
unsigned int *v10;
UINT64 v11;
unsigned int v12;
UINT8 *v13;
UINT8 *v14;
unsigned int v15;
unsigned __int64 v16;
unsigned int v17;
unsigned int v18;
unsigned __int64 v19;
v2 = (unsigned int)PolicyBlobSize;
if( (unsigned int)PolicyBlobSize < 0x10
|| (v4 = *((_DWORD *)PolicyBlob + 2), v5 = *((_DWORD *)PolicyBlob + 3), (v4 == 0) != (v5 == 0))
|| v4 >= (unsigned int)v2
|| v5 >= (unsigned int)v2
|| v5 - 1 <= 0x3E
|| v5 + v4 > (unsigned int)v2 )
{
v7 = -1069350909;
goto LABEL_31;
}
v6 = 0i64;
*(_OWORD *)g_SecureBootPolicyBlobHeader = *(_OWORD *)PolicyBlob;
qword_140C54390 = *((_QWORD *)PolicyBlob + 2);
if( *((_DWORD *)PolicyBlob + 3) )
v6 = (UINT8 *)PolicyBlob + *((unsigned int *)PolicyBlob + 2);
SepSecureBootSetRegistryKey((__int64)v6);
if( (dword_140C54384 & 8) != 0 )
SepSecureBootCheckForUpdates();
if( !v6 )
return 0;
PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(NonPagedPoolNx, *((unsigned int *)PolicyBlob + 3), 0x62536553ui64);
v10 = (unsigned int *)PoolWithTag;
if( !PoolWithTag )
goto LABEL_35;
memmove(PoolWithTag, v6, *((unsigned int *)PolicyBlob + 3));
qword_140CF4AF8 = v10;
if( *((_WORD *)v6 + 18) || *((_WORD *)v6 + 19) )
{
qword_140CF9DA0 = (__int64)v10 + v10[13] + 60;
v7 = SepSecureBootBuildRules();
if( v7 < 0 )
goto LABEL_32;
if( *(_DWORD *)PolicyBlob < 2u )
goto LABEL_31;
v11 = *((unsigned int *)PolicyBlob + 5);
if( !(_DWORD)v11 )
goto LABEL_31;
if( (unsigned int)v11 >= (unsigned int)v2 )
goto LABEL_36;
v12 = *((_DWORD *)PolicyBlob + 4);
if( v12 >= (unsigned int)v2 || v12 > (int)v2 - (int)v11 )
goto LABEL_36;
v13 = (UINT8 *)ExAllocatePoolWithTag(NonPagedPoolNx, v11, 0x62536553ui64);
v14 = v13;
if( v13 )
{
memmove(v13, (UINT8 *)PolicyBlob + *((unsigned int *)PolicyBlob + 4), *((unsigned int *)PolicyBlob + 5));
v15 = *((_DWORD *)PolicyBlob + 5);
if( v15 >= 0x18 )
{
v16 = 276i64 * *(unsigned int *)v14;
v17 = v15 - 24;
*((_QWORD *)v14 + 1) = v14 + 24;
if( v16 <= 0xFFFFFFFF && v17 >= (unsigned int)v16 )
{
v18 = v17 - v16;
v19 = 32i64 * *((unsigned int *)v14 + 1);
if( v19 <= 0xFFFFFFFF )
{
v7 = 0;
if( v18 >= (unsigned int)v19 )
{
*((_QWORD *)v14 + 2) = &v14[(unsigned int)v16 + 24];
LODWORD(g_SecureBootActivePlatformManifestSize) = *((_DWORD *)PolicyBlob + 5);
g_SecureBootActivePlatformManifest = v14;
LABEL_31:
if( v7 >= 0 )
return(unsigned int)v7;
LABEL_32:
if( qword_140CF4AF8 )
{
ExFreePoolWithTag(qword_140CF4AF8, 0);
qword_140CF4AF8 = 0i64;
}
KeBugCheckEx(0x145u, v7, (ULONG_PTR)PolicyBlob, v2, 0i64);
}
}
}
}
LABEL_36:
v7 = -1069350909;
goto LABEL_32;
}
LABEL_35:
v7 = -1073741670;
goto LABEL_32;
}
return 0;
}Referenced by:
SeCodeIntegrityInitializePolicy