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