BiCreateMergedBootEntry
INT64 __fastcall BiCreateMergedBootEntry(INT64 a1, UINT8 *a2, INT64 a3, UINT8 *a4, UINT8 **a5){
__int64 v5;
UINT8 *v6;
UINT8 *v7;
void *v9;
INT64 v10;
UINT8 *v11;
_FILE_PATH *v12;
int DeviceFromEfiPath;
unsigned int v15;
NTSTATUS FilePathFromEfiPath;
__int64 v17;
unsigned int v18;
__int64 v19;
unsigned int v20;
unsigned int v21;
_FILE_PATH *PoolWithTag;
UINT8 *v23;
__int64 v24;
UINT64 v25;
NTSTATUS v26;
unsigned int v27;
int v28;
int v29;
int v30;
UINT8 *v31;
UINT8 *v32;
__int64 v33;
UINT64 v34;
__int64 v35;
char v36;
size_t Size;
size_t v38;
void *Src;
UINT8 *v40;
char v42;
v5 = -1i64;
Size = 0i64;
v6 = a4;
v7 = a2;
Src = 0i64;
v38 = 0i64;
v9 = 0i64;
v42 = 0;
v10 = 0i64;
v40 = 0i64;
v11 = 0i64;
v36 = 0;
v12 = 0i64;
if( a3 )
{
if( *(_DWORD *)a3 == 5 )
return 3221225486i64;
if( *(_DWORD *)a3 != 2 )
return 3221225485i64;
Src = (void *)(a3 + 20);
}
else
{
v10 = a1 + *(unsigned int *)(a1 + 20);
if( !a4 )
goto LABEL_24;
v38 = a1 + *(unsigned int *)(a1 + 20);
DeviceFromEfiPath = BiGetDeviceFromEfiPath((UINT8 *)(v10 + 12), (INT64)&Src, &Size);
v9 = Src;
v15 = DeviceFromEfiPath;
if( DeviceFromEfiPath < 0 )
goto LABEL_32;
Src = (char *)Src + 20;
v6 = a4;
}
if( v6 )
{
v11 = v6;
goto LABEL_14;
}
v10 = a1 + *(unsigned int *)(a1 + 20);
v38 = v10;
FilePathFromEfiPath = BiGetFilePathFromEfiPath(v10 + 12, &v40, (unsigned int *)&Size + 1);
v11 = v40;
v15 = FilePathFromEfiPath;
if( FilePathFromEfiPath >= 0 )
{
v36 = 1;
LABEL_14:
v17 = -1i64;
do
++v17;
while( *((_WORD *)Src + v17) );
v18 = 2 * v17 + 2;
v19 = -1i64;
HIDWORD(Size) = v18;
do
++v19;
while( *(_WORD *)&v11[2 * v19] );
LODWORD(Size) = 2 * v19 + 2;
v20 = v18 + Size;
if( v18 + (unsigned int)Size < v18 )
goto LABEL_31;
v21 = v20 + 12;
if( v20 + 12 < v20 )
goto LABEL_31;
PoolWithTag = (_FILE_PATH *)ExAllocatePoolWithTag(PagedPool, v21, 0x4B444342ui64);
v12 = PoolWithTag;
if( !PoolWithTag )
{
LABEL_21:
v15 = -1073741670;
goto LABEL_32;
}
v23 = (UINT8 *)Src;
PoolWithTag->Length = v21;
v24 = HIDWORD(Size);
v25 = HIDWORD(Size);
PoolWithTag->Version = 1;
PoolWithTag->Type = 3;
memmove((UINT8 *)PoolWithTag->FilePath, v23, v25);
memmove((UINT8 *)&v12->FilePath[v24], v11, (unsigned int)Size);
v26 = BiTranslateFilePath(v12, 4ui64, (_FILE_PATH **)&v38);
v10 = v38;
v15 = v26;
if( v26 < 0 )
goto LABEL_32;
v7 = a2;
v42 = 1;
LABEL_24:
if( !v7 )
v7 = (UINT8 *)(a1 + *(unsigned int *)(a1 + 16));
do
++v5;
while( *(_WORD *)&v7[2 * v5] );
v27 = *(_DWORD *)(a1 + 24);
v28 = 2 * v5 + 2;
LODWORD(v38) = v28;
if( v27 + v28 >= v27 )
{
v29 = *(_DWORD *)(v10 + 4);
if( v29 + v27 + v28 + 36 >= v27 + v28 )
{
HIDWORD(Size) = (v27 + 31) & 0xFFFFFFFC;
LODWORD(Size) = (v28 + HIDWORD(Size) + 3) & 0xFFFFFFFC;
v30 = v29 + Size;
v31 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, (unsigned int)(v29 + Size), 0x4B444342ui64);
v40 = v31;
if( v31 )
{
memset((INT64)v31, 0i64);
v32 = v40;
v33 = HIDWORD(Size);
v34 = (unsigned int)v38;
*((_DWORD *)v40 + 1) = v30;
v35 = (__int64)v40;
*(_DWORD *)v32 = 1;
*(_DWORD *)(v35 + 8) = *(_DWORD *)(a1 + 8);
*(_DWORD *)(v35 + 12) = *(_DWORD *)(a1 + 12);
LODWORD(v32) = Size;
*(_DWORD *)(v35 + 16) = v33;
*(_DWORD *)(v35 + 20) = (_DWORD)v32;
*(_DWORD *)(v35 + 24) = *(_DWORD *)(a1 + 24);
memmove((UINT8 *)(v35 + v33), v7, v34);
memmove((UINT8 *)(v35 + (unsigned int)Size), (UINT8 *)v10, *(unsigned int *)(v10 + 4));
memmove((UINT8 *)(v35 + 28), (UINT8 *)(a1 + 28), *(unsigned int *)(a1 + 24));
v15 = 0;
*a5 = (UINT8 *)v35;
goto LABEL_32;
}
goto LABEL_21;
}
}
LABEL_31:
v15 = -1073741675;
}
LABEL_32:
if( v9 )
ExFreePoolWithTag(v9, 0x4B444342u);
if( v42 )
ExFreePoolWithTag((PVOID)v10, 0x4B444342u);
if( v36 )
ExFreePoolWithTag(v11, 0x4B444342u);
if( v12 )
ExFreePoolWithTag(v12, 0x4B444342u);
return v15;
}Referenced by:
BiUpdateEfiEntry