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