Newer
Older
AMI-Aptio-BIOS-Reversed / DxeCore / PeCoff / PeCoff.c
@Ajax Dong Ajax Dong 2 days ago 16 KB Init
#include "../uefi_headers/Uefi.h"

// ==================================================================
// PE/COFF Loader Library
// Source: MdePkg/Library/BasePeCoffLib/BasePeCoff.c
//         MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c
//         MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c (PeCoffGetImageInfo)
//         MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c
//         MdePkg/Library/BaseCpuExceptionHandlerLib/X64Exception.c
//         MdePkg/Library/LzmaDecompressLib
// ==================================================================

// PeCoffGetEntryPoint
// PeCoffGetEntryPoint -- Validate PE headers and locate entry point
//
RETURN_STATUS __cdecl PeCoffGetEntryPoint(void *Pe32Data, void **EntryPoint)
{
  double v2; // xmm3_8
  char *Pe32Data_1; // rax

  if ( !Pe32Data ) /*0x14cc3*/
    Assert_7( /*0x14cd6*/
      (__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffGetEntryPointLib\\PeCoffGetEntryPoint.c",
      54,
      (__int64)"Pe32Data != ((void *) 0)",
      v2);
  if ( !EntryPoint ) /*0x14cde*/
    Assert_7( /*0x14cf1*/
      (__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffGetEntryPointLib\\PeCoffGetEntryPoint.c",
      55,
      (__int64)"EntryPoint != ((void *) 0)",
      v2);
  if ( *(_WORD *)Pe32Data == 23117 ) /*0x14cfe*/
    Pe32Data_1 = (char *)Pe32Data + *((unsigned __int16 *)Pe32Data + 30); /*0x14d04*/
  else
    Pe32Data_1 = (char *)Pe32Data; /*0x14d09*/
  if ( *(_WORD *)Pe32Data_1 == 23126 ) /*0x14d14*/
  {
    *EntryPoint = (char *)Pe32Data /*0x14d27*/
                + *((unsigned int *)Pe32Data_1 + 2)
                - (unsigned __int64)*((unsigned __int16 *)Pe32Data_1 + 3)
                + 40;
    return 0; /*0x14d2c*/
  }
  if ( *(_DWORD *)Pe32Data_1 == 17744 ) /*0x14d34*/
  {
    *EntryPoint = (char *)Pe32Data + *((unsigned int *)Pe32Data_1 + 10); /*0x14d3c*/
    return 0; /*0x14d3f*/
  }
  return 0x8000000000000003uLL; /*0x14d50*/
}

// PeCoffGetImageInfo
// PeCoffGetImageInfo -- Query image info from PE headers
//
RETURN_STATUS __cdecl PeCoffGetImageInfo(PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext)
{
  double v1; // xmm3_8
  __int64 v3; // r10
  PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext_1; // rax
  unsigned int *p_EntryPoint; // rdx
  char *v6; // rcx
  int n512; // ecx
  __int16 EntryPoint; // cx
  unsigned int FixupDataSize_high; // r8d
  unsigned __int64 v10; // r8
  _DWORD *i; // rcx
  _DWORD *v12; // rax

  if ( !ImageContext ) /*0x14d64*/
    Assert_7( /*0x14d79*/
      (__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffGetEntryPointLib\\PeCoffGetEntryPoint.c",
      166,
      (__int64)"Pe32Data != ((void *) 0)",
      v1);
  v3 = 0; /*0x14d7e*/
  if ( LOWORD(ImageContext->ImageAddress) == 23117 ) /*0x14d89*/
    ImageContext_1 = (PE_COFF_LOADER_IMAGE_CONTEXT *)((char *)ImageContext + LOWORD(ImageContext->PeCoffHeaderOffset)); /*0x14d8f*/
  else
    ImageContext_1 = ImageContext; /*0x14d94*/
  if ( LOWORD(ImageContext_1->ImageAddress) != 23126 ) /*0x14d9f*/
  {
    if ( LODWORD(ImageContext_1->ImageAddress) != 17744 ) /*0x14dcb*/
      return 0; /*0x14dcb*/
    n512 = WORD2(ImageContext_1->ImageAddress); /*0x14dd1*/
    if ( n512 == 332 ) /*0x14de0*/
    {
      EntryPoint = 267; /*0x14df8*/
    }
    else
    {
      if ( n512 == 512 || n512 == 34404 ) /*0x14df0*/
        goto LABEL_17; /*0x14df0*/
      EntryPoint = ImageContext_1->EntryPoint; /*0x14df2*/
    }
    if ( EntryPoint == 267 ) /*0x14dfd*/
    {
      FixupDataSize_high = HIDWORD(ImageContext_1->FixupDataSize); /*0x14dff*/
      p_EntryPoint = (unsigned int *)&ImageContext_1[1].EntryPoint; /*0x14e03*/
      goto LABEL_19; /*0x14e0a*/
    }
LABEL_17:
    if ( LOWORD(ImageContext_1->EntryPoint) != 523 ) /*0x14e15*/
      goto LABEL_20; /*0x14e15*/
    FixupDataSize_high = HIDWORD(ImageContext_1->HiiResourceData); /*0x14e17*/
    p_EntryPoint = (unsigned int *)&ImageContext_1[1].Handle; /*0x14e1e*/
LABEL_19:
    v6 = (char *)ImageContext + *p_EntryPoint; /*0x14e25*/
    if ( FixupDataSize_high > 6 ) /*0x14e2e*/
      goto LABEL_21; /*0x14e2e*/
LABEL_20:
    p_EntryPoint = 0; /*0x14e30*/
    v6 = 0; /*0x14e32*/
    goto LABEL_21; /*0x14e32*/
  }
  p_EntryPoint = (unsigned int *)&ImageContext_1->ImageRead; /*0x14da1*/
  if ( !LODWORD(ImageContext_1->ImageRead) ) /*0x14da8*/
    return 0; /*0x14e8e*/
  v3 = 40LL - HIWORD(ImageContext_1->ImageAddress); /*0x14db8*/
  v6 = (char *)ImageContext_1 + *p_EntryPoint + v3; /*0x14dc0*/
LABEL_21:
  if ( !v6 ) /*0x14e37*/
    return 0; /*0x14e37*/
  if ( !p_EntryPoint ) /*0x14e3c*/
    return 0; /*0x14e3c*/
  v10 = 0; /*0x14e42*/
  if ( !p_EntryPoint[1] ) /*0x14e3e*/
    return 0; /*0x14e48*/
  for ( i = v6 + 16; ; i += 7 ) /*0x14e4a*/
  {
    if ( *(i - 1) != 2 || !*i ) /*0x14e54*/
      goto LABEL_30; /*0x14e57*/
    v12 = (_DWORD *)((char *)ImageContext + v3 + (unsigned int)i[1]); /*0x14e5f*/
    if ( *v12 == 808534606 ) /*0x14e68*/
      break; /*0x14e68*/
    if ( *v12 == 1129272397 ) /*0x14e70*/
      return (RETURN_STATUS)(v12 + 5); /*0x14e99*/
    if ( *v12 == 1396986706 ) /*0x14e78*/
      return (RETURN_STATUS)(v12 + 6); /*0x14e93*/
LABEL_30:
    v10 += 28LL; /*0x14e7a*/
    if ( v10 >= p_EntryPoint[1] ) /*0x14e85*/
      return 0; /*0x14e85*/
  }
  return (RETURN_STATUS)(v12 + 4); /*0x14e89*/
}

// PeCoffLoadImage
// PeCoffLoadImage -- Load PE/COFF image with base relocations
//
RETURN_STATUS __cdecl PeCoffLoadImage(PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext)
{
  double v1; // xmm3_8
  PHYSICAL_ADDRESS DestinationAddress; // rdx
  PHYSICAL_ADDRESS v4; // rax
  unsigned int v5; // r15d
  __int64 DestinationAddress_1; // rcx
  PHYSICAL_ADDRESS v7; // r9
  unsigned int n5; // edx
  __int64 n176; // rcx
  unsigned int *v10; // rcx
  unsigned int *v11; // rdi
  PHYSICAL_ADDRESS ImageAddress; // rax
  UINT64 ImageSize; // r10
  UINT64 v14; // rcx
  unsigned __int64 v15; // rdx
  UINT64 v16; // r11
  unsigned __int64 v17; // r10
  RETURN_STATUS result; // rax
  unsigned __int64 v19; // r13
  char *FixupData; // r8
  bool v21; // cf
  unsigned int *v22; // r14
  __int64 v23; // rcx
  unsigned int *v24; // rbp
  UINT64 v25; // r11
  UINT64 v26; // rsi
  _WORD *v27; // rcx
  int v28; // r11d
  int v29; // r11d
  int v30; // r11d
  int n7; // r11d
  char *v32; // r8
  char *v33; // r8
  PHYSICAL_ADDRESS DestinationAddress_2; // rax

  if ( !ImageContext ) /*0x169a0*/
    Assert_7( /*0x169b5*/
      (__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffLib\\BasePeCoff.c",
      958,
      (__int64)"ImageContext != ((void *) 0)",
      v1);
  ImageContext->ImageError = 0; /*0x169ba*/
  if ( ImageContext->RelocationsStripped ) /*0x169bd*/
    return 0; /*0x169bd*/
  DestinationAddress = ImageContext->DestinationAddress; /*0x169c7*/
  if ( !DestinationAddress ) /*0x169ce*/
    DestinationAddress = ImageContext->ImageAddress; /*0x169d0*/
  if ( ImageContext->IsTeImage ) /*0x169d8*/
  {
    ImageAddress = ImageContext->ImageAddress; /*0x16a44*/
    v5 = *(unsigned __int16 *)(ImageContext->ImageAddress + 6) - 40; /*0x16a4f*/
    v7 = DestinationAddress - v5 - *(_QWORD *)(ImageContext->ImageAddress + 16); /*0x16a59*/
    if ( DestinationAddress - v5 != *(_QWORD *)(ImageContext->ImageAddress + 16) ) /*0x16a5d*/
      *(_QWORD *)(ImageAddress + 16) = DestinationAddress - v5; /*0x16a62*/
    v11 = (unsigned int *)(ImageAddress + 24); /*0x16a66*/
  }
  else
  {
    if ( (v4 = ImageContext->ImageAddress + ImageContext->PeCoffHeaderOffset, v5 = 0, *(_WORD *)(v4 + 4) == 512) /*0x16a04*/
      && *(_WORD *)(v4 + 24) == 267
      || *(_WORD *)(v4 + 24) != 267 )
    {
      v7 = DestinationAddress - *(_QWORD *)(v4 + 48); /*0x16a21*/
      if ( DestinationAddress != *(_QWORD *)(v4 + 48) ) /*0x16a25*/
        *(_QWORD *)(v4 + 48) = DestinationAddress; /*0x16a27*/
      n5 = *(_DWORD *)(v4 + 132); /*0x16a2b*/
      n176 = 176; /*0x16a31*/
    }
    else
    {
      DestinationAddress_1 = *(unsigned int *)(v4 + 52); /*0x16a06*/
      v7 = DestinationAddress - DestinationAddress_1; /*0x16a0c*/
      if ( DestinationAddress != DestinationAddress_1 ) /*0x16a0f*/
        *(_DWORD *)(v4 + 52) = DestinationAddress; /*0x16a11*/
      n5 = *(_DWORD *)(v4 + 116); /*0x16a14*/
      n176 = 160; /*0x16a17*/
    }
    v10 = (unsigned int *)(v4 + n176); /*0x16a36*/
    v11 = 0; /*0x16a39*/
    if ( n5 >= 5 ) /*0x16a3e*/
      v11 = v10; /*0x16a3e*/
  }
  if ( v11 && v11[1] ) /*0x16a6f*/
  {
    ImageSize = ImageContext->ImageSize; /*0x16a74*/
    v14 = *v11; /*0x16a78*/
    if ( v14 < ImageSize + v5 ) /*0x16a84*/
    {
      v15 = v14 + ImageContext->ImageAddress - v5; /*0x16a94*/
    }
    else
    {
      ImageContext->ImageError = 5; /*0x16a86*/
      v15 = 0; /*0x16a89*/
    }
    v16 = v11[1] + *v11 - 1; /*0x16aa1*/
    if ( v16 < ImageSize + v5 ) /*0x16aa8*/
    {
      v17 = v16 + ImageContext->ImageAddress - v5; /*0x16ab8*/
    }
    else
    {
      ImageContext->ImageError = 5; /*0x16aaa*/
      v17 = 0; /*0x16aad*/
    }
    if ( !v15 || !v17 || v17 < v15 ) /*0x16ac8*/
      goto LABEL_33; /*0x16ac8*/
  }
  else
  {
    v17 = 0; /*0x16ae0*/
    v15 = 0; /*0x16ae3*/
  }
  v19 = v15; /*0x16ae6*/
  if ( !v7 ) /*0x16aec*/
    return 0; /*0x16c7a*/
  FixupData = (char *)ImageContext->FixupData; /*0x16af2*/
  v21 = v15 < v17; /*0x16af6*/
LABEL_37:
  if ( !v21 ) /*0x16af9*/
  {
    if ( FixupData > (char *)ImageContext->FixupData + ImageContext->FixupDataSize ) /*0x16c50*/
      Assert_7( /*0x16c65*/
        (__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffLib\\BasePeCoff.c",
        1164,
        (__int64)"(UINTN)FixupData <= (UINTN)ImageContext->FixupData + ImageContext->FixupDataSize",
        v1);
    DestinationAddress_2 = ImageContext->DestinationAddress; /*0x16c6a*/
    if ( DestinationAddress_2 ) /*0x16c71*/
      ImageContext->EntryPoint += DestinationAddress_2 - ImageContext->ImageAddress; /*0x16c76*/
    return 0; /*0x16c76*/
  }
  v22 = (unsigned int *)(v15 + 8); /*0x16aff*/
  if ( !*(_DWORD *)(v15 + 4) ) /*0x16b03*/
    goto LABEL_33; /*0x16b03*/
  v23 = *(unsigned int *)(v15 + 4); /*0x16b08*/
  if ( v15 > ~v23 ) /*0x16b13*/
    goto LABEL_33; /*0x16b13*/
  v24 = (unsigned int *)(v23 + v15); /*0x16b18*/
  if ( v23 + v15 > v19 + v11[1] ) /*0x16b22*/
    goto LABEL_33; /*0x16b22*/
  v25 = *(unsigned int *)v15; /*0x16b28*/
  if ( v25 >= v5 + ImageContext->ImageSize ) /*0x16b34*/
  {
    ImageContext->ImageError = 5; /*0x16c39*/
    goto LABEL_33; /*0x16c40*/
  }
  if ( !(v25 + ImageContext->ImageAddress - v5) ) /*0x16b43*/
  {
LABEL_33:
    ImageContext->ImageError = 9; /*0x16aca*/
    return 0x8000000000000001uLL; /*0x16adb*/
  }
  while ( 1 ) /*0x16bff*/
  {
    if ( v22 >= v24 ) /*0x16c02*/
    {
      v15 = (unsigned __int64)v24; /*0x16c08*/
      v21 = (unsigned __int64)v24 < v17; /*0x16c0b*/
      goto LABEL_37; /*0x16c0e*/
    }
    v26 = *(_DWORD *)v15 + (*(_WORD *)v22 & 0xFFFu); /*0x16b5b*/
    if ( v26 >= v5 + ImageContext->ImageSize ) /*0x16b64*/
      break; /*0x16b64*/
    v27 = (_WORD *)(v26 + ImageContext->ImageAddress - v5); /*0x16b70*/
    if ( !v27 ) /*0x16b73*/
      goto LABEL_64; /*0x16b73*/
    v28 = *(unsigned __int16 *)v22 >> 12; /*0x16b79*/
    if ( v28 ) /*0x16b82*/
    {
      v29 = v28 - 1; /*0x16b84*/
      if ( !v29 ) /*0x16b88*/
      {
        *v27 += WORD1(v7); /*0x16be8*/
LABEL_57:
        if ( FixupData ) /*0x16bf1*/
        {
          *(_WORD *)FixupData = *v27; /*0x16bf3*/
          FixupData += 2; /*0x16bf7*/
        }
        goto LABEL_59; /*0x16bf7*/
      }
      v30 = v29 - 1; /*0x16b8a*/
      if ( !v30 ) /*0x16b8e*/
      {
        *v27 += v7; /*0x16bdc*/
        goto LABEL_57; /*0x16be0*/
      }
      n7 = v30 - 1; /*0x16b90*/
      if ( n7 ) /*0x16b94*/
      {
        if ( n7 != 7 ) /*0x16b9a*/
        {
          result = 0x8000000000000003uLL; /*0x16c13*/
          goto LABEL_65; /*0x16c1d*/
        }
        *(_QWORD *)v27 += v7; /*0x16b9c*/
        if ( FixupData ) /*0x16ba5*/
        {
          v32 = &FixupData[-(int)FixupData & 7]; /*0x16bb0*/
          *(_QWORD *)v32 = *(_QWORD *)v27; /*0x16bb3*/
          FixupData = v32 + 8; /*0x16bb6*/
        }
      }
      else
      {
        *(_DWORD *)v27 += v7; /*0x16bbc*/
        if ( FixupData ) /*0x16bc5*/
        {
          v33 = &FixupData[-(int)FixupData & 3]; /*0x16bd0*/
          *(_DWORD *)v33 = *(_DWORD *)v27; /*0x16bd3*/
          FixupData = v33 + 4; /*0x16bd6*/
        }
      }
    }
LABEL_59:
    v22 = (unsigned int *)((char *)v22 + 2); /*0x16bfb*/
  }
  ImageContext->ImageError = 5; /*0x16c1f*/
LABEL_64:
  result = 0x8000000000000001uLL; /*0x16c26*/
LABEL_65:
  ImageContext->ImageError = 9; /*0x16c30*/
  return result; /*0x16c8b*/
}

// DumpCpuExceptionInfo
// DumpCpuExceptionInfo -- Dump CPU exception context registers
//
__int64 __fastcall DumpCpuExceptionInfo(__int64 n14, _QWORD *a2, double a3)
{
  int v4; // eax

  v4 = GetInfo_12(); /*0x17c24*/
  Assert_5("!!!! X64 Exception Type - %02x(%a)  CPU Apic ID - %08x !!!!\n", n14, a3, v4); /*0x17c39*/
  if ( ((unsigned int)&unk_27D00 & (1 << n14)) != 0 ) /*0x17c4f*/
  {
    Assert_5("ExceptionData - %016lx", *a2); /*0x17c63*/
    if ( n14 == 14 ) /*0x17c6c*/
      Assert_5( /*0x17cd1*/
        "  I:%x R:%x U:%x W:%x P:%x PK:%x S:%x",
        (*a2 >> 4) & 1,
        (*a2 >> 3) & 1,
        (*a2 >> 2) & 1,
        (*a2 >> 1) & 1,
        *a2 & 1,
        (*a2 >> 5) & 1,
        (*a2 >> 15) & 1);
    Assert_5("\n"); /*0x17cdd*/
  }
  Assert_5("RIP  - %016lx, CS  - %016lx, RFLAGS - %016lx\n", a2[84], a2[89], a2[77]); /*0x17d02*/
  Assert_5("RAX  - %016lx, RCX - %016lx, RDX - %016lx\n", a2[98], a2[97], a2[96]); /*0x17d27*/
  Assert_5("RBX  - %016lx, RSP - %016lx, RBP - %016lx\n", a2[95], a2[94], a2[93]); /*0x17d4c*/
  Assert_5("RSI  - %016lx, RDI - %016lx\n", a2[92], a2[91]); /*0x17d6a*/
  Assert_5("R8   - %016lx, R9  - %016lx, R10 - %016lx\n", a2[99], a2[100], a2[101]); /*0x17d8f*/
  Assert_5("R11  - %016lx, R12 - %016lx, R13 - %016lx\n", a2[102], a2[103], a2[104]); /*0x17db4*/
  Assert_5("R14  - %016lx, R15 - %016lx\n", a2[105], a2[106]); /*0x17dd2*/
  Assert_5("DS   - %016lx, ES  - %016lx, FS  - %016lx\n", a2[88], a2[87], a2[86]); /*0x17df7*/
  Assert_5("GS   - %016lx, SS  - %016lx\n", a2[85], a2[90]); /*0x17e15*/
  Assert_5("CR0  - %016lx, CR2 - %016lx, CR3 - %016lx\n", a2[71], a2[73], a2[74]); /*0x17e3a*/
  Assert_5("CR4  - %016lx, CR8 - %016lx\n", a2[75], a2[76]); /*0x17e58*/
  Assert_5("DR0  - %016lx, DR1 - %016lx, DR2 - %016lx\n", a2[65], a2[66], a2[67]); /*0x17e7d*/
  Assert_5("DR3  - %016lx, DR6 - %016lx, DR7 - %016lx\n", a2[68], a2[69], a2[70]); /*0x17ea2*/
  Assert_5("GDTR - %016lx %016lx, LDTR - %016lx\n", a2[80], a2[81], a2[78]); /*0x17ec7*/
  Assert_5("IDTR - %016lx %016lx,   TR - %016lx\n", a2[82], a2[83], a2[79]); /*0x17eec*/
  return Assert_5("FXSAVE_STATE - %016lx\n", (int)a2 + 8); /*0x17f0f*/
}

// ReportStatusCodeWithExtendedData
// ReportStatusCodeWithExtendedData -- Report status code with extended data buffer
//
// local variable allocation has failed, the output may be wrong!
EFI_STATUS __cdecl ReportStatusCodeWithExtendedData(
        EFI_STATUS_CODE_TYPE Type,
        EFI_STATUS_CODE_VALUE Value,
        const void *ExtendedData,
        UINTN ExtendedDataSize)
{
  double v4; // xmm3_8
  unsigned __int64 n0x10; // rbx
  __int64 v8; // r8
  _BYTE *v9; // rax
  __int64 *v10; // rdx
  __int64 v11; // r8
  void *ExtendedDataSize_1; // r9
  EFI_STATUS v13; // rbx
  _BYTE v15[528]; // [rsp+30h] [rbp-218h] BYREF
  __int64 *v16; // [rsp+270h] [rbp+28h]
  __int64 *p__; // [rsp+278h] [rbp+30h]
  _BYTE *v18; // [rsp+280h] [rbp+38h] BYREF

  if ( !p__ ) /*0x1480c*/
    Assert_7( /*0x14821*/
      (__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeReportStatusCodeLib\\ReportStatusCodeLib.c",
      496,
      (__int64)"!((ExtendedData == ((void *) 0)) && (ExtendedDataSize != 0))",
      v4);
  if ( !buf_0 || !*((_QWORD *)buf_0 + 8) || !*((_QWORD *)buf_0 + 9) ) /*0x14841*/
    return 0x8000000000000003uLL; /*0x14957*/
  n0x10 = (*((__int64 (__fastcall **)(__int64, _QWORD, const void *))buf_0 + 3))(31, *(_QWORD *)&Value, ExtendedData); /*0x1485e*/
  (*((void (__fastcall **)(unsigned __int64))buf_0 + 4))(n0x10); /*0x14861*/
  v18 = 0; /*0x14864*/
  if ( n0x10 > 0x10 || ((*((void (__fastcall **)(__int64, __int64, _BYTE **))buf_0 + 8))(4, 28, &v18), (v9 = v18) == 0) ) /*0x14898*/
  {
    v9 = v15; /*0x1489a*/
    v18 = v15; /*0x1489f*/
  }
  v10 = &qword_223C0; /*0x148ac*/
  *(_WORD *)v9 = 20; /*0x148b3*/
  *((_WORD *)v18 + 1) = 8; /*0x148c1*/
  if ( v16 ) /*0x148d8*/
    v10 = v16; /*0x148d8*/
  Assert_108(v18 + 4, (__int64)v10, v8, v4); /*0x148e0*/
  if ( p__ ) /*0x148ee*/
    MemConfig_1(v18 + 20, (char *)p__, 8u, v4); /*0x14907*/
  ExtendedDataSize_1 = &unk_22760; /*0x14914*/
  if ( ExtendedDataSize ) /*0x1492a*/
    ExtendedDataSize_1 = (void *)ExtendedDataSize; /*0x1492a*/
  v13 = sub_146F0(1u, Value, v11, (__int64)ExtendedDataSize_1, (__int64)v18); /*0x1493b*/
  if ( v18 != v15 ) /*0x14946*/
    (*((void (**)(void))buf_0 + 9))(); /*0x1494f*/
  return v13; /*0x14971*/
}

// LzmaDecompress -- LZMA decompressor (adaptive range coder + Huffman + LZ77 sliding window)
// Located at 0x18818, 3039 bytes. Full decompilation too large to embed.
// See LzmaDecompress.c in MdePkg/Library/LzmaDecompressLib for reference implementation.