Newer
Older
AMI-Aptio-BIOS-Reversed / IntelPhyCard / IntelPhyCard.c
@Ajax Dong Ajax Dong 2 days ago 43 KB Init
/*
 *IntelPhyCard.efi - Full Decompilation
 *Source: HR650X BIOS PE file 0101 (IntelPhyCard.efi)
 *IDA Port: 13368
 *Decompiled: 24 major functions covering all driver logic
 */

#include "IntelPhyCard.h"

// _ModuleEntryPoint (0x3e0)
EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
 sub_480(ImageHandle); /*0x3e9*/
 if ( !::SystemTable ) /*0x3f6*/
 {
 ::SystemTable = (__int64)SystemTable; /*0x3f8*/
 BootServices = (__int64)SystemTable->BootServices; /*0x403*/
 RuntimeServices = (__int64)SystemTable->RuntimeServices; /*0x40e*/
 }
 if ( (unsigned __int8)sub_1844() ) /*0x415*/
 {
 sub_1A50(0x80000000LL, "\nOCP present\n"); /*0x42a*/
 sub_E14(); /*0x42f*/
 }
 else
 {
 sub_1A50(0x80000000LL, "\nOCP not present\n"); /*0x43d*/
 }
 return (*(EFI_STATUS ( **)(__int64, __int64, __int64 ( *)()))(BootServices + 368))( /*0x478*/
 512,
 8,
 sub_18A0);
}

// sub_480 (0x480)
__int64 sub_480(__int64 ImageHandle, __int64 a2)
{
 __int64 Status; // rax __int64 Status; // rbx __int64 Status; // rax __int64 v6; // rax __int64 v7; // rax __int64 v8; // rbx __int64 v9; // rax __int64 v10; // rax __int64 v11; // rax __int64 v12; // rcx __int64 v13; // rax _BYTE *v14; // rax __int16 v15; // bx bool v16; // bl __int64 v17; // rdi __int64 result; // rax

 ::ImageHandle = ImageHandle; /*0x495*/
 if ( !ImageHandle ) /*0x4a9*/
 sub_1A98( /*0x4b8*/
 "e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
 51,
 "gImageHandle != ((void *) 0)");
 qword_4B50 = a2; /*0x4bd*/
 if ( !a2 ) /*0x4c7*/
 sub_1A98("e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c", 57, "gST != ((void *) 0)"); /*0x4d6*/
 qword_4B58 = *(_QWORD *)(a2 + 96); /*0x4df*/
 if ( !qword_4B58 ) /*0x4e9*/
 sub_1A98("e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c", 63, "gBS != ((void *) 0)"); /*0x4f8*/
 qword_4B68 = *(_QWORD *)(a2 + 88); /*0x501*/
 if ( !qword_4B68 ) /*0x50b*/
 sub_1A98( /*0x51e*/
 "e:\\hs\\MdePkg\\Library\\UefiRuntimeServicesTableLib\\UefiRuntimeServicesTableLib.c",
 47,
 "gRT != ((void *) 0)");
 Status = sub_1B64(&unk_4A10, &qword_4B80); /*0x531*/
 Status = Status; /*0x536*/
 if ( Status < 0 ) /*0x542*/
 {
 sub_1A50(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x551*/
 sub_1A98("e:\\hs\\MdePkg\\Library\\DxeServicesTableLib\\DxeServicesTableLib.c", 64, "!EFI_ERROR (Status)"); /*0x569*/
 }
 if ( !qword_4B80 ) /*0x576*/
 sub_1A98("e:\\hs\\MdePkg\\Library\\DxeServicesTableLib\\DxeServicesTableLib.c", 65, "gDS != ((void *) 0)"); /*0x58b*/
 if ( Status < 0 ) /*0x593*/
 {
 sub_1A50(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x5a2*/
 sub_1A98( /*0x5ba*/
 "e:\\hs\\Build\\HR6N0XMLK\\DEBUG_VS2015\\X64\\LenovoServerPkg\\IntelPhyCard\\IntelPhyCard\\DEBUG\\AutoGen.c",
 453,
 "!EFI_ERROR (Status)");
 }
 if ( !qword_4B88 ) /*0x5c7*/
 {
 Status = (*(__int64 ( **)(void *, _QWORD, __int64 *))(qword_4B58 + 320))(&unk_49B0, 0, &qword_4B88); /*0x5e0*/
 if ( Status < 0 ) /*0x5e9*/
 {
 sub_1A50(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x5f8*/
 sub_1A98("e:\\hs\\CpRcPkg\\Library\\DxeMmPciBaseLib\\DxeMmPciBaseLib.c", 52, "!EFI_ERROR (Status)"); /*0x610*/
 }
 if ( !qword_4B88 ) /*0x61d*/
 sub_1A98("e:\\hs\\CpRcPkg\\Library\\DxeMmPciBaseLib\\DxeMmPciBaseLib.c", 53, "mPciUsra != ((void *) 0)"); /*0x632*/
 }
 sub_1C28(); /*0x637*/
 v6 = sub_1AD8(); /*0x63c*/
 qword_4B98 = (*(__int64 ( **)(__int64))(v6 + 32))(5); /*0x649*/
 v7 = sub_1AD8(); /*0x650*/
 v8 = (*(__int64 ( **)(__int64))(v7 + 40))(7); /*0x65f*/
 v9 = sub_1AD8(); /*0x662*/
 if ( (unsigned __int64)(*(__int64 ( **)(__int64))(v9 + 56))(7) > 0x48 ) /*0x670*/
 sub_1A98( /*0x683*/
 "e:\\hs\\AmiCRBPkg\\Library\\AmiPcieSegBusLib\\AmiPcieSegBusDxeSmm.c",
 60,
 "sizeof (PCIE_SEG_BUS_TABLE) >= LibPcdGetSize(7U)");
 v10 = sub_1AD8(); /*0x688*/
 v11 = (*(__int64 ( **)(__int64))(v10 + 56))(7); /*0x690*/
 sub_292C(v12, v8, v11); /*0x699*/
 if ( *(char *)sub_1CAC(1024068) >= 0 ) /*0x6ae*/
 {
 v13 = sub_1CAC(1024064); /*0x6b3*/
 sub_2878(v13); /*0x6bb*/
 v14 = (_BYTE *)sub_1CAC(1024068); /*0x6c2*/
 *v14 |= 0x80u; /*0x6cc*/
 }
 v15 = sub_360(); /*0x6d3*/
 sub_350(); /*0x6d6*/
 v16 = (v15 & 0x200) != 0; /*0x6e7*/
 v17 = sub_1950(1288) & 0xFFFFFF; /*0x6f1*/
 sub_330(); /*0x6f7*/
 while ( (((_DWORD)v17 + 357 - (unsigned int)sub_1950(1288)) & 0x800000) == 0 ) /*0x717*/
 sub_320(); /*0x6fe*/
 sub_330(); /*0x719*/
 if ( v16 ) /*0x720*/
 sub_340(); /*0x722*/
 else sub_350(); /*0x729*/
 result = sub_2784(4278190080LL); /*0x733*/
 if ( result < 0 ) /*0x73b*/
 {
 sub_1A50(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", result); /*0x74a*/
 return sub_1A98( /*0x762*/
 "e:\\hs\\Build\\HR6N0XMLK\\DEBUG_VS2015\\X64\\LenovoServerPkg\\IntelPhyCard\\IntelPhyCard\\DEBUG\\AutoGen.c",
 471,
 "!EFI_ERROR (Status)");
 }
 return result; /*0x776*/
}

// sub_E14 (0xe14)
__int64 sub_E14()
{
 __int64 v0; // rax __int16 Index; // ax __int64 Index; // rdx unsigned int Index; // edi int v4; // eax int Status; // ebx __int64 v6; // rcx __int64 Result; // r8 __int64 v8; // r9 unsigned __int16 v9; // ax unsigned __int8 Index; // dl unsigned int v11; // ebx __int64 result; // rax int v13; // r12d int v14; // r15d int v15; // r14d int v16; // ebx unsigned __int16 v17; // si unsigned __int8 *v18; // rbx unsigned __int16 n4_1; // di __int64 Index; // r14 __int64 v21; // rcx __int64 v22; // r8 __int64 v23; // rax unsigned __int8 v24; // r12 unsigned __int8 v25; // al unsigned __int16 v26; // r15 __int64 v27; // r13 bool v28; // al __int64 Index; // rdi __int64 v30; // rcx __int64 v31; // r8 __int64 v32; // rdx char v33; // al __int16 v34; // kr08_2 __int64 v35; // r8 __int64 v36; // r9 char v37; // r10 void (*funcs_1386)(void); // rax char Index; // bl __int64 v40; // rdx unsigned __int16 n0x20; // si __int64 v42; // r14 __int64 v43; // rax __int64 v44; // rdi __int64 v45; // rbx __int64 v46; // rdx int n4096; // r12d unsigned int n4096_1; // r15d __int64 v49; // rdi unsigned int Index; // edx unsigned int v51; // r12d __int64 v52; // rax __int64 Index; // rcx char v54; // r8 const char *Write_success_%X_n; // rdx void (*funcs_157E)(void); // rax char Index; // bl __int64 v58; // r9 __int64 Status; // rbx int v60; // [rsp+28h] [rbp-D8h]
 __int64 v61; // [rsp+40h] [rbp-C0h] BYREF unsigned __int8 v62; // [rsp+48h] [rbp-B8h]
 char v63; // [rsp+49h] [rbp-B7h]
 char v64[2]; // [rsp+4Ah] [rbp-B6h] BYREF unsigned __int16 v65; // [rsp+4Ch] [rbp-B4h]
 _BYTE v66[4]; // [rsp+50h] [rbp-B0h] BYREF char v67[4]; // [rsp+54h] [rbp-ACh] BYREF __int16 v68; // [rsp+58h] [rbp-A8h] BYREF int v69; // [rsp+5Ah] [rbp-A6h]
 __int64 Result; // [rsp+60h] [rbp-A0h] BYREF _DWORD v71[4]; // [rsp+68h] [rbp-98h] BYREF int v72; // [rsp+78h] [rbp-88h]
 int v73; // [rsp+7Ch] [rbp-84h]
 int v74; // [rsp+80h] [rbp-80h]
 int v75; // [rsp+84h] [rbp-7Ch]
 int v76; // [rsp+88h] [rbp-78h]
 int v77; // [rsp+8Ch] [rbp-74h]
 __int128 Result; // [rsp+90h] [rbp-70h] BYREF _QWORD v79[40]; // [rsp+A0h] [rbp-60h] BYREF __int64 v80; // [rsp+1F0h] [rbp+F0h] BYREF __int64 v81; // [rsp+1F8h] [rbp+F8h] BYREF unsigned __int8 v82; // [rsp+200h] [rbp+100h]
 unsigned __int8 v83; // [rsp+208h] [rbp+108h]

 v0 = sub_1AD8(); /*0xe30*/
 Index = (*(__int64 ( **)(__int64))(v0 + 16))(189); /*0xe3a*/
 Index = qword_4A20; /*0xe3d*/
 v65 = Index + 8; /*0xe50*/
 *(_DWORD *)(qword_4A20 + 180) = 0; /*0xe55*/
 if ( *(_DWORD *)(Index + 184) == 267429210 /*0xe7f*/
 && (*(_DWORD *)(Index + 180) = 8236, v4 = *(_DWORD *)(Index + 184), (v4 & 0xFFFF0000) != 0) )
 {
 Index = (unsigned __int16)v4 << 12; /*0xe84*/
 }
 else
 {
 Index = 0; /*0xe66*/
 }
 Status = 0; /*0xe8c*/
 v6 = *(unsigned int *)sub_1CAC(1036304); /*0xe93*/
 qword_4A20 = v6; /*0xe95*/
 *(_DWORD *)(v6 + 180) = 0; /*0xe9e*/
 if ( *(_DWORD *)(v6 + 184) == 267429210 ) /*0xeb6*/
 {
 *(_DWORD *)&byte_40[(unsigned int)v6 + 116] = 4; /*0xebc*/
 v9 = (*(_DWORD *)&byte_40[(unsigned int)v6 + 120] >> 8) & 3; /*0xecf*/
 *(_DWORD *)&byte_40[(unsigned int)v6 + 116] = 4096; /*0xed2*/
 Result = *(unsigned int *)&byte_40[(unsigned int)v6 + 120]; /*0xedc*/
 Index = 0; /*0xee3*/
 v8 = (unsigned int)v9 + 1; /*0xeea*/
 if ( v9 != -1 ) /*0xeed*/
 {
 do /*0xf66*/
 {
 if ( (Result & 7) != 0 ) /*0xef6*/
 {
 switch ( Result & 7 ) /*0xefb*/
 {
 case 1LL: /*0xefb*/
 Status += 0x100000; /*0xf4b*/
 break;
 case 2LL: /*0xefb*/
 Status += 0x200000; /*0xf43*/
 break;
 case 3LL: /*0xefb*/
 Status += 0x400000; /*0xf3b*/
 break;
 case 4LL: /*0xefb*/
 Status += 0x800000; /*0xf33*/
 break;
 case 5LL: /*0xefb*/
 Status += 0x1000000; /*0xf2b*/
 break;
 case 6LL: /*0xefb*/
 Status += 0x2000000; /*0xf23*/
 break;
 case 7LL: /*0xefb*/
 Status += 0x4000000; /*0xf1b*/
 break;
 }
 }
 else
 {
 Status += 0x80000; /*0xf53*/
 }
 ++Index; /*0xf59*/
 LOBYTE(Result) = (unsigned __int8)Result >> 4; /*0xf5c*/
 }
 while ( Index < (unsigned int)v8 ); /*0xf66*/
 }
 }
 v11 = -Status; /*0xf68*/
 result = Index; /*0xf6a*/
 *(_QWORD *)&Result = Index + (unsigned __int64)v11; /*0xf72*/
 if ( (_QWORD)Result )
 {
 sub_9BC(Index + (unsigned __int64)v11, 0, Result, v8); /*0xf81*/
 v13 = (unsigned __int8)dword_4CC0; /*0xf86*/
 v14 = BYTE1(dword_4CC0); /*0xf95*/
 v15 = BYTE2(dword_4CC0); /*0xf9d*/
 v16 = HIBYTE(word_4CC4); /*0xfb3*/
 LODWORD(v81) = dword_4CC0; /*0xfba*/
 WORD2(v81) = word_4CC4; /*0xfd6*/
 v73 = (unsigned __int8)word_4CC4; /*0xffb*/
 v74 = HIBYTE(dword_4CC0); /*0x1002*/
 v63 = sub_C90(&v81); /*0x1011*/
 v72 = v16; /*0x1015*/
 v75 = v15; /*0x1019*/
 v76 = v14; /*0x101d*/
 v77 = v13; /*0x1021*/
 sub_1A50(64, "LanMac.MAC = [%X-%X-%X-%X-%X-%X] \n", v13, v14, v15, v74, v73, v16); /*0x102a*/
 v17 = v65; /*0x102f*/
 v18 = v66; /*0x1034*/
 n4_1 = 0; /*0x103b*/
 Index = 4; /*0x1046*/
 do /*0x1142*/
 {
 sub_1980(&v61, 6); /*0x1056*/
 v23 = sub_BEC(v21, v17, v22, &v61); /*0x1063*/
 v62 = BYTE1(v61); /*0x1071*/
 v24 = v61; /*0x1071*/
 __SET_PAIR__(v82, v83, WORD1(v61)); /*0x108b*/
 v69 = *(_DWORD *)((char *)&v61 + 2); /*0x108b*/
 __SET_PAIR__(v80, v81, WORD2(v61)); /*0x10a7*/
 v68 = v61; /*0x10b1*/
 if ( v23 >= 0 ) /*0x10b9*/
 {
 v25 = sub_C90(&v68); /*0x10c5*/
 *v18 = v25; /*0x10de*/
 sub_1A50(64, "ValidMacFRU[%d] = 0x%X \n", n4_1, v25); /*0x10e1*/
 sub_1A50( /*0x112a*/
 64,
 "BMCFruMac.MAC = [%X-%X-%X-%X-%X-%X] \n",
 v24,
 v62,
 v83,
 v82,
 (unsigned __int8)v81,
 (unsigned __int8)v80);
 }
 else
 {
 *v18 = 0; /*0x10bb*/
 }
 ++n4_1; /*0x1134*/
 v17 += 6; /*0x1138*/
 ++v18; /*0x113b*/
 }
 while ( n4_1 < 4u ); /*0x1142*/
 v26 = v65; /*0x114d*/
 v27 = Result; /*0x1153*/
 v28 = v66[0] || v66[1] || v66[2] || v66[3]; /*0x1179*/
 if ( v63 )
 {
 sub_1A50(64, "The MAC[%x %x %x %x %x %x] is Valid.\n", v77, v76, v75, v74, v73, v72); /*0x11ba*/
 v71[0] = -326642109; /*0x11d1*/
 v71[1] = 1270213540; /*0x11dd*/
 v71[2] = 1044374945; /*0x11ea*/
 v71[3] = -1458720202; /*0x11f9*/
 result = (*(__int64 ( **)(const __int16 *, _DWORD *, __int64, __int64, int *))(RuntimeServices + 88))( /*0x1206*/
 L"LBG_LAN_Mac",
 v71,
 3,
 24,
 &dword_4CC0);
 if ( result < 0 )
 return sub_1A50(64, "Write MAC to NVRAM fail: %r\n", result);
 }
 else if ( v28 ) /*0x1228*/
 {
 sub_1A50(64, "The MAC is Invalid, but the MAC in FRU is Valid.\n"); /*0x1242*/
 result = (*(__int64 ( **)(__int64, __int64, __int64 *))(qword_4B58 + 64))(4, 0x20000, &Result); /*0x125d*/
 if ( result >= 0 ) /*0x1263*/
 {
 sub_27C4(v27, Result, 0x20000); /*0x1274*/
 Index = 0; /*0x1279*/
 do /*0x1318*/
 {
 sub_1980(&v61, 6); /*0x1298*/
 sub_BEC(v30, v26, v31, &v61); /*0x12a6*/
 v33 = v61; /*0x12ab*/
 v26 += 6; /*0x12af*/
 v34 = *(_WORD *)((char *)&v61 + 1); /*0x12b7*/
 LOBYTE(v36) = BYTE4(v61); /*0x12c0*/
 LOBYTE(v35) = BYTE3(v61); /*0x12c0*/
 v37 = BYTE5(v61); /*0x12c5*/
 *((_BYTE *)&dword_4CC0 + Index) = v61; /*0x12ca*/
 *(_WORD *)((char *)&dword_4CC0 + Index + 1) = v34; /*0x12cd*/
 *(_WORD *)((char *)&dword_4CC0 + Index + 3) = __PAIR16__(v36, v35); /*0x12d5*/
 *((_BYTE *)&dword_4CC0 + Index + 5) = v37; /*0x12df*/
 byte_4CA0[Index] = v33; /*0x12e4*/
 *(_WORD *)&byte_4CA0[Index + 1] = v34; /*0x12eb*/
 *(_WORD *)&byte_4CA0[Index + 3] = __PAIR16__(v36, v35); /*0x12f9*/
 byte_4CA4[Index + 1] = v37; /*0x1309*/
 Index += 6; /*0x1311*/
 --Index; /*0x1314*/
 }
 while ( Index ); /*0x1318*/
 LOBYTE(v32) = 1; /*0x132d*/
 dword_4C70 = dword_4CC0; /*0x1330*/
 word_4C74 = word_4CC4; /*0x1366*/
 sub_9BC(Result, v32, v35, v36); /*0x1372*/
 funcs_1386 = (void (*)(void))funcs_1386; /*0x1377*/
 Index = 0; /*0x1381*/
 while ( funcs_1386 ) /*0x1399*/
 {
 funcs_1386(); /*0x1386*/
 funcs_1386 = *(void (**)(void))((char *)&funcs_1386 + (_QWORD)&_ImageBase[4 * (unsigned __int8)++Index]); /*0x138e*/
 }
 v40 = qword_4C28; /*0x139b*/
 if ( qword_4C28 || (sub_2784(qword_4AD0), (v40 = qword_4C28) != 0) ) /*0x13bd*/
 {
 (*(void (**)(void))(v40 + 48))(); /*0x13bf*/
 v40 = qword_4C28; /*0x13c2*/
 }
 n0x20 = 0; /*0x13c9*/
 v42 = v27; /*0x13cd*/
 do /*0x1542*/
 {
 v43 = n0x20 << 12; /*0x13d3*/
 v44 = v43; /*0x13d6*/
 v81 = v43; /*0x13d8*/
 v45 = v43 + v27; /*0x13df*/
 if ( (v40 || (sub_2784(v43 + v27), (v40 = qword_4C28) != 0)) /*0x1420*/
 && ((*(void ( **)(__int64))(v40 + 32))(v45), (v46 = qword_4C28) != 0)
 || (sub_2784(v45), (v46 = qword_4C28) != 0) )
 {
 (*(void ( **)(__int64))(v46 + 8))(v45); /*0x1425*/
 }
 sub_38BC(v45, v44 + Result); /*0x1433*/
 n4096 = 4096; /*0x143d*/
 n4096_1 = 4096; /*0x1446*/
 v80 = v44 + Result; /*0x144b*/
 v49 = 0; /*0x1452*/
 while ( 1 ) /*0x1460*/
 {
 sub_39AE(v79, 256, 0); /*0x1460*/
 sub_27C4(v27 + v49 + v81, v79, 256); /*0x147c*/
 n4096_1 -= 256; /*0x1484*/
 Index = 0; /*0x148b*/
 v51 = n4096 - n4096_1; /*0x148e*/
 if ( v51 ) /*0x1491*/
 break; /*0x1491*/
LABEL_64:
 n4096 = n4096_1; /*0x14d0*/
 v49 = 4096 - n4096_1; /*0x14d8*/
 if ( n4096_1 > 0x1000 ) /*0x14e1*/
 {
 Write_success_%X_n = "Write success %X\n"; /*0x14e7*/
 goto LABEL_66; /*0x14e7*/
 }
 }
 v52 = v80; /*0x1493*/
 Index = 0; /*0x149a*/
 while ( 1 ) /*0x14a0*/
 {
 if ( v52 ) /*0x14a0*/
 {
 v54 = *(_BYTE *)(Index + v52 + v49); /*0x14a5*/
 v52 = v80; /*0x14a9*/
 }
 else
 {
 v54 = -1; /*0x14b2*/
 }
 if ( *((_BYTE *)v79 + Index) != v54 ) /*0x14ba*/
 break; /*0x14ba*/
 ++Index; /*0x14c0*/
 ++Index; /*0x14c2*/
 if ( Index >= v51 ) /*0x14ce*/
 goto LABEL_64; /*0x14ce*/
 }
 Write_success_%X_n = "Write fail %X\n"; /*0x1667*/
LABEL_66:
 sub_1A50(64, Write_success_%X_n, v42); /*0x14ee*/
 v40 = qword_4C28; /*0x14fd*/
 if ( qword_4C28 || (sub_2784(v45), (v40 = qword_4C28) != 0) ) /*0x151e*/
 {
 (*(void ( **)(__int64))(v40 + 40))(v45); /*0x1523*/
 v40 = qword_4C28; /*0x1526*/
 }
 v42 += 4096; /*0x1533*/
 ++n0x20; /*0x153a*/
 }
 while ( n0x20 < 0x20u ); /*0x1542*/
 if ( v40 || (sub_2784(qword_4AD0), (v40 = qword_4C28) != 0) ) /*0x1563*/
 {
 (*(void (**)(void))(v40 + 56))(); /*0x1565*/
 funcs_157E = (void (*)(void))funcs_157E; /*0x1568*/
 Index = 0; /*0x156f*/
 if ( funcs_157E ) /*0x1575*/
 {
 do /*0x1591*/
 {
 funcs_157E(); /*0x157e*/
 funcs_157E = *(void (**)(void))((char *)&funcs_157E + (_QWORD)&_ImageBase[4 * (unsigned __int8)++Index]); /*0x1586*/
 }
 while ( funcs_157E ); /*0x1591*/
 }
 }
 (*(void ( **)(__int64))(qword_4B58 + 72))(Result); /*0x159f*/
 (*(void ( **)(__int64))(qword_4B58 + 248))(500000); /*0x15ae*/
 LOBYTE(v80) = 0; /*0x15cb*/
 Result = xmmword_3B68; /*0x15d6*/
 result = (*(__int64 ( **)(__int128 *, _QWORD, __int64 *))(qword_4B58 + 320))(&Result, 0, &qword_4B40); /*0x15db*/
 if ( result >= 0 ) /*0x15e4*/
 {
 v64[0] = 2; /*0x15ed*/
 LOBYTE(v58) = 2; /*0x15f7*/
 LOBYTE(v80) = 1; /*0x15ff*/
 LOBYTE(v60) = 1; /*0x1613*/
 Status = (*(__int64 ( **)(__int64, _QWORD, _QWORD, __int64, char *, int, char *, __int64 *))(qword_4B40 + 16))( /*0x1638*/
 qword_4B40,
 0,
 0,
 v58,
 v64,
 v60,
 v67,
 &v80);
 (*(void ( **)(__int64))(qword_4B58 + 248))(360000000); /*0x163b*/
 return sub_1A50(64, "Send power cycle status - %r\n", Status); /*0x164e*/
 }
 }
 }
 else
 {
 return sub_1A50(64, "Both of the Mac and MAC in FRU is invalid.\n"); /*0x1231*/
 }
 }
 return result; /*0x1653*/
}

// sub_18A0 (0x18A0)
__int64 sub_18A0()
{
 __int64 result; // rax char v1; // [rsp+50h] [rbp+18h]

 sub_1A50(0x80000000LL, "\nUpdateOCPCardStatus\n"); /*0x18b9*/
 if ( (unsigned __int8)sub_1674() == 1 ) /*0x18c5*/
 {
 result = sub_1844(); /*0x18c7*/
 if ( (_BYTE)result ) /*0x18ce*/
 return result; /*0x18ce*/
 v1 = 1; /*0x18d0*/
 }
 else
 {
 sub_1A50(0x80000000LL, "\nOCP not present\n"); /*0x18e1*/
 result = sub_1844(); /*0x18e6*/
 if ( !(_BYTE)result ) /*0x18ed*/
 return result; /*0x18ed*/
 v1 = 0; /*0x18ef*/
 }
 result = (*(__int64 ( **)(const __int16 *, void *, __int64))(qword_4B68 + 88))(L"OCP_TypeC", &unk_49D0, 3); /*0x191d*/
 if ( v1 ) /*0x1925*/
 {
 sub_1A50(0x80000000LL, "\nOCP Conenct,Reset System\n"); /*0x1931*/
 return (*(__int64 ( **)(_QWORD, _QWORD, _QWORD, _QWORD))(qword_4B68 + 104))(0, 0, 0, 0); /*0x1947*/
 }
 return result; /*0x194a*/
}

// sub_1844 (0x1844)
char sub_1844()
{
 char Result; // [rsp+40h] [rbp+8h] BYREF __int64 v2; // [rsp+48h] [rbp+10h] BYREF v2 = 1; /*0x184f*/
 Result = 0; /*0x1870*/
 if ( (*(__int64 ( **)(const __int16 *, void *, _QWORD, __int64 *, char *))(qword_4B68 + 72))( /*0x1882*/
 L"OCP_TypeC",
 &unk_49D0,
 0,
 &v2,
 &Result) < 0 )
 sub_1A50(0x80000000LL, "\nLnvGetOcpTypeCstatus Fail\n"); /*0x1890*/
 return Result; /*0x1899*/
}

// sub_1950 (0x1950)
unsigned __int32 sub_1950(unsigned __int16 n1288)
{
 if ( (n1288 & 3) != 0 ) /*0x195c*/
 sub_1A98((__int64)"e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLibMsc.c", 193, (__int64)"(Port & 3) == 0"); /*0x1971*/
 return __indword(n1288); /*0x197a*/
}

// sub_1A50 (0x1A50)
__int64 sub_1A50(__int64 a1, const char *a2, ...)
{
 __int64 result; // rax __int64 ( **v4)(__int64, const char *, __int64 *); // r10 va_list va; // [rsp+40h] [rbp+18h] BYREF va_start(va, a2);
 result = sub_19D0(); /*0x1a67*/
 if ( result ) /*0x1a72*/
 {
 result = sub_28AC(); /*0x1a74*/
 if ( ((unsigned int)result & (unsigned int)a1) != 0 ) /*0x1a7f*/
 return (*v4)(a1, a2, (__int64 *)va); /*0x1a8e*/
 }
 return result; /*0x1a91*/
}

// sub_1A98 (0x1A98)
__int64 sub_1A98(__int64 a1, __int64 a2, __int64 a3)
{
 __int64 result; // rax result = sub_19D0(); /*0x1ab0*/
 if ( result ) /*0x1ab8*/
 return (*(__int64 ( **)(__int64, __int64, __int64))(result + 8))(a1, a2, a3); /*0x1ac3*/
 return result; /*0x1ad0*/
}

// sub_1AD8 (0x1AD8)
__int64 sub_1AD8()
{
 __int64 result; // rax __int64 Status; // rax result = qword_4B78; /*0x1adc*/
 if ( !qword_4B78 ) /*0x1ae6*/
 {
 Status = (*(__int64 ( **)(void *, _QWORD, __int64 *))(qword_4B58 + 320))(&unk_49C0, 0, &qword_4B78); /*0x1aff*/
 if ( Status < 0 ) /*0x1b08*/
 {
 sub_1A50(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x1b19*/
 sub_1A98("e:\\hs\\MdePkg\\Library\\DxePcdLib\\DxePcdLib.c", 78, "!EFI_ERROR (Status)"); /*0x1b31*/
 }
 result = qword_4B78; /*0x1b36*/
 if ( !qword_4B78 ) /*0x1b40*/
 {
 sub_1A98("e:\\hs\\MdePkg\\Library\\DxePcdLib\\DxePcdLib.c", 79, "mPcd != ((void *) 0)"); /*0x1b53*/
 return qword_4B78; /*0x1b58*/
 }
 }
 return result; /*0x1b5f*/
}

// sub_1CAC (0x1CAC)
__int64 sub_1CAC(__int64 a1)
{
 if ( (a1 & 0xFFFFFFFFF0000000uLL) != 0 ) /*0x1cbc*/
 sub_1A98( /*0x1cd1*/
 (__int64)"e:\\hs\\MdePkg\\Library\\SmmPciExpressLib\\PciExpressLib.c",
 118,
 (__int64)"((Address) & ~0xfffffff) == 0");
 return a1 + qword_4B98; /*0x1ce0*/
}

// sub_1DF8 (0x1DF8)
__int64 sub_1DF8(char a1, char a2)
{
 unsigned int n0x4000000; // r8d unsigned int i; // r9d __int64 result; // rax n0x4000000 = 0; /*0x1df8*/
 if ( a1 ) /*0x1e03*/
 {
 for ( i = 0; i < 0x4000000; ++i ) /*0x1e05*/
 {
 if ( (*(_BYTE *)(qword_4A20 + 4) & 0x21) != 0x20 ) /*0x1e18*/
 break; /*0x1e18*/
 }
 result = qword_4A20; /*0x1e22*/
 *(_BYTE *)(qword_4A20 + 4) = 7; /*0x1e29*/
 }
 if ( a2 ) /*0x1e2f*/
 {
 do /*0x1e4c*/
 {
 if ( (*(_BYTE *)(qword_4A20 + 160) & 5) != 1 ) /*0x1e44*/
 break; /*0x1e44*/
 ++n0x4000000; /*0x1e46*/
 }
 while ( n0x4000000 < 0x4000000 ); /*0x1e4c*/
 result = qword_4A20; /*0x1e4e*/
 *(_BYTE *)(qword_4A20 + 160) = 28; /*0x1e55*/
 }
 return result; /*0x1e5c*/
}

// sub_1EA4 (0x1EA4)
char sub_1EA4(__int64 a1, __int64 a2, unsigned int n2, char a4)
{
 __int64 v4; // rdi unsigned int n2_1; // ebx unsigned int n2_2; // esi unsigned int Index; // edx unsigned int v12; // esi __int64 Index; // rcx char v14; // r8 char dst[64]; // [rsp+20h] [rbp-68h] BYREF unsigned int p_n2; // [rsp+A0h] [rbp+18h] BYREF v4 = 0; /*0x1ebb*/
 n2_1 = n2; /*0x1ebd*/
 p_n2 = n2; /*0x1ec0*/
 n2_2 = n2; /*0x1ecf*/
 if ( !n2 ) /*0x1ed5*/
 return 1; /*0x1f70*/
 while ( 1 ) /*0x1ee7*/
 {
 sub_39AE(dst, 64, 0); /*0x1ee7*/
 if ( a4 ) /*0x1eef*/
 {
 sub_253C(v4 + a1, dst, &p_n2); /*0x1f02*/
 n2_1 = p_n2; /*0x1f07*/
 }
 else
 {
 if ( n2_1 <= 0x40 ) /*0x1f13*/
 n2_1 = 0; /*0x1f1a*/
 else n2_1 -= 64; /*0x1f15*/
 p_n2 = n2_1; /*0x1f1e*/
 sub_3A00(dst, (char *)(v4 + a1), n2_2 - n2_1); /*0x1f33*/
 }
 Index = 0; /*0x1f38*/
 v12 = n2_2 - n2_1; /*0x1f3a*/
 if ( v12 ) /*0x1f3c*/
 break; /*0x1f3c*/
LABEL_15:
 n2_2 = n2_1; /*0x1f62*/
 v4 = n2 - n2_1; /*0x1f66*/
 if ( n2 < n2_1 ) /*0x1f6a*/
 return 1; /*0x1f6a*/
 }
 Index = 0; /*0x1f3e*/
 while ( 1 )
 {
 v14 = a2 ? *(_BYTE *)(v4 + Index + a2) : -1;
 if ( dst[Index] != v14 ) /*0x1f57*/
 return 0; /*0x1f7f*/
 ++Index; /*0x1f59*/
 ++Index; /*0x1f5b*/
 if ( Index >= v12 ) /*0x1f60*/
 goto LABEL_15; /*0x1f60*/
 }
}

// sub_1F90 (0x1F90)
unsigned __int64 sub_1F90(int a1, unsigned int *a2)
{
 __int64 v2; // r8 unsigned __int64 v5; // r10 unsigned __int64 Index; // r11 unsigned int v7; // eax unsigned __int64 v9; // [rsp+30h] [rbp+8h] BYREF __int64 v10; // [rsp+40h] [rbp+18h] BYREF __int64 v11; // [rsp+48h] [rbp+20h] BYREF LODWORD(v2) = qword_4C18; /*0x1f9c*/
 LODWORD(v5) = qword_4C00; /*0x1fb0*/
 v11 = qword_4C10; /*0x1fb7*/
 v10 = qword_4C18; /*0x1fbb*/
 if ( !qword_4C18 ) /*0x1fc2*/
 {
 *(_DWORD *)(qword_4A20 + 180) = 0; /*0x1fcf*/
 if ( *(_DWORD *)(qword_4A20 + 184) == 267429210 && sub_1D5C(0, &v11, &v10) >= 0 ) /*0x1ffd*/
 {
 Index = 0; /*0x1fff*/
 v9 = 0; /*0x2002*/
 v5 = 0; /*0x2007*/
 do /*0x2056*/
 {
 *(_DWORD *)(qword_4A20 + 180) = 0; /*0x2011*/
 if ( *(_DWORD *)(qword_4A20 + 184) == 267429210 && sub_1D5C((unsigned int)Index, 0, &v9) >= 0 && v9 > v5 ) /*0x2049*/
 v5 = v9; /*0x2049*/
 ++Index; /*0x204f*/
 }
 while ( Index < 5 ); /*0x2056*/
 v2 = v10; /*0x2058*/
 }
 else
 {
 v5 = (unsigned int)(n0x1000000 - 1); /*0x2067*/
 v2 = v5; /*0x206a*/
 }
 qword_4C10 = v11; /*0x2072*/
 qword_4C18 = v2; /*0x2079*/
 qword_4C00 = v5; /*0x2080*/
 }
 if ( byte_4C08 ) /*0x208e*/
 a1 += -16777216 - qword_4AD0; /*0x209c*/
 v7 = a1 + v2 + 1; /*0x20a3*/
 if ( v7 > (unsigned int)v5 ) /*0x20a9*/
 return 0x8000000000000002uLL; /*0x20ab*/
 *a2 = v7; /*0x20b7*/
 return 0; /*0x20c0*/
}

// sub_216C (0x216C)
char sub_216C(__int64 a1, int *p_n24608)
{
 int v3; // edx qword_4A20 = *(unsigned int *)sub_1CAC(1036304); /*0x2183*/
 *(_DWORD *)(qword_4A20 + 8) = 0; /*0x218a*/
 *(_WORD *)(qword_4A20 + 6) = 525; /*0x219d*/
 sub_1DF8(1, 0); /*0x21a3*/
 sub_1CE8((unsigned int)(v3 + 35)); /*0x21ab*/
 *p_n24608 = *(_DWORD *)(qword_4A20 + 16) & 0xFFFFFF; /*0x21c2*/
 return 1; /*0x21c4*/
}

// sub_234C (0x234C)
char sub_234C(__int64 a1, __int64 a2, _DWORD *a3)
{
 __int64 v6; // r9 unsigned __int16 Index; // bx char n2_2; // si __int64 Index; // rdx __int64 n2_1; // r9 char v11; // r10 unsigned __int16 i; // r8 char v13; // r15 unsigned int v15; // [rsp+68h] [rbp+20h] BYREF v15 = 0; /*0x2373*/
 v6 = *(unsigned int *)sub_1CAC(1036304); /*0x238b*/
 Index = Index; /*0x2392*/
 qword_4A20 = v6; /*0x2398*/
 if ( Index == 1 ) /*0x23a2*/
 {
 if ( byte_4AA8 && (a1 & 1) == 0 && *a3 >= 2u ) /*0x23e3*/
 Index = 2; /*0x23e5*/
 }
 else
 {
 Index = 64; /*0x23a4*/
 if ( *a3 < 0x40u ) /*0x23a9*/
 Index = *(_WORD *)a3; /*0x23ab*/
 if ( (a1 & 1) != 0 ) /*0x23c1*/
 {
 Index = 1; /*0x23c3*/
 }
 else if ( Index > (unsigned __int16)(256 - (unsigned __int8)a1) ) /*0x23cc*/
 {
 Index = 256 - (unsigned __int8)a1; /*0x23ce*/
 }
 }
 n2_2 = 0; /*0x23e8*/
 while ( 1 ) /*0x23ef*/
 {
 if ( sub_1EA4(a2, 0, Index, 0) ) /*0x23fa*/
 {
LABEL_28:
 *a3 -= Index; /*0x2512*/
 return 1; /*0x2515*/
 }
 if ( Index ) /*0x240b*/
 {
 Index = 0; /*0x240d*/
 n2_1 = Index; /*0x2410*/
 do /*0x2451*/
 {
 v11 = *(_BYTE *)(Index + a2); /*0x2414*/
 for ( i = 0; i < 0x12Cu; ++i ) /*0x2418*/
 {
 *(_BYTE *)(Index + qword_4A20 + 16) = v11; /*0x2423*/
 v11 = *(_BYTE *)(Index + a2); /*0x242f*/
 if ( v11 == *(_BYTE *)(Index + qword_4A20 + 16) ) /*0x243a*/
 break; /*0x243a*/
 }
 ++Index; /*0x244b*/
 --n2_1; /*0x244e*/
 }
 while ( n2_1 ); /*0x2451*/
 }
 sub_1DF8(1, 1); /*0x2459*/
 if ( (sub_1F90(a1, &v15) & 0x8000000000000000uLL) != 0LL ) /*0x246e*/
 return 0; /*0x2527*/
 v13 = v15; /*0x247d*/
 *(_DWORD *)(qword_4A20 + 8) = v15; /*0x2485*/
 *(_WORD *)(qword_4A20 + 6) = (Index << 8) - 251; /*0x24a0*/
 sub_1DF8(1, 0); /*0x24a7*/
 sub_1E60(); /*0x24ac*/
 if ( byte_4AA8 && (v13 & 1) == 0 && Index >= 2u ) /*0x24c7*/
 {
 *(_WORD *)(qword_4A20 + 161) = 114; /*0x24d6*/
 sub_1DF8(0, 1); /*0x24df*/
 }
 if ( !sub_1EA4(a1, a2, Index, 1) ) /*0x24f0*/
 {
 if ( n2_2 == 2 ) /*0x2503*/
 return 0; /*0x2503*/
 if ( (unsigned __int8)++n2_2 < 3u ) /*0x250c*/
 continue; /*0x250c*/
 }
 goto LABEL_28; /*0x250c*/
 }
}

// sub_2638 (0x2638)
signed __int64 sub_2638(int a1)
{
 signed __int64 Result; // rax __int64 v2; // rcx __int64 n12; // rdx __int64 v4; // rcx unsigned int v5; // [rsp+38h] [rbp+10h] BYREF v5 = 0; /*0x2640*/
 Result = sub_1F90(a1, &v5); /*0x264a*/
 if ( Result >= 0 ) /*0x2652*/
 {
 if ( v5 ) /*0x265e*/
 *(_DWORD *)(qword_4A20 + 8) = v5; /*0x2667*/
 *(_WORD *)(qword_4A20 + 6) = 17; /*0x2678*/
 sub_1DF8(1, 0); /*0x267e*/
 Result = 28; /*0x268c*/
 n12 = 12; /*0x2692*/
 if ( (_BYTE)n24608_0 == 31 ) /*0x269e*/
 Result = 12; /*0x269e*/
 if ( ((unsigned __int8)Result & *(_BYTE *)(qword_4A20 + 16)) != 0 ) /*0x26a3*/
 {
 LOBYTE(n12) = 1; /*0x26a5*/
 LOBYTE(v2) = 1; /*0x26a7*/
 sub_1DF8(v2, n12); /*0x26a9*/
 *(_BYTE *)(qword_4A20 + 16) = 0; /*0x26b5*/
 *(_DWORD *)(qword_4A20 + 8) = v5; /*0x26c4*/
 Result = 2048; /*0x26d2*/
 if ( (*(_WORD *)(qword_4A20 + 4) & 0x800) == 0 ) /*0x26da*/
 {
 LOBYTE(v4) = 1; /*0x26e8*/
 *(_WORD *)(qword_4A20 + 6) = 15; /*0x26ea*/
 sub_1DF8(v4, 0); /*0x26f0*/
 return sub_1E60(); /*0x26f5*/
 }
 }
 }
 return Result; /*0x26fa*/
}

// sub_2784 (0x2784)
__int64 sub_2784(__int64 a1)
{
 __int64 ( **v2)(); // rbx char v3; // al v2 = off_4320; /*0x2791*/
 do /*0x27b2*/
 {
 if ( !*v2 ) /*0x2798*/
 break; /*0x279e*/
 v3 = ((__int64 ( *)(__int64, __int64 *))*v2++)(a1, &qword_4C28); /*0x27aa*/
 }
 while ( !v3 ); /*0x27b2*/
 return 0; /*0x27bb*/
}

// sub_2BC0 (0x2BC0)
char sub_2BC0(__int64 a1, __int64 *a2)
{
 const char *SST_25LF040; // rdx __int64 v5; // rcx if ( !(unsigned __int8)sub_216C(a1, &n24608) ) /*0x2bd4*/
 return 0; /*0x2bdb*/
 if ( (unsigned __int16)n24608 == 17599 ) /*0x2bf0*/
 {
 n0x1000000 = 0x80000; /*0x2c0c*/
 SST_25LF040 = "SST 25LF040"; /*0x2c16*/
 }
 else
 {
 if ( (unsigned __int16)n24608 != 32959 ) /*0x2bf7*/
 return 0; /*0x2bdf*/
 n0x1000000 = 0x100000; /*0x2bf9*/
 SST_25LF040 = "SST 25LF080"; /*0x2c03*/
 }
 sub_3A00(&unk_4C40, SST_25LF040, 11); /*0x2c2d*/
 *a2 = (__int64)off_4A30; /*0x2c46*/
 sub_3A00(&unk_4A88, &unk_4B20, 24); /*0x2c50*/
 n24608_0 = n24608; /*0x2c5b*/
 v5 = *a2; /*0x2c61*/
 n24608_1 = n24608; /*0x2c64*/
 *(_DWORD *)(v5 + 72) = dword_4B30; /*0x2c71*/
 *(_DWORD *)(*a2 + 76) = dword_4B34; /*0x2c7d*/
 *(_QWORD *)(*a2 + 80) = &unk_4C40; /*0x2c83*/
 return 1; /*0x2c8e*/
}

// sub_2C94 (0x2C94)
char sub_2C94(__int64 a1, __int64 *a2)
{
 const char *ADESTO_AT25SF641; // rdx __int64 n17; // r8 __int64 v6; // rcx if ( !(unsigned __int8)sub_216C(a1, &n24608) ) /*0x2ca8*/
 return 0; /*0x2cb1*/
 switch ( (unsigned __int16)n24608 ) /*0x2cc6*/
 {
 case 0x321Fu: /*0x2cc6*/
 ADESTO_AT25SF641 = "ADESTO AT25SF641"; /*0x2dbe*/
 goto LABEL_20; /*0x2dbe*/
 case 0x421Fu: /*0x2cc6*/
 n0x1000000 = 0x1000000; /*0x2d95*/
 ADESTO_AT25SF641 = "ADESTO AT25SL128A"; /*0x2d9f*/
 byte_4AE4 = 0; /*0x2da6*/
 n17 = 17; /*0x2dac*/
 n4096_0 = 4096; /*0x2db2*/
 goto LABEL_22; /*0x2dbc*/
 case 0x431Fu: /*0x2cc6*/
 ADESTO_AT25SF641 = "ADESTO AT25SL641"; /*0x2d8c*/
LABEL_20:
 n17 = 16; /*0x2dc5*/
 n4096_0 = 4096; /*0x2dcb*/
 byte_4AE4 = 0; /*0x2dd5*/
 goto LABEL_21; /*0x2dd5*/
 case 0x441Fu: /*0x2cc6*/
 n0x1000000 = 0x80000; /*0x2d73*/
 ADESTO_AT25SF641 = "ATMEL 26DF041/25DF041"; /*0x2d7d*/
 n17 = 21; /*0x2d84*/
 goto LABEL_22; /*0x2d8a*/
 case 0x451Fu: /*0x2cc6*/
 n0x1000000 = 0x100000; /*0x2d5a*/
 ADESTO_AT25SF641 = "ATMEL 26DF081/25DF081"; /*0x2d64*/
 n17 = 21; /*0x2d6b*/
 goto LABEL_22; /*0x2d71*/
 case 0x461Fu: /*0x2cc6*/
 goto LABEL_12; /*0x2cf9*/
 case 0x471Fu: /*0x2cc6*/
 n0x1000000 = 0x400000; /*0x2d3e*/
 ADESTO_AT25SF641 = "ATMEL 26DF321/25DF321"; /*0x2d48*/
 n17 = 21; /*0x2d4f*/
 goto LABEL_22; /*0x2d55*/
 case 0x481Fu: /*0x2cc6*/
 n17 = 21; /*0x2d2c*/
 ADESTO_AT25SF641 = "ATMEL 26DF641/25DF641"; /*0x2d32*/
LABEL_21:
 n0x1000000 = 0x800000; /*0x2ddb*/
 goto LABEL_22; /*0x2ddb*/
 }
 if ( (unsigned __int16)n24608 != 34335 ) /*0x2d0e*/
 return 0; /*0x2cb5*/
LABEL_12:
 n0x1000000 = 0x200000; /*0x2d10*/
 ADESTO_AT25SF641 = "ATMEL 26DF161/25DQ161"; /*0x2d1a*/
 n17 = 21; /*0x2d21*/
LABEL_22:
 sub_3A00(&unk_4C40, ADESTO_AT25SF641, n17); /*0x2de5*/
 *a2 = (__int64)off_4A30; /*0x2e08*/
 sub_3A00(&unk_4A88, &unk_4AD8, 24); /*0x2e12*/
 n24608_0 = n24608; /*0x2e1d*/
 v6 = *a2; /*0x2e23*/
 n24608_1 = n24608; /*0x2e26*/
 *(_DWORD *)(v6 + 72) = dword_4AE8; /*0x2e33*/
 *(_DWORD *)(*a2 + 76) = n4096_0; /*0x2e3f*/
 *(_QWORD *)(*a2 + 80) = &unk_4C40; /*0x2e4a*/
 qword_4A20 = *(unsigned int *)sub_1CAC(1036304); /*0x2e57*/
 sub_20C8(); /*0x2e5e*/
 sub_2638(4278190080LL); /*0x2e68*/
 return 1; /*0x2e74*/
}

// sub_2E7C (0x2E7C)
__int64 sub_2E7C(unsigned int a1)
{
 unsigned int n23; // ecx n23 = HIWORD(a1); /*0x2e7c*/
 if ( (unsigned __int8)n23 <= 0x18u ) /*0x2e85*/
 {
 switch ( (unsigned __int8)n23 ) /*0x2e87*/
 {
 case 0x18u: /*0x2e87*/
 return 0x1000000; /*0x2f08*/
 case 0x10u: /*0x2e87*/
 return 0x10000; /*0x2eda*/
 case 0x11u: /*0x2e87*/
 return 0x20000; /*0x2ed4*/
 case 0x12u: /*0x2e87*/
 return 0x40000; /*0x2ece*/
 case 0x13u: /*0x2e87*/
 return 0x80000; /*0x2ec8*/
 case 0x14u: /*0x2e87*/
 return 0x100000; /*0x2ec2*/
 case 0x15u: /*0x2e87*/
 return 0x200000; /*0x2ebc*/
 }
 if ( (unsigned __int8)n23 != 22 ) /*0x2eaa*/
 {
 if ( (unsigned __int8)n23 == 23 ) /*0x2eaf*/
 return 0x800000; /*0x2eb6*/
 return 0x1000000; /*0x2eaf*/
 }
 return 0x400000; /*0x2eaa*/
 }
 if ( (unsigned __int8)n23 != 25 ) /*0x2ede*/
 {
 switch ( (unsigned __int8)n23 ) /*0x2ee8*/
 {
 case 0x1Au: /*0x2ee8*/
 case 0x20u: /*0x2ee8*/
 return 0x4000000; /*0x2f1a*/
 case 0x21u: /*0x2ee8*/
 return 0x8000000; /*0x2f14*/
 case 0x36u: /*0x2ee8*/
 return 0x400000; /*0x2f0e*/
 case 0x37u: /*0x2ee8*/
 return 0x800000; /*0x2ef7*/
 }
 if ( (unsigned __int8)n23 != 57 ) /*0x2efc*/
 return 0x1000000; /*0x2efc*/
 }
 return 0x2000000; /*0x2eb6*/
}

// sub_2FD4 (0x2FD4)
char sub_2FD4(__int64 a1, __int64 *a2)
{
 const char *XMC_25QH_Series; // rdx __int64 n15; // r8 int n0x40000; // r8d bool v7; // zf __int64 v8; // rcx if ( !(unsigned __int8)sub_216C(a1, &n24608) ) /*0x2fe8*/
 return 0; /*0x2fef*/
 if ( (unsigned __int16)n24608 > 0x40C8u ) /*0x3008*/
 {
 if ( (unsigned __int16)n24608 <= 0x7020u ) /*0x336b*/
 {
 if ( (unsigned __int16)n24608 != 28704 ) /*0x3371*/
 {
 if ( (unsigned __int16)n24608 <= 0x6020u ) /*0x337e*/
 {
 if ( (unsigned __int16)n24608 == 24608 ) /*0x3384*/
 {
 n4096 = 4096; /*0x3424*/
 n32 = 32; /*0x342e*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x343a*/
 XMC_25QH_Series = "XMC 25QH Series"; /*0x3440*/
 n15 = 15; /*0x3447*/
 goto LABEL_92; /*0x344d*/
 }
 if ( (unsigned __int16)n24608 == 16623 ) /*0x3390*/
 goto LABEL_75; /*0x3390*/
 if ( (unsigned __int16)n24608 != 16780 ) /*0x339c*/
 {
 if ( (unsigned __int16)n24608 != 20719 ) /*0x33a4*/
 {
 if ( (unsigned __int16)n24608 == 24258 ) /*0x33b0*/
 goto LABEL_14; /*0x33b0*/
 if ( (unsigned __int16)n24608 == 24577 ) /*0x33bc*/
 {
 n4096 = 4096; /*0x33c4*/
 n32 = 32; /*0x33ce*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x33da*/
 XMC_25QH_Series = "Spansion 25FL(L) Series"; /*0x33e0*/
 n15 = 23; /*0x33e7*/
 goto LABEL_92; /*0x33ed*/
 }
 return 0; /*0x2ff3*/
 }
 goto LABEL_75; /*0x33a4*/
 }
 goto LABEL_56; /*0x339c*/
 }
 if ( (unsigned __int16)n24608 == 24733 ) /*0x3458*/
 {
 n4096 = 4096; /*0x34d6*/
 n32 = 32; /*0x34e0*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x34ec*/
 XMC_25QH_Series = "ISSI 25LP Series"; /*0x34f2*/
 n15 = 16; /*0x34f9*/
 goto LABEL_92; /*0x34ff*/
 }
 if ( (unsigned __int16)n24608 != 24776 ) /*0x345d*/
 {
 if ( (unsigned __int16)n24608 != 24815 ) /*0x3462*/
 {
 if ( (unsigned __int16)n24608 != 28700 ) /*0x346e*/
 return 0; /*0x346e*/
LABEL_62:
 n4096 = 4096; /*0x3474*/
 n32 = 32; /*0x3480*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x348c*/
 XMC_25QH_Series = "EON 25F/Q/S/QH Series"; /*0x3492*/
 n15 = 21; /*0x3499*/
 goto LABEL_92; /*0x349f*/
 }
 goto LABEL_75; /*0x3462*/
 }
LABEL_63:
 n4096 = 4096; /*0x34a4*/
 n32 = 32; /*0x34b0*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x34bc*/
 XMC_25QH_Series = "GigaDevice 25Q Series"; /*0x34c2*/
 n15 = 21; /*0x34c9*/
 goto LABEL_92; /*0x34cf*/
 }
LABEL_73:
 n4096 = 4096; /*0x3579*/
 n32 = 32; /*0x3585*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x3591*/
 XMC_25QH_Series = "STM/Micron/Numonyx 25PF/PX Series"; /*0x3597*/
 n15 = 33; /*0x359e*/
 goto LABEL_92; /*0x35a4*/
 }
 if ( (unsigned __int16)n24608 <= 0x80EFu ) /*0x350b*/
 {
 switch ( (unsigned __int16)n24608 ) /*0x3511*/
 {
 case 0x80EFu: /*0x3511*/
 goto LABEL_75; /*0x3511*/
 case 0x709Du: /*0x3511*/
 n4096 = 4096; /*0x35ab*/
 n32 = 32; /*0x35b5*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x35c1*/
 XMC_25QH_Series = "ISSI 25WP Series"; /*0x35c7*/
 n15 = 16; /*0x35ce*/
 goto LABEL_92; /*0x35d4*/
 case 0x70EFu: /*0x3511*/
 goto LABEL_75; /*0x3526*/
 }
 if ( (unsigned __int16)n24608 != 28960 ) /*0x352f*/
 {
 if ( (unsigned __int16)n24608 != 29167 ) /*0x3537*/
 {
 if ( (unsigned __int16)n24608 == 32800 ) /*0x3543*/
 {
 n4096 = 256; /*0x354b*/
 n32 = -37; /*0x3555*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x3561*/
 XMC_25QH_Series = "STM/Numonyx 25PE Series"; /*0x3567*/
 n15 = 23; /*0x356e*/
 goto LABEL_92; /*0x3574*/
 }
 return 0; /*0x3543*/
 }
 goto LABEL_75; /*0x3537*/
 }
 goto LABEL_73; /*0x352f*/
 }
 if ( (unsigned __int16)n24608 != 35209 ) /*0x360f*/
 {
 if ( (unsigned __int16)n24608 == 40319 ) /*0x3617*/
 {
 n4096 = 4096; /*0x365c*/
 n32 = -41; /*0x3666*/
 n0x1000000 = sub_2F24((unsigned int)n24608); /*0x3672*/
 XMC_25QH_Series = "PMC 25LV/LQ Series"; /*0x3678*/
 n15 = 18; /*0x367f*/
 goto LABEL_92; /*0x3685*/
 }
 if ( (((unsigned __int16)n24608 - 47648) & 0xFFFFFEFF) == 0 ) /*0x3624*/
 {
 n4096 = 4096; /*0x362c*/
 n32 = 32; /*0x3636*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x3642*/
 XMC_25QH_Series = "Micron/Numonyx 25Q Series"; /*0x3648*/
 n15 = 25; /*0x364f*/
 goto LABEL_92; /*0x3655*/
 }
 return 0; /*0x3624*/
 }
 n4096 = 0x10000; /*0x3694*/
 if ( BYTE2(n24608) != 17 ) /*0x369e*/
 {
 if ( BYTE2(n24608) == 18 ) /*0x36a3*/
 goto LABEL_89; /*0x36a3*/
 if ( BYTE2(n24608) == 19 ) /*0x36a8*/
 goto LABEL_88; /*0x36a8*/
 if ( BYTE2(n24608) != 21 ) /*0x36ad*/
 {
 if ( BYTE2(n24608) != 22 ) /*0x36b2*/
 {
 if ( BYTE2(n24608) != 23 ) /*0x36b7*/
 {
 n0x1000000 = 0x1000000; /*0x36b9*/
LABEL_91:
 n15 = 24; /*0x36e7*/
 XMC_25QH_Series = "Intel/Numonyx 25F160/320"; /*0x36ed*/
 goto LABEL_92; /*0x36ed*/
 }
LABEL_88:
 n0x1000000 = 0x800000; /*0x36c5*/
 goto LABEL_91; /*0x36cf*/
 }
LABEL_89:
 n0x1000000 = 0x400000; /*0x36d1*/
 goto LABEL_91; /*0x36db*/
 }
 }
 n0x1000000 = 0x200000; /*0x36dd*/
 goto LABEL_91; /*0x36dd*/
 }
 if ( (unsigned __int16)n24608 == 16584 ) /*0x300e*/
 goto LABEL_63; /*0x300e*/
 if ( (unsigned __int16)n24608 > 0x3037u ) /*0x301b*/
 {
 if ( (unsigned __int16)n24608 <= 0x3820u ) /*0x31f0*/
 {
 if ( (unsigned __int16)n24608 == 14368 ) /*0x31f6*/
 {
 n4096 = 4096; /*0x3287*/
 n32 = 32; /*0x3291*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x329d*/
 XMC_25QH_Series = "XMC 25QU Series"; /*0x32a3*/
 n15 = 15; /*0x32aa*/
 goto LABEL_92; /*0x32b0*/
 }
 if ( (unsigned __int16)n24608 != 12527 ) /*0x3202*/
 {
 switch ( (unsigned __int16)n24608 ) /*0x320b*/
 {
 case 0x311Cu: /*0x320b*/
 goto LABEL_62; /*0x320b*/
 case 0x32F8u: /*0x320b*/
 n4096 = 4096; /*0x3257*/
 n32 = 32; /*0x3261*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x326d*/
 XMC_25QH_Series = "FIDELIX 25Q Series"; /*0x3273*/
 n15 = 18; /*0x327a*/
 goto LABEL_92; /*0x3280*/
 case 0x377Fu: /*0x320b*/
 n4096 = 4096; /*0x322e*/
 n0x1000000 = sub_2F24((unsigned int)n24608); /*0x323d*/
 XMC_25QH_Series = "AMIC 25L Series"; /*0x3243*/
 n15 = 15; /*0x324a*/
 goto LABEL_92; /*0x3250*/
 }
 v7 = (unsigned __int16)n24608 == 14364; /*0x3221*/
 goto LABEL_25; /*0x3227*/
 }
LABEL_75:
 n4096 = 4096; /*0x35d9*/
 n32 = 32; /*0x35e5*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x35f1*/
 XMC_25QH_Series = "Winbond 25X/Q Series"; /*0x35f7*/
 n15 = 20; /*0x35fe*/
 goto LABEL_92; /*0x3604*/
 }
 if ( (unsigned __int16)n24608 == 16385 ) /*0x32bb*/
 {
 n4096 = 4096; /*0x3336*/
 n32 = 32; /*0x3340*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x334c*/
 XMC_25QH_Series = "Spansion 25FL(K) Series"; /*0x3352*/
 n15 = 23; /*0x3359*/
 goto LABEL_92; /*0x335f*/
 }
 if ( (unsigned __int16)n24608 == 16439 ) /*0x32c0*/
 goto LABEL_44; /*0x32c0*/
 if ( (unsigned __int16)n24608 != 16524 ) /*0x32c5*/
 {
 if ( (unsigned __int16)n24608 == 16545 ) /*0x32ce*/
 {
 n4096 = 4096; /*0x32d6*/
 n32 = 32; /*0x32e0*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x32ec*/
 XMC_25QH_Series = "Fudan FM25Q Series"; /*0x32f2*/
 n15 = 18; /*0x32f9*/
 goto LABEL_92; /*0x32ff*/
 }
 return 0; /*0x32ce*/
 }
LABEL_56:
 n4096 = 4096; /*0x33f2*/
 n32 = 32; /*0x33fe*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x340a*/
 XMC_25QH_Series = "ESMT 25L QA/PA Series"; /*0x3410*/
 n15 = 21; /*0x3417*/
 goto LABEL_92; /*0x341d*/
 }
 if ( (unsigned __int16)n24608 == 12343 ) /*0x3021*/
 {
LABEL_44:
 n4096 = 4096; /*0x3304*/
 n32 = 32; /*0x3310*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x331c*/
 XMC_25QH_Series = "AMIC 25L/LQ Series"; /*0x3322*/
 n15 = 18; /*0x3329*/
 goto LABEL_92; /*0x332f*/
 }
 if ( (unsigned __int16)n24608 > 0x24C2u ) /*0x302e*/
 {
 switch ( (unsigned __int16)n24608 ) /*0x3162*/
 {
 case 0x25C2u: /*0x3162*/
 goto LABEL_14; /*0x3162*/
 case 0x26BFu: /*0x3162*/
 n4096 = 4096; /*0x31bb*/
 byte_4AA9 = 1; /*0x31c5*/
 n0x1000000 = sub_2F74((unsigned int)n24608); /*0x31d1*/
 XMC_25QH_Series = "SST 26VF Series"; /*0x31d7*/
 n15 = 15; /*0x31de*/
 goto LABEL_92; /*0x31e4*/
 case 0x28C2u: /*0x3162*/
 n4096 = 4096; /*0x318b*/
 n32 = 32; /*0x3195*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x31a1*/
 XMC_25QH_Series = "MXIC 25R Series"; /*0x31a7*/
 n15 = 15; /*0x31ae*/
 goto LABEL_92; /*0x31b4*/
 }
 v7 = (unsigned __int16)n24608 == 12316; /*0x3178*/
LABEL_25:
 if ( !v7 ) /*0x317e*/
 return 0; /*0x317e*/
 goto LABEL_62; /*0x317e*/
 }
 if ( (unsigned __int16)n24608 != 9410 ) /*0x3034*/
 {
 switch ( (unsigned __int16)n24608 ) /*0x303c*/
 {
 case 0x201u: /*0x303c*/
 n4096 = 0x10000; /*0x3138*/
 n0x1000000 = sub_2F24((unsigned int)n24608); /*0x3144*/
 XMC_25QH_Series = "Spansion 25FL Series"; /*0x314a*/
 n15 = 19; /*0x3151*/
 goto LABEL_92; /*0x3157*/
 case 0x2001u: /*0x303c*/
 n4096 = 0x10000; /*0x310c*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x3118*/
 XMC_25QH_Series = "Spansion 25FL(P) Series"; /*0x311e*/
 n15 = 23; /*0x3125*/
 goto LABEL_92; /*0x312b*/
 case 0x201Cu: /*0x303c*/
 n32 = -40; /*0x30d7*/
 n4096 = 0x10000; /*0x30e0*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x30ec*/
 XMC_25QH_Series = "EON 25P Series"; /*0x30f2*/
 n15 = 14; /*0x30f9*/
 goto LABEL_92; /*0x30ff*/
 case 0x2020u: /*0x303c*/
 n32 = -40; /*0x3092*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x30a9*/
 XMC_25QH_Series = "STM/Micron/Numonyx 25P Series"; /*0x30b4*/
 if ( n0x1000000 == 0x1000000 ) /*0x30bb*/
 n0x40000 = 0x40000; /*0x30bb*/
 n4096 = n0x40000; /*0x30bf*/
 n15 = 29; /*0x30c6*/
 goto LABEL_92; /*0x30cc*/
 }
 if ( (unsigned __int16)n24608 != 8386 ) /*0x305e*/
 return 0; /*0x305e*/
 }
LABEL_14:
 n4096 = 4096; /*0x3060*/
 n32 = 32; /*0x306c*/
 n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x3078*/
 XMC_25QH_Series = "MXIC 25L/U Series"; /*0x307e*/
 n15 = 17; /*0x3085*/
LABEL_92:
 sub_3A00(&unk_4C40, XMC_25QH_Series, n15); /*0x36f4*/
 *a2 = (__int64)off_4A30; /*0x3717*/
 sub_3A00(&unk_4A88, &unk_4B08, 24); /*0x3721*/
 n24608_0 = n24608; /*0x372c*/
 v8 = *a2; /*0x3732*/
 n24608_1 = n24608; /*0x3735*/
 *(_DWORD *)(v8 + 72) = dword_4B18; /*0x3742*/
 *(_DWORD *)(*a2 + 76) = n4096; /*0x374e*/
 *(_QWORD *)(*a2 + 80) = &unk_4C40; /*0x3754*/
 qword_4A20 = *(unsigned int *)sub_1CAC(1036304); /*0x3764*/
 sub_20C8(); /*0x376b*/
 sub_2638(4278190080LL); /*0x3775*/
 return 1; /*0x3781*/
}

// sub_3788 (0x3788)
char sub_3788(__int64 a1, __int64 *a2)
{
 unsigned int n0x800000; // eax int n256; // ecx __int64 n17; // r8 const char *ESMT_25L_T_Series; // rdx __int64 v8; // rcx if ( !(unsigned __int8)sub_216C(a1, &n24608) ) /*0x379c*/
 return 0; /*0x37a3*/
 if ( (unsigned __int16)n24608 == 8332 ) /*0x37ba*/
 {
 n0x800000 = sub_2E7C((unsigned int)n24608); /*0x380c*/
 ESMT_25L_T_Series = "ESMT 25L T Series"; /*0x3811*/
 goto LABEL_11; /*0x3811*/
 }
 if ( (unsigned __int16)n24608 == 8588 ) /*0x37c1*/
 {
 n0x800000 = sub_2E7C((unsigned int)n24608); /*0x37f7*/
 byte_4AFC = 0; /*0x37fc*/
 ESMT_25L_T_Series = "ESMT 25L B Series"; /*0x3803*/
LABEL_11:
 n17 = 17; /*0x3818*/
 goto LABEL_12; /*0x3818*/
 }
 if ( (unsigned __int16)n24608 != 9663 ) /*0x37c8*/
 return 0; /*0x37a7*/
 n0x800000 = sub_2F74(n24608); /*0x37ca*/
 n256 = n256; /*0x37cf*/
 n17 = 15; /*0x37df*/
 if ( n0x800000 >= 0x800000 ) /*0x37e5*/
 n256 = 256; /*0x37e5*/
 ESMT_25L_T_Series = "SST 25VF Series"; /*0x37e8*/
 n256 = n256; /*0x37ef*/
LABEL_12:
 n0x1000000 = n0x800000; /*0x381e*/
 sub_3A00(&unk_4C40, ESMT_25L_T_Series, n17); /*0x382e*/
 *a2 = (__int64)off_4A30; /*0x3847*/
 sub_3A00(&unk_4A88, &unk_4AF0, 24); /*0x3851*/
 n24608_0 = n24608; /*0x385c*/
 v8 = *a2; /*0x3862*/
 n24608_1 = n24608; /*0x3865*/
 *(_DWORD *)(v8 + 72) = n256; /*0x3872*/
 *(_DWORD *)(*a2 + 76) = dword_4B04; /*0x387e*/
 *(_QWORD *)(*a2 + 80) = &unk_4C40; /*0x3889*/
 qword_4A20 = *(unsigned int *)sub_1CAC(1036304); /*0x3896*/
 sub_20C8(); /*0x389d*/
 sub_2638(4278190080LL); /*0x38a7*/
 return 1; /*0x38b3*/
}

// sub_3960 (0x3960)
__int64 sub_3960(unsigned int _RAX_1, _DWORD *a2, _DWORD *a3, _DWORD *a4, _DWORD *a5)
{
 __int64 result; // rax _RAX = _RAX_1; /*0x396f*/
 __asm { cpuid } /*0x3974*/
 if ( a2 ) /*0x3979*/
 *a2 = result; /*0x397b*/
 if ( a3 ) /*0x3981*/
 *a3 = _RBX; /*0x3983*/
 if ( a4 ) /*0x3989*/
 *a4 = _RCX; /*0x398b*/
 if ( a5 ) /*0x3991*/
 *a5 = _RDX; /*0x3993*/
 return result; /*0x3996*/
}

// sub_3A00 (0x3A00)
char *sub_3A00(char *dst_1, char *src, unsigned __int64 n8)
{
 char *dst; // rdi unsigned __int64 count_2; // rcx char v10; // dl unsigned __int64 n8_1; // rax unsigned __int64 count; // rax __int64 count_1; // rbx char count_3; // al unsigned __int64 Ptr; // rcx unsigned __int64 count_4; // rax __asm { pushf } /*0x3a03*/
 dst = dst_1; /*0x3a09*/
 count_2 = n8; /*0x3a0c*/
 v10 = 0; /*0x3a0f*/
 n8_1 = src - dst; /*0x3a14*/
 if ( src < dst ) /*0x3a17*/
 {
 n8_1 = dst - src; /*0x3a1d*/
 if ( &src[n8] >= dst ) /*0x3a23*/
 {
 src += n8; /*0x3a25*/
 dst += n8; /*0x3a28*/
 v10 = 1; /*0x3a2c*/
 }
 }
 if ( n8 < 8 || n8_1 < 8 ) /*0x3a39*/
 goto LABEL_19; /*0x3a39*/
 count = (unsigned __int8)src & 7; /*0x3a41*/
 count_1 = (unsigned __int8)dst & 7; /*0x3a45*/
 if ( v10 ) /*0x3a4b*/
 {
 --src; /*0x3a4d*/
 --dst; /*0x3a50*/
 }
 if ( count == count_1 && count ) /*0x3a5b*/
 {
 if ( !v10 ) /*0x3a5f*/
 count = 8 - count; /*0x3a64*/
 qmemcpy(dst, src, count); /*0x3a6d*/
 src += count; /*0x3a6d*/
 dst += count; /*0x3a6d*/
 count_2 = n8 - count; /*0x3a6f*/
 }
 if ( v10 ) /*0x3a74*/
 {
 src -= 7; /*0x3a76*/
 dst -= 7; /*0x3a7a*/
 }
 count_3 = count_2; /*0x3a7e*/
 Ptr = count_2 >> 3; /*0x3a81*/
 qmemcpy(dst, src, 8 *Ptr); /*0x3a85*/
 src += 8 *Ptr; /*0x3a85*/
 dst += 8 *Ptr; /*0x3a85*/
 count_4 = count_3 & 7; /*0x3a88*/
 if ( count_4 ) /*0x3a8c*/
 {
 if ( v10 ) /*0x3a90*/
 {
 src += 8; /*0x3a92*/
 dst += 8; /*0x3a96*/
 }
 count_2 = count_4; /*0x3a9a*/
LABEL_19:
 if ( v10 ) /*0x3a9f*/
 {
 --src; /*0x3aa1*/
 --dst; /*0x3aa4*/
 }
 qmemcpy(dst, src, count_2); /*0x3aa7*/
 }
 __asm { popf } /*0x3aa9*/
 return dst_1; /*0x3aac*/
}