Newer
Older
AMI-Aptio-BIOS-Reversed / 117828F1-DA7D-4BC1-8B58-9A954FED5121 / RaidCfgMgr.c
@Ajax Dong Ajax Dong 2 days ago 9 KB Init
#include "117828F1-DA7D-4BC1-8B58-9A954FED5121.h"

// RaidCfgMgr.c - RAID configuration manager
// Extracted from 117828F1-DA7D-4BC1-8B58-9A954FED5121.c

// Function: RstCallback @ 0x48d8 (0x92 bytes)
// Index: 101/906

EFI_STATUS __fastcall RstCallback(RST_PRIVATE_DATA *Private)
{
  EFI_STATUS result; // rax
  __int64 v3; // [rsp+40h] [rbp+8h] BYREF
  __int64 v4; // [rsp+48h] [rbp+10h] BYREF

  RstHelper_48a0((__int64)Private); /*0x48e1*/
  result = (*(__int64 (__fastcall **)(__int64, unsigned int *, _QWORD, __int64 *, __int64 *))(qword_58070 + 312))( /*0x490a*/
             2,
             &dword_278C0,
             0,
             &v3,
             &v4);
  if ( !LOBYTE(Private->HiiLibFunctions[15]) && !result && v3 ) /*0x4923*/
  {
    (*(void (__fastcall **)(_QWORD *))(*qword_35418 + 32LL))(qword_35418); /*0x492f*/
    LOBYTE(Private->HiiLibFunctions[15]) = 1; /*0x4932*/
    result = RstGetString((__int64)&Private->HiiLibFunctions[7], (__int64)(qword_35418 + 78)); /*0x494b*/
  }
  if ( v4 ) /*0x4958*/
    return (*(EFI_STATUS (**)(void))(qword_58070 + 72))(); /*0x4961*/
  return result; /*0x4964*/
}

// Function: RstCallbackHandler @ 0x496c (0x1ad bytes)
// Index: 102/906

EFI_STATUS __fastcall RstCallbackHandler(RST_PRIVATE_DATA *Private)
{
  const CHAR16 *Source_1; // rdx
  unsigned int n24_3; // r8d
  unsigned int n24_1; // esi
  const CHAR16 *Source; // rbp
  EFI_STATUS n24; // rax
  void *v7; // rax
  CHAR16 *Destination; // rcx
  unsigned int n24_2; // r12d
  __int64 v10; // r14
  __int64 v11; // rbp
  __int64 v12; // r13
  __int64 v13; // rbx
  char *v14; // rax
  __int64 v15; // r15
  __int64 v16; // [rsp+50h] [rbp+8h] BYREF

  n24_1 = n24_3; /*0x4988*/
  Source = Source_1; /*0x498b*/
  HiiLibGetDefaultString((__int64)Private); /*0x4991*/
  n24 = 24; /*0x4996*/
  if ( n24_1 > 0x18 ) /*0x499d*/
    n24_1 = 24; /*0x499d*/
  HIDWORD(Private->HiiLibFunctions[11]) = 0; /*0x49a0*/
  if ( Source && n24_1 ) /*0x49af*/
  {
    Private->HiiLibFunctions[12] = (void *)MemAllocPages(8LL * n24_1); /*0x49c6*/
    Private->HiiLibFunctions[13] = (void *)MemAllocPages(56LL * n24_1); /*0x49d9*/
    v7 = (void *)MemAllocPages(4LL * n24_1); /*0x49dd*/
    Destination = (CHAR16 *)Private->HiiLibFunctions[12]; /*0x49e2*/
    Private->HiiLibFunctions[14] = v7; /*0x49e6*/
    if ( Destination && Private->HiiLibFunctions[13] && v7 ) /*0x4a04*/
    {
      StrnCpy(Destination, Source, 8LL * n24_1); /*0x4a10*/
      n24_2 = 0; /*0x4a15*/
      LODWORD(Private->HiiLibFunctions[11]) = n24_1; /*0x4a18*/
      v10 = 0; /*0x4a23*/
      v11 = 0; /*0x4a26*/
      v12 = 0; /*0x4a28*/
      v13 = 0; /*0x4a2b*/
      do /*0x4aec*/
      {
        MemZero((_BYTE *)Private->HiiLibFunctions[13] + v13, 0, 56); /*0x4a3b*/
        *((_BYTE *)Private->HiiLibFunctions[13] + v11) = 1; /*0x4a44*/
        v14 = (char *)Private->HiiLibFunctions[12]; /*0x4a49*/
        v15 = *(_QWORD *)&v14[v12]; /*0x4a4d*/
        if ( v15 /*0x4a7b*/
          && !HiiLibGetStringId((__int64)Private, *(_QWORD *)&v14[v12], (__int64)&unk_27890, (__int64)&v16)
          && v16 )
        {
          if ( (*(__int64 (__fastcall **)(__int64, char *))(v16 + 8))(v16, (char *)Private->HiiLibFunctions[13] + v13) < 0 /*0x4a99*/
            || *((_BYTE *)Private->HiiLibFunctions[13] + v11) != 1 )
          {
            MemZero((_BYTE *)Private->HiiLibFunctions[13] + v13, 0, 56); /*0x4aa9*/
          }
          HiiLibFindString((__int64)Private, v15, (__int64)&unk_27890); /*0x4abb*/
        }
        RstFreeContext(Private); /*0x4ac6*/
        ++n24_2; /*0x4ad2*/
        *(_DWORD *)((char *)Private->HiiLibFunctions[14] + v10) = n24; /*0x4ad5*/
        v13 += 56; /*0x4ad9*/
        v12 += 8; /*0x4add*/
        v10 += 4; /*0x4ae1*/
        v11 += 56; /*0x4ae5*/
      }
      while ( n24_2 < n24_1 ); /*0x4aec*/
    }
    else
    {
      return HiiLibGetDefaultString((__int64)Private); /*0x4af7*/
    }
  }
  return n24; /*0x4b0b*/
}

// Function: RstQueryConfig @ 0x4b1c (0x6a bytes)
// Index: 103/906

EFI_STATUS __fastcall RstQueryConfig(RST_PRIVATE_DATA *Private)
{
  EFI_STATUS result; // rax
  __int64 n24; // [rsp+48h] [rbp+10h] BYREF
  CHAR16 *Source; // [rsp+50h] [rbp+18h] BYREF

  n24 = 0; /*0x4b22*/
  HiiLibGetDefaultString(Private); /*0x4b2b*/
  result = (*(__int64 (__fastcall **)(__int64, void *, _QWORD, __int64 *, CHAR16 **))(qword_58070 + 312))( /*0x4b54*/
             2,
             &unk_27890,
             0,
             &n24,
             &Source);
  if ( !result ) /*0x4b5d*/
  {
    RstCallbackHandler(Private); /*0x4b6c*/
    return (*(EFI_STATUS (__fastcall **)(CHAR16 *))(qword_58070 + 72))(Source); /*0x4b7d*/
  }
  return result; /*0x4b80*/
}

// Function: RstFormCallback @ 0x4b88 (0x83 bytes)
// Index: 104/906

EFI_STATUS __fastcall RstFormCallback(RST_DEVICE *Device)
{
  unsigned __int64 v2; // rbx
  EFI_STATUS result; // rax
  unsigned __int64 v4; // [rsp+48h] [rbp+10h] BYREF
  __int64 v5; // [rsp+50h] [rbp+18h] BYREF

  RstQueryConfig((RST_PRIVATE_DATA *)Device); /*0x4b95*/
  v2 = 0; /*0x4b9f*/
  v4 = 0; /*0x4bbf*/
  result = (*(__int64 (__fastcall **)(__int64, void *, _QWORD, unsigned __int64 *, __int64 *))(qword_58070 + 312))( /*0x4bc4*/
             2,
             &unk_278A0,
             0,
             &v4,
             &v5);
  if ( !result ) /*0x4bcd*/
  {
    if ( v4 ) /*0x4bd4*/
    {
      do /*0x4bef*/
      {
        RstAllocContext728((RST_PRIVATE_DATA *)Device); /*0x4be2*/
        ++v2; /*0x4be7*/
      }
      while ( v2 < v4 ); /*0x4bef*/
    }
    return (*(__int64 (__fastcall **)(__int64))(qword_58070 + 72))(v5); /*0x4bfd*/
  }
  return result; /*0x4c05*/
}

// Function: RstFormCallbackInit @ 0x4c0c (0x2d bytes)
// Index: 105/906

char __fastcall RstFormCallbackInit(__int64 a1)
{
  if ( !*(_QWORD *)(a1 + 40) ) /*0x4c12*/
    *(_QWORD *)(a1 + 40) = Assert_85(0, 0); /*0x4c25*/
  RstFormCallback(a1); /*0x4c2c*/
  return 1; /*0x4c33*/
}

// Function: RstProcessAction @ 0x509c (0xc7 bytes)
// Index: 110/906

__int64 __fastcall RstProcessAction(__int64 a1)
{
  __int64 v3; // rbx
  UINTN v4; // rax
  UINTN v5; // rax

  if ( !*(_QWORD *)(a1 + 360) ) /*0x50a6*/
    return 0x8000000000000003uLL; /*0x50b5*/
  v3 = (*(__int64 (__fastcall **)(_QWORD, void *))(qword_58070 + 144))(*(_QWORD *)(a1 + 184), &unk_278D0); /*0x50df*/
  if ( !v3 || v3 == 0x800000000000000EuLL ) /*0x50f4*/
  {
    v4 = StrLen(*(const CHAR16 **)(*(_QWORD *)(a1 + 360) + 62LL)); /*0x5101*/
    MemZeroThenFree(*(_BYTE **)(*(_QWORD *)(a1 + 360) + 62LL), v4); /*0x5114*/
    v5 = StrLen(*(const CHAR16 **)(*(_QWORD *)(a1 + 360) + 54LL)); /*0x5124*/
    MemZeroThenFree(*(_BYTE **)(*(_QWORD *)(a1 + 360) + 54LL), v5); /*0x5137*/
    MemZeroThenFree(*(_BYTE **)(a1 + 360), 116); /*0x5148*/
    *(_QWORD *)(a1 + 360) = 0; /*0x514d*/
  }
  return v3; /*0x515d*/
}

// Function: RstExtractConfig @ 0x51ac (0x36 bytes)
// Index: 114/906

__int64 __fastcall RstExtractConfig(__int64 a1, __int64 a2)
{
  __int64 result; // rax
  __int64 v3; // [rsp+38h] [rbp+10h] BYREF

  v3 = a2; /*0x51ac*/
  if ( *(_QWORD *)(a1 + 624) ) /*0x51b5*/
    return (*(__int64 (__fastcall **)(__int64 *, void *, _QWORD))(qword_58070 + 128))(&v3, &unk_278E0, 0); /*0x51d7*/
  return result; /*0x51dd*/
}

// Function: RstRouteConfig @ 0x51e4 (0x2f bytes)
// Index: 115/906

__int64 __fastcall RstRouteConfig(__int64 a1, __int64 a2)
{
  __int64 result; // rax

  result = a2; /*0x51ef*/
  if ( *(_QWORD *)(a1 + 624) ) /*0x51e8*/
    return (*(__int64 (__fastcall **)(__int64, void *))(qword_58070 + 144))(a2, &unk_278E0); /*0x5208*/
  return result; /*0x520e*/
}

// Function: RstSubmitForm @ 0x5214 (0x78 bytes)
// Index: 116/906

__int64 __fastcall RstSubmitForm(__int64 *a1)
{
  __int64 result; // rax
  __int64 String; // rdi

  result = RstProcessAction((__int64)a1); /*0x5221*/
  if ( result != 0x800000000000000FuLL && result != 0x8000000000000002uLL ) /*0x5242*/
  {
    String = HiiLibFindString(a1[2], a1[23], (__int64)&unk_278A0); /*0x525b*/
    if ( String >= 0 ) /*0x5261*/
    {
      a1[25] = 0; /*0x5263*/
      String = sub_7DD0((__int64)a1); /*0x5273*/
    }
    RstCheckCondition(a1); /*0x5279*/
    return String; /*0x527e*/
  }
  return result; /*0x5286*/
}

// Function: RstCfgRaidDevCopy @ 0x1451c (0xcc bytes)
// Index: 555/906

__int64 __fastcall RstCfgRaidDevCopy(__int64 a1, __int64 Source, __int64 a3)
{
  sub_14158(a1); /*0x1453d*/
  StrnCpy((CHAR16 *)(a1 + 16), (const CHAR16 *)Source, 0x10u); /*0x1454f*/
  *(_BYTE *)(a1 + 32) = 0; /*0x14554*/
  *(_DWORD *)(a1 + 36) = *(unsigned __int8 *)(Source + 32); /*0x1455c*/
  *(_QWORD *)(a1 + 40) = *(unsigned int *)(Source + 16) + ((unsigned __int64)*(unsigned int *)(Source + 20) << 32); /*0x14576*/
  *(_DWORD *)(a1 + 48) = *(_DWORD *)(Source + 24); /*0x1457d*/
  *(_WORD *)(a1 + 64) = *(_WORD *)(Source + 40); /*0x14584*/
  *(_WORD *)(a1 + 52) = *(_WORD *)(Source + 36); /*0x1458c*/
  **(_QWORD **)(a1 + 56) = a1; /*0x14594*/
  sub_19D40(*(_QWORD *)(a1 + 56), Source + 80, a3, 0); /*0x1459b*/
  *(_QWORD *)(a1 + 8) = 0; /*0x145a0*/
  *(_BYTE *)(a1 + 66) = *(_BYTE *)(Source + 34); /*0x145aa*/
  *(_DWORD *)(a1 + 80) = *(unsigned __int8 *)(Source + 50); /*0x145b9*/
  MemZero((_BYTE *)(a1 + 84), 0, 16); /*0x145bc*/
  return sub_8304(a1 + 84, Source + 51, 16); /*0x145de*/
}

// Function: RstCfgRaidDevCheckFlagBit4 @ 0x14858 (0x10 bytes)
// Index: 565/906

bool __fastcall RstCfgRaidDevCheckFlagBit4(__int64 a1)
{
  return (*(_DWORD *)(*(_QWORD *)(a1 + 136) + 48LL) & 0x10) != 0; /*0x14867*/
}

// Function: RstRaidMapTranslateAddress @ 0x1523c (0x20 bytes)
// Index: 589/906

unsigned __int64 __fastcall RstRaidMapTranslateAddress(unsigned __int16 *a1, unsigned __int64 a2)
{
  if ( a1[37] ) /*0x1523c*/
    return a2 & a1[38]; /*0x1524a*/
  else
    return a2 % a1[36]; /*0x15259*/
}