SeSecureBootRegisterPolicy

NTSTATUS __stdcall SeSecureBootRegisterPolicy(
        VOID *PolicyBlob,
        ULONG_PTR PolicyBlobSize,
        INT64 a3,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  void *v8; 
  unsigned int v10; 
  unsigned int v11; 
  _WORD *v12; 
  int v13; 
  VOID **PoolWithTag; 
  VOID **v16; 
  UINT64 v17; 
  unsigned int v18; 
  VOID **v19; 
  unsigned int *v20; 
  unsigned int v21; 
  unsigned __int64 v22; 
  unsigned int v23; 
  unsigned int v24; 
  unsigned __int64 v25; 

  v8 = (void *)PolicyBlobSize;
  if( PolicyBlobSize < 0x10
    || (v10 = *((_DWORD *)PolicyBlob + 2), v11 = *((_DWORD *)PolicyBlob + 3), (v10 == 0) != (v11 == 0))
    || v10 >= (unsigned int)v8
    || v11 >= (unsigned int)v8
    || v11 - 1 <= 0x3E
    || v11 + v10 > (unsigned int)v8 )
  {
    v13 = -1069350909;
    goto LABEL_31;
  }
  v12 = 0i64;
  g_SecureBootPolicyBlobHeader = *(_OWORD *)PolicyBlob;
  qword_140C54390 = *((_QWORD *)PolicyBlob + 2);
  if( *((_DWORD *)PolicyBlob + 3) )
    v12 = (char *)PolicyBlob + *((unsigned int *)PolicyBlob + 2);
  SepSecureBootSetRegistryKey((__int64)v12);
  if( (dword_140C54384 & 8) != 0 )
    SepSecureBootCheckForUpdates();
  if( !v12 )
    return 0;
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, *((unsigned int *)PolicyBlob + 3), 1649632595i64);
  v16 = PoolWithTag;
  if( !PoolWithTag )
    goto LABEL_35;
  memmove(PoolWithTag, v12, *((_DWORD *)PolicyBlob + 3));
  *(&stru_140CF2E80 + 911) = v16;
  if( v12[18] || v12[19] )
  {
    qword_140CF9DA0 = (__int64)v16 + *((unsigned int *)v16 + 13) + 60;
    v13 = SepSecureBootBuildRules();
    if( v13 < 0 )
      goto LABEL_32;
    if( *(_DWORD *)PolicyBlob < 2u )
      goto LABEL_31;
    v17 = *((unsigned int *)PolicyBlob + 5);
    if( !(_DWORD)v17 )
      goto LABEL_31;
    if( (unsigned int)v17 >= (unsigned int)v8 )
      goto LABEL_36;
    v18 = *((_DWORD *)PolicyBlob + 4);
    if( v18 >= (unsigned int)v8 || v18 > (int)v8 - (int)v17 )
      goto LABEL_36;
    v19 = ExAllocatePoolWithTag(0x200ui64, v17, 1649632595i64);
    v20 = (unsigned int *)v19;
    if( v19 )
    {
      memmove(v19, (char *)PolicyBlob + *((unsigned int *)PolicyBlob + 4), *((_DWORD *)PolicyBlob + 5));
      v21 = *((_DWORD *)PolicyBlob + 5);
      if( v21 >= 0x18 )
      {
        v22 = 276i64 * *v20;
        v23 = v21 - 24;
        *((_QWORD *)v20 + 1) = v20 + 6;
        if( v22 <= 0xFFFFFFFF && v23 >= (unsigned int)v22 )
        {
          v24 = v23 - v22;
          v25 = 32i64 * v20[1];
          if( v25 <= 0xFFFFFFFF )
          {
            v13 = 0;
            if( v24 >= (unsigned int)v25 )
            {
              *((_QWORD *)v20 + 2) = (char *)v20 + (unsigned int)v22 + 24;
              g_SecureBootActivePlatformManifestSize = *((_DWORD *)PolicyBlob + 5);
              g_SecureBootActivePlatformManifest = v20;
LABEL_31:
              if( v13 >= 0 )
                return v13;
LABEL_32:
              if( *(&stru_140CF2E80 + 911) )
              {
                ExFreePoolWithTag(*(&stru_140CF2E80 + 911), 0);
                *(&stru_140CF2E80 + 911) = 0i64;
              }
              KeBugCheckEx(0x145u, (PVOID)v13, PolicyBlob, v8, 0i64);
            }
          }
        }
      }
LABEL_36:
      v13 = -1069350909;
      goto LABEL_32;
    }
LABEL_35:
    v13 = -1073741670;
    goto LABEL_32;
  }
  return 0;
}

Referenced by:

No references.