Newer
Older
AMI-Aptio-BIOS-Reversed / DxeIpl / DxeIplLzmaBitDecode.c
@Ajax Dong Ajax Dong 2 days ago 2 KB Init
/* DxeIplLzmaBitDecode @ 0xffc16c81 size=0xff */
char __fastcall DxeIplLzmaBitDecode(int i_1)
{
  int i; // esi
  unsigned __int16 n0x100; // cx
  unsigned int v3; // eax
  unsigned int v4; // edx
  int v5; // ebx
  unsigned __int16 n0x1F; // di
  unsigned int n0x800000; // ecx
  unsigned int n0x1F_1; // ebp
  unsigned int j; // edx
  unsigned int v10; // edi
  int v11; // ecx

  for ( i = i_1; ; i_1 = i ) /*0xffc16c8b*/
  {
    n0x100 = DxeIplLzmaRangeDecode(i_1); /*0xffc16c92*/
    LOBYTE(v3) = 0; /*0xffc16c95*/
    if ( *(_WORD *)(i + 40) ) /*0xffc16c97*/
      break; /*0xffc16c97*/
    LOBYTE(v3) = 0; /*0xffc16ca1*/
    if ( n0x100 >= 0x100u ) /*0xffc16cac*/
    {
      v5 = (unsigned __int16)(n0x100 - 253); /*0xffc16cce*/
      n0x1F = *(_WORD *)(i + 2 * HIBYTE(*(_DWORD *)(i + 20)) + 12852); /*0xffc16cd7*/
      if ( n0x1F >= 0x1Fu ) /*0xffc16ce2*/
      {
        n0x800000 = 0x800000; /*0xffc16ce4*/
        do /*0xffc16d05*/
        {
          if ( (n0x800000 & *(_DWORD *)(i + 20)) != 0 ) /*0xffc16cef*/
            n0x1F = *(_WORD *)(i + 2 * n0x1F + 2080); /*0xffc16cf1*/
          else
            n0x1F = *(_WORD *)(i + 2 * n0x1F + 42); /*0xffc16cfb*/
          n0x800000 >>= 1; /*0xffc16d00*/
        }
        while ( n0x1F >= 0x1Fu ); /*0xffc16d05*/
      }
      n0x1F_1 = n0x1F; /*0xffc16d07*/
      DxeIplDecompressLzma(i, *(unsigned __int8 *)(i + n0x1F + 4628)); /*0xffc16d14*/
      LOBYTE(v3) = 1; /*0xffc16d1b*/
      if ( n0x1F > 1u ) /*0xffc16d1f*/
      {
        v3 = DxeIplGetDecompressAlgo(i, n0x1F - 1); /*0xffc16d26*/
        n0x1F_1 = v3 + (1 << (n0x1F - 1)); /*0xffc16d35*/
      }
      for ( j = *(_DWORD *)(i + 8) - n0x1F_1 - 1; ; ++j ) /*0xffc16d41*/
      {
        v5 += 0xFFFF; /*0xffc16d5e*/
        if ( (v5 & 0x8000u) != 0 ) /*0xffc16d63*/
          break; /*0xffc16d63*/
        v10 = *(_DWORD *)(i + 8); /*0xffc16d44*/
        if ( v10 >= *(_DWORD *)(i + 36) ) /*0xffc16d4a*/
          return v3; /*0xffc16d4a*/
        if ( j >= *(_DWORD *)(i + 36) ) /*0xffc16d4f*/
        {
          *(_WORD *)(i + 40) = -1; /*0xffc16d74*/
          return v3; /*0xffc16d74*/
        }
        v11 = *(_DWORD *)(i + 4); /*0xffc16d51*/
        LOBYTE(v3) = *(_BYTE *)(v11 + j); /*0xffc16d54*/
        *(_BYTE *)(v11 + v10) = v3; /*0xffc16d57*/
        ++*(_DWORD *)(i + 8); /*0xffc16d5a*/
      }
      v3 = *(_DWORD *)(i + 8); /*0xffc16d65*/
      if ( v3 >= *(_DWORD *)(i + 36) ) /*0xffc16d6b*/
        return v3; /*0xffc16d6b*/
    }
    else
    {
      v4 = *(_DWORD *)(i + 8); /*0xffc16cae*/
      if ( v4 >= *(_DWORD *)(i + 36) ) /*0xffc16cb4*/
        return v3; /*0xffc16cb4*/
      *(_BYTE *)(v4 + *(_DWORD *)(i + 4)) = n0x100; /*0xffc16cbd*/
      ++*(_DWORD *)(i + 8); /*0xffc16cc0*/
    }
  }
  return v3; /*0xffc16d78*/
}