#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);
}