BiUpdateObjectReferenceInEfiEntry

INT64 __fastcall BiUpdateObjectReferenceInEfiEntry(INT64 a1, VOID *a2){
  int ObjectReferenceFromEfiEntry; 
  __int64 v5; 
  UINT64 v6; 
  UINT8 *PoolWithTag; 
  wchar_t *v8; 
  WCHAR *v9; 
  WCHAR v10; 
  struct _UNICODE_STRING DestinationString; 
  _GUID Guid; 
  _GUID ObjectIdentifier; 
  Guid = 0i64;
  ObjectIdentifier = 0i64;
  DestinationString = 0i64;
  ObjectReferenceFromEfiEntry = BiGetObjectReferenceFromEfiEntry((_BOOT_ENTRY *)a1, &ObjectIdentifier);
  if( ObjectReferenceFromEfiEntry >= 0 )
  {
    ObjectReferenceFromEfiEntry = BcdQueryObject(a2, 0i64, 0i64, &Guid);
    if( ObjectReferenceFromEfiEntry >= 0 )
    {
      v5 = *(_QWORD *)&ObjectIdentifier.Data1 - *(_QWORD *)&Guid.Data1;
      if( *(_QWORD *)&ObjectIdentifier.Data1 == *(_QWORD *)&Guid.Data1 )
        v5 = *(_QWORD *)ObjectIdentifier.Data4 - *(_QWORD *)Guid.Data4;
      if( v5 )
      {
        v6 = (unsigned int)(*(_DWORD *)(a1 + 40) - 20);
        PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v6, 0x4B444342ui64);
        v8 = (wchar_t *)PoolWithTag;
        if( PoolWithTag )
        {
          memmove(PoolWithTag, (UINT8 *)(a1 + 48), v6);
          wcsupr(v8);
          v9 = wcsstr(v8, L"BCDOBJECT=");
          if( v9 )
          {
            RtlInitUnicodeString(&DestinationString, 0i64, v10);
            ObjectReferenceFromEfiEntry = RtlStringFromGUIDEx(&Guid, &DestinationString, 1u);
            if( ObjectReferenceFromEfiEntry >= 0 )
            {
              memmove(
                (UINT8 *)(a1 + 68 + 2 * ((unsigned __int64)(v9 - v8) >> 1)),
                (UINT8 *)DestinationString.Buffer,
                DestinationString.Length);
              RtlFreeAnsiString(&DestinationString);
            }
          }
          else
          {
            ObjectReferenceFromEfiEntry = -1073741275;
          }
          ExFreePoolWithTag(v8, 0x4B444342u);
        }
        else
        {
          return(unsigned int)-1073741670;
        }
      }
    }
  }
  return(unsigned int)ObjectReferenceFromEfiEntry;
}

Referenced by:

BiCreateEfiEntry