BcdEnumerateObjects

INT64 __fastcall BcdEnumerateObjects(__int64 a1, _DWORD *a2, GUID *a3, unsigned int *a4, unsigned int *a5){
  unsigned int *v5; 
  GUID *v6; 
  UINT8 v8; 
  INT64 result; 
  WCHAR **v10; 
  int v11; 
  PVOID v12; 
  unsigned int v13; 
  int v14; 
  unsigned int v15; 
  __int64 v16; 
  WCHAR **v17; 
  int ObjectDescription; 
  unsigned __int64 v19; 
  UINT64 *v20; 
  unsigned __int64 v21; 
  unsigned int v22; 
  unsigned int v23; 
  unsigned int v24; 
  int v25; 
  WCHAR v26; 
  UINT64 v27; 
  UINT8 IsOfflineHandle; 
  char SubKeyCount[12]; 
  WCHAR **SubKeyList; 
  UINT64 PackedObjectType; 
  PVOID Handle; 
  unsigned int v33; 
  struct _UNICODE_STRING DestinationString; 
  GUID *Guid; 
  Guid = a3;
  PackedObjectType = 0i64;
  v5 = a4;
  v6 = a3;
  memset(SubKeyCount, 0, sizeof(SubKeyCount));
  DestinationString = 0i64;
  if( !a3 && *a4 || !a5 || !*a2 )
    return 3221225485i64;
  IsOfflineHandle = BiIsOfflineHandle((_HHIVE *)a1, (UINT64)a2, (_UNICODE_STRING *)a3, (_UNICODE_STRING *)a4);
  v8 = IsOfflineHandle;
  result = BiAcquireBcdSyncMutant(IsOfflineHandle);
  if( (int)result >= 0 )
  {
    Handle = 0i64;
    SubKeyList = 0i64;
    v10 = 0i64;
    v11 = BiOpenKey((PVOID)a1, (WCHAR *)L"Objects", 0x20019ui64, &Handle);
    v12 = Handle;
    v13 = v11;
    if( v11 >= 0 )
    {
      v14 = BiEnumerateSubKeys(Handle, &SubKeyList, (UINT64 *)SubKeyCount);
      v10 = SubKeyList;
      v13 = v14;
      if( v14 >= 0 )
      {
        v15 = 0;
        if( *(_DWORD *)SubKeyCount )
        {
          v16 = *(unsigned int *)SubKeyCount;
          v17 = SubKeyList;
          do
          {
            if( (int)BiOpenKey(v12, *v17, 0x20019ui64, (PVOID *)&SubKeyCount[4]) >= 0 )
            {
              ObjectDescription = BiGetObjectDescription(*(__int64 *)&SubKeyCount[4], &PackedObjectType);
              BiCloseKey(*(PVOID *)&SubKeyCount[4]);
              if( ObjectDescription >= 0 )
              {
                if( BiIsEnumerateMatch((unsigned int)a2[1], HIDWORD(PackedObjectType)) )
                  ++v15;
              }
            }
            ++v17;
            --v16;
          }
          while( v16 );
          v5 = a4;
          v6 = Guid;
        }
        v19 = 24i64 * v15;
        if( v19 > 0xFFFFFFFF
          || (v20 = (UINT64 *)((char *)&v6->Data1 + (unsigned int)v19), v21 = 8i64 * v15, v21 > 0xFFFFFFFF)
          || (v22 = v21 + v19, LODWORD(SubKeyList) = v21 + v19, (int)v21 + (int)v19 < (unsigned int)v19) )
        {
          v13 = -1073741675;
        }
        else if( v22 <= *v5 )
        {
          v33 = 0;
          v23 = 0;
          if( *(_DWORD *)SubKeyCount )
          {
            v24 = v33;
            do
            {
              if( v23 >= v15 )
                break;
              if( (int)BiOpenKey(Handle, v10[v24], 0x20019ui64, (PVOID *)&SubKeyCount[4]) >= 0 )
              {
                v25 = BiGetObjectDescription(*(__int64 *)&SubKeyCount[4], &PackedObjectType);
                BiCloseKey(*(PVOID *)&SubKeyCount[4]);
                if( v25 >= 0 )
                {
                  if( BiIsEnumerateMatch((unsigned int)a2[1], HIDWORD(PackedObjectType)) )
                  {
                    RtlInitUnicodeString(&DestinationString, v10[v24], v26);
                    if( RtlGUIDFromString(&DestinationString, Guid) >= 0 )
                    {
                      v27 = PackedObjectType;
                      *(_QWORD *)&Guid[1].Data1 = v20;
                      *v20++ = v27;
                      ++v23;
                      Guid = (GUID *)((char *)Guid + 24);
                    }
                  }
                }
              }
              ++v24;
            }
            while( v24 < *(_DWORD *)SubKeyCount );
            v22 = (unsigned int)SubKeyList;
            v5 = a4;
          }
          v13 = 0;
          *v5 = v22;
          *a5 = v23;
          v12 = Handle;
        }
        else
        {
          v13 = -1073741789;
          *v5 = v22;
          *a5 = v15;
        }
        v8 = IsOfflineHandle;
      }
    }
    if( v12 )
      BiCloseKey(v12);
    if( v10 )
      ExFreePoolWithTag(v10, 0x4B444342u);
    BiReleaseBcdSyncMutant(v8);
    return v13;
  }
  return result;
}

Referenced by:

SepSecureBootCorrectBcd