Newer
Older
AMI-Aptio-BIOS-Reversed / Build / GuidArtifacts / 117828F1-DA7D-4BC1-8B58-9A954FED5121 / DsMgr.c
@Ajax Dong Ajax Dong 2 days ago 11 KB Full restructure
#include "117828F1-DA7D-4BC1-8B58-9A954FED5121.h"

// DsMgr.c - Disk manager
// Extracted from 117828F1-DA7D-4BC1-8B58-9A954FED5121.c

// Function: RstFormatSerialNumber @ 0x5418 (0xe9 bytes)
// Index: 125/906

__int64 __fastcall RstFormatSerialNumber(__int64 a1, __int64 a2, CHAR8 **a3, double a4)
{
  CHAR8 *StartOfBuffer; // rdi
  unsigned __int64 v7; // rbx
  CHAR16 *v8; // rbx
  CHAR16 i[12]; // [rsp+30h] [rbp-78h] BYREF
  _BYTE i_1[32]; // [rsp+48h] [rbp-60h] BYREF
  CHAR16 i_2[28]; // [rsp+68h] [rbp-40h] BYREF

  StartOfBuffer = (CHAR8 *)(a1 + 368); /*0x542f*/
  if ( !*(_WORD *)(a1 + 368) ) /*0x543c*/
  {
    v7 = *(unsigned int *)(a1 + 226) | ((unsigned __int64)*(unsigned __int16 *)(a1 + 224) << 32); /*0x5461*/
    MemZero(i_1, 0, 32); /*0x5464*/
    RstFormatDiskSize((__int64)i_1, v7, *(_DWORD *)(a1 + 216), 1, 0); /*0x5480*/
    v8 = RstStringTrimCopy(i, 21, (const CHAR16 *)(a1 + 236), 0x14u); /*0x54b4*/
    RstStringTrimCopy(i_2, 41, (const CHAR16 *)(a1 + 256), 0x28u); /*0x54b7*/
    HiiCfgArraySet(StartOfBuffer, 0x100u, "%a SN:%a, %a", a4, *(double *)&v8, COERCE_DOUBLE(i_1)); /*0x54dd*/
  }
  *a3 = StartOfBuffer; /*0x54ea*/
  return 0; /*0x54fc*/
}

// Function: RstStringTrimCopy @ 0x8348 (0xef bytes)
// Index: 222/906

CHAR16 *__fastcall RstStringTrimCopy(CHAR16 *i, __int64 n21, const CHAR16 *Source, UINTN n20)
{
  unsigned int v8; // edi
  CHAR16 *i_1; // rsi
  CHAR16 *j; // r11
  const CHAR16 *k; // rbx

  if ( !i || !n20 || !n21 || !Source ) /*0x838a*/
    return 0; /*0x841c*/
  v8 = 0; /*0x8393*/
  i_1 = (CHAR16 *)MemAllocPages(n21); /*0x83a2*/
  MemZero(i_1, 0, n21); /*0x83a5*/
  StrnCpy(i_1, Source, n20); /*0x83b3*/
  for ( j = (CHAR16 *)((char *)i_1 + n21 - 1); j > i_1 && (*(_BYTE *)j == 32 || !*(_BYTE *)j); j = (CHAR16 *)((char *)j - 1) ) /*0x83b8*/
    ++v8; /*0x83cf*/
  *((_BYTE *)j + 1) = 0; /*0x83d6*/
  for ( k = i_1; *(_BYTE *)k == 32; ++v8 ) /*0x83e0*/
    k = (const CHAR16 *)((char *)k + 1); /*0x83e2*/
  MemZero(i, 0, n21); /*0x83f3*/
  StrnCpy(i, k, n21 - v8); /*0x8407*/
  MemZeroThenFree(i_1, n21); /*0x8412*/
  return i; /*0x842d*/
}

// Function: RstParseDecimalString @ 0x8438 (0x154 bytes)
// Index: 223/906

__int64 __fastcall RstParseDecimalString(
        __int64 a1,
        unsigned __int64 n9,
        unsigned __int8 i,
        unsigned __int64 *a4,
        unsigned __int64 *a5)
{
  __int64 v5; // r14
  char v10; // di
  unsigned __int8 n9_2; // si
  CHAR16 *v12; // rbx
  unsigned __int8 n9_1; // al
  __int64 n9_4; // rdx
  CHAR16 n46; // cx
  unsigned __int8 n9_3; // al
  __int64 n9_5; // rcx
  unsigned __int8 j; // dl
  CHAR16 n0x30; // cx
  unsigned __int64 n0xA; // rax

  v5 = 2 * n9; /*0x8454*/
  v10 = 1; /*0x8467*/
  n9_2 = 0; /*0x846a*/
  v12 = (CHAR16 *)MemAllocPages(2 * n9); /*0x8475*/
  n9_1 = 0; /*0x8478*/
  if ( n9 ) /*0x847e*/
  {
    n9_4 = 0; /*0x8480*/
    while ( 1 ) /*0x8483*/
    {
      n46 = *(_WORD *)(a1 + 2 * n9_4); /*0x8483*/
      if ( n46 == 46 ) /*0x848c*/
        break; /*0x848c*/
      if ( n46 < 0x30u || n46 > 0x39u ) /*0x849e*/
      {
        n9_2 = -1; /*0x84b1*/
        goto LABEL_10; /*0x84b4*/
      }
      ++n9_1; /*0x84a0*/
      v12[n9_4] = n46; /*0x84a3*/
      n9_4 = n9_1; /*0x84a7*/
      if ( n9_1 >= n9 ) /*0x84ad*/
        goto LABEL_10; /*0x84ad*/
    }
    n9_2 = n9_1; /*0x84b6*/
  }
LABEL_10:
  v12[n9_1] = 0; /*0x84b9*/
  *a4 = StrToUpper(v12); /*0x84c9*/
  if ( n9_2 != 0xFF ) /*0x84d1*/
  {
    n9_3 = 0; /*0x84da*/
    if ( n9 ) /*0x84e0*/
    {
      n9_5 = 0; /*0x84e2*/
      do /*0x84f3*/
      {
        ++n9_3; /*0x84e5*/
        v12[n9_5] = 0; /*0x84e8*/
        n9_5 = n9_3; /*0x84ed*/
      }
      while ( n9_3 < n9 ); /*0x84f3*/
    }
    for ( j = 0; j < i; ++j ) /*0x84fb*/
    {
      if ( j + n9_2 + 1 < n9 ) /*0x850f*/
      {
        n0x30 = *(_WORD *)(a1 + 2 * (j + (unsigned __int64)n9_2) + 2); /*0x851c*/
        if ( n0x30 < 0x30u || n0x30 > 0x39u ) /*0x852c*/
        {
          v10 = 0; /*0x853d*/
          break; /*0x853d*/
        }
        v12[j] = n0x30; /*0x852e*/
      }
    }
    n0xA = StrToUpper(v12); /*0x8540*/
    *a5 = n0xA; /*0x854d*/
    if ( !v10 && n0xA < 0xA ) /*0x8559*/
      *a5 = 10 * n0xA; /*0x8562*/
  }
  return MemZeroThenFree(v12, v5); /*0x857a*/
}

// Function: RstFormatDiskSize @ 0x858c (0x12f bytes)
// Index: 224/906

__int64 __fastcall RstFormatDiskSize(__int64 a1, unsigned __int64 a2, unsigned int a3, char a4, char a5)
{
  __int64 n5; // rcx
  unsigned __int64 v7; // r8
  unsigned __int64 v8; // rbx

  if ( a2 && a3 ) /*0x85a4*/
  {
    n5 = 0; /*0x85b1*/
    v7 = (1000 * (a2 / (0x100000 / a3))) >> 10; /*0x85ce*/
    if ( a4 == 1 ) /*0x85d6*/
      n5 = 5; /*0x85d6*/
    v8 = (n5 + v7) / 0xA; /*0x85ed*/
    if ( a1 ) /*0x85f4*/
    {
      if ( a5 ) /*0x860a*/
        RstHelper_8da8( /*0x8641*/
          a1,
          0xAu,
          "%4ld.%ld%ldGB",
          (unsigned int)v8 / 0x64,
          (unsigned int)v8 / 0xA % 0xA,
          (unsigned int)v8 % 0xA);
      else
        RstHelper_8da8( /*0x868d*/
          a1,
          0xAu,
          "%ld.%ld%ldGB",
          (unsigned int)v8 / 0x64,
          (unsigned int)v8 / 0xA % 0xA,
          (unsigned int)v8 % 0xA);
    }
    return (unsigned int)v8; /*0x8692*/
  }
  else
  {
    RstHelper_8da8(a1, 0xAu, "%4ld.%ldMB", 0, 0); /*0x86ae*/
    return 0; /*0x86b3*/
  }
}

// Function: RstParseUnicodeString @ 0x86bc (0x70 bytes)
// Index: 225/906

unsigned __int64 __fastcall RstParseUnicodeString(_BYTE *a1, _BYTE **i, _QWORD *a3)
{
  _BYTE *v3; // rax
  _BYTE **j; // rbx

  v3 = *i; /*0x86d0*/
  for ( j = i; ; v3 = *j ) /*0x86d6*/
  {
    if ( !v3 ) /*0x8700*/
      return 0x8000000000000003uLL; /*0x8702*/
    if ( !StrnCpy16(v3, a1, 0xFFFF) ) /*0x86ec*/
      break; /*0x86ec*/
    j += 2; /*0x86f6*/
  }
  *a3 = j[1]; /*0x8725*/
  return 0; /*0x871b*/
}

// Function: RstGetMemoryMap @ 0x877c (0x50 bytes)
// Index: 228/906

unsigned __int64 RstGetMemoryMap()
{
  __int64 v1; // [rsp+30h] [rbp+8h] BYREF
  __int64 v2; // [rsp+38h] [rbp+10h] BYREF

  sub_9070(&v2); /*0x8785*/
  (*(void (__fastcall **)(__int64))(qword_58070 + 248))(3000); /*0x8796*/
  sub_9070(&v1); /*0x87a1*/
  dword_35430 = (v1 - v2) / 0xBB8uLL; /*0x87c1*/
  return 0xAEC33E1F671529A5uLL * (v1 - v2); /*0x87c7*/
}

// Function: RstUint64ToHexString @ 0x8864 (0xbd bytes)
// Index: 233/906

unsigned __int16 __fastcall RstUint64ToHexString(_BYTE *a1, unsigned __int64 a2, char a3, unsigned __int16 a4)
{
  _BYTE *i; // rdi
  unsigned __int16 v6; // bp
  char v7; // al
  char n48; // r10
  __int64 v9; // rbx
  _BYTE i_1[56]; // [rsp+20h] [rbp-38h] BYREF

  i = i_1; /*0x888a*/
  v6 = 0; /*0x888e*/
  do /*0x88b2*/
  {
    v7 = a2; /*0x8892*/
    a2 >>= 4; /*0x889c*/
    ++v6; /*0x88a3*/
    *i++ = a0123456789abcd_0[v7 & 0xF]; // "0123456789ABCDEF" /*0x88aa*/
  }
  while ( a2 ); /*0x88b2*/
  if ( (a3 & 0x20) != 0 ) /*0x88b8*/
    n48 = 48; /*0x88ba*/
  else
    n48 = ~(32 * a3) & 0x20; /*0x88c6*/
  if ( v6 < a4 ) /*0x88ce*/
  {
    v9 = (unsigned __int16)(a4 - v6); /*0x88da*/
    MemZero(i, n48, v9); /*0x88e1*/
    i += v9; /*0x88e6*/
    v6 += v9; /*0x88e9*/
  }
  while ( i != i_1 ) /*0x8900*/
    *a1++ = *--i; /*0x88f3*/
  *a1 = 0; /*0x8907*/
  return v6; /*0x8917*/
}

// Function: RstInt64ToDecimalString @ 0x8924 (0x17c bytes)
// Index: 234/906

unsigned __int16 __fastcall RstInt64ToDecimalString(_BYTE *i, __int64 a2, char a3, unsigned __int16 a4)
{
  __int64 v5; // r10
  _BYTE *i_1; // rbp
  __int64 *v7; // rsi
  char v8; // r13
  unsigned __int16 v9; // di
  __int16 v10; // r11
  char n48; // r9
  __int64 v12; // rdx
  __int16 v13; // ax
  unsigned __int16 v14; // di
  unsigned __int16 v15; // ax
  _BYTE *i_2; // rcx
  __int64 v17; // rbx
  __int64 v18; // rax
  __int64 v20; // [rsp+20h] [rbp-48h] BYREF

  v5 = a2; /*0x8947*/
  i_1 = i; /*0x894d*/
  v7 = &v20; /*0x8950*/
  v8 = 0; /*0x8958*/
  v9 = 0; /*0x895b*/
  if ( a2 < 0 && a3 >= 0 ) /*0x8964*/
  {
    v8 = 1; /*0x8966*/
    v5 = -a2; /*0x8969*/
  }
  v10 = 0; /*0x8970*/
  n48 = 48; /*0x8974*/
  do /*0x89ea*/
  {
    v12 = v5 / 10; /*0x8993*/
    v13 = v5 % 10; /*0x89a7*/
    if ( v13 < 0 ) /*0x89ab*/
      v13 = -v13; /*0x89ad*/
    ++v9; /*0x89b3*/
    v5 /= 10; /*0x89b7*/
    *(_BYTE *)v7 = v13 + 48; /*0x89ba*/
    v7 = (__int64 *)((char *)v7 + 1); /*0x89bc*/
    if ( (a3 & 8) == 8 && v9 == 3 * (v9 / 3) ) /*0x89db*/
    {
      *(_BYTE *)v7 = 44; /*0x89dd*/
      v7 = (__int64 *)((char *)v7 + 1); /*0x89e0*/
      ++v10; /*0x89e3*/
    }
  }
  while ( v12 ); /*0x89ea*/
  if ( v8 ) /*0x89ef*/
  {
    *(_BYTE *)v7 = 45; /*0x89f1*/
    v7 = (__int64 *)((char *)v7 + 1); /*0x89f4*/
    ++v9; /*0x89f7*/
  }
  v14 = v10 + v9; /*0x89fb*/
  if ( (a3 & 0x20) == 0 ) /*0x8a03*/
    n48 = 32; /*0x8a05*/
  v15 = a4 - v14; /*0x8a0c*/
  if ( (a3 & 1) != 0 )
  {
    i_2 = &i[v14]; /*0x8a17*/
    if ( (v15 & (unsigned __int16)-(v14 < a4)) != 0 )
      MemZero(i_2, n48, v14 < a4 ? v15 : 0);
  }
  else if ( (v15 & (unsigned __int16)-(v14 < a4)) != 0 )
  {
    v17 = v14 < a4 ? v15 : 0;
    MemZero(i, n48, v17); /*0x8a4e*/
    i_1 += v17; /*0x8a53*/
  }
  if ( v14 ) /*0x8a5a*/
  {
    v18 = v14; /*0x8a5c*/
    do /*0x8a6d*/
    {
      v7 = (__int64 *)((char *)v7 - 1); /*0x8a5f*/
      *i_1++ = *(_BYTE *)v7; /*0x8a64*/
      --v18; /*0x8a6a*/
    }
    while ( v18 ); /*0x8a6d*/
  }
  if ( a4 > v14 ) /*0x8a80*/
    v14 = a4; /*0x8a80*/
  i_1[v14] = 0; /*0x8a8b*/
  return v14; /*0x8a93*/
}

// Function: RstDiskInit @ 0x102d8 (0x35 bytes)
// Index: 432/906

__int64 __fastcall RstDiskInit(__int64 a1)
{
  sub_181BC(a1 + 112); /*0x102e5*/
  *(_QWORD *)(a1 + 16) = 0; /*0x102f3*/
  *(_QWORD *)(a1 + 8) = 0; /*0x102f7*/
  *(_QWORD *)a1 = &off_23BF0; /*0x102fb*/
  *(_DWORD *)(a1 + 136) = 0; /*0x10301*/
  return a1; /*0x10307*/
}

// Function: RstDiskCopyState @ 0x105b4 (0xf8 bytes)
// Index: 435/906

__int64 __fastcall RstDiskCopyState(__int64 a1, __int64 a2)
{
  __int64 v3; // rdx

  v3 = 0; /*0x105c1*/
  if ( a2 ) /*0x105c9*/
    v3 = a2 + 112; /*0x105cb*/
  *(_QWORD *)(a1 + 112) = *(_QWORD *)v3; /*0x105d2*/
  *(_DWORD *)(a1 + 120) = *(_DWORD *)(v3 + 8); /*0x105dc*/
  sub_100EC(a1, a2); /*0x105df*/
  *(_QWORD *)(a1 + 128) = *(_QWORD *)(a2 + 128); /*0x105eb*/
  *(_DWORD *)(a1 + 136) = *(_DWORD *)(a2 + 136); /*0x105f8*/
  *(_QWORD *)(a1 + 144) = *(_QWORD *)(a2 + 144); /*0x10605*/
  *(_BYTE *)(a1 + 152) = *(_BYTE *)(a2 + 152); /*0x10612*/
  *(_QWORD *)(a1 + 153) = *(_QWORD *)(a2 + 153); /*0x1061f*/
  *(_DWORD *)(a1 + 164) = *(_DWORD *)(a2 + 164); /*0x1062c*/
  *(_WORD *)(a1 + 168) = *(_WORD *)(a2 + 168); /*0x10639*/
  *(_WORD *)(a1 + 170) = *(_WORD *)(a2 + 170); /*0x10647*/
  *(_WORD *)(a1 + 172) = *(_WORD *)(a2 + 172); /*0x10655*/
  *(_QWORD *)(a1 + 176) = *(_QWORD *)(a2 + 176); /*0x10663*/
  *(_QWORD *)(a1 + 184) = *(_QWORD *)(a2 + 184); /*0x10671*/
  *(_QWORD *)(a1 + 192) = *(_QWORD *)(a2 + 192); /*0x1067f*/
  *(_BYTE *)(a1 + 200) = *(_BYTE *)(a2 + 200); /*0x1068c*/
  *(_BYTE *)(a1 + 201) = *(_BYTE *)(a2 + 201); /*0x1069d*/
  return a1; /*0x106a6*/
}

// Function: RstDiskSetFlagBit2 @ 0x106ac (0x1f bytes)
// Index: 436/906

__int64 __fastcall RstDiskSetFlagBit2(__int64 a1, char a2)
{
  if ( a2 ) /*0x106b0*/
  {
    *(_DWORD *)(a1 + 136) |= 4u; /*0x106b2*/
  }
  else
  {
    *(_DWORD *)(a1 + 136) &= ~4u; /*0x106bb*/
    *(_WORD *)(a1 + 116) = 0; /*0x106c2*/
  }
  return sub_10178(a1);
}