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