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