BiUpdateBcdObject
INT64 __fastcall BiUpdateBcdObject(VOID *a1, const GUID *a2){
UINT8 *v2;
PVOID v4;
PVOID v5;
void *PoolWithTag;
int v7;
PVOID v8;
int v9;
unsigned int v10;
UINT64 v11;
UINT8 *v12;
__int64 v13;
SIZE_T v14;
int ElementDataWithFlags;
UINT64 v16;
UINT64 v17;
__int64 v18;
UINT8 *v19;
UINT64 v20;
UINT64 v21;
VOID **Buffer;
UINT64 *Length;
UINT64 DataSize;
PVOID P;
PVOID Data;
void *Source2;
PVOID ObjectHandle;
SIZE_T NumberOfBytes;
UINT64 a3;
v2 = *(UINT8 **)a2[2].Data4;
LODWORD(a3) = 0;
v4 = 0i64;
P = 0i64;
v5 = 0i64;
Data = 0i64;
PoolWithTag = 0i64;
Source2 = 0i64;
DataSize = 0i64;
ObjectHandle = 0i64;
LODWORD(NumberOfBytes) = 0;
v7 = BcdOpenObject(a1, (GUID *)&a2[1], &ObjectHandle);
v8 = ObjectHandle;
v9 = v7;
if( v7 < 0 )
goto LABEL_31;
if( (a2[3].Data1 & 2) != 0
&& (int)BiGetRegistryValue(
ObjectHandle,
(WCHAR *)L"FirmwareVariable",
(WCHAR *)L"Description",
3ui64,
&Source2,
&DataSize) >= 0 )
{
v10 = *((_DWORD *)v2 + 1);
if( v10 == (_DWORD)DataSize && RtlCompareMemory(v2, Source2, v10) == *((_DWORD *)v2 + 1) )
{
LABEL_8:
v12 = &v2[*((unsigned int *)v2 + 4)];
v13 = -1i64;
do
++v13;
while( *(_WORD *)&v12[2 * v13] );
v14 = (unsigned int)(2 * v13 + 2);
ElementDataWithFlags = BcdGetElementDataWithFlags(v8, 0x12000004ui64, v11, 0i64, &NumberOfBytes);
if( ElementDataWithFlags == -1073741789 )
{
PoolWithTag = ExAllocatePoolWithTag(PagedPool, (unsigned int)NumberOfBytes, 0x4B444342ui64);
if( !PoolWithTag )
{
LABEL_17:
BiDeleteElement(v8, 0x12000004ui64);
LODWORD(Buffer) = v14;
BcdSetElementDataWithFlags(v8, 0x12000004ui64, v17, v12, (UINT64)Buffer);
LABEL_18:
v18 = *((unsigned int *)v2 + 5);
if( *(_DWORD *)&v2[v18 + 8] == 4 )
{
v19 = &v2[v18];
if( (int)BiGetDeviceFromEfiPath(&v2[v18 + 12], (INT64)&P, &a3) < 0 )
{
v4 = P;
}
else
{
BiDeleteElement(v8, 0x11000001ui64);
BiMapEfiDeviceForSpaces((INT64)a2, (const VOID **)&P, &a3);
v4 = P;
LODWORD(Buffer) = a3;
BcdSetElementDataWithFlags(v8, 0x11000001ui64, v20, P, (UINT64)Buffer);
}
if( BiGetFilePathFromEfiPath((__int64)(v19 + 12), &Data, (unsigned int *)&DataSize + 1) < 0 )
{
v5 = Data;
}
else
{
BiDeleteElement(v8, 0x12000002ui64);
v5 = Data;
LODWORD(Buffer) = HIDWORD(DataSize);
BcdSetElementDataWithFlags(v8, 0x12000002ui64, v21, Data, (UINT64)Buffer);
}
}
v9 = 0;
if( v4 )
ExFreePoolWithTag(v4, 0x4B444342u);
if( v5 )
ExFreePoolWithTag(v5, 0x4B444342u);
goto LABEL_29;
}
ElementDataWithFlags = BcdGetElementDataWithFlags(v8, 0x12000004ui64, v16, PoolWithTag, &NumberOfBytes);
}
if( ElementDataWithFlags >= 0
&& PoolWithTag
&& (_DWORD)NumberOfBytes == (_DWORD)v14
&& RtlCompareMemory(v12, PoolWithTag, v14) == v14 )
{
goto LABEL_18;
}
goto LABEL_17;
}
}
LODWORD(Length) = *((_DWORD *)v2 + 1);
v9 = BiSetRegistryValue(v8, (WCHAR *)L"FirmwareVariable", (WCHAR *)L"Description", 3ui64, v2, (UINT64)Length);
if( v9 >= 0 )
{
a2[3].Data1 |= 2u;
goto LABEL_8;
}
LABEL_29:
if( Source2 )
ExFreePoolWithTag(Source2, 0x4B444342u);
LABEL_31:
if( v8 )
BcdCloseObject(v8);
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x4B444342u);
return(unsigned int)v9;
}Referenced by:
BiBindEfiEntries