#include "UbaMainPeim.h"
// UbaMainPeim - UEFI Module (Regenerated from IDA)
// Total functions: 586
// I64: /private/ajax/bios/bios_source/UbaMainPeim/UbaMainPeim.i64
// Function: j_ProtocolTeardown @ 0x1a6cc (0x5 bytes)
// attributes: thunk
EFI_STATUS __fastcall j_ProtocolTeardown(struct NIC_CONTEXT *NicContext)
{
return ProtocolTeardown(NicContext);
}
// Function: _ModuleEntryPoint @ 0x1a6d4 (0x57 bytes)
EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, struct _EFI_SYSTEM_TABLE *SystemTable)
{
__int64 v5; // [rsp+40h] [rbp+18h] BYREF
EarlyInit(ImageHandle, SystemTable); /*0x1a6e4*/
(*(void (__fastcall **)(EFI_HANDLE, __int64 *, __int64 *))(BootServices + 152))(ImageHandle, qword_3B0, &v5); /*0x1a6ff*/
*(_QWORD *)(v5 + 88) = j_ProtocolTeardown; /*0x1a717*/
return DxeDriverEntryPoint(ImageHandle, SystemTable); /*0x1a725*/
}
// Function: EarlyInit @ 0x1a72c (0xb8 bytes)
// write access to const memory has been detected, the output may be wrong!
EFI_STATUS EarlyInit(EFI_HANDLE ImageHandle, struct _EFI_SYSTEM_TABLE *SystemTable)
{
__int64 BootServices; // r9
__int64 RuntimeServices; // rax
BootServices = *((_QWORD *)SystemTable + 12); /*0x1a730*/
RuntimeServices = *((_QWORD *)SystemTable + 11); /*0x1a734*/
::ImageHandle = (__int64)ImageHandle; /*0x1a738*/
::SystemTable = (__int64)SystemTable; /*0x1a73f*/
BootServices = BootServices; /*0x1a756*/
RuntimeServices = RuntimeServices; /*0x1a75d*/
(*(void (__fastcall **)(__int64 *, _QWORD, __int64 *))(BootServices + 320))(qword_2D0, 0, &qword_473C0); /*0x1a764*/
(*(void (__fastcall **)(__int64 *, _QWORD, __int64 *))(BootServices + 320))(qword_300, 0, &qword_473D0); /*0x1a782*/
(*(void (__fastcall **)(__int64 *, _QWORD, __int64 *))(BootServices + 320))(qword_2E0, 0, &qword_473D8); /*0x1a79f*/
(*(void (__fastcall **)(__int64 *, _QWORD, __int64 *))(BootServices + 320))(qword_330, 0, &qword_473B8); /*0x1a7bc*/
return (*(EFI_STATUS (__fastcall **)(__int64 *, _QWORD, __int64 *))(BootServices + 320))(qword_340, 0, &qword_473C8);
}
// Function: DxeDriverEntryPrepare @ 0x1a7e4 (0x99 bytes)
EFI_STATUS DxeDriverEntryPrepare(EFI_HANDLE ImageHandle)
{
__int64 v2; // rax
__int64 n6; // [rsp+50h] [rbp+8h] BYREF
__int64 v5; // [rsp+58h] [rbp+10h] BYREF
__int64 v6; // [rsp+60h] [rbp+18h] BYREF
__int64 v7; // [rsp+68h] [rbp+20h] BYREF
if ( *((_WORD *)ImageHandle + 4805) != 4156 /*0x1a85b*/
|| ((*(void (__fastcall **)(_QWORD, __int64 *, __int64 *, __int64 *, __int64 *))(*((_QWORD *)ImageHandle + 1398)
+ 112LL))(
*((_QWORD *)ImageHandle + 1398),
&v7,
&v6,
&n6,
&v5),
*((_DWORD *)ImageHandle + 2402) == 272371833)
&& *((_WORD *)ImageHandle + 4806) == 4819
&& n6 == 6 )
{
LODWORD(v2) = 3; /*0x1a7fc*/
}
else
{
return -(__int64)(v5 != 0) & 0x8000000000000003uLL; /*0x1a873*/
}
return v2; /*0x1a876*/
}
// Function: DxeDriverEntryPoint @ 0x1a880 (0x1cc bytes)
// write access to const memory has been detected, the output may be wrong!
EFI_STATUS DxeDriverEntryPoint(EFI_HANDLE ImageHandle, struct _EFI_SYSTEM_TABLE *SystemTable)
{
__int64 v4; // rax
EFI_HANDLE ImageHandle_1; // [rsp+80h] [rbp+8h] BYREF
EFI_HANDLE ImageHandle_2; // [rsp+88h] [rbp+10h] BYREF
__int64 Status; // [rsp+90h] [rbp+18h] BYREF
ImageHandle_1 = ImageHandle; /*0x1a887*/
ImageHandle_2 = ImageHandle; /*0x1a890*/
SystemTable_0 = (__int64)SystemTable; /*0x1a8a5*/
v4 = (*(__int64 (__fastcall **)(EFI_HANDLE *, __int64 *, _UNKNOWN **, _QWORD))(BootServices + 328))( /*0x1a8bd*/
&ImageHandle_2,
qword_350,
&off_1D78,
0);
ImageHandle_0 = (__int64)ImageHandle; /*0x1a8cb*/
ImageHandle_1 = (__int64)ImageHandle_2; /*0x1a8d2*/
if ( v4 >= 0 ) /*0x1a8dc*/
{
v4 = (*(__int64 (__fastcall **)(__int64 *, __int64 *, _UNKNOWN **, __int64 *, _UNKNOWN **, __int64 *, _UNKNOWN **, __int64 *, _UNKNOWN **, __int64 *, _UNKNOWN **, __int64 *, __int64 (__fastcall **)(int, int, int, int, __int64, __int64), _QWORD))(BootServices + 328))( /*0x1a977*/
&ImageHandle_1,
qword_360,
&off_E98,
qword_390,
&off_1B28,
qword_370,
&off_1AA0,
qword_3A0,
&off_1B38,
qword_380,
&off_E78,
qword_320,
&off_1B48,
0);
if ( v4 >= 0 ) /*0x1a980*/
{
if ( *((_DWORD *)SystemTable + 2) >= (unsigned int)SnpCheckFwRevision ) /*0x1a98d*/
v4 = (*(__int64 (__fastcall **)(EFI_HANDLE *, __int64 *, __int64 *, _QWORD))(BootServices + 328))( /*0x1a9af*/
&ImageHandle_1,
qword_310,
qword_1AB8,
0);
if ( v4 >= 0 ) /*0x1a9b8*/
{
v4 = (*(__int64 (__fastcall **)(EFI_HANDLE, __int64 *, __int64 *, EFI_HANDLE, _QWORD, int))(BootServices + 280))( /*0x1a9ed*/
ImageHandle_1,
qword_3B0,
&Status,
ImageHandle_1,
0,
2);
if ( v4 >= 0 ) /*0x1a9f6*/
{
*(_QWORD *)(Status + 88) = ProtocolTeardown; /*0x1aa0a*/
v4 = (*(__int64 (__fastcall **)(__int64, __int64, void (*)()))(BootServices + 80))( /*0x1aa31*/
513,
16,
ProtocolBootCallback);
if ( v4 >= 0 ) /*0x1aa37*/
LODWORD(v4) = PxeStructInit(); /*0x1aa39*/
}
}
}
}
return v4; /*0x1aa46*/
}
// Function: PxeStructInit @ 0x1aa4c (0xde bytes)
// write access to const memory has been detected, the output may be wrong!
EFI_STATUS PxeStructInit()
{
__int64 n96; // rbx
__int64 Status_1; // rax
int Status; // r11d
_BYTE *Struct; // rax
n96 = 96; /*0x1aa59*/
Status_1 = (*(__int64 (__fastcall **)(__int64, __int64, __int64 *))(BootServices + 64))(4, 96, &qword_47380); /*0x1aa6b*/
Status = Status_1; /*0x1aa74*/
if ( Status_1 >= 0 ) /*0x1aa77*/
{
Struct = 0; /*0x1aa7d*/
do /*0x1aa90*/
{
--n96; /*0x1aa84*/
*Struct++ = 0; /*0x1aa87*/
}
while ( n96 ); /*0x1aa90*/
UndiCallbackDispatch_0 = (__int64 (__fastcall *)(_QWORD, _QWORD, _QWORD))UndiCallbackDispatch; /*0x1aab5*/
qword_47388 = 0; /*0x1aab9*/
strcpy((char *)&_ImageBase, "!PXE "); /*0x1aac0*/
n2 = 2; /*0x1aad3*/
LOWORD(n4099) = 4099; /*0x1aad7*/
word_A = 0; /*0x1aadb*/
*(_DWORD *)&word_C = 1073792506; /*0x1aae0*/
LOWORD(word_18) = 0; /*0x1aaeb*/
n256 = 256; /*0x1aaf3*/
*(_DWORD *)word_1C = 1380533072; /*0x1aafb*/
HIBYTE(word_4) = 0; /*0x1ab21*/
LODWORD(Status_1) = Status; /*0x1ab1e*/
}
return Status_1; /*0x1ab24*/
}
// Function: ProtocolBootCallback @ 0x1ab2c (0x97 bytes)
void ProtocolBootCallback()
{
; /*0x1ab2c*/
}
// Function: ProtocolTeardown @ 0x1abc4 (0x1d6 bytes)
EFI_STATUS ProtocolTeardown(struct NIC_CONTEXT *NicContext)
{
__int64 Protocol_1; // rax
unsigned __int64 i; // rbx
int Protocol; // r11d
unsigned __int64 i_1; // [rsp+98h] [rbp+10h] BYREF
__int64 Interface; // [rsp+A0h] [rbp+18h] BYREF
Protocol_1 = (*(__int64 (__fastcall **)(_QWORD, _QWORD, _QWORD, unsigned __int64 *, __int64 *))(BootServices + 312))( /*0x1abf0*/
0,
0,
0,
&i_1,
&Interface);
if ( Protocol_1 >= 0 ) /*0x1abf9*/
{
for ( i = 0; i < i_1; ++i ) /*0x1ac09*/
(*(void (__fastcall **)(_QWORD, struct NIC_CONTEXT *, _QWORD))(BootServices + 272))( /*0x1ac24*/
*(_QWORD *)(Interface + 8 * i),
NicContext,
0);
if ( Interface ) /*0x1ac42*/
(*(void (**)(void))(BootServices + 72))(); /*0x1ac4b*/
Protocol_1 = (*(__int64 (__fastcall **)(_QWORD))(BootServices + 72))(0); /*0x1ac69*/
if ( Protocol_1 >= 0 ) /*0x1ac6f*/
{
Protocol_1 = (*(__int64 (__fastcall **)(_QWORD))(BootServices + 112))(0); /*0x1ac83*/
if ( Protocol_1 >= 0 ) /*0x1ac89*/
{
Protocol_1 = (*(__int64 (__fastcall **)(struct NIC_CONTEXT *, __int64 *, _UNKNOWN **, __int64 *, _UNKNOWN **, __int64 *, _UNKNOWN **, __int64 *, _UNKNOWN **, __int64 *, _UNKNOWN **, __int64 *, _UNKNOWN **, __int64 *, __int64 (__fastcall **)(int, int, int, int, __int64, __int64), _QWORD))(BootServices + 336))( /*0x1ad38*/
NicContext,
qword_350,
&off_1D78,
qword_360,
&off_E98,
qword_390,
&off_1B28,
qword_370,
&off_1AA0,
qword_3A0,
&off_1B38,
qword_380,
&off_E78,
qword_320,
&off_1B48,
0);
Protocol = Protocol_1; /*0x1ad3e*/
if ( Protocol_1 >= 0 ) /*0x1ad44*/
{
if ( *(_DWORD *)(SystemTable + 8) >= (unsigned int)SnpCheckFwRevision ) /*0x1ad54*/
Protocol = (*(__int64 (__fastcall **)(struct NIC_CONTEXT *, __int64 *, __int64 *, _QWORD))(BootServices + 336))( /*0x1ad77*/
NicContext,
qword_310,
qword_1AB8,
0);
LODWORD(Protocol_1) = Protocol; /*0x1ad7a*/
}
}
}
}
return Protocol_1; /*0x1ad91*/
}
// Function: UndiChildProtocolAlloc @ 0x1bd4c (0xd6 bytes)
EFI_STATUS UndiChildProtocolAlloc(UINTN a1, UINTN a2, UINT64 *pProtocol, UINT64 *pIndex)
{
__int16 v6; // r12
__int16 v7; // r13
_QWORD *ProtocolData; // rbx
_QWORD *NicConfig; // rdi
_BYTE *ProtocolStatus; // rax
_BYTE *ProtocolEntry; // rax
v6 = a2; /*0x1bd6a*/
v7 = a1; /*0x1bd6e*/
if ( !pIndex ) /*0x1bd75*/
return 2; /*0x1bd81*/
ProtocolData = UtlMemAlloc(); /*0x1bd8b*/
if ( ProtocolData ) /*0x1bd91*/
{
NicConfig = UtlMemAlloc(); /*0x1bd98*/
if ( NicConfig ) /*0x1bd9e*/
{
ProtocolStatus = UtlMemAllocPool((__int64)ProtocolData, (__int64 *)&Var14, 0, 21); /*0x1bdb3*/
if ( ProtocolStatus ) /*0x1bdbe*/
{
ProtocolStatus[18] = 0; /*0x1bdd0*/
*(_WORD *)(ProtocolStatus + 19) = v7; /*0x1bdd4*/
ProtocolEntry = UtlMemAllocPool((__int64)NicConfig, (__int64 *)&Var14, 0, 21); /*0x1bdd9*/
ProtocolEntry[18] = 0; /*0x1bdde*/
*(_WORD *)(ProtocolEntry + 19) = v6; /*0x1bde2*/
*pProtocol = (UINT64)ProtocolData; /*0x1bde7*/
*pIndex = (UINT64)NicConfig; /*0x1bded*/
return 0; /*0x1bdf0*/
}
UtlMemFree(NicConfig); /*0x1bdf2*/
}
UtlMemFree(ProtocolData); /*0x1bdfa*/
}
return 9; /*0x1be18*/
}
// Function: UndiChildProtocolRegister @ 0x1be24 (0x11f bytes)
EFI_STATUS UndiChildProtocolRegister(UINT64 *pProtocol1, UINT64 *pProtocol2, UINT64 *Index)
{
unsigned __int16 v3; // r9
__int64 Buffer_1; // rax
__int64 Buffer; // rbx
_BYTE *v7; // rcx
__int64 n15; // rax
_BYTE *Result; // rax
_QWORD *pIndex__1; // rsi
_QWORD *pProtocol_; // [rsp+30h] [rbp-28h] BYREF
_QWORD *pIndex_; // [rsp+38h] [rbp-20h] BYREF
_BYTE v14[2]; // [rsp+40h] [rbp-18h] BYREF
__int16 n80_1; // [rsp+42h] [rbp-16h]
__int16 v16; // [rsp+44h] [rbp-14h]
__int16 n4410_1; // [rsp+46h] [rbp-12h]
char PortNum; // [rsp+4Ch] [rbp-Ch]
__int16 n4679_1; // [rsp+4Dh] [rbp-Bh]
_UNKNOWN *retaddr; // [rsp+58h] [rbp+0h] BYREF
unsigned __int16 n4681; // [rsp+80h] [rbp+28h]
__int16 n4679; // [rsp+88h] [rbp+30h]
__int16 n80; // [rsp+90h] [rbp+38h]
__int16 v24; // [rsp+98h] [rbp+40h]
__int16 n4410; // [rsp+A8h] [rbp+50h]
if ( &retaddr == (_UNKNOWN **)word_28 ) /*0x1be42*/
{
Buffer = 0x8000000000000002uLL; /*0x1be61*/
}
else
{
LODWORD(Buffer_1) = UndiChildProtocolAlloc(v3, n4681, (UINT64 *)&pProtocol_, (UINT64 *)&pIndex_); /*0x1be57*/
Buffer = Buffer_1; /*0x1be5c*/
}
if ( Buffer >= 0 ) /*0x1be6e*/
{
v7 = v14; /*0x1be79*/
n15 = 15; /*0x1be7e*/
do /*0x1be8b*/
{
*v7++ = 0; /*0x1be81*/
--n15; /*0x1be87*/
}
while ( n15 ); /*0x1be8b*/
n80_1 = n80; /*0x1be9d*/
v16 = v24; /*0x1bead*/
n4410_1 = n4410; /*0x1bebf*/
PortNum = 0; /*0x1bed7*/
n4679_1 = n4679; /*0x1bedc*/
Result = UtlBuildTlv((__int64)pProtocol_, v14, 15, 15, 0, 0); /*0x1bee1*/
pIndex__1 = pIndex_; /*0x1bee6*/
if ( Result ) /*0x1beee*/
LODWORD(Buffer) = UtlInstallProtocol((__int64)pProtocol1, (__int64)&qword_1D48, 1, pProtocol_, pIndex_); /*0x1bf1b*/
else
LODWORD(Buffer) = 9; /*0x1bef0*/
UtlMemFree(pProtocol_); /*0x1bf23*/
UtlMemFree(pIndex__1); /*0x1bf2b*/
}
return Buffer; /*0x1bf3d*/
}
// Function: NicAddUndiCommand @ 0x1bf44 (0x26b bytes)
EFI_STATUS NicAddUndiCommand(UINT64 Context)
{
UINT64 *pProtocol1; // rcx
__int64 v3; // rax
__int64 NicConfig; // rbx
__int64 v5; // rax
_QWORD *DevicePath; // rax
__int64 Protocol; // r8
_QWORD *DevicePath_1; // rbx
__int64 n38; // rax
_BYTE *Index; // rcx
__int64 Result; // [rsp+0h] [rbp-88h] BYREF
__int16 n4681[4]; // [rsp+20h] [rbp-68h]
__int16 n4679; // [rsp+28h] [rbp-60h]
__int16 n80; // [rsp+30h] [rbp-58h]
__int16 n140; // [rsp+38h] [rbp-50h]
int Var12; // [rsp+40h] [rbp-48h]
__int16 n4410; // [rsp+48h] [rbp-40h]
_BYTE Index_1[2]; // [rsp+50h] [rbp-38h] BYREF
__int16 n35; // [rsp+52h] [rbp-36h]
__int16 n35_1; // [rsp+54h] [rbp-34h]
__int16 n4359; // [rsp+56h] [rbp-32h]
__int16 n4660; // [rsp+58h] [rbp-30h]
__int16 n43; // [rsp+5Ah] [rbp-2Eh]
char n4; // [rsp+5Ch] [rbp-2Ch]
char PortNum; // [rsp+5Dh] [rbp-2Bh]
__int64 p_Protocol; // [rsp+90h] [rbp+8h] BYREF
__int64 p_Index; // [rsp+98h] [rbp+10h] BYREF
if ( *(_BYTE *)(Context + 13641) ) /*0x1bf51*/
{
n4410 = 4402; /*0x1bf6d*/
LOBYTE(Var12) = 0; /*0x1bf75*/
n140 = 140; /*0x1bf7a*/
pProtocol1 = *(UINT64 **)(Context + 12216); /*0x1bf7f*/
n80 = 139; /*0x1bf86*/
n4679 = 4663; /*0x1bf8f*/
n4681[0] = 4685; /*0x1bfa6*/
LODWORD(v3) = UndiChildProtocolRegister(pProtocol1, (UINT64 *)&pProtocol2_, (UINT64 *)((char *)&_ImageBase + 1)); /*0x1bfac*/
LODWORD(NicConfig) = v3; /*0x1bfb1*/
if ( v3 < 0 ) /*0x1bfb7*/
goto LABEL_19; /*0x1bfb7*/
}
if ( &Result == (__int64 *)-144LL ) /*0x1bfc8*/
v5 = 0x8000000000000002uLL; /*0x1bfe9*/
else
LODWORD(v5) = UndiChildProtocolAlloc(0x1238u, 0x1239u, (UINT64 *)&p_Protocol, (UINT64 *)&p_Index); /*0x1bfe2*/
if ( v5 >= 0 ) /*0x1bff6*/
{
DevicePath = UtlMemAlloc(); /*0x1bffc*/
DevicePath_1 = DevicePath; /*0x1c001*/
if ( !DevicePath ) /*0x1c007*/
{
LODWORD(v5) = 9; /*0x1c009*/
return v5; /*0x1c013*/
}
LOBYTE(Protocol) = 16; /*0x1c026*/
UtlBuildTlvPath((__int64)DevicePath, 40, Protocol, 0, 0); /*0x1c02c*/
if ( *(_BYTE *)(Context + 13640) ) /*0x1c031*/
UtlBuildTlvPath((__int64)DevicePath_1, 36, 0, 0, 1); /*0x1c051*/
if ( *(_BYTE *)(Context + 13641) ) /*0x1c056*/
{
UtlBuildTlvPath((__int64)DevicePath_1, 37, 0, 0, 2); /*0x1c076*/
UtlBuildTlvPath((__int64)DevicePath_1, 38, 0, 0, 3); /*0x1c092*/
}
if ( *(_BYTE *)(Context + 13642) ) /*0x1c097*/
UtlBuildTlvPath((__int64)DevicePath_1, 39, 0, 0, 4); /*0x1c0b7*/
n38 = 38; /*0x1c0bc*/
Index = Index_1; /*0x1c0c1*/
do /*0x1c0d0*/
{
*Index++ = 0; /*0x1c0c6*/
--n38; /*0x1c0cc*/
}
while ( n38 ); /*0x1c0d0*/
n35 = 35; /*0x1c0e4*/
n35_1 = 35; /*0x1c0e9*/
n4359 = 4359; /*0x1c0f3*/
n4660 = 4660; /*0x1c100*/
n4 = 4; /*0x1c119*/
n43 = 43; /*0x1c11e*/
PortNum = 0; /*0x1c123*/
UtlBuildTlv(p_Protocol, Index_1, 5, 38, 0, 1); /*0x1c128*/
UtlMemDupFromPath((__int64 *)p_Protocol, DevicePath_1); /*0x1c138*/
UtlBuildTlvWide((_QWORD *)p_Protocol); /*0x1c145*/
UtlMemFree(DevicePath_1); /*0x1c14d*/
NicConfig = UtlInstallProtocol(*(_QWORD *)(Context + 12216), (__int64)&pProtocol2_, 4661, (_QWORD *)p_Protocol, 0); /*0x1c179*/
if ( NicConfig >= 0 ) /*0x1c17f*/
{
UtlMemFree((_QWORD *)p_Protocol); /*0x1c189*/
UtlMemFree((_QWORD *)p_Index); /*0x1c196*/
}
LABEL_19:
LODWORD(v5) = NicConfig; /*0x1c19b*/
}
return v5; /*0x1c1a6*/
}
// Function: PnpAddUndiChild @ 0x1c1b0 (0x326 bytes)
EFI_STATUS PnpAddUndiChild(UINT64 Context)
{
__int64 NicConfig; // rbx
__int64 v3; // rax
__int64 v4; // rax
__int64 NicConfig_1; // rax
_BYTE *DevicePath; // rcx
__int64 n38; // rax
_QWORD *Protocol; // rbp
__int64 n20; // rsi
_BYTE *Buffer; // rax
_QWORD *Index; // r12
char Result; // al
_WORD *Offset; // rcx
_BYTE *Table; // rdx
__int16 *PortNum; // rcx
_WORD *i; // rdx
__int16 Var11; // ax
__int64 j; // rax
_BYTE DevicePath_1[2]; // [rsp+50h] [rbp-8A8h] BYREF
__int16 n67; // [rsp+52h] [rbp-8A6h]
__int16 n68; // [rsp+54h] [rbp-8A4h]
__int16 n4368; // [rsp+56h] [rbp-8A2h]
__int16 n4660; // [rsp+58h] [rbp-8A0h]
__int16 n45; // [rsp+5Ah] [rbp-89Eh]
char n20_1; // [rsp+5Ch] [rbp-89Ch]
char n16; // [rsp+5Dh] [rbp-89Bh]
char Var15; // [rsp+5Eh] [rbp-89Ah]
char n8; // [rsp+5Fh] [rbp-899h]
char Var16; // [rsp+60h] [rbp-898h]
_WORD n91393[20]; // [rsp+78h] [rbp-880h] BYREF
__int64 Var19; // [rsp+A0h] [rbp-858h] BYREF
_BYTE Table_1[264]; // [rsp+A8h] [rbp-850h] BYREF
_QWORD Var21[233]; // [rsp+1B0h] [rbp-748h] BYREF
__int64 p_Protocol; // [rsp+908h] [rbp+10h] BYREF
__int64 p_Index; // [rsp+910h] [rbp+18h] BYREF
if ( (unsigned __int8)NvmLookupPciId1((struct NIC_CONTEXT *)Context) ) /*0x1c1c6*/
{
LODWORD(v3) = UndiChildProtocolRegister( /*0x1c226*/
*(UINT64 **)(Context + 12216),
(UINT64 *)&pProtocol2_,
(UINT64 *)((char *)&_ImageBase + 1));
LODWORD(NicConfig) = v3; /*0x1c22e*/
if ( v3 >= 0 ) /*0x1c231*/
{
LODWORD(v4) = UndiChildProtocolRegister( /*0x1c278*/
*(UINT64 **)(Context + 12216),
(UINT64 *)&pProtocol2_,
(UINT64 *)((char *)&_ImageBase + 1));
LODWORD(NicConfig) = v4; /*0x1c280*/
if ( v4 >= 0 ) /*0x1c283*/
{
if ( &p_Protocol ) /*0x1c294*/
{
LODWORD(NicConfig_1) = UndiChildProtocolAlloc(0x124Eu, 0x124Fu, (UINT64 *)&p_Protocol, (UINT64 *)&p_Index); /*0x1c2ac*/
NicConfig = NicConfig_1; /*0x1c2b1*/
}
else
{
NicConfig = 0x8000000000000002uLL; /*0x1c2b6*/
}
if ( NicConfig >= 0 ) /*0x1c2c3*/
{
DevicePath = DevicePath_1; /*0x1c2cf*/
n38 = 38; /*0x1c2d4*/
do /*0x1c2e3*/
{
--n38; /*0x1c2d7*/
*DevicePath++ = 0; /*0x1c2da*/
}
while ( n38 ); /*0x1c2e3*/
Protocol = (_QWORD *)p_Protocol; /*0x1c2e5*/
n4368 = 4368; /*0x1c2f7*/
n4660 = 4660; /*0x1c304*/
n45 = 45; /*0x1c311*/
n67 = 67; /*0x1c320*/
n16 = 16; /*0x1c32a*/
n20 = 20; /*0x1c32f*/
Var15 = 1; /*0x1c332*/
n8 = 8; /*0x1c337*/
n68 = 68; /*0x1c33c*/
Var16 = 1; /*0x1c341*/
n20_1 = 20; /*0x1c34b*/
Buffer = UtlBuildTlv(p_Protocol, DevicePath_1, 7, 38, 0, 0); /*0x1c350*/
Index = (_QWORD *)p_Index; /*0x1c355*/
if ( Buffer ) /*0x1c360*/
{
NicConfig = UtlInstallProtocol(*(_QWORD *)(Context + 12216), &pProtocol2_, 1, Protocol, p_Index); /*0x1c395*/
if ( NicConfig >= 0 ) /*0x1c398*/
{
if ( PhyReadConfigBlock(Context + 12176, Var21) ) /*0x1c3ad*/
{
LODWORD(NicConfig) = 21; /*0x1c3b8*/
}
else if ( PhySearchEntry(Var21, 4u, &off_16190, &Var19) ) /*0x1c3e3*/
{
LODWORD(NicConfig) = 7; /*0x1c3ee*/
}
else
{
Result = Table_1[0]; /*0x1c3fd*/
Table_1[255] = 0; /*0x1c404*/
Offset = n91393; /*0x1c40c*/
Table = Table_1; /*0x1c411*/
while ( Result ) /*0x1c42d*/
{
*Offset++ = Result; /*0x1c41e*/
Result = *++Table; /*0x1c428*/
}
*Offset = 0; /*0x1c42f*/
if ( n91393 == UtlStrStr(n91393, L"FFV") ) /*0x1c44c*/
{
PortNum = &n91393[3]; /*0x1c44e*/
for ( i = n91393; *PortNum; ++i ) /*0x1c45e*/
{
if ( !n20 ) /*0x1c463*/
break; /*0x1c463*/
Var11 = *PortNum++; /*0x1c465*/
--n20; /*0x1c46c*/
*i = Var11; /*0x1c46f*/
}
for ( j = 2 * n20; j; --j ) /*0x1c47c*/
{
*(_BYTE *)i = 0; /*0x1c485*/
i = (_WORD *)((char *)i + 1); /*0x1c488*/
}
}
LODWORD(NicConfig) = UtlConfigHash(*(_QWORD *)(Context + 12216), 84, n91393, 0); /*0x1c4a9*/
}
}
}
else
{
LODWORD(NicConfig) = 9; /*0x1c362*/
}
UtlMemFree(Protocol); /*0x1c4af*/
UtlMemFree(Index); /*0x1c4b7*/
}
}
}
}
else
{
LODWORD(NicConfig) = 0; /*0x1c1d3*/
}
return NicConfig; /*0x1c4c7*/
}
// Function: PnpSetMacAddress @ 0x1c4d8 (0x22c bytes)
EFI_STATUS PnpSetMacAddress(UINT64 Context, UINT64 MacAddr)
{
__int64 v2; // r9
EFI_STATUS Handle; // ebx
__int64 n6; // rax
__int16 *Protocol; // r8
unsigned __int8 i; // cl
unsigned __int16 n0x61; // ax
char Result; // dl
int n16; // eax
_QWORD *Buffer; // rdi
void (__fastcall *Index)(UINT64, __int64, __int64, unsigned __int16 *); // rax
__int64 ConfigData; // rdx
__int16 Device; // cx
__int64 Offset; // rsi
unsigned __int16 Table; // si
void (__fastcall *Var10)(_QWORD *, __int64, __int64, _WORD *); // rax
void (__fastcall *Var11)(_QWORD *, _QWORD, __int64, _WORD *); // rax
void (__fastcall *Var12)(_QWORD *, __int64, __int64, _WORD *); // rax
void (__fastcall *Var13)(_QWORD *, _QWORD, __int64, __int16 *); // rax
void (__fastcall *Var14)(_QWORD *, __int64, __int16 *, __int64); // rax
_WORD Var15[20]; // [rsp+20h] [rbp-28h] BYREF
unsigned __int16 ConfigData_1; // [rsp+60h] [rbp+18h] BYREF
__int16 p_Var17; // [rsp+68h] [rbp+20h] BYREF
Handle = 0; /*0x1c4ea*/
n6 = 6; /*0x1c4f2*/
LOBYTE(v2) = 0; /*0x1c4f8*/
Protocol = &p_Var17; /*0x1c4fb*/
do /*0x1c50c*/
{
--n6; /*0x1c500*/
*(_BYTE *)Protocol = 0; /*0x1c503*/
Protocol = (__int16 *)((char *)Protocol + 1); /*0x1c506*/
}
while ( n6 ); /*0x1c50c*/
for ( i = 0; i < 0x11u; ++i ) /*0x1c50e*/
{
if ( i == 2 || i == 5 || i == 8 || i == 11 || i == 14 ) /*0x1c527*/
{
if ( *(_WORD *)(MacAddr + 2LL * i) != 58 ) /*0x1c595*/
return 0; /*0x1c595*/
}
else
{
n0x61 = *(_WORD *)(MacAddr + 2LL * i); /*0x1c52c*/
if ( n0x61 < 0x30u || n0x61 > 0x39u ) /*0x1c53b*/
{
if ( n0x61 < 0x41u || n0x61 > 0x46u ) /*0x1c54e*/
{
if ( n0x61 < 0x61u || n0x61 > 0x66u ) /*0x1c567*/
return 0; /*0x1c6ef*/
Result = *(_BYTE *)(MacAddr + 2LL * i) - 87; /*0x1c571*/
}
else
{
Result = *(_BYTE *)(MacAddr + 2LL * i) - 55; /*0x1c554*/
}
}
else
{
Result = n0x61 - 48; /*0x1c53f*/
}
if ( (v2 & 1) == 0 ) /*0x1c57e*/
Result *= 16; /*0x1c580*/
*((_BYTE *)&p_Var17 + ((unsigned __int64)(unsigned __int8)v2 >> 1)) |= Result; /*0x1c583*/
LOBYTE(v2) = v2 + 1; /*0x1c587*/
}
}
n16 = *(_DWORD *)(Context + 364); /*0x1c5a7*/
if ( n16 != 16 && n16 != 17 && n16 != 18 && n16 != 19 && n16 != 20 ) /*0x1c5c4*/
return MacInitRarTable(Context + 88, &p_Var17); /*0x1c5d4*/
Buffer = (_QWORD *)(Context + 96); /*0x1c5dc*/
Index = *(void (__fastcall **)(UINT64, __int64, __int64, unsigned __int16 *))(Context + 1256); /*0x1c5e0*/
if ( Index ) /*0x1c5ea*/
Index(Context + 96, 55, 1, &ConfigData_1); /*0x1c5fc*/
ConfigData = ConfigData_1; /*0x1c5fe*/
if ( ConfigData_1 == 0xFFFF || !ConfigData_1 ) /*0x1c616*/
return 3; /*0x1c6e0*/
Device = *(_WORD *)(Context + 10288); /*0x1c61c*/
Offset = *(_QWORD *)(Context + 10304); /*0x1c623*/
LOWORD(ConfigData) = 3 * Device + ConfigData_1; /*0x1c633*/
ConfigData_1 = ConfigData; /*0x1c636*/
if ( Offset ) /*0x1c63e*/
Table = ((_WORD)Offset + 1) << 6; /*0x1c643*/
else
Table = 0; /*0x1c649*/
Var10 = (void (__fastcall *)(_QWORD *, __int64, __int64, _WORD *))Buffer[145]; /*0x1c64c*/
if ( Var10 ) /*0x1c656*/
{
Var10(Buffer, ConfigData, 1, Var15); /*0x1c663*/
LOWORD(ConfigData) = ConfigData_1; /*0x1c665*/
}
if ( Var15[0] == 0xFFFF ) /*0x1c675*/
{
Var11 = (void (__fastcall *)(_QWORD *, _QWORD, __int64, _WORD *))Buffer[145]; /*0x1c677*/
if ( Var11 ) /*0x1c681*/
{
Var11(Buffer, Table, 3, Var15); /*0x1c691*/
LOWORD(ConfigData) = ConfigData_1; /*0x1c693*/
}
Var12 = (void (__fastcall *)(_QWORD *, __int64, __int64, _WORD *))Buffer[151]; /*0x1c698*/
if ( Var12 ) /*0x1c6a2*/
Var12(Buffer, ConfigData, 3, Var15); /*0x1c6af*/
}
Var13 = (void (__fastcall *)(_QWORD *, _QWORD, __int64, __int16 *))Buffer[151]; /*0x1c6b1*/
if ( Var13 ) /*0x1c6bb*/
Var13(Buffer, Table, 3, &p_Var17); /*0x1c6cb*/
Var14 = (void (__fastcall *)(_QWORD *, __int64, __int16 *, __int64))Buffer[148]; /*0x1c6cd*/
if ( Var14 ) /*0x1c6d7*/
Var14(Buffer, ConfigData, Protocol, v2); /*0x1c6dc*/
return Handle; /*0x1c6fb*/
}
// Function: PnpNotificationCallback @ 0x1c704 (0xb60 bytes)
UINT64 PnpNotificationCallback(struct NIC_CONTEXT *NicContext, void *Context, UINT64 *Result, void *Buffer)
{
struct NIC_CONTEXT *Handle; // rbx
char PortIndex; // dl
int Protocol; // r9d
__int64 PortIndex_1; // r8
void (__fastcall *Event)(struct NIC_CONTEXT *, __int64, __int64, __int16 *); // rax
__int16 LinkSpeed; // cx
void (__fastcall *ConfigData)(struct NIC_CONTEXT *, __int64, __int64, __int16 *); // rax
__int16 ConfigValue; // r8
int Index; // eax
bool *PortNum; // r12
char FwMode; // al
void (__fastcall *MediaSpeedFunc)(struct NIC_CONTEXT *, _WORD *, _WORD *); // r9
__int16 MediaSpeedVal; // cx
__int16 LinkPartnerAbility; // ax
char MediaSpeed; // al
__int64 (__fastcall *PhyReadFunc)(struct NIC_CONTEXT *, __int64, __int64, _WORD *); // rax
int PhyStatus; // eax
UINT64 *FilterBase; // rdi
int FilterResult_1; // eax
__int64 EepromOffset1; // rbp
__int16 *p_n19542_1; // rcx
__int64 n604; // rax
bool EepromValid; // al
__int16 *p_n1954... [24154 chars total]
// Function: PnpParseOffsetUrlParam @ 0x1d264 (0x169 bytes)
UINT64 PnpParseOffsetUrlParam(UINT64 Status, void *UrlStr)
{
UINT64 *v2; // r8
UINT64 *v4; // rsi
UINT64 n0x10; // rax
UINT64 n0x10_1; // r10
unsigned __int64 UrlStr_3; // rbx
char UrlStr_4; // r11
void *UrlStr_1; // r9
unsigned __int64 UrlStr_6; // rdx
int Handle; // ecx
unsigned __int64 UrlStr_7; // r8
_BYTE *Protocol; // r9
char UrlStr_5; // cl
unsigned __int64 Result; // rax
void *UrlStr_2; // [rsp+30h] [rbp+8h]
v4 = v2; /*0x1d282*/
n0x10 = (UINT64)UtlStrStr((_WORD *)Status, L"&OFFSET="); /*0x1d285*/
n0x10_1 = n0x10; /*0x1d28a*/
if ( !n0x10 ) /*0x1d290*/
goto LABEL_27; /*0x1d290*/
UrlStr_3 = (unsigned __int64)UrlStr_2; /*0x1d296*/
UrlStr_4 = (char)UrlStr_2; /*0x1d29b*/
while ( 2 ) /*0x1d2a0*/
{
UrlStr_1 = 0; /*0x1d2a0*/
UrlStr_6 = 0; /*0x1d2a3*/
UrlStr_2 = 0; /*0x1d2a5*/
while ( 1 ) /*0x1d2aa*/
{
Handle = *(unsigned __int16 *)(n0x10_1 + 2 * UrlStr_6 + 16); /*0x1d2aa*/
if ( (unsigned __int16)(Handle - 48) <= 9u ) /*0x1d2b7*/
{
UrlStr_4 = Handle - 48; /*0x1d2b9*/
goto LABEL_10; /*0x1d2bd*/
}
if ( (unsigned __int16)(Handle - 65) <= 5u ) /*0x1d2c6*/
{
UrlStr_4 = Handle - 55; /*0x1d2c8*/
goto LABEL_10; /*0x1d2cc*/
}
n0x10 = (unsigned int)(Handle - 97); /*0x1d2ce*/
if ( (unsigned __int16)(Handle - 97) > 5u ) /*0x1d2d5*/
break; /*0x1d2d5*/
UrlStr_4 = Handle - 87; /*0x1d2d7*/
LABEL_10:
++UrlStr_6; /*0x1d2db*/
}
if ( !UrlStr_6 ) /*0x1d2e3*/
goto LABEL_25; /*0x1d2e3*/
n0x10 = (UrlStr_6 + 1) & 0xFFFFFFFFFFFFFFFEuLL; /*0x1d2ed*/
if ( n0x10 > 0x10 ) /*0x1d2f5*/
{
LABEL_27:
LOBYTE(n0x10) = 0; /*0x1d3af*/
return n0x10; /*0x1d3c5*/
}
UrlStr_7 = 0; /*0x1d2fb*/
Protocol = (_BYTE *)(n0x10_1 + 2 * UrlStr_6 + 14); /*0x1d307*/
do /*0x1d383*/
{
if ( (unsigned __int16)(*(_WORD *)Protocol - 48) > 9u ) /*0x1d318*/
{
if ( (unsigned __int16)(*(_WORD *)Protocol - 65) > 5u ) /*0x1d32f*/
{
if ( (unsigned __int16)(*(_WORD *)Protocol - 97) <= 5u ) /*0x1d346*/
UrlStr_4 = *Protocol - 87; /*0x1d34b*/
}
else
{
UrlStr_4 = *Protocol - 55; /*0x1d334*/
}
}
else
{
UrlStr_4 = *Protocol - 48; /*0x1d31d*/
}
if ( (UrlStr_7 & 1) != 0 ) /*0x1d353*/
UrlStr_5 = (16 * UrlStr_4) | *((_BYTE *)&UrlStr_2 + (UrlStr_7 >> 1)) & 0xF; /*0x1d36d*/
else
UrlStr_5 = UrlStr_4; /*0x1d355*/
Result = UrlStr_7++; /*0x1d36f*/
Protocol -= 2; /*0x1d375*/
n0x10 = Result >> 1; /*0x1d379*/
*((_BYTE *)&UrlStr_2 + n0x10) = UrlStr_5; /*0x1d37c*/
}
while ( UrlStr_7 < UrlStr_6 ); /*0x1d383*/
UrlStr_1 = UrlStr_2; /*0x1d385*/
UrlStr_3 = UrlStr_6; /*0x1d38a*/
LABEL_25:
if ( UrlStr_1 != UrlStr ) /*0x1d390*/
{
n0x10 = (UINT64)UtlStrStr((_WORD *)(n0x10_1 + 4 * UrlStr_3 + 16), L"&OFFSET="); /*0x1d39e*/
n0x10_1 = n0x10; /*0x1d3a3*/
if ( !n0x10 ) /*0x1d3a9*/
goto LABEL_27; /*0x1d3a9*/
continue; /*0x1d3a9*/
}
break;
}
*v4 = n0x10_1; /*0x1d3c6*/
LOBYTE(n0x10) = 1; /*0x1d3c9*/
return n0x10; /*0x1d3c0*/
}
// Function: PnpStartNicInit @ 0x1d3d0 (0xa8b bytes)
EFI_STATUS PnpStartNicInit(struct NIC_CONTEXT *NicContext, void *Param, UINT64 *DevicePath)
{
UINT64 Buffer; // rax
struct NIC_CONTEXT *Handle; // rsi
__int64 Result; // rdx
__int64 Offset; // rbx
char n2; // di
_WORD *PortNum; // rax
const wchar_t *FF:FF:FF:FF:FF:FF; // rcx
__int16 n70; // dx
_WORD *Var10; // rax
const wchar_t *_00:00:00:00:00:00; // rcx
__int16 n48; // dx
__int16 Var11; // ax
_WORD *Var12; // r8
char *Var13; // rcx
__int64 v21; // rax
void *UrlStr; // rdx
unsigned __int16 n0xF; // ax
__int64 n3; // rdx
UINT64 *Var14; // rdi
void *UrlStr_1; // rdx
char Var15; // r13
__int64 n604; // r15
__int16 *p_n19542_1; // rcx
__int64 n604_1; // rax
int Var16; // eax
char Var17; // r13
__int64 n604_2; // rax
__int16 *p_n19542_9; // rcx
int Var18; // eax
char Var19; // r13
__int64 n604_3; // rax
__int16 *p_n19542_10; // rcx
int Var20; // eax
char *Var21; // rcx
char *Var22_1; // rdx
char Var23; // al
__int64 ... [21955 chars total]
// Function: NicSetConfigItem @ 0x1de5c (0x15b bytes)
UINT64 NicSetConfigItem(struct NIC_CONTEXT *NicContext, char *ConfigStr)
{
int n11; // r8d
int Status; // r8d
int NicConfig; // r8d
int DevicePath; // r8d
int Protocol; // r8d
int Buffer; // r8d
int Index; // r8d
int Result; // r8d
int n2; // r8d
n11 = HIDWORD(NicContext[11].field_08); /*0x1de5c*/
if ( n11 <= 11 ) /*0x1de6a*/
{
if ( n11 == 11 ) /*0x1de70*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel PCH2"); /*0x1df24*/
Status = n11 - 1; /*0x1de7b*/
if ( !Status ) /*0x1de7e*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel 82571"); /*0x1df18*/
NicConfig = Status - 1; /*0x1de84*/
if ( !NicConfig ) /*0x1de87*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel 82572"); /*0x1df0c*/
DevicePath = NicConfig - 1; /*0x1de89*/
if ( !DevicePath ) /*0x1de8c*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel 82573"); /*0x1df00*/
Protocol = DevicePath - 1; /*0x1de8e*/
if ( !Protocol ) /*0x1de91*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel 82574"); /*0x1def4*/
Buffer = Protocol - 1; /*0x1de93*/
if ( !Buffer ) /*0x1de96*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel 82583V"); /*0x1dee8*/
Index = Buffer - 1; /*0x1de98*/
if ( !Index ) /*0x1de9b*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel 80003ES2LAN"); /*0x1dedc*/
Result = Index - 1; /*0x1de9d*/
if ( !Result ) /*0x1dea0*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel ICH8"); /*0x1ded0*/
n2 = Result - 1; /*0x1dea2*/
if ( !n2 ) /*0x1dea5*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel ICH9"); /*0x1dec4*/
if ( n2 == 2 ) /*0x1deab*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel PCH"); /*0x1deb8*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"unknown"); /*0x1df7d*/
}
switch ( n11 ) /*0x1df2d*/
{
case 12: /*0x1df2d*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel PCH LPT"); /*0x1dfb2*/
case 13: /*0x1df2d*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel PCH SPT"); /*0x1dfa1*/
case 14: /*0x1df2d*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel 82575"); /*0x1df98*/
case 15: /*0x1df2d*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel 82576"); /*0x1df8f*/
}
if ( n11 != 16 ) /*0x1df45*/
{
if ( n11 <= 18 ) /*0x1df4d*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel i350"); /*0x1df74*/
if ( n11 == 19 ) /*0x1df53*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel i210"); /*0x1df6b*/
if ( n11 == 20 ) /*0x1df59*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel i211"); /*0x1df62*/
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"unknown"); /*0x1df59*/
}
return UtlCrc32Calc(ConfigStr, 0x50u, (unsigned __int8 *)L"Intel 82580");
}
// Function: NicParseAndApplyConfig @ 0x1dfb8 (0x615 bytes)
EFI_STATUS NicParseAndApplyConfig(struct NIC_CONTEXT *NicContext, unsigned __int8 *ConfigStr)
{
EFI_STATUS NicConfig; // esi
UINT64 STACK[0x7D0]_1; // rbp
EFI_STATUS result; // eax
unsigned __int16 NicConfig_1; // ax
unsigned __int8 *Protocol; // r12
unsigned __int16 NicConfig_2; // ax
unsigned __int8 *Index; // rbp
unsigned __int16 NicConfig_3; // ax
unsigned __int8 *Offset; // rbp
unsigned __int16 NicConfig_4; // ax
unsigned __int8 *PortNum; // rax
unsigned __int8 *PortNum_1; // rbp
unsigned __int16 Var11; // ax
EFI_STATUS Var11_1; // ebp
char Var13; // al
__int64 n23; // rdx
unsigned __int8 *Var14; // rsi
char Var15; // al
_WORD *Var16; // rcx
__int64 *p_Var15; // rdx
_BYTE *Var18; // rsi
_BYTE *Var18_2; // rbp
_BYTE *Var20; // rax
_BYTE *Var18_1; // r8
_BYTE *Var18_3; // r8
_BYTE *Var18_4; // r8
__int64 Var24; // [rsp+20h] [rbp-3B8h]
__int64 Var25; // [rsp+20h] [rbp-3B8h]
__int64 Var26; // [rsp+28h] [rbp-3B0h]
__int64 Var27; // [rsp+28h] [rbp-3B0h]
__int64 Var28; // [rsp+30h] [rbp-3A8h]
__int64 Var29; // [rsp+30h] [rbp-3A8h]
__int64 Var30; // [rsp+38h] [rbp-3A0h]
__int64 Var31; // [rsp+40h] [rbp-398h]
__int64 Var15_1; // [rsp+50h] [rbp-388h] BYREF
char Var33; // [rsp+5Eh] [rbp-37Ah]
_BYTE Var16_1[32]; // [rsp+60h] [rbp-378h] BYREF
char n91393[400]; // [rsp+80h] [rbp-358h] BYREF
char _r_n[456]; // [rsp+210h] [rbp-1C8h] BYREF
__int16 p_Var37; // [rsp+3E8h] [rbp+10h] BYREF
unsigned __int8 Var39; // [rsp+3EAh] [rbp+12h]
unsigned __int8 Var40; // [rsp+3EBh] [rbp+13h]
unsigned __int8 Var41; // [rsp+3ECh] [rbp+14h]
unsigned __int8 Var42; // [rsp+3EDh] [rbp+15h]
__int16 v48; // [rsp+3F0h] [rbp+18h] BYREF
UINT64 STACK[0x7D0]; // [rsp+3F8h] [rbp+20h] BYREF
NicConfig = 0; /*0x1dfd5*/
if ( *ConfigStr == 120 ) /*0x1dfdb*/
{
LABEL_29:
if ( (unsigned __int8)NvmLookupPciId1(NicContext) ) /*0x1e4aa*/
{
Var18 = UtlConfigSaveToNvm(NicContext[381].field_18, 196, ConfigStr); /*0x1e4db*/
Var18_2 = UtlConfigSaveToNvm(NicContext[381].field_18, 197, ConfigStr); /*0x1e4f2*/
Var20 = UtlConfigSaveToNvm(NicContext[381].field_18, 34, ConfigStr); /*0x1e4f5*/
UtlConfigHash(NicContext[381].field_18, 32, Var20, ConfigStr); /*0x1e50c*/
Var18_1 = Var18; /*0x1e52c*/
if ( LOBYTE(NicContext[426].field_08) ) /*0x1e52f*/
Var18_1 = Var18_2; /*0x1e538*/
UtlConfigHash(NicContext[381].field_18, 193, Var18_1, ConfigStr); /*0x1e53b*/
Var18_3 = Var18; /*0x1e557*/
if ( BYTE1(NicContext[426].field_08) ) /*0x1e55a*/
Var18_3 = Var18_2; /*0x1e563*/
UtlConfigHash(NicContext[381].field_18, 189, Var18_3, ConfigStr); /*0x1e566*/
Var18_4 = Var18; /*0x1e582*/
if ( BYTE2(NicContext[426].field_08) ) /*0x1e585*/
Var18_4 = Var18_2; /*0x1e58e*/
UtlConfigHash(NicContext[381].field_18, 191, Var18_4, ConfigStr); /*0x1e591*/
return UtlConfigHash(NicContext[381].field_18, 195, Var18, ConfigStr); /*0x1e5b5*/
}
return NicConfig; /*0x1e5b8*/
}
STACK[0x7D0]_1 = NicContext[381].field_10; /*0x1dfe1*/
STACK[0x7D0] = STACK[0x7D0]_1; /*0x1e002*/
UtlCrc32Calc(_r_n, 0xC8u, (unsigned __int8 *)L"%s", STACK[0x7D0]_1); /*0x1e006*/
if ( (unsigned __int8)NvmLookupPciId2(NicContext) ) /*0x1e00e*/
{
result = UtlConfigHash(NicContext[381].field_18, 5, _r_n, ConfigStr); /*0x1e098*/
if ( !(_WORD)result ) /*0x1e09e*/
return result; /*0x1e09e*/
}
else
{
UtlCrc32Calc( /*0x1e075*/
_r_n,
0xC8u,
(unsigned __int8 *)L"%s - %02x:%02x:%02x:%02x:%02x:%02x",
STACK[0x7D0]_1,
LOBYTE(NicContext[11].field_00),
BYTE1(NicContext[11].field_00),
BYTE2(NicContext[11].field_00),
BYTE3(NicContext[11].field_00),
BYTE4(NicContext[11].field_00),
BYTE5(NicContext[11].field_00));
}
NicConfig_1 = UtlConfigHash(NicContext[381].field_18, 2, _r_n, ConfigStr); /*0x1e0bb*/
NicConfig = NicConfig_1; /*0x1e0c0*/
if ( !NicConfig_1 ) /*0x1e0c6*/
return NicConfig; /*0x1e0c6*/
Protocol = UtlConfigSaveToNvm(NicContext[381].field_18, 41, ConfigStr); /*0x1e0e0*/
if ( !Protocol ) /*0x1e0e6*/
return NicConfig; /*0x1e0e6*/
UtlCrc32Calc( /*0x1e11e*/
n91393,
0xC8u,
Protocol,
NicContext[321].field_00,
NicContext[321].field_08,
NicContext[321].field_10,
STACK[0x7D0]_1);
(*(void (__fastcall **)(unsigned __int8 *))(BootServices + 72))(Protocol); /*0x1e12d*/
NicConfig_2 = UtlConfigHash(NicContext[381].field_18, 41, n91393, ConfigStr); /*0x1e147*/
NicConfig = NicConfig_2; /*0x1e14c*/
if ( !NicConfig_2 ) /*0x1e152*/
return NicConfig; /*0x1e152*/
MacSetRarEntry((__int64)NicContext, &p_Var37, &v48); /*0x1e16b*/
Index = UtlConfigSaveToNvm(NicContext[381].field_18, 9, ConfigStr); /*0x1e188*/
if ( !Index ) /*0x1e18e*/
return NicConfig; /*0x1e18e*/
LODWORD(Var31) = Var42; /*0x1e1c8*/
LODWORD(Var30) = Var41; /*0x1e1cc*/
LODWORD(Var28) = Var40; /*0x1e1d0*/
LODWORD(Var26) = Var39; /*0x1e1d5*/
LODWORD(Var24) = HIBYTE(p_Var37); /*0x1e1e8*/
UtlCrc32Calc(n91393, 0xC8u, Index, (unsigned __int8)p_Var37, Var24, Var26, Var28, Var30, Var31); /*0x1e1ed*/
(*(void (__fastcall **)(unsigned __int8 *))(BootServices + 72))(Index); /*0x1e1fc*/
NicConfig_3 = UtlConfigHash(NicContext[381].field_18, 9, n91393, ConfigStr); /*0x1e214*/
NicConfig = NicConfig_3; /*0x1e219*/
if ( !NicConfig_3 ) /*0x1e21f*/
return NicConfig; /*0x1e21f*/
Offset = UtlConfigSaveToNvm(NicContext[381].field_18, 14, ConfigStr); /*0x1e23d*/
if ( !Offset ) /*0x1e243*/
return NicConfig; /*0x1e243*/
UtlCrc32Calc(n91393, 0xC8u, Offset, NicContext[321].field_00, NicContext[321].field_08, NicContext[321].field_10); /*0x1e276*/
(*(void (__fastcall **)(unsigned __int8 *))(BootServices + 72))(Offset); /*0x1e285*/
NicConfig_4 = UtlConfigHash(NicContext[381].field_18, 14, n91393, ConfigStr); /*0x1e29d*/
NicConfig = NicConfig_4; /*0x1e2a2*/
if ( !NicConfig_4 ) /*0x1e2a8*/
return NicConfig; /*0x1e2a8*/
NvmGetVersionInfo(0, "eng", &STACK[0x7D0]); /*0x1e2bf*/
PortNum = UtlConfigSaveToNvm(NicContext[381].field_18, 27, ConfigStr); /*0x1e2d7*/
PortNum_1 = PortNum; /*0x1e2dc*/
if ( !PortNum ) /*0x1e2e2*/
return NicConfig; /*0x1e2e2*/
UtlCrc32Calc(n91393, 0xC8u, PortNum, STACK[0x7D0]); /*0x1e2fe*/
(*(void (__fastcall **)(unsigned __int8 *))(BootServices + 72))(PortNum_1); /*0x1e30d*/
Var11 = UtlConfigHash(NicContext[381].field_18, 27, n91393, ConfigStr); /*0x1e325*/
Var11_1 = Var11; /*0x1e32a*/
if ( !Var11 ) /*0x1e330*/
return Var11_1; /*0x1e330*/
Var13 = NvmLookupPciId2(NicContext); /*0x1e33d*/
n23 = 23; /*0x1e352*/
if ( !Var13 ) /*0x1e35a*/
n23 = 24; /*0x1e35c*/
Var14 = UtlConfigSaveToNvm(NicContext[381].field_18, n23, ConfigStr); /*0x1e364*/
if ( !Var14 ) /*0x1e36a*/
return Var11_1; /*0x1e335*/
if ( (unsigned __int8)NvmLookupPciId2(NicContext) ) /*0x1e36f*/
{
LODWORD(Var29) = WORD2(NicContext[300].field_08); /*0x1e39a*/
LODWORD(Var27) = WORD1(NicContext[300].field_08); /*0x1e39e*/
LODWORD(Var25) = LOWORD(NicContext[300].field_08); /*0x1e3a2*/
UtlCrc32Calc(n91393, 0xC8u, Var14, HIWORD(NicContext[300].field_08), Var25, Var27, Var29); /*0x1e3b2*/
}
else
{
UtlCrc32Calc(n91393, 0xC8u, Var14, LOWORD(NicContext[300].field_08)); /*0x1e3cc*/
}
(*(void (__fastcall **)(unsigned __int8 *))(BootServices + 72))(Var14); /*0x1e3db*/
result = UtlConfigHash(NicContext[381].field_18, 24, n91393, ConfigStr); /*0x1e3f8*/
if ( (_WORD)result ) /*0x1e3fe*/
{
NicSetConfigItem(NicContext, n91393); /*0x1e40f*/
result = UtlConfigHash(NicContext[381].field_18, 20, n91393, ConfigStr); /*0x1e430*/
if ( (_WORD)result ) /*0x1e436*/
{
if ( !(unsigned int)NiiSnpTransmit((__int64)&NicContext[3], &Var15_1, 15) ) /*0x1e44b*/
{
Var15 = Var15_1; /*0x1e455*/
Var33 = 0; /*0x1e459*/
Var16 = Var16_1; /*0x1e45e*/
p_Var15 = &Var15_1; /*0x1e463*/
while ( Var15 ) /*0x1e47c*/
{
*Var16++ = Var15; /*0x1e46d*/
p_Var15 = (__int64 *)((char *)p_Var15 + 1); /*0x1e474*/
Var15 = *(_BYTE *)p_Var15; /*0x1e477*/
}
*Var16 = 0; /*0x1e47e*/
}
NicConfig = UtlConfigHash(NicContext[381].field_18, 17, Var16_1, ConfigStr); /*0x1e49b*/
goto LABEL_29; /*0x1e49b*/
}
}
return result; /*0x1e5bb*/
}
// Function: EepromFindUndiRomEntry @ 0x1e5d0 (0x92 bytes)
EFI_STATUS EepromFindUndiRomEntry(UINT64 a1, UINT64 RomBase, UINT64 *pEntry, UINT64 *pData)
{
UINT64 v4; // rcx
UINT64 v5; // r10
UINT64 i; // rdx
v4 = RomBase + 20; /*0x1e5de*/
v5 = RomBase + *(unsigned int *)(RomBase + 16); /*0x1e5e5*/
if ( RomBase + 20 < v5 ) /*0x1e5eb*/
{
do /*0x1e641*/
{
if ( *(_BYTE *)(v4 + 3) == 2 ) /*0x1e5ff*/
{
for ( i = v4 + 4; i < v4 + (*(_DWORD *)v4 & 0xFFFFFF); i += *(_BYTE *)(i + 1) & 0x7F ) /*0x1e604*/
{
if ( *(_BYTE *)i == 14 && *(_OWORD *)(i + 2) == *(_OWORD *)&pProtocol2_ ) /*0x1e61d*/
{
*pEntry = v4; /*0x1e658*/
*pData = i; /*0x1e65b*/
return 0; /*0x1e660*/
}
}
}
v4 += *(_DWORD *)v4 & 0xFFFFFF; /*0x1e63b*/
}
while ( v4 < v5 ); /*0x1e641*/
}
return 14; /*0x1e657*/
}
// Function: NicFinalizeInit @ 0x1e664 (0x252 bytes)
EFI_STATUS NicFinalizeInit(struct NIC_CONTEXT *NicContext)
{
_QWORD *NicConfig; // rax
_QWORD *NicConfig_1; // rdi
__int64 Protocol; // rbx
_BYTE *Buffer; // rax
UINT64 Index; // rax
UINT64 Result; // rdx
UINT64 PortNum; // rsi
_BYTE *RomBase; // r12
__int64 Protocol_1; // rax
__int64 Var11; // r10
__int64 Var12; // rcx
__int64 Var13; // r10
__int64 Protocol_2; // rax
__int64 Var14; // [rsp+20h] [rbp-38h] BYREF
unsigned __int64 Var15; // [rsp+28h] [rbp-30h]
__int64 Var18; // [rsp+68h] [rbp+10h] BYREF
UINT64 Var19; // [rsp+70h] [rbp+18h] BYREF
_DWORD *pEntry_; // [rsp+78h] [rbp+20h] BYREF
Var14 = 0x45A03A6AF005E403LL; /*0x1e677*/
Var15 = 0xEB7F3BB3456DFA8AuLL; /*0x1e689*/
NicConfig = UtlMemAlloc(); /*0x1e6b6*/
NicConfig_1 = NicConfig; /*0x1e6bb*/
if ( !NicConfig ) /*0x1e6c1*/
{
LODWORD(Protocol) = 9; /*0x1e6c3*/
return Protocol; /*0x1e8a7*/
}
Buffer = UtlMemAllocPool((__int64)NicConfig, &Var14, 0, 22); /*0x1e6e3*/
if ( !Buffer ) /*0x1e6eb*/
goto LABEL_4; /*0x1e6eb*/
Buffer[18] = 3; /*0x1e6fc*/
Buffer[19] = 2; /*0x1e700*/
*((_WORD *)Buffer + 10) = 41; /*0x1e709*/
Index = NicContext[426].field_10; /*0x1e70d*/
Result = NicContext[381].field_18; /*0x1e714*/
Var18 = 0; /*0x1e71b*/
Protocol = (*(__int64 (__fastcall **)(UINT64, UINT64, __int64 *, _QWORD))(Index + 32))(Index, Result, &Var18, 0); /*0x1e72f*/
if ( Protocol == 0x8000000000000005uLL ) /*0x1e73f*/
{
PortNum = UtlAllocZero(4, Var18); /*0x1e758*/
if ( !PortNum ) /*0x1e75e*/
{
LABEL_4:
Protocol = 0x8000000000000009uLL; /*0x1e6ed*/
goto LABEL_15; /*0x1e6f7*/
}
Protocol = (*(__int64 (__fastcall **)(UINT64, UINT64, __int64 *, UINT64))(NicContext[426].field_10 + 32))( /*0x1e77c*/
NicContext[426].field_10,
NicContext[381].field_18,
&Var18,
PortNum);
if ( !Protocol ) /*0x1e782*/
{
RomBase = UtlStrCmp(4, Var18 + NicConfig_1[2]); /*0x1e79c*/
if ( RomBase ) /*0x1e7a2*/
{
LODWORD(Protocol_1) = EepromFindUndiRomEntry((UINT64)&pProtocol2_, PortNum, (UINT64 *)&pEntry_, &Var19); /*0x1e7c7*/
Protocol = Protocol_1; /*0x1e7cc*/
if ( !Protocol_1 ) /*0x1e7d2*/
{
UtlMemCpy(RomBase, (_BYTE *)PortNum, Var19 + (*(_BYTE *)(Var19 + 1) & 0x7F) - PortNum); /*0x1e7f5*/
UtlMemCpy(&RomBase[Var11], (_BYTE *)*NicConfig_1, NicConfig_1[2]); /*0x1e805*/
UtlMemCpy( /*0x1e819*/
(_BYTE *)(NicConfig_1[2] + Var12),
(_BYTE *)(Var13 + PortNum),
*(unsigned int *)(PortNum + 16) - Var13);
LODWORD(Protocol_2) = EepromFindUndiRomEntry((UINT64)&pProtocol2_, (UINT64)RomBase, (UINT64 *)&Var14, &Var19); /*0x1e832*/
Protocol = Protocol_2; /*0x1e837*/
if ( !Protocol_2 ) /*0x1e83d*/
{
*((_DWORD *)RomBase + 4) = *(_DWORD *)(PortNum + 16) + *((_DWORD *)NicConfig_1 + 4); /*0x1e848*/
*(_DWORD *)Var14 ^= (*(_DWORD *)Var14 ^ (*pEntry_ + *((_DWORD *)NicConfig_1 + 4))) & 0xFFFFFF; /*0x1e864*/
Protocol = (*(__int64 (__fastcall **)(UINT64, UINT64, _BYTE *))(NicContext[426].field_10 + 16))( /*0x1e87a*/
NicContext[426].field_10,
NicContext[381].field_18,
RomBase);
}
}
(*(void (__fastcall **)(_BYTE *))(BootServices + 72))(RomBase); /*0x1e887*/
}
else
{
Protocol = 0x8000000000000009uLL; /*0x1e7a4*/
}
}
(*(void (__fastcall **)(UINT64))(BootServices + 72))(PortNum); /*0x1e894*/
}
LABEL_15:
UtlMemFree(NicConfig_1); /*0x1e897*/
if ( Protocol < 0 ) /*0x1e8a2*/
return Protocol; /*0x1e8a2*/
return 0; /*0x1e8ab*/
}
// Function: NicStrMatch @ 0x1e8b8 (0xf4 bytes)
UINT64 NicStrMatch(UINT64 Status, char *Str1, char *Str2)
{
_BYTE *NicConfig; // rax
UINT64 DevicePath; // r11
unsigned __int64 i; // r10
_BYTE *Protocol; // rcx
_BYTE *Buffer; // r8
char Index; // al
unsigned __int64 Result; // rdx
const char *j; // rax
_BYTE *Offset; // rcx
__int64 Table; // r8
_BYTE *PortNum; // rcx
_BYTE *Buffer_2; // r10
_BYTE Buffer_1[520]; // [rsp+20h] [rbp-208h] BYREF
NicConfig = UtlStrCmp(4, 77569); /*0x1e8d3*/
if ( !NicConfig ) /*0x1e8e0*/
return 0; /*0x1e8e2*/
UtlMemCpy(NicConfig, &dword_1DB0, 77569); /*0x1e8f6*/
for ( i = DevicePath + 4; i < DevicePath + 77569; i += *(_DWORD *)i & 0xFFFFFF ) /*0x1e8fb*/
{
Protocol = (_BYTE *)(i + 46); /*0x1e905*/
Buffer = Buffer_1; /*0x1e909*/
Index = *(_BYTE *)(i + 46); /*0x1e90e*/
Result = i + 46; /*0x1e910*/
while ( Index ) /*0x1e924*/
{
Buffer += 2; /*0x1e915*/
Index = *(_BYTE *)++Result; /*0x1e91f*/
}
for ( j = "x-RIS-UEFI"; *Protocol && *Protocol == *j; ++j ) /*0x1e926*/
++Protocol; /*0x1e933*/
if ( *Protocol == *j ) /*0x1e948*/
{
Offset = (_BYTE *)(i + 46); /*0x1e95c*/
Table = 0; /*0x1e960*/
if ( *(_BYTE *)(i + 46) ) /*0x1e963*/
{
do /*0x1e96b*/
++Table; /*0x1e968*/
while ( Offset[Table] ); /*0x1e96b*/
}
UtlMemCpy(Offset, "x-UEFI-RIS", Table + 1); /*0x1e97b*/
Buffer_2 = Buffer_1; /*0x1e980*/
while ( *PortNum ) /*0x1e996*/
{
Buffer_2 += 2; /*0x1e987*/
++PortNum; /*0x1e98e*/
}
return DevicePath; /*0x1e996*/
}
}
return DevicePath; /*0x1e9a3*/
}
// Function: NicControllerInit @ 0x1e9ac (0x1e6 bytes)
EFI_STATUS NicControllerInit(struct NIC_CONTEXT *NicContext)
{
UINT64 NicConfig; // rsi
int *NicConfig_2; // rbx
UINT64 NicConfig_1; // rax
UINT64 Buffer; // rbx
__int64 Var10_1; // rax
UINT64 Index; // rcx
__int64 Result; // r8
__int64 Offset; // r9
bool Table; // zf
unsigned __int64 n200_1; // rbx
unsigned __int8 n59; // cl
__int64 PortNum; // rax
__int64 v14; // rax
int Var10; // ebx
unsigned __int8 n91393[208]; // [rsp+30h] [rbp-1A8h] BYREF
_BYTE Var13[208]; // [rsp+100h] [rbp-D8h] BYREF
__int16 Var14; // [rsp+1E0h] [rbp+8h] BYREF
unsigned __int64 n200; // [rsp+1E8h] [rbp+10h] BYREF
NicConfig = 0; /*0x1e9c1*/
NicConfig_2 = &Status_; /*0x1e9c8*/
if ( (unsigned __int8)NvmLookupPciId2(NicContext) ) /*0x1e9c3*/
{
NicConfig_1 = NicStrMatch((UINT64)&Status_, "x-RIS-UEFI", "x-UEFI-RIS"); /*0x1e9e4*/
NicConfig = NicConfig_1; /*0x1e9ec*/
if ( NicConfig_1 ) /*0x1e9ef*/
NicConfig_2 = (int *)NicConfig_1; /*0x1e9ef*/
}
Buffer = UtlMemAllocStruct(&pProtocol2_, NicContext[2].field_00, NicConfig_2, qword_450, 0); /*0x1ea13*/
if ( NicConfig ) /*0x1ea19*/
(*(void (__fastcall **)(UINT64))(BootServices + 72))(NicConfig); /*0x1ea25*/
if ( Buffer ) /*0x1ea2b*/
{
Index = NicContext[426].field_18; /*0x1ea56*/
NicContext[381].field_18 = Buffer; /*0x1ea59*/
n200 = 200; /*0x1ea60*/
(*(void (__fastcall **)(UINT64, UINT64, _BYTE *, unsigned __int64 *))(Index + 24))(Index, Buffer, Var13, &n200); /*0x1ea6c*/
if ( (unsigned __int8)NvmLookupPciId1(NicContext) /*0x1ea8e*/
&& MacReadPhyStatus((__int64)NicContext, &Var14, Result, Offset) >= 0 )
{
Table = (Var14 & 3) == 0; /*0x1ea90*/
LOBYTE(NicContext[426].field_08) = 0; /*0x1ea98*/
BYTE1(NicContext[426].field_08) = 0; /*0x1ea9f*/
BYTE2(NicContext[426].field_08) = 0; /*0x1eaa6*/
if ( !Table ) /*0x1eaad*/
LOBYTE(NicContext[426].field_08) = 1; /*0x1eaaf*/
if ( (Var14 & 0x10) != 0 ) /*0x1eabe*/
BYTE1(NicContext[426].field_08) = 1; /*0x1eac0*/
BYTE2(NicContext[426].field_08) = 0; /*0x1eac7*/
}
n200_1 = 0; /*0x1eace*/
if ( n200 ) /*0x1ead8*/
{
do /*0x1eb30*/
{
n59 = Var13[n200_1]; /*0x1eada*/
PortNum = 0; /*0x1eae1*/
while ( 1 ) /*0x1eae3*/
{
++n200_1; /*0x1eae3*/
if ( n59 == 59 ) /*0x1eae9*/
break; /*0x1eae9*/
n91393[PortNum] = n59; /*0x1eaeb*/
n59 = Var13[n200_1]; /*0x1eaef*/
++PortNum; /*0x1eaf6*/
if ( !n59 ) /*0x1eafb*/
goto LABEL_21; /*0x1eafb*/
}
n91393[PortNum++] = 0; /*0x1eaff*/
LABEL_21:
n91393[PortNum] = 0; /*0x1eb07*/
LODWORD(v14) = NicParseAndApplyConfig(NicContext, n91393); /*0x1eb14*/
}
while ( v14 >= 0 && Var13[n200_1] && n200_1 < n200 ); /*0x1eb30*/
}
LODWORD(Var10_1) = NicFinalizeInit(NicContext); /*0x1eb35*/
Var10 = Var10_1; /*0x1eb3a*/
if ( Var10_1 >= 0 ) /*0x1eb40*/
{
if ( !(unsigned __int8)NvmLookupPciId1(NicContext) /*0x1eb5c*/
|| (LODWORD(Var10_1) = PnpAddUndiChild((UINT64)NicContext), Var10 = Var10_1, Var10_1 >= 0) )
{
if ( !(unsigned __int8)NvmLookupPciId1(NicContext) /*0x1eb78*/
|| (LODWORD(Var10_1) = NicAddUndiCommand((UINT64)NicContext), Var10 = Var10_1, Var10_1 >= 0) )
{
LODWORD(Var10_1) = Var10; /*0x1eb7a*/
}
}
}
}
else
{
LODWORD(Var10_1) = 9; /*0x1ea2d*/
}
return Var10_1; /*0x1eb8d*/
}
// Function: UndiDevicePathBuild @ 0x1eb94 (0x743 bytes)
UINT64 UndiDevicePathBuild(struct NIC_CONTEXT *NicContext, void *DevPath, UINT64 *FullPath)
{
_WORD *v3; // r9
_WORD *v5; // r14
char FullPath_1; // r13
_BYTE *NicConfig; // rcx
char DevicePath; // di
UINT64 Protocol; // rsi
__int64 n1416; // rax
__int64 Buffer; // r12
const wchar_t *GUID_00000000000000000000000000000000&NAME_0000&PATH_00; // rax
__int64 Index; // rcx
__int64 Result; // rdx
_WORD *Buffer_1; // rax
__int64 i; // rcx
__int64 Table; // rbx
char *PortNum; // r15
__int64 Var10; // rbx
char *Var22_1; // rbx
char *j; // r11
char Var12; // al
char *Var22_7; // rcx
unsigned int n0xDF_1; // eax
char Var14; // al
char *Var15; // rbp
_BYTE *Var16; // rax
__int16 Var17; // cx
signed __int64 Var18; // rbp
char *Var22_6; // rcx
unsigned int n0xF_2; // eax
bool Var20; // al
char *Var21; // rbp
__int16 v34; // cx
signed __int64 Var23; // rbp
char *Var22_5; // rax
unsigned int n0xF_1; // ecx
int Var25; // eax
char V... [18100 chars total]
// Function: SnpGetSetInterruptStatus @ 0x1f2d8 (0x132 bytes)
// write access to const memory has been detected, the output may be wrong!
EFI_STATUS SnpGetSetInterruptStatus(struct NIC_CONTEXT *NicContext, UINT64 n2)
{
UINT64 *n4362; // r8
char MacAddr; // r9
char MacAddr_1; // di
unsigned __int16 DevPath; // bp
__int64 Size; // rbx
unsigned __int16 *p_n0xF; // [rsp+50h] [rbp+28h]
_QWORD *v10; // [rsp+58h] [rbp+30h]
MacAddr_1 = MacAddr; /*0x1f2f6*/
DevPath = (unsigned __int16)n4362; /*0x1f2f9*/
if ( p_n0xF && v10 ) /*0x1f311*/
{
*v10 = 0; /*0x1f317*/
if ( n2 ) /*0x1f31e*/
{
if ( n2 != 1 ) /*0x1f324*/
{
if ( n2 <= 2 || n2 > 4 ) /*0x1f330*/
LODWORD(Size) = 3; /*0x1f339*/
else
LODWORD(Size) = 0; /*0x1f332*/
return Size; /*0x1f334*/
}
Size = 0; /*0x1f356*/
if ( (_WORD)n4362 == 4362 ) /*0x1f35b*/
{
if ( MacAddr == 1 ) /*0x1f361*/
{
NvmPollReady((struct NIC_CONTEXT *)((char *)NicContext - 13608)); /*0x1f36d*/
byte_4737D = 1; /*0x1f372*/
}
else
{
Size = 0x8000000000000003uLL; /*0x1f37b*/
}
}
if ( Size < 0 ) /*0x1f388*/
return Size; /*0x1f388*/
byte_4737D = 0; /*0x1f38a*/
}
else
{
Size = 0; /*0x1f398*/
if ( (_WORD)n4362 == 4362 ) /*0x1f39d*/
{
if ( MacAddr == 1 ) /*0x1f3a3*/
{
NvmPollReady((struct NIC_CONTEXT *)((char *)NicContext - 13608)); /*0x1f3af*/
byte_4737D = 1; /*0x1f3b4*/
}
else
{
Size = 0x8000000000000003uLL; /*0x1f3bd*/
}
}
if ( Size < 0 ) /*0x1f3ca*/
return Size; /*0x1f3ca*/
}
LOBYTE(n4362) = MacAddr_1; /*0x1f3cf*/
LODWORD(Size) = UndiDevicePathBuild(NicContext, (void *)DevPath, n4362); /*0x1f3dd*/
return Size; /*0x1f3e3*/
}
return 2; /*0x1f403*/
}
// Function: SnpReceiveFilterInit @ 0x1f40c (0x196 bytes)
EFI_STATUS SnpReceiveFilterInit(struct NIC_CONTEXT *NicContext)
{
__int64 n1416; // rax
__int64 n32; // rax
char *MacAddr; // rcx
struct NIC_CONTEXT *Buffer; // rcx
char Size; // [rsp+20h] [rbp-28h] BYREF
_BYTE Result[8]; // [rsp+28h] [rbp-20h] BYREF
__int64 n3; // [rsp+30h] [rbp-18h]
__int64 Index; // [rsp+38h] [rbp-10h] BYREF
NicContext[426].field_18 = 0; /*0x1f420*/
NicContext[427].field_08 = 0; /*0x1f428*/
NicContext[427].field_00 = 0; /*0x1f430*/
NicContext[426].field_10 = 0; /*0x1f449*/
n1416 = (*(__int64 (__fastcall **)(__int64 *, _QWORD))(BootServices + 320))(qword_300, 0); /*0x1f456*/
if ( n1416 >= 0 ) /*0x1f45f*/
{
n1416 = (*(__int64 (__fastcall **)(__int64 *, _QWORD, UINT64 *))(BootServices + 320))( /*0x1f47c*/
qword_2D0,
0,
&NicContext[426].field_18);
if ( n1416 >= 0 ) /*0x1f485*/
{
n1416 = (*(__int64 (__fastcall **)(__int64 *, _QWORD, UINT64 *))(BootServices + 320))( /*0x1f4a2*/
&qword_2B0[2],
0,
&NicContext[427].field_08);
if ( n1416 >= 0 ) /*0x1f4ab*/
{
n1416 = (*(__int64 (__fastcall **)(__int64 *, _QWORD, struct NIC_CONTEXT *))(BootServices + 320))( /*0x1f4c8*/
qword_2E0,
0,
NicContext + 427);
if ( n1416 >= 0 ) /*0x1f4d1*/
{
n32 = 32; /*0x1f4d7*/
MacAddr = &Size; /*0x1f4dc*/
do /*0x1f4eb*/
{
*MacAddr++ = 0; /*0x1f4e1*/
--n32; /*0x1f4e7*/
}
while ( n32 ); /*0x1f4eb*/
(*(void (__fastcall **)(_QWORD, _QWORD, _BYTE *, __int64 *))(*(_QWORD *)(SystemTable + 64) + 24LL))( /*0x1f50d*/
*(_QWORD *)(SystemTable + 64),
*(int *)(*(_QWORD *)(*(_QWORD *)(SystemTable + 64) + 72LL) + 4LL),
Result,
&Index);
Index -= 3; /*0x1f511*/
NicContext[428].field_00 = (UINT64)PnpNotificationCallback; /*0x1f530*/
NicContext[428].field_08 = (UINT64)PnpStartNicInit; /*0x1f53d*/
n3 = 3; /*0x1f54b*/
NicContext[428].field_10 = (UINT64)SnpGetSetInterruptStatus; /*0x1f554*/
(*(void (__fastcall **)(struct NIC_CONTEXT *, __int64 *, _QWORD))(BootServices + 128))( /*0x1f562*/
NicContext + 2,
&qword_2E0[2],
0);
LODWORD(n1416) = NicControllerInit(NicContext); /*0x1f56b*/
if ( n1416 >= 0 ) /*0x1f573*/
{
n1416 = 1416; /*0x1f575*/
Buffer = NicContext + 382; /*0x1f57a*/
do /*0x1f58b*/
{
LOBYTE(Buffer->field_00) = 0; /*0x1f581*/
Buffer = (struct NIC_CONTEXT *)((char *)Buffer + 1); /*0x1f584*/
--n1416; /*0x1f587*/
}
while ( n1416 ); /*0x1f58b*/
}
}
}
}
}
return n1416; /*0x1f59c*/
}
// Function: SnpCheckNicType @ 0x1f5a4 (0x74 bytes)
EFI_STATUS SnpCheckNicType(struct NIC_CONTEXT *NicContext)
{
unsigned int v1; // r8d
_WORD *i; // rdx
v1 = 0; /*0x1f5b0*/
for ( i = (_WORD *)&qword_1B60[4] + 1; /*0x1f5b3*/
HIWORD(NicContext[300].field_08) != *(i - 1)
|| LOWORD(NicContext[300].field_08) != *i
|| WORD1(NicContext[300].field_08) != i[1]
|| WORD2(NicContext[300].field_08) != i[2];
i += 8 )
{
if ( ++v1 >= 0xB ) /*0x1f5f2*/
return 0; /*0x1f5f2*/
}
MacCheckLink((__int64)NicContext, qword_1B60[2 * v1 + 5], HIDWORD(qword_1B60[2 * v1 + 5])); /*0x1f60c*/
return 0; /*0x1f613*/
}
// Function: SnpGetLinkStatus @ 0x1f618 (0x44 bytes)
UINT64 SnpGetLinkStatus(struct NIC_CONTEXT *NicContext)
{
_BYTE *v1; // rdx
bool v2; // zf
UINT64 *v3; // rcx
_BYTE *v4; // rbx
int n3_1; // eax
int n3; // [rsp+30h] [rbp+8h] BYREF
v2 = &NicContext[380].field_10 == 0; /*0x1f61e*/
v3 = &NicContext[380].field_10; /*0x1f61e*/
v4 = v1; /*0x1f625*/
if ( !v2 && !(unsigned int)MacSetFilterEntry((__int64)v3, &n3) ) /*0x1f62f*/
{
n3_1 = n3; /*0x1f638*/
if ( n3 == 3 ) /*0x1f63f*/
{
*v4 = 1; /*0x1f641*/
return 0; /*0x1f64f*/
}
*v4 = 0; /*0x1f646*/
if ( !n3_1 ) /*0x1f64b*/
return 0; /*0x1f64b*/
}
return 255; /*0x1f656*/
}
// Function: SnpSetLinkSpeedDuplex @ 0x1f65c (0x2a bytes)
void SnpSetLinkSpeedDuplex(struct NIC_CONTEXT *NicContext)
{
_BYTE *v1; // rdx
unsigned int n3; // eax
n3 = 0; /*0x1f660*/
if ( *v1 ) /*0x1f662*/
n3 = 3; /*0x1f668*/
MacInitReceiveFilters((__int64)&NicContext[380].field_10, n3); /*0x1f675*/
}
// Function: SnpGetMacAddress @ 0x1f688 (0x3f bytes)
UINT64 SnpGetMacAddress(struct NIC_CONTEXT *NicContext)
{
_BYTE *v1; // rdx
_BYTE *v2; // rbx
__int16 v4; // [rsp+30h] [rbp+8h] BYREF
__int16 p_Var37; // [rsp+40h] [rbp+18h] BYREF
v2 = v1; /*0x1f68e*/
if ( MacSetRarEntry((__int64)NicContext, &p_Var37, &v4) ) /*0x1f69b*/
return 255; /*0x1f6a5*/
UtlMemCpy(v2, &v4, 6); /*0x1f6ba*/
return 0; /*0x1f6c1*/
}
// Function: SnpSetMacAddressStr @ 0x1f6c8 (0x96 bytes)
// write access to const memory has been detected, the output may be wrong!
UINT64 SnpSetMacAddressStr(struct NIC_CONTEXT *NicContext, char *MacStr)
{
int n16; // eax
unsigned __int64 inited; // rax
void (__fastcall *v7)(struct NIC_CONTEXT *, char *, _QWORD); // rax
struct NIC_CONTEXT *v8; // rbx
void (__fastcall *v9)(struct NIC_CONTEXT *); // rax
n16 = HIDWORD(NicContext[11].field_08); /*0x1f6d2*/
if ( n16 == 16 || n16 == 17 || n16 == 18 || n16 == 19 || n16 == 20 ) /*0x1f6f5*/
inited = MacWriteAddress((__int64)&NicContext[2].field_18, MacStr); /*0x1f706*/
else
inited = MacInitRarTable((__int64)&NicContext[2].field_18, MacStr); /*0x1f6fb*/
if ( inited ) /*0x1f70e*/
return 255; /*0x1f710*/
v7 = (void (__fastcall *)(struct NIC_CONTEXT *, char *, _QWORD))NicContext[9].field_18; /*0x1f717*/
v8 = NicContext + 3; /*0x1f71e*/
if ( v7 ) /*0x1f725*/
v7(v8, MacStr, 0); /*0x1f730*/
v9 = (void (__fastcall *)(struct NIC_CONTEXT *))v8[7].field_00; /*0x1f732*/
if ( v9 ) /*0x1f73f*/
v9(v8); /*0x1f741*/
else
NiiSnpInitialize((__int64 *)v8); /*0x1f745*/
byte_47100 = 1; /*0x1f74a*/
return 0; /*0x1f758*/
}
// Function: SnpGetInitStatus @ 0x1f760 (0x9 bytes)
UINT64 SnpGetInitStatus(struct NIC_CONTEXT *NicContext)
{
_DWORD *v1; // rdx
*v1 = 1; /*0x1f760*/
return 0; /*0x1f768*/
}
// Function: SnpSetPermanentMacAddress @ 0x1f76c (0x6e bytes)
EFI_STATUS SnpSetPermanentMacAddress(struct NIC_CONTEXT *NicContext)
{
void (__fastcall *v3)(struct NIC_CONTEXT *, __int16 *, _QWORD); // rax
struct NIC_CONTEXT *v4; // rbx
void (__fastcall *v5)(struct NIC_CONTEXT *); // rax
__int16 v6; // [rsp+30h] [rbp+8h] BYREF
__int16 p_Var37; // [rsp+40h] [rbp+18h] BYREF
if ( MacSetVlanFilter((__int64)NicContext) || MacSetRarEntry((__int64)NicContext, &p_Var37, &v6) ) /*0x1f793*/
return 255; /*0x1f77f*/
v3 = (void (__fastcall *)(struct NIC_CONTEXT *, __int16 *, _QWORD))NicContext[9].field_18; /*0x1f79d*/
v4 = NicContext + 3; /*0x1f7a4*/
if ( v3 ) /*0x1f7ab*/
v3(v4, &v6, 0); /*0x1f7b8*/
v5 = (void (__fastcall *)(struct NIC_CONTEXT *))v4[7].field_00; /*0x1f7ba*/
if ( v5 ) /*0x1f7c7*/
v5(v4); /*0x1f7c9*/
else
NiiSnpInitialize((__int64 *)v4); /*0x1f7cd*/
return 0; /*0x1f7d4*/
}
// Function: SnpReadConfigFromFs @ 0x1f7dc (0x2ab bytes)
// write access to const memory has been detected, the output may be wrong!
EFI_STATUS SnpReadConfigFromFs(struct NIC_CONTEXT *NicContext)
{
__int64 MacAddr; // rdx
_WORD *Handle_1; // r8
_WORD *Handle; // r13
__int64 MacAddr_1; // rsi
__int64 v6; // rax
__int64 i; // rax
__int64 Index; // rax
__int64 n2048; // rcx
_BYTE *Index_1; // rdx
char *PhyReg; // rbx
__int64 v12; // rdi
__int64 LinkStatus; // [rsp+50h] [rbp-48h] BYREF
__int64 Var10; // [rsp+58h] [rbp-40h] BYREF
__int64 Var11; // [rsp+60h] [rbp-38h] BYREF
__int64 Var12; // [rsp+68h] [rbp-30h] BYREF
_QWORD *Var13; // [rsp+70h] [rbp-28h] BYREF
_BYTE Var14[8]; // [rsp+78h] [rbp-20h] BYREF
__int64 Var15; // [rsp+B8h] [rbp+20h] BYREF
LinkStatus = 0; /*0x1f7f7*/
Handle = Handle_1; /*0x1f800*/
MacAddr_1 = MacAddr; /*0x1f815*/
v6 = (*(__int64 (__fastcall **)(__int64, char *, _QWORD, __int64 *, _QWORD **))(BootServices + 312))( /*0x1f828*/
2,
&byte_1B58,
0,
&Var12,
&Var13);
if ( v6 >= 0 ) /*0x1f831*/
{
if ( Var12 ) /*0x1f83d*/
{
v6 = (*(__int64 (__fastcall **)(_QWORD, char *, __int64 *, UINT64, __int64, int))(BootServices + 280))( /*0x1f877*/
*Var13,
&byte_1B58,
&Var10,
NicContext[1].field_08,
MacAddr_1,
2);
if ( v6 >= 0 ) /*0x1f880*/
{
byte_47100 = 0; /*0x1f8ad*/
for ( i = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, __int64 *, __int64 *, __int64 *, _BYTE *))Var10)( /*0x1f8c1*/
Var10,
MacAddr_1,
0,
&LinkStatus,
&Var11,
&Var15,
Var14);
;
i = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, __int64 *, __int64 *, __int64 *, _BYTE *))Var10)(
Var10,
MacAddr_1,
0,
&LinkStatus,
&Var11,
&Var15,
Var14) )
{
LODWORD(v12) = i; /*0x1fa2b*/
if ( i < 0 ) /*0x1fa31*/
break; /*0x1fa31*/
Index = UtlAllocZero(4, 2048); /*0x1f8e5*/
if ( Index ) /*0x1f8f0*/
{
n2048 = 2048; /*0x1f8f2*/
Index_1 = (_BYTE *)Index; /*0x1f8f7*/
do /*0x1f904*/
{
*Index_1++ = 0; /*0x1f8fa*/
--n2048; /*0x1f900*/
}
while ( n2048 ); /*0x1f904*/
}
*(_QWORD *)(Var15 + 16) = Index; /*0x1f913*/
*(_DWORD *)(Var15 + 24) = 2047; /*0x1f91f*/
PhyReg = UtlStrCmp(4, (unsigned int)(*(_DWORD *)(Var15 + 8) + 1)); /*0x1f94a*/
UtlMemCpy(PhyReg, *(_BYTE **)Var15, *(unsigned int *)(Var15 + 8)); /*0x1f94d*/
MacInitPhy( /*0x1f99b*/
Handle,
(__int64)&qword_1B60[26],
PhyReg,
*(_DWORD *)(Var15 + 8) + 1,
*(_BYTE **)(Var15 + 16),
(_DWORD *)(Var15 + 24),
(_BYTE *)(Var15 + 28),
(char *)(Var15 + 29),
(_WORD *)(Var15 + 30));
v12 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, __int64 *, __int64, __int64, __int64, _DWORD))(Var10 + 8))( /*0x1f9de*/
Var10,
MacAddr_1,
0,
&LinkStatus,
Var11,
Var15,
32,
0);
(*(void (__fastcall **)(char *))(BootServices + 72))(PhyReg); /*0x1f9e8*/
if ( v12 < 0 ) /*0x1f9ee*/
break; /*0x1f9ee*/
++LinkStatus; /*0x1f9f0*/
}
MacSetVlanFilter((__int64)Handle); /*0x1fa43*/
(*(void (__fastcall **)(__int64, char *, UINT64, __int64))(BootServices + 288))( /*0x1fa61*/
MacAddr_1,
&byte_1B58,
NicContext[1].field_08,
MacAddr_1);
LODWORD(v6) = v12; /*0x1fa67*/
}
}
else
{
LODWORD(v6) = 14; /*0x1f83f*/
}
}
return v6; /*0x1fa7e*/
}
// Function: SnpLookupConfigGuid @ 0x1fa88 (0x167 bytes)
UINT64 SnpLookupConfigGuid(struct NIC_CONTEXT *NicContext, void *GuidStr)
{
__int64 Buffer; // r8
_DWORD *Size; // r9
_DWORD *Size_1; // rdi
__int64 Buffer_1; // rsi
__int64 ConfigData; // rax
__int64 PhyReg; // rax
signed __int64 Offset; // rbx
unsigned __int64 LinkStatus; // rcx
_BYTE *Var10; // rax
unsigned __int64 LinkStatus_1; // [rsp+30h] [rbp-18h] BYREF
_BYTE Var12[16]; // [rsp+38h] [rbp-10h] BYREF
__int64 Var13; // [rsp+68h] [rbp+20h] BYREF
_QWORD *v16; // [rsp+70h] [rbp+28h]
_QWORD *v17; // [rsp+78h] [rbp+30h]
Size_1 = Size; /*0x1fa9c*/
Buffer_1 = Buffer; /*0x1fa9f*/
if ( !Size ) /*0x1faa8*/
return 0x8000000000000002uLL; /*0x1fab4*/
if ( GuidStr ) /*0x1fabc*/
{
ConfigData = (*(__int64 (__fastcall **)(void *, __int64 *, _BYTE *, __int64, void *, int))(BootServices + 280))( /*0x1faef*/
GuidStr,
qword_2B0,
Var12,
ImageHandle_1,
GuidStr,
16);
if ( ConfigData >= 0 ) /*0x1faf8*/
{
(*(void (__fastcall **)(void *, __int64 *, __int64, void *))(BootServices + 288))( /*0x1fb11*/
GuidStr,
qword_2B0,
ImageHandle_1,
GuidStr);
return 0x8000000000000003uLL; /*0x1fb32*/
}
if ( ConfigData != 0x8000000000000014uLL ) /*0x1fb26*/
return 0x8000000000000003uLL; /*0x1fb26*/
if ( Buffer_1 ) /*0x1fb3a*/
{
PhyReg = (*(__int64 (__fastcall **)(void *, __int64 *, __int64 *, unsigned __int64 *))(BootServices + 296))( /*0x1fb57*/
GuidStr,
qword_1D68,
&Var13,
&LinkStatus_1);
Offset = 0x8000000000000003uLL; /*0x1fb5d*/
if ( PhyReg < 0 ) /*0x1fb6a*/
return Offset; /*0x1fb6a*/
LinkStatus = 0; /*0x1fb76*/
if ( LinkStatus_1 ) /*0x1fb7b*/
{
Var10 = (_BYTE *)(Var13 + 16); /*0x1fb7d*/
while ( *((_QWORD *)Var10 - 1) != Buffer_1 || (*Var10 & 8) == 0 ) /*0x1fb8a*/
{
++LinkStatus; /*0x1fb8c*/
Var10 += 24; /*0x1fb8f*/
if ( LinkStatus >= LinkStatus_1 ) /*0x1fb96*/
goto LABEL_17; /*0x1fb96*/
}
Offset = 0; /*0x1fb9a*/
}
LABEL_17:
(*(void (__fastcall **)(__int64))(BootServices + 72))(Var13); /*0x1fba6*/
if ( Offset < 0 ) /*0x1fbac*/
return Offset; /*0x1fbb1*/
}
*Size_1 = 0; /*0x1fbb3*/
}
else
{
*Size = 0; /*0x1fbb8*/
}
if ( v16 ) /*0x1fbc4*/
*v16 = 0; /*0x1fbc6*/
if ( v17 ) /*0x1fbd2*/
*v17 = 0; /*0x1fbd4*/
return 0; /*0x1fbe9*/
}
// Function: SnpReadNvmConfig @ 0x1fbf0 (0x412 bytes)
EFI_STATUS SnpReadNvmConfig(struct NIC_CONTEXT *NicContext)
{
__int16 n10; // dx
struct NIC_CONTEXT *NicContext_1; // rbx
char v3; // si
int n3; // eax
void (__fastcall *v5)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v6)(struct NIC_CONTEXT *, __int64, __int64); // rax
void (__fastcall *v7)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v8)(struct NIC_CONTEXT *, __int64, __int64); // rax
__int64 n6192; // rdx
__int64 n462; // r8
int v11; // edi
void (__fastcall *v12)(struct NIC_CONTEXT *, __int64, __int64); // rax
void (__fastcall *v13)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v14)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v15)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v16)(struct NIC_CONTEXT *, __int64, __int64); // rax
void (__fastcall *v17)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v18)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
int v19; // eax
void (__fastcall *v20)(struct NIC_CONTEXT *, __int64, __int64); // rax
void (__fastcall *v21)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v22)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v23)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v24)(struct NIC_CONTEXT *, __int64, __int64); // rax
void (__fastcall *v25)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v26)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v27)(struct NIC_CONTEXT *, _QWORD, __int16 *); // rax
void (__fastcall *v28)(struct NIC_CONTEXT *, __int64, __int64); // rax
void (__fastcall *v29)(struct NIC_CONTEXT *, __int64, __int64); // rax
void (__fastcall *v30)(struct NIC_CONTEXT *, __int64, __int64); // rax
void (__fastcall *v31)(struct NIC_CONTEXT *, __int64, __int64); // rax
void (__fastcall *v32)(struct NIC_CONTEXT *, __int64, __int16 *); // r11
void (__fastcall *v33)(struct NIC_CONTEXT *, __int64, __int16 *); // rax
__int64 v34; // rax
__int16 v36; // [rsp+38h] [rbp+10h] BYREF
NicContext_1 = NicContext; /*0x1fc06*/
v36 = 0; /*0x1fc09*/
BYTE3(NicContext[26].field_00) = 0; /*0x1fc10*/
if ( n10 == 10 ) /*0x1fc1a*/
{
v20 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int64))NicContext[31].field_18; /*0x1fe31*/
if ( v20 ) /*0x1fe3b*/
v20(NicContext, 16, 2056); /*0x1fe48*/
v21 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext_1[31].field_18; /*0x1fe4a*/
if ( v21 ) /*0x1fe54*/
v21(NicContext_1, 0, 37184); /*0x1fe61*/
v22 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext_1[31].field_18; /*0x1fe63*/
if ( v22 ) /*0x1fe6d*/
v22(NicContext_1, 0, 33088); /*0x1fe7a*/
v23 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext_1[31].field_18; /*0x1fe7c*/
if ( v23 ) /*0x1fe86*/
v23(NicContext_1, 0, 33024); /*0x1fe93*/
v24 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int64))NicContext_1[31].field_18; /*0x1fe95*/
if ( v24 ) /*0x1fe9f*/
v24(NicContext_1, 20, 3076); /*0x1feaf*/
v25 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext_1[31].field_18; /*0x1feb1*/
if ( v25 ) /*0x1febb*/
v25(NicContext_1, 0, 33024); /*0x1fec8*/
v26 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext_1[31].field_18; /*0x1feca*/
if ( v26 ) /*0x1fed4*/
v26(NicContext_1, 0, 16640); /*0x1fee1*/
v19 = UtlRegisterWrite((__int64 *)NicContext_1, 0) & 0xFFFFE4BE | 0x1841; /*0x1fef2*/
goto LABEL_60; /*0x1fef2*/
}
if ( n10 == 100 ) /*0x1fc23*/
{
v12 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int64))NicContext[31].field_18; /*0x1fd67*/
if ( v12 ) /*0x1fd71*/
v12(NicContext, 16, 2056); /*0x1fd7e*/
v13 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext_1[31].field_18; /*0x1fd80*/
if ( v13 ) /*0x1fd8a*/
v13(NicContext_1, 0, 37184); /*0x1fd97*/
v14 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext_1[31].field_18; /*0x1fd99*/
if ( v14 ) /*0x1fda3*/
v14(NicContext_1, 0, 33088); /*0x1fdb0*/
v15 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext_1[31].field_18; /*0x1fdb2*/
if ( v15 ) /*0x1fdbc*/
v15(NicContext_1, 0, 33024); /*0x1fdc9*/
v16 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int64))NicContext_1[31].field_18; /*0x1fdcb*/
if ( v16 ) /*0x1fdd5*/
v16(NicContext_1, 20, 3092); /*0x1fde5*/
v17 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext_1[31].field_18; /*0x1fde7*/
if ( v17 ) /*0x1fdf1*/
v17(NicContext_1, 0, 57600); /*0x1fdfe*/
v18 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext_1[31].field_18; /*0x1fe00*/
if ( v18 ) /*0x1fe0a*/
v18(NicContext_1, 0, 24832); /*0x1fe17*/
v19 = UtlRegisterWrite((__int64 *)NicContext_1, 0) & 0xFFFFE43E | 0x19C1; /*0x1fe27*/
LABEL_60:
UtlRegisterAccess((__int64 *)NicContext_1, 0, v19); /*0x1fef7*/
v3 = 1; /*0x1ff04*/
goto LABEL_61; /*0x1ff04*/
}
if ( n10 != 1000 ) /*0x1fc2e*/
{
v3 = 0; /*0x1fc30*/
goto LABEL_61; /*0x1fc33*/
}
n3 = NicContext[33].field_10; /*0x1fc38*/
if ( n3 == 3 ) /*0x1fc41*/
{
v5 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext[31].field_18; /*0x1fc43*/
if ( v5 ) /*0x1fc4d*/
goto LABEL_21; /*0x1fc4d*/
goto LABEL_22; /*0x1fc4d*/
}
if ( n3 != 2 ) /*0x1fc58*/
{
if ( n3 != 5 ) /*0x1fca8*/
goto LABEL_22; /*0x1fca8*/
v8 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int64))NicContext[31].field_18; /*0x1fcaa*/
if ( !v8 ) /*0x1fcb4*/
goto LABEL_19; /*0x1fcb4*/
n6192 = 6192; /*0x1fcb6*/
n462 = 462; /*0x1fcbb*/
goto LABEL_18; /*0x1fcbb*/
}
v6 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int64))NicContext[31].field_18; /*0x1fc5a*/
if ( v6 ) /*0x1fc64*/
v6(NicContext, 16, 2056); /*0x1fc71*/
v7 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext_1[31].field_18; /*0x1fc73*/
if ( v7 ) /*0x1fc7d*/
v7(NicContext_1, 0, 37184); /*0x1fc8a*/
v8 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int64))NicContext_1[31].field_18; /*0x1fc8c*/
if ( v8 ) /*0x1fc96*/
{
n6192 = 0; /*0x1fc98*/
n462 = 33088; /*0x1fc9a*/
NicContext = NicContext_1; /*0x1fca0*/
LABEL_18:
v8(NicContext, n6192, n462); /*0x1fcc1*/
}
LABEL_19:
v5 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext_1[31].field_18; /*0x1fcc3*/
if ( v5 ) /*0x1fccd*/
{
NicContext = NicContext_1; /*0x1fccf*/
LABEL_21:
v5(NicContext, 0, 16704); /*0x1fcd2*/
}
LABEL_22:
v11 = UtlRegisterWrite((__int64 *)NicContext_1, 0) & 0xFFFFE4FE | 0x1A01; /*0x1fcdc*/
if ( HIDWORD(NicContext_1[34].field_18) == 3 ) /*0x1fcf9*/
{
UtlRegisterAccess((__int64 *)NicContext_1, 0, v11); /*0x1fd03*/
UtlRegisterRead(NicContext_1->field_00, (__int64)L"tion I218-V"); /*0x1fd10*/
v11 = UtlRegisterWrite((__int64 *)NicContext_1, 0); /*0x1fd1f*/
}
v3 = 1; /*0x1fd21*/
if ( HIDWORD(NicContext_1[34].field_18) == 1 ) /*0x1fd2c*/
{
if ( LODWORD(NicContext_1[33].field_10) == 2 ) /*0x1fd35*/
v11 |= 0x80u; /*0x1fd37*/
}
else if ( (UtlRegisterWrite((__int64 *)NicContext_1, 8u) & 1) == 0 ) /*0x1fd4d*/
{
v11 |= 0xC0u; /*0x1fd4f*/
}
UtlRegisterAccess((__int64 *)NicContext_1, 0, v11); /*0x1fd5d*/
LABEL_61:
v27 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int16 *))NicContext_1[30].field_00; /*0x1ff09*/
if ( v27 ) /*0x1ff13*/
v27(NicContext_1, 0, &v36); /*0x1ff1f*/
if ( LODWORD(NicContext_1[33].field_10) == 2 ) /*0x1ff28*/
{
v28 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int64))NicContext_1[31].field_18; /*0x1ff2e*/
if ( v28 ) /*0x1ff38*/
v28(NicContext_1, 29, 31); /*0x1ff46*/
v29 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int64))NicContext_1[31].field_18; /*0x1ff48*/
if ( v29 ) /*0x1ff57*/
v29(NicContext_1, 30, 36860); /*0x1ff64*/
v30 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int64))NicContext_1[31].field_18; /*0x1ff66*/
if ( v30 ) /*0x1ff70*/
v30(NicContext_1, 29, 26); /*0x1ff7e*/
v31 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int64))NicContext_1[31].field_18; /*0x1ff80*/
if ( v31 ) /*0x1ff8a*/
v31(NicContext_1, 30, 36848); /*0x1ff97*/
UtlRegisterRead(NicContext_1->field_00, 500); /*0x1ffa1*/
v32 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int16 *))NicContext_1[30].field_00; /*0x1ffa6*/
if ( v32 ) /*0x1ffb0*/
v32(NicContext_1, 16, &v36); /*0x1ffbf*/
v33 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int16 *))NicContext_1[30].field_00; /*0x1ffc2*/
if ( v33 ) /*0x1ffcc*/
v33(NicContext_1, 20, &v36); /*0x1ffdb*/
}
v34 = UtlRegisterRead(NicContext_1->field_00, (__int64)L"tion I218-V"); /*0x1ffe5*/
LOBYTE(v34) = v3; /*0x1fff4*/
return v34; /*0x1fffc*/
}
// Function: SnpCheckFwRevisionThunk @ 0x20004 (0x6 bytes)
__int64 Cfg_20004()
{
return SnpCheckFwRevision();
}
// Function: SnpCheckFwRevision @ 0x2000a (0xe2 bytes)
// positive sp value has been detected, the output may be wrong!
EFI_STATUS SnpCheckFwRevision(struct NIC_CONTEXT *NicContext)
{
int v2; // eax
int v3; // eax
int v4; // eax
int v5; // eax
UtlRegisterAccess((__int64 *)NicContext, 0x24u, 1040); /*0x2001c*/
UtlRegisterRead(NicContext->field_00, 10000); /*0x2002c*/
v2 = UtlRegisterWrite((__int64 *)NicContext, 0x18u); /*0x20039*/
UtlRegisterAccess((__int64 *)NicContext, 0x18u, v2 | 0xC00000); /*0x2004e*/
UtlRegisterRead(NicContext->field_00, 10000); /*0x20059*/
v3 = UtlRegisterWrite((__int64 *)NicContext, 0); /*0x20063*/
UtlRegisterAccess((__int64 *)NicContext, 0, v3 & 0xE7FFFFB6 | 0x41); /*0x20078*/
UtlRegisterRead(NicContext->field_00, 10000); /*0x20083*/
v4 = UtlRegisterWrite((__int64 *)NicContext, 0x4208u); /*0x20090*/
UtlRegisterAccess((__int64 *)NicContext, 0x4208u, v4 & 0xFFFEFFC6 | 0x39); /*0x200a7*/
UtlRegisterRead(NicContext->field_00, 10000); /*0x200b2*/
v5 = UtlRegisterWrite((__int64 *)NicContext, 0x34u); /*0x200bf*/
UtlRegisterAccess((__int64 *)NicContext, 0x34u, v5 & 0xFFFFFFFB); /*0x200d2*/
return UtlRegisterRead(NicContext->field_00, 10000);
}
// Function: SnpGetFwRevision @ 0x200ec (0x147 bytes)
EFI_STATUS SnpGetFwRevision(struct NIC_CONTEXT *NicContext)
{
__int16 n1080; // ax
int v3; // eax
int v4; // eax
int v5; // eax
int v6; // eax
int v7; // eax
int v8; // eax
int v9; // eax
n1080 = NicContext[297].field_08; /*0x200f2*/
if ( n1080 == 1080 || n1080 == 1082 || n1080 == 1084 || n1080 == 1088 ) /*0x20122*/
{
v3 = UtlRegisterWrite((__int64 *)NicContext, 0x24u); /*0x2012c*/
UtlRegisterAccess((__int64 *)NicContext, 0x24u, v3 & 0xFFFF0000 | 4); /*0x20144*/
v4 = UtlRegisterWrite((__int64 *)NicContext, 0xE10u); /*0x20151*/
UtlRegisterAccess((__int64 *)NicContext, 0xE10u, v4 | 0x10); /*0x20164*/
}
UtlRegisterAccess((__int64 *)NicContext, 0x24u, 1040); /*0x20177*/
v5 = UtlRegisterWrite((__int64 *)NicContext, 0x100u); /*0x20184*/
UtlRegisterAccess((__int64 *)NicContext, 0x100u, v5 | 0xC0); /*0x20199*/
v6 = UtlRegisterWrite((__int64 *)NicContext, 0); /*0x201a3*/
UtlRegisterAccess((__int64 *)NicContext, 0, v6 & 0xE7FFFFBE | 0x41); /*0x201b8*/
v7 = UtlRegisterWrite((__int64 *)NicContext, 0); /*0x201c2*/
UtlRegisterAccess((__int64 *)NicContext, 0, v7 & 0xFFFFE4FE | 0x1A01); /*0x201d8*/
v8 = UtlRegisterWrite((__int64 *)NicContext, 0x4208u); /*0x201e5*/
UtlRegisterAccess((__int64 *)NicContext, 0x4208u, v8 & 0xFFFEFFC6 | 0x39); /*0x201fc*/
v9 = UtlRegisterWrite((__int64 *)NicContext, 0x34u); /*0x20209*/
UtlRegisterAccess((__int64 *)NicContext, 0x34u, v9 & 0xFFFFFFFB); /*0x2021c*/
return UtlRegisterRead(NicContext->field_00, 500000); /*0x20229*/
}
// Function: SnpCheckAutoNegSpeed @ 0x20234 (0x62 bytes)
UINT64 SnpCheckAutoNegSpeed(struct NIC_CONTEXT *NicContext)
{
__int16 n100; // dx
void (__fastcall *v3)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
__int64 n16640; // r8
UINT64 result; // rax
if ( n100 == 10 ) /*0x20243*/
{
v3 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext[31].field_18; /*0x2026b*/
if ( v3 ) /*0x20275*/
{
n16640 = 16640; /*0x20277*/
goto LABEL_9; /*0x20277*/
}
}
else
{
v3 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext[31].field_18; /*0x20248*/
if ( n100 == 100 ) /*0x2024f*/
{
if ( v3 ) /*0x20261*/
{
n16640 = 24832; /*0x20263*/
goto LABEL_9; /*0x20269*/
}
}
else if ( v3 ) /*0x20254*/
{
n16640 = 16704; /*0x20256*/
LABEL_9:
v3(NicContext, 0, n16640); /*0x2027d*/
}
}
result = UtlRegisterRead(NicContext->field_00, 500000); /*0x20281*/
LOBYTE(result) = 1; /*0x2028e*/
return result; /*0x20290*/
}
// Function: SnpReadPhyRegister @ 0x20298 (0x289 bytes)
EFI_STATUS SnpReadPhyRegister(struct NIC_CONTEXT *NicContext, UINT32 PhyAddr)
{
__int64 v2; // r8
UINT16 PhyAddr_1; // di
int n4; // eax
int v6; // eax
void (__fastcall *v7)(struct NIC_CONTEXT *, __int64, unsigned __int16 *); // rax
void (__fastcall *v8)(struct NIC_CONTEXT *, __int64); // rax
void (__fastcall *v9)(struct NIC_CONTEXT *, _QWORD, unsigned __int16 *); // rax
void (__fastcall *v10)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v11)(struct NIC_CONTEXT *, __int64, unsigned __int16 *); // r11
void (__fastcall *v12)(struct NIC_CONTEXT *, __int64); // rax
__int16 v13; // r8
void (__fastcall *v14)(struct NIC_CONTEXT *, __int64, unsigned __int16 *); // rax
void (__fastcall *v15)(struct NIC_CONTEXT *, __int64); // rax
unsigned __int16 v16; // r8
void (__fastcall *v17)(struct NIC_CONTEXT *, __int64, unsigned __int16 *); // rax
void (__fastcall *v18)(struct NIC_CONTEXT *, __int64); // rax
unsigned __int16 v19; // r8
void (__fastcall *v20)(struct NIC_CONTEXT *, __int64, unsigned __int16 *); // rax
void (__fastcall *v21)(struct NIC_CONTEXT *, __int64); // rax
EFI_STATUS result; // eax
unsigned __int16 v23; // [rsp+48h] [rbp+10h] BYREF
PhyAddr_1 = PhyAddr; /*0x202b2*/
v23 = 0; /*0x202b8*/
n4 = HIDWORD(NicContext[8].field_08); /*0x202bc*/
if ( n4 == 4 || n4 == 5 ) /*0x202d0*/
{
v6 = UtlRegisterWrite((__int64 *)NicContext, 0); /*0x202d4*/
UtlRegisterAccess((__int64 *)NicContext, 0, v6 | 0x80); /*0x202e5*/
}
v7 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, unsigned __int16 *))NicContext[30].field_00; /*0x202ea*/
if ( PhyAddr_1 == 1000 ) /*0x202fb*/
{
if ( v7 ) /*0x20300*/
v7(NicContext, 85, &v23); /*0x2030f*/
v2 = v23; /*0x20311*/
LOWORD(v2) = v23 & 0xFFF8 | 6; /*0x20320*/
}
else if ( PhyAddr_1 == 100 ) /*0x2032b*/
{
if ( v7 ) /*0x20330*/
v7(NicContext, 85, &v23); /*0x2033f*/
LOWORD(v2) = v23 & 0xFFF8 | 5; /*0x20350*/
}
else
{
if ( v7 ) /*0x20359*/
v7(NicContext, 85, &v23); /*0x20368*/
LOWORD(v2) = v23 & 0xFFF8 | 4; /*0x20379*/
}
v8 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64))NicContext[31].field_18; /*0x2037d*/
v23 = v2; /*0x20384*/
if ( v8 ) /*0x2038d*/
{
v8(NicContext, 85); /*0x20397*/
LOWORD(v2) = v23; /*0x20399*/
}
v9 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, unsigned __int16 *))NicContext[30].field_00; /*0x2039f*/
if ( v9 ) /*0x203a9*/
{
v9(NicContext, 0, &v23); /*0x203b5*/
LOWORD(v2) = v23; /*0x203b7*/
}
v10 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext[31].field_18; /*0x203bd*/
if ( v10 ) /*0x203c7*/
{
LOWORD(v2) = v2 | 0x8000; /*0x203d0*/
v10(NicContext, 0, v2); /*0x203d7*/
}
UtlRegisterRead(NicContext->field_00, 1000); /*0x203df*/
v11 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, unsigned __int16 *))NicContext[30].field_00; /*0x203e4*/
if ( v11 ) /*0x203f3*/
v11(NicContext, 24624, &v23); /*0x203ff*/
v12 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64))NicContext[31].field_18; /*0x20408*/
v13 = v23 | 0xC; /*0x2040f*/
v23 |= 0xCu; /*0x20414*/
if ( v12 ) /*0x2041d*/
{
v12(NicContext, 24624); /*0x20424*/
v13 = v23; /*0x20426*/
}
v14 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, unsigned __int16 *))NicContext[30].field_00; /*0x2042c*/
if ( v14 ) /*0x2043c*/
{
v14(NicContext, 24848, &v23); /*0x20449*/
v13 = v23; /*0x2044b*/
}
v15 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64))NicContext[31].field_18; /*0x20451*/
v16 = v13 | 0x40; /*0x20458*/
v23 = v16; /*0x2045d*/
if ( v15 ) /*0x20466*/
{
v15(NicContext, 24848); /*0x2046e*/
v16 = v23; /*0x20470*/
}
v17 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, unsigned __int16 *))NicContext[30].field_00; /*0x20476*/
if ( v17 ) /*0x20480*/
{
v17(NicContext, 24624, &v23); /*0x2048c*/
v16 = v23; /*0x2048e*/
}
v18 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64))NicContext[31].field_18; /*0x20494*/
v19 = v16 | 0x40; /*0x2049b*/
v23 = v19; /*0x204a0*/
if ( v18 ) /*0x204a9*/
{
v18(NicContext, 24624); /*0x204b0*/
v19 = v23; /*0x204b2*/
}
v20 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, unsigned __int16 *))NicContext[30].field_00; /*0x204b8*/
if ( v20 ) /*0x204c7*/
{
v20(NicContext, 24628, &v23); /*0x204d3*/
v19 = v23; /*0x204d5*/
}
v21 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64))NicContext[31].field_18; /*0x204e4*/
v23 = v19 | 0x400; /*0x204eb*/
if ( v21 ) /*0x204f4*/
v21(NicContext, 24628); /*0x204fb*/
LOBYTE(result) = SnpInitPhyConfig(NicContext, PhyAddr_1); /*0x20503*/
return result; /*0x20517*/
}
// Function: SnpWritePhyRegister @ 0x20524 (0xd2 bytes)
EFI_STATUS SnpWritePhyRegister(struct NIC_CONTEXT *NicContext, UINT32 PhyAddr, UINT16 Value)
{
unsigned int n0x1388; // ebx
__int16 PhyAddr_1; // si
char inited; // bp
void (__fastcall *v7)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v8)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
EFI_STATUS result; // eax
n0x1388 = 0; /*0x2053c*/
PhyAddr_1 = PhyAddr; /*0x20544*/
inited = 0; /*0x2054e*/
if ( (_WORD)PhyAddr == 1000 ) /*0x20555*/
{
v7 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext[31].field_18; /*0x20557*/
if ( v7 ) /*0x20561*/
v7(NicContext, 0, 16704); /*0x2056b*/
inited = 1; /*0x2056d*/
}
else if ( (_WORD)PhyAddr == 100 ) /*0x20576*/
{
v8 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext[31].field_18; /*0x20578*/
if ( v8 ) /*0x20582*/
v8(NicContext, 0, 24832); /*0x2058c*/
}
else
{
inited = SnpInitPhyConfig(NicContext, PhyAddr); /*0x20598*/
}
do /*0x205a3*/
{
UtlRegisterRead(NicContext->field_00, (__int64)L"tion I218-V"); /*0x205a3*/
result = UtlRegisterWrite((__int64 *)NicContext, 8u); /*0x205b0*/
if ( (result & 3) != 0 ) /*0x205b7*/
{
if ( PhyAddr_1 == 1000 ) /*0x205bd*/
{
if ( (result & 0x80u) != 0 ) /*0x205c1*/
break; /*0x205c1*/
goto LABEL_15; /*0x205c1*/
}
if ( PhyAddr_1 != 100 || (result & 0x40) != 0 ) /*0x205cd*/
break; /*0x205cd*/
}
LABEL_15:
n0x1388 += 100; /*0x205cf*/
}
while ( n0x1388 < 0x1388 ); /*0x205a3*/
LOBYTE(result) = inited; /*0x205da*/
return result; /*0x205ec*/
}
// Function: SnpInitPhyConfig @ 0x205f8 (0x168 bytes)
char SnpInitPhyConfig(struct NIC_CONTEXT *NicContext, UINT16 Speed)
{
char v2; // di
__int16 v4; // r8
void (__fastcall *v5)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
int v6; // edi
void (__fastcall *v7)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v8)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
void (__fastcall *v9)(struct NIC_CONTEXT *, __int64, __int16 *); // rax
void (__fastcall *v10)(struct NIC_CONTEXT *, __int64); // rax
__int16 v12; // [rsp+38h] [rbp+10h] BYREF
v2 = 0; /*0x20602*/
v4 = 0; /*0x2060a*/
v12 = 0; /*0x2060e*/
BYTE3(NicContext[26].field_00) = 0; /*0x20613*/
switch ( Speed ) /*0x2061d*/
{
case 0xAu: /*0x2061d*/
v8 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext[31].field_18; /*0x2069b*/
if ( v8 ) /*0x206a5*/
{
v8(NicContext, 0, 16640); /*0x206af*/
v4 = v12; /*0x206b1*/
}
v9 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int16 *))NicContext[30].field_00; /*0x206b7*/
if ( v9 ) /*0x206c1*/
{
v9(NicContext, 16, &v12); /*0x206d0*/
v4 = v12; /*0x206d2*/
}
v10 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64))NicContext[31].field_18; /*0x206e1*/
v12 = v4 | 0x4000; /*0x206e8*/
if ( v10 ) /*0x206f1*/
v10(NicContext, 16); /*0x206fb*/
v6 = UtlRegisterWrite((__int64 *)NicContext, 0) & 0xFFFFE4FE | 0x1801; /*0x2070f*/
break;
case 0x64u: /*0x2061d*/
v7 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext[31].field_18; /*0x2066d*/
if ( v7 ) /*0x20677*/
v7(NicContext, 0, 24832); /*0x20681*/
v6 = UtlRegisterWrite((__int64 *)NicContext, 0) & 0xFFFFE4FE | 0x1901; /*0x20693*/
break;
case 0x3E8u: /*0x2061d*/
v5 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext[31].field_18; /*0x2062f*/
if ( v5 ) /*0x20639*/
v5(NicContext, 0, 16704); /*0x20643*/
UtlRegisterRead(NicContext->field_00, 250000); /*0x2064d*/
v6 = UtlRegisterWrite((__int64 *)NicContext, 0) & 0xFFFFE4FE | 0x1A01; /*0x20662*/
break;
default:
goto LABEL_21; /*0x20629*/
}
if ( HIDWORD(NicContext[34].field_18) != 1 && (UtlRegisterWrite((__int64 *)NicContext, 8u) & 1) == 0 ) /*0x2072d*/
v6 |= 0xC0u; /*0x2072f*/
UtlRegisterAccess((__int64 *)NicContext, 0, v6); /*0x2073d*/
v2 = 1; /*0x20742*/
LABEL_21:
UtlRegisterRead(NicContext->field_00, 500); /*0x20745*/
return v2; /*0x2075a*/
}
// Function: SnpConfigurePhy @ 0x20760 (0x12f bytes)
EFI_STATUS SnpConfigurePhy(struct NIC_CONTEXT *NicContext, UINT32 PhyAddr)
{
int v3; // eax
int v4; // eax
void (__fastcall *v5)(struct NIC_CONTEXT *, _QWORD, __int64); // rax
int v6; // eax
void (__fastcall *v7)(struct NIC_CONTEXT *, __int64, __int16 *); // rax
void (__fastcall *v8)(struct NIC_CONTEXT *, __int64, __int64); // r9
__int16 v9; // ax
void (__fastcall *v10)(struct NIC_CONTEXT *, __int64, __int16 *); // r9
void (__fastcall *v11)(struct NIC_CONTEXT *, __int64, _QWORD); // r9
unsigned __int16 v12; // ax
__int64 v13; // rax
__int16 v15; // [rsp+30h] [rbp+8h] BYREF
v15 = 0; /*0x20772*/
v3 = UtlRegisterWrite((__int64 *)NicContext, 0x18u); /*0x20777*/
UtlRegisterAccess((__int64 *)NicContext, 0x18u, v3 & 0xFF3FFFFF); /*0x2078a*/
v4 = UtlRegisterWrite((__int64 *)NicContext, 0xE14u); /*0x20797*/
UtlRegisterAccess((__int64 *)NicContext, 0xE14u, v4 & 0xFFFFFFFA); /*0x207aa*/
v5 = (void (__fastcall *)(struct NIC_CONTEXT *, _QWORD, __int64))NicContext[31].field_18; /*0x207af*/
if ( v5 ) /*0x207b9*/
v5(NicContext, 0, 16704); /*0x207c6*/
v6 = UtlRegisterWrite((__int64 *)NicContext, 0); /*0x207cd*/
UtlRegisterAccess((__int64 *)NicContext, 0, v6 & 0xFFFFE4FE | 0x1A01); /*0x207e3*/
v7 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int16 *))NicContext[30].field_00; /*0x207e8*/
if ( v7 ) /*0x207f2*/
v7(NicContext, 19, &v15); /*0x20801*/
v8 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int64))NicContext[31].field_18; /*0x20803*/
v9 = -32767; /*0x2080a*/
v15 = -32767; /*0x2080f*/
if ( v8 ) /*0x20817*/
{
v8(NicContext, 19, 32769); /*0x20824*/
v9 = v15; /*0x20827*/
}
v10 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, __int16 *))NicContext[30].field_00; /*0x2082c*/
if ( v10 ) /*0x20836*/
{
v10(NicContext, 23, &v15); /*0x20845*/
v9 = v15; /*0x20848*/
}
v11 = (void (__fastcall *)(struct NIC_CONTEXT *, __int64, _QWORD))NicContext[31].field_18; /*0x2084d*/
v12 = v9 | 0x2000; /*0x20859*/
v15 = v12; /*0x2085c*/
if ( v11 ) /*0x20864*/
v11(NicContext, 23, v12); /*0x20872*/
v13 = UtlRegisterRead(NicContext->field_00, 500000); /*0x2087d*/
LOBYTE(v13) = 1; /*0x20887*/
return v13; /*0x20889*/
}
// Function: NvmLookupPciId1 @ 0x234ac (0x5d bytes)
UINT64 NvmLookupPciId1(struct NIC_CONTEXT *NicContext)
{
__int64 v1; // r9
unsigned __int64 n0x36; // r8
UINT64 result; // rax
char *v4; // rcx
v1 = 0; /*0x234bd*/
n0x36 = 0; /*0x234c0*/
while ( 1 ) /*0x234c3*/
{
if ( *(_WORD *)((char *)qword_160F0 + n0x36) == LOWORD(NicContext[300].field_08) ) /*0x234c8*/
{
result = WORD1(NicContext[300].field_08); /*0x234ca*/
if ( *(_WORD *)((char *)qword_160F0 + n0x36 + 2) == (_WORD)result ) /*0x234d7*/
{
result = WORD2(NicContext[300].field_08); /*0x234d9*/
if ( *(_WORD *)((char *)qword_160F0 + n0x36 + 4) == (_WORD)result ) /*0x234e6*/
break; /*0x234e6*/
}
}
n0x36 += 6LL; /*0x234e8*/
++v1; /*0x234ec*/
if ( n0x36 >= 0x36 ) /*0x234f3*/
{
v4 = 0; /*0x234f5*/
goto LABEL_7; /*0x234f5*/
}
}
result = 3 * v1; /*0x234ff*/
v4 = (char *)qword_160F0 + 6 * v1; /*0x23503*/
LABEL_7:
LOBYTE(result) = v4 != 0; /*0x234f8*/
return result; /*0x234fe*/
}
// Function: NvmLookupPciId2 @ 0x2350c (0x5d bytes)
UINT64 NvmLookupPciId2(struct NIC_CONTEXT *NicContext)
{
__int64 v1; // r9
unsigned __int64 n0x36; // r8
UINT64 result; // rax
char *v4; // rcx
v1 = 0; /*0x2351d*/
n0x36 = 0; /*0x23520*/
while ( 1 ) /*0x23523*/
{
if ( *(_WORD *)((char *)qword_16128 + n0x36) == LOWORD(NicContext[300].field_08) ) /*0x23528*/
{
result = WORD1(NicContext[300].field_08); /*0x2352a*/
if ( *(_WORD *)((char *)qword_16128 + n0x36 + 2) == (_WORD)result ) /*0x23537*/
{
result = WORD2(NicContext[300].field_08); /*0x23539*/
if ( *(_WORD *)((char *)qword_16128 + n0x36 + 4) == (_WORD)result ) /*0x23546*/
break; /*0x23546*/
}
}
n0x36 += 6LL; /*0x23548*/
++v1; /*0x2354c*/
if ( n0x36 >= 0x36 ) /*0x23553*/
{
v4 = 0; /*0x23555*/
goto LABEL_7; /*0x23555*/
}
}
result = 3 * v1; /*0x2355f*/
v4 = (char *)qword_16128 + 6 * v1; /*0x23563*/
LABEL_7:
LOBYTE(result) = v4 != 0; /*0x23558*/
return result; /*0x2355e*/
}
// Function: NvmValidatePciId @ 0x2444c (0x1d1 bytes)
EFI_STATUS NvmValidatePciId(struct NIC_CONTEXT *NicContext, UINT64 PciCfg)
{
__int16 n10; // ax
UINT64 FwBlock; // rax
UINT64 Buffer; // rax
UINT64 Size; // rax
unsigned __int16 n53; // di
unsigned __int16 n52; // ax
void (__fastcall *Offset)(UINT64 *, _QWORD, __int64, __int16 *); // r10
void (__fastcall *Table)(UINT64 *, _QWORD, __int64, unsigned __int16 *); // rax
EFI_STATUS Result; // eax
unsigned __int16 Index; // [rsp+40h] [rbp+8h] BYREF
__int16 ConfigData; // [rsp+48h] [rbp+10h] BYREF
n10 = NicContext[346].field_00; /*0x24458*/
if ( n10 == 10 && BYTE2(NicContext[346].field_00) == 4 ) /*0x24471*/
{
BYTE6(NicContext[35].field_10) = 0; /*0x24473*/
BYTE3(NicContext[26].field_08) = 0; /*0x2447a*/
BYTE6(NicContext[26].field_00) = 1; /*0x24481*/
NicContext[345].field_10 = 0; /*0x24488*/
}
if ( n10 == 100 && BYTE2(NicContext[346].field_00) == 4 ) /*0x2449c*/
{
BYTE6(NicContext[35].field_10) = 0; /*0x2449e*/
BYTE3(NicContext[26].field_08) = 0; /*0x244a5*/
BYTE6(NicContext[26].field_00) = 4; /*0x244ac*/
NicContext[345].field_10 = 0; /*0x244b3*/
}
if ( n10 == 10 && BYTE2(NicContext[346].field_00) == 1 ) /*0x244c7*/
{
BYTE6(NicContext[35].field_10) = 0; /*0x244c9*/
BYTE3(NicContext[26].field_08) = 0; /*0x244d0*/
BYTE6(NicContext[26].field_00) = 2; /*0x244d7*/
NicContext[345].field_10 = 0; /*0x244de*/
}
if ( n10 == 100 && BYTE2(NicContext[346].field_00) == 1 ) /*0x244f2*/
{
BYTE6(NicContext[35].field_10) = 0; /*0x244f4*/
BYTE3(NicContext[26].field_08) = 0; /*0x244fb*/
BYTE6(NicContext[26].field_00) = 8; /*0x24502*/
NicContext[345].field_10 = 0; /*0x24509*/
}
FwBlock = NicContext[318].field_18; /*0x24510*/
if ( FwBlock ) /*0x2451a*/
{
Buffer = FwBlock - 1; /*0x2451c*/
if ( !Buffer ) /*0x24520*/
{
n53 = 53; /*0x24540*/
n52 = 52; /*0x24545*/
goto LABEL_21; /*0x24548*/
}
Size = Buffer - 1; /*0x24522*/
if ( !Size ) /*0x24526*/
{
n53 = 57; /*0x24536*/
n52 = 56; /*0x2453b*/
goto LABEL_21; /*0x2453e*/
}
if ( Size == 1 ) /*0x2452c*/
{
n53 = 59; /*0x2452e*/
n52 = 58; /*0x24531*/
goto LABEL_21; /*0x24534*/
}
}
n52 = 48; /*0x2454a*/
n53 = 49; /*0x2454f*/
LABEL_21:
Offset = (void (__fastcall *)(UINT64 *, _QWORD, __int64, __int16 *))NicContext[36].field_10; /*0x24552*/
if ( Offset ) /*0x2455c*/
Offset(&NicContext->field_08, n52, 1, &ConfigData); /*0x24570*/
Table = (void (__fastcall *)(UINT64 *, _QWORD, __int64, unsigned __int16 *))NicContext[36].field_10; /*0x24573*/
if ( Table ) /*0x2457d*/
Table(&NicContext->field_08, n53, 1, &Index); /*0x24591*/
Result = Index; /*0x24593*/
LOWORD(Result) = Index & 0xC000; /*0x2459d*/
if ( (Index & 0xC000) == 0x4000 ) /*0x245a8*/
{
Result = ConfigData & 0x1C00; /*0x245af*/
switch ( Result ) /*0x245b9*/
{
case 0x400u: /*0x245b9*/
BYTE6(NicContext[26].field_00) = 1; /*0x245f4*/
break;
case 0x800u: /*0x245b9*/
BYTE6(NicContext[26].field_00) = 4; /*0x245eb*/
break;
case 0x1400u: /*0x245b9*/
BYTE6(NicContext[26].field_00) = 2; /*0x245e2*/
break;
case 0x1800u: /*0x245b9*/
BYTE6(NicContext[26].field_00) = 8; /*0x245d9*/
break;
default:
BYTE3(NicContext[26].field_08) = 1; /*0x245d0*/
return Result; /*0x245d7*/
}
NicContext[345].field_10 = 0; /*0x245fb*/
BYTE3(NicContext[26].field_08) = 0; /*0x24602*/
BYTE6(NicContext[35].field_10) = 0; /*0x24609*/
}
return Result; /*0x24615*/
}
// Function: NvmCheckFwCompat @ 0x24a14 (0xa5 bytes)
UINT64 NvmCheckFwCompat(struct NIC_CONTEXT *NicContext)
{
UINT64 PciCfg; // rdx
_BYTE *v3; // rcx
char *v4; // rax
__int64 (*v5)(void); // rax
int v6; // eax
__int16 n6; // di
__int64 (*v8)(void); // rax
UINT64 result; // rax
v3 = (_BYTE *)NicContext[349].field_00; /*0x24a26*/
v4 = (char *)&loc_204FD + 2; /*0x24a2d*/
do /*0x24a40*/
{
--v4; /*0x24a34*/
*v3++ = 0; /*0x24a37*/
}
while ( v4 ); /*0x24a40*/
NvmValidatePciId(NicContext, PciCfg); /*0x24a45*/
if ( NicContext[345].field_10 ) /*0x24a4a*/
goto LABEL_9; /*0x24a51*/
v5 = (__int64 (*)(void))NicContext[5].field_00; /*0x24a57*/
if ( v5 ) /*0x24a61*/
v6 = v5(); /*0x24a63*/
else
v6 = -3; /*0x24a67*/
if ( !v6 ) /*0x24a6e*/
{
NicContext[345].field_10 = 1; /*0x24a70*/
LABEL_9:
n6 = 0; /*0x24a7b*/
NvmInitChecklist(NicContext); /*0x24a81*/
goto LABEL_10; /*0x24a81*/
}
n6 = 6; /*0x24a9a*/
LABEL_10:
v8 = (__int64 (*)(void))NicContext[7].field_08; /*0x24a86*/
if ( v8 ) /*0x24a94*/
result = v8(); /*0x24a96*/
else
result = NiiSnpInitialize((__int64 *)&NicContext->field_08); /*0x24aa1*/
LOWORD(result) = n6; /*0x24ab0*/
return result; /*0x24ab3*/
}
// Function: NvmInitChecklist @ 0x24abc (0x3f9 bytes)
char NvmInitChecklist(struct NIC_CONTEXT *NicContext)
{
__int64 n64; // r8
struct NIC_CONTEXT *FwBlock; // rcx
UINT64 Buffer; // rax
unsigned __int16 n0x3E8_1; // si
__int64 n64_1; // rax
__int64 Size; // rdx
__int64 Offset; // r9
UINT64 *Table; // r10
UINT64 Result; // rcx
UINT64 Index; // rcx
unsigned __int16 v12; // ax
unsigned __int16 v13; // ax
int n14; // eax
unsigned __int16 n0x3E8; // bp
int n14_1; // eax
unsigned __int16 v17; // ax
int n63; // r8d
int v19; // eax
int v20; // eax
int v21; // eax
int v22; // eax
int n16; // r11d
int v24; // eax
NvmRegInitFlash(NicContext); /*0x24ad5*/
n64 = 64; /*0x24ae5*/
FwBlock = NicContext + 359; /*0x24aeb*/
Buffer = (NicContext[349].field_00 + 127) & 0xFFFFFFFFFFFFFF80uLL; /*0x24af2*/
NicContext[358].field_00 = Buffer; /*0x24afa*/
n0x3E8_1 = 0; /*0x24b07*/
NicContext[358].field_08 = Buffer + 1024; /*0x24b09*/
n64_1 = 64; /*0x24b10*/
do /*0x24b1f*/
{
--n64_1; /*0x24b13*/
LOBYTE(FwBlock->field_00) = 0; /*0x24b16*/
FwBlock = (struct NIC_CONTEXT *)((char *)FwBlock + 1); /*0x24b19*/
}
while ( n64_1 ); /*0x24b1f*/
Size = 0; /*0x24b2e*/
Offset = 0; /*0x24b34*/
Table = &NicContext[361].field_08; /*0x24b37*/
NicContext[358].field_10 = NicContext[358].field_08 + 128; /*0x24b3e*/
do /*0x24b87*/
{
Result = Offset + NicContext[358].field_10; /*0x24b4c*/
Offset += 2048; /*0x24b57*/
*(_QWORD *)(Size + NicContext[358].field_00) = Result; /*0x24b5e*/
Index = *(_QWORD *)(Size + NicContext[358].field_00); /*0x24b69*/
Size += 16; /*0x24b6d*/
*Table++ = Index; /*0x24b71*/
--n64; /*0x24b7f*/
*(_BYTE *)(Size + NicContext[358].field_00 - 4) = 4; /*0x24b82*/
}
while ( n64 ); /*0x24b87*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x2800u, NicContext[358].field_00); /*0x24b99*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x2804u, HIDWORD(NicContext[358].field_00)); /*0x24bb8*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x2808u, 1024); /*0x24bcc*/
v12 = UtlRegisterWrite((__int64 *)&NicContext->field_08, 0x3810u); /*0x24bda*/
HIWORD(NicContext[357].field_10) = v12; /*0x24bec*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x3818u, v12); /*0x24bf3*/
LOWORD(NicContext[358].field_18) = HIWORD(NicContext[357].field_10); /*0x24c09*/
v13 = UtlRegisterWrite((__int64 *)&NicContext->field_08, 0x2810u); /*0x24c11*/
WORD2(NicContext[357].field_10) = v13; /*0x24c23*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x2818u, v13); /*0x24c2a*/
n14 = HIDWORD(NicContext[8].field_10); /*0x24c2f*/
if ( n14 != 14 && n14 != 15 && n14 != 16 && n14 != 17 && n14 != 18 && n14 != 19 && n14 != 20 ) /*0x24c60*/
{
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x280Cu, 0); /*0x24c6e*/
NvmReadShadow(NicContext, 0x2828u, 0x2000000u); /*0x24c85*/
n0x3E8 = 0; /*0x24c8a*/
do /*0x24cb8*/
{
++n0x3E8; /*0x24c9a*/
if ( (UtlRegisterWrite((__int64 *)&NicContext->field_08, 0x2828u) & 0x2000000) != 0 ) /*0x24ca7*/
break; /*0x24ca7*/
UtlRegisterRead((__int64)NicContext, 1); /*0x24caf*/
}
while ( n0x3E8 < 0x3E8u ); /*0x24cb8*/
}
n14_1 = HIDWORD(NicContext[8].field_10); /*0x24cc6*/
if ( n14_1 != 14 && n14_1 != 15 && n14_1 != 16 && n14_1 != 17 && n14_1 != 18 && n14_1 != 19 && n14_1 != 20 ) /*0x24ced*/
{
v17 = WORD2(NicContext[357].field_10); /*0x24cef*/
if ( v17 ) /*0x24d02*/
n63 = v17 - 1; /*0x24d10*/
else
n63 = 63; /*0x24d04*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x2818u, n63); /*0x24d13*/
}
if ( HIDWORD(NicContext[8].field_10) == 13 ) /*0x24d1f*/
{
v19 = UtlRegisterWrite((__int64 *)&NicContext->field_08, 0xE4u); /*0x24d30*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0xE4u, v19 | 4); /*0x24d41*/
v20 = UtlRegisterWrite((__int64 *)&NicContext->field_08, 0x5BB4u); /*0x24d51*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x5BB4u, v20 | 0x1800); /*0x24d64*/
v21 = UtlRegisterWrite((__int64 *)&NicContext->field_08, 0x5BBCu); /*0x24d74*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x5BBCu, v21 | 0x2000); /*0x24d86*/
v22 = UtlRegisterWrite((__int64 *)&NicContext->field_08, 0x3840u); /*0x24d96*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x3840u, v22 | 0x20000000); /*0x24da8*/
}
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x2170u, 0); /*0x24db9*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x5818u, 0); /*0x24dca*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x3800u, NicContext[358].field_08); /*0x24ddf*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x3804u, HIDWORD(NicContext[358].field_08)); /*0x24dfe*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x3808u, 128); /*0x24e0f*/
n16 = HIDWORD(NicContext[8].field_10); /*0x24e14*/
if ( n16 == 16 || n16 == 17 || n16 == 18 || n16 == 19 || n16 == 20 ) /*0x24e37*/
{
NvmReadShadow(NicContext, 0x3828u, 0x2000000u); /*0x24e49*/
do /*0x24e72*/
{
if ( (UtlRegisterWrite((__int64 *)&NicContext->field_08, 0x3828u) & 0x2000000) != 0 ) /*0x24e5d*/
break; /*0x24e5d*/
UtlRegisterRead((__int64)NicContext, 1); /*0x24e65*/
++n0x3E8_1; /*0x24e6a*/
}
while ( n0x3E8_1 < 0x3E8u ); /*0x24e72*/
}
v24 = UtlRegisterWrite((__int64 *)&NicContext->field_08, 0x400u); /*0x24e7d*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x400u, v24 | 0xA); /*0x24e91*/
return UtlMicroStall((__int64 *)&NicContext->field_08); /*0x24ea4*/
}
// Function: NvmRegInitFlash @ 0x250b0 (0x159 bytes)
void NvmRegInitFlash(struct NIC_CONTEXT *NicContext)
{
int v2; // eax
int n14; // eax
unsigned __int64 n0xC8; // rsi
int v5; // eax
int n14_1; // eax
__int64 n64; // rcx
_BYTE *v8; // rax
if ( LOBYTE(NicContext[357].field_18) ) /*0x250c9*/
{
if ( HIDWORD(NicContext[8].field_10) == 1 ) /*0x250dd*/
{
v2 = UtlRegisterWrite((__int64 *)&NicContext->field_08, 0x100u); /*0x250ea*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x100u, v2 & 0xFFFFFFFD); /*0x250fb*/
}
n14 = HIDWORD(NicContext[8].field_10); /*0x25100*/
if ( n14 == 14 || n14 == 15 || n14 == 16 || n14 == 17 || n14 == 18 || n14 == 19 || n14 == 20 ) /*0x25127*/
{
NvmWriteShadow(NicContext, 0x2828u, 0x2000000u); /*0x25137*/
n0xC8 = 0; /*0x2513c*/
do /*0x2516f*/
{
(*(void (__fastcall **)(__int64))(BootServices + 248))(1); /*0x2514b*/
v5 = UtlRegisterWrite((__int64 *)&NicContext->field_08, 0x2828u); /*0x2515a*/
++n0xC8; /*0x2515f*/
}
while ( n0xC8 < 0xC8 && (v5 & 0x2000000) != 0 ); /*0x2516f*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x2810u, 0); /*0x2517d*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x2818u, 0); /*0x2518e*/
WORD2(NicContext[357].field_10) = 0; /*0x25193*/
}
n14_1 = HIDWORD(NicContext[8].field_10); /*0x2519a*/
if ( n14_1 == 14 /*0x251c6*/
|| n14_1 == 15
|| n14_1 == 16
|| n14_1 == 17
|| n14_1 == 18
|| n14_1 == 19
|| n14_1 == 20
|| n14_1 == 1 )
{
n64 = 64; /*0x251cf*/
v8 = (_BYTE *)(NicContext[358].field_00 + 12); /*0x251d4*/
do /*0x251eb*/
{
*((_WORD *)v8 - 2) = 0; /*0x251d8*/
*v8 = 0; /*0x251dc*/
v8[1] = 0; /*0x251df*/
v8 += 16; /*0x251e3*/
--n64; /*0x251e7*/
}
while ( n64 ); /*0x251eb*/
}
LOBYTE(NicContext[357].field_18) = 0; /*0x251ed*/
}
}
// Function: NvmReadFwBlock @ 0x2520c (0x125 bytes)
EFI_STATUS NvmReadFwBlock(struct NIC_CONTEXT *NicContext)
{
EFI_STATUS result; // eax
unsigned __int64 n0xC8; // rsi
UINT64 *v4; // rcx
int v5; // eax
int n15; // r11d
int v7; // eax
if ( LOBYTE(NicContext[357].field_18) != 1 ) /*0x25225*/
{
n0xC8 = 0; /*0x2522b*/
v4 = &NicContext->field_08; /*0x2522d*/
*((_WORD *)v4 + 5588) = 0; /*0x25236*/
v5 = UtlRegisterWrite((__int64 *)v4, 0x100u); /*0x2523d*/
LOBYTE(result) = UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x100u, v5 | 0x8002); /*0x25253*/
n15 = HIDWORD(NicContext[8].field_10); /*0x25258*/
if ( n15 == 14 ) /*0x25263*/
{
DxeRegister_0((__int64)&NicContext->field_08); /*0x25297*/
}
else if ( n15 != 15 && n15 != 16 && n15 != 17 && n15 != 18 && n15 != 19 && n15 != 20 ) /*0x25287*/
{
LABEL_15:
LOBYTE(NicContext[357].field_18) = 1; /*0x2531a*/
return result; /*0x2531a*/
}
NvmReadShadow(NicContext, 0x2828u, 0x2000000u); /*0x252aa*/
do /*0x252df*/
{
(*(void (__fastcall **)(__int64))(BootServices + 248))(1); /*0x252bb*/
v7 = UtlRegisterWrite((__int64 *)&NicContext->field_08, 0x2828u); /*0x252ca*/
++n0xC8; /*0x252cf*/
}
while ( n0xC8 < 0xC8 && (v7 & 0x2000000) == 0 ); /*0x252df*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x2818u, 63); /*0x252f0*/
UtlRegisterAccess((__int64 *)&NicContext->field_08, 0x2810u, 0); /*0x25303*/
result = UtlRegisterWrite((__int64 *)&NicContext->field_08, 0x2810u); /*0x2530e*/
WORD2(NicContext[357].field_10) = result; /*0x25313*/
goto LABEL_15; /*0x25313*/
}
return result; /*0x2532b*/
}
// Function: NvmReadShadow @ 0x25594 (0x4d bytes)
EFI_STATUS NvmReadShadow(struct NIC_CONTEXT *NicContext, UINT32 Offset, UINT32 Value)
{
__int64 *v3; // rsi
EFI_STATUS v5; // ebx
v3 = (__int64 *)&NicContext->field_08; /*0x255a8*/
v5 = Value | UtlRegisterWrite((__int64 *)&NicContext->field_08, Offset); /*0x255c0*/
UtlRegisterAccess(v3, Offset, v5); /*0x255c5*/
return v5; /*0x255db*/
}
// Function: NvmWriteShadow @ 0x255e4 (0x4f bytes)
EFI_STATUS NvmWriteShadow(struct NIC_CONTEXT *NicContext, UINT32 Offset, UINT32 Value)
{
__int64 *v3; // rsi
EFI_STATUS v5; // ebx
v3 = (__int64 *)&NicContext->field_08; /*0x255f8*/
v5 = ~Value & UtlRegisterWrite((__int64 *)&NicContext->field_08, Offset); /*0x25612*/
UtlRegisterAccess(v3, Offset, v5); /*0x25617*/
return v5; /*0x2562d*/
}
// Function: NvmPollReady @ 0x25634 (0xd9 bytes)
UINT64 NvmPollReady(struct NIC_CONTEXT *NicContext)
{
int v1; // edx
void (__fastcall *v2)(UINT64 *); // rax
int v3; // edi
int n4; // eax
void (__fastcall *v6)(UINT64 *); // rax
int i; // edi
void (__fastcall *v8)(UINT64 *); // rax
void (__fastcall *v9)(UINT64 *); // rax
unsigned int n0xC8; // edi
UINT64 result; // rax
v2 = (void (__fastcall *)(UINT64 *))NicContext[6].field_08; /*0x25643*/
v3 = v1; /*0x2564a*/
if ( v2 ) /*0x25652*/
v2(&NicContext->field_08); /*0x25658*/
n4 = HIDWORD(NicContext[8].field_10); /*0x2565a*/
if ( n4 == 4 || n4 > 9 && n4 <= 13 ) /*0x2566d*/
{
for ( i = 1000 * v3; i; i = n0xC8 - 200 ) /*0x25698*/
{
v8 = (void (__fastcall *)(UINT64 *))NicContext[4].field_00; /*0x2569a*/
if ( v8 ) /*0x256a4*/
v8(&NicContext->field_08); /*0x256aa*/
UtlRegisterRead((__int64)NicContext, (__int64)&loc_30D3E + 2); /*0x256b4*/
v9 = (void (__fastcall *)(UINT64 *))NicContext[4].field_08; /*0x256b9*/
n0xC8 = i - 200; /*0x256c0*/
if ( v9 ) /*0x256c9*/
v9(&NicContext->field_08); /*0x256cf*/
if ( n0xC8 <= 0xC8 ) /*0x256d7*/
break; /*0x256d7*/
UtlRegisterRead((__int64)NicContext, (__int64)&loc_30D3E + 2); /*0x256e1*/
}
}
else
{
v6 = (void (__fastcall *)(UINT64 *))NicContext[1].field_18; /*0x2566f*/
if ( v6 ) /*0x25676*/
v6(&NicContext->field_08); /*0x2567c*/
UtlRegisterRead((__int64)NicContext, (unsigned int)(1000000 * v3)); /*0x25689*/
}
result = NicContext[2].field_10; /*0x256ee*/
if ( result ) /*0x256f5*/
return ((__int64 (__fastcall *)(UINT64 *))result)(&NicContext->field_08); /*0x256fb*/
return result; /*0x25707*/
}
// Function: NvmCheckConfigDone @ 0x25710 (0x5b bytes)
char __fastcall NvmCheckConfigDone(__int64 a1)
{
int v3; // [rsp+40h] [rbp+8h]
if ( *(_BYTE *)(a1 + 12077) == 1 ) /*0x25720*/
return 1; /*0x25720*/
(*(void (__fastcall **)(_QWORD, __int64, _QWORD))(*(_QWORD *)(a1 + 11096) + 16LL))(*(_QWORD *)(a1 + 11096), 2, 0); /*0x25750*/
if ( v3 == -1 ) /*0x25758*/
{
*(_BYTE *)(a1 + 12077) = 1; /*0x2575a*/
return 1; /*0x25724*/
}
return 0; /*0x25765*/
}
// Function: NvmUnsupported @ 0x25874 (0xb bytes)
unsigned __int64 Nvm_25874()
{
return 0x8000000000000003uLL; /*0x2587e*/
}
// Function: NvmInit @ 0x25880 (0x75 bytes)
unsigned __int64 __fastcall NvmInit(__int64 a1, _QWORD *a2, _QWORD *a3)
{
_BYTE *v6; // rcx
__int64 v7; // rcx
if ( !a1 || !a2 || !a3 ) /*0x258a9*/
return 0x8000000000000002uLL; /*0x25895*/
v6 = (_BYTE *)UtlAllocZero(4, 16); /*0x258b8*/
if ( !v6 ) /*0x258be*/
return 0x8000000000000009uLL; /*0x258c0*/
UtlMemCpy(v6, qword_160E0, 16); /*0x258d9*/
*a2 = v7; /*0x258de*/
*a3 = 1; /*0x258e1*/
return 0; /*0x258ef*/
}
// Function: NvmWriteField @ 0x258f8 (0x11d bytes)
__int64 __fastcall NvmWriteField(__int64 a1, char a2, unsigned __int16 n0xFFF, unsigned __int16 n7, unsigned __int8 a5)
{
__int64 result; // rax
__int64 v9; // r8
__int64 v10; // r9
__int64 v11; // rsi
__int64 v12; // rdi
__int64 v13; // r8
__int64 v14; // r9
__int64 v15; // [rsp+20h] [rbp-38h]
__int64 v16; // [rsp+28h] [rbp-30h]
__int64 v17; // [rsp+28h] [rbp-30h]
__int64 *v18; // [rsp+30h] [rbp-28h] BYREF
unsigned int v19; // [rsp+38h] [rbp-20h]
if ( n0xFFF > 0xFFFu || n7 > 7u || a5 > 1u ) /*0x25948*/
return 0x8000000000000002uLL; /*0x2592b*/
LODWORD(v16) = 2; /*0x25967*/
result = (*(__int64 (__fastcall **)(__int64, __int64 *, __int64 **, __int64))(BootServices + 280))( /*0x25974*/
a1,
qword_1D68,
&v18,
ImageHandle_1);
v11 = result; /*0x2597d*/
if ( result >= 0 ) /*0x25980*/
{
v12 = *v18; /*0x25989*/
UtlRegisterWrite((_QWORD *)(*v18 + 88), 0, v9, v10, 0, v16, (__int64)v18, v19); /*0x25990*/
if ( a2 ) /*0x25998*/
{
*(_BYTE *)(v12 + 12152) = 1; /*0x259a5*/
*(_WORD *)(v12 + 12154) = n0xFFF | ((a5 | (unsigned __int16)(2 * n7)) << 12); /*0x259bb*/
}
else
{
*(_BYTE *)(v12 + 12152) = 0; /*0x259c4*/
*(_WORD *)(v12 + 12154) = 0; /*0x259cb*/
}
UtlRegisterAccess((_QWORD *)(v12 + 88), 0); /*0x259e0*/
UtlRegisterWrite((_QWORD *)(v12 + 88), 0x38u, v13, v14, v15, v17, (__int64)v18, v19); /*0x259ee*/
return v11; /*0x259f3*/
}
return result; /*0x25a0a*/
}
// Function: NvmInitPciIdMapping @ 0x25a18 (0x1ba bytes)
unsigned __int64 __fastcall NvmInitPciIdMapping(__int64 NicContext)
{
__int16 v1; // r9
__int64 v3; // rcx
__int64 v4; // r8
__int64 v5; // rdx
_BYTE *p__r_n; // rdi
__int64 v7; // rax
__int64 v8; // r10
__int16 v9; // r9
__int16 v10; // r9
__int16 v11; // r9
unsigned __int64 n4156; // rax
_BYTE *p__r_n_1; // r9
v1 = -32634; /*0x25a31*/
v3 = -1; /*0x25a48*/
v4 = -1; /*0x25a4b*/
v5 = -1; /*0x25a4e*/
p__r_n = 0; /*0x25a51*/
v7 = 0; /*0x25a54*/
v8 = 0; /*0x25a61*/
while ( *(_WORD *)(NicContext + 9614) != v1 ) /*0x25a73*/
{
LABEL_12:
++v7; /*0x25ac3*/
v8 = 2 * v7; /*0x25ac9*/
v1 = qword_1010[2 * v7 + 2]; /*0x25acd*/
if ( v1 == -1 ) /*0x25ad6*/
goto LABEL_13; /*0x25ad6*/
}
v9 = WORD2(qword_1010[v8 + 2]); /*0x25a75*/
if ( *(_WORD *)(NicContext + 9608) != v9 ) /*0x25a83*/
{
if ( !v9 ) /*0x25abf*/
v3 = v7; /*0x25abf*/
goto LABEL_12; /*0x25abf*/
}
v10 = WORD1(qword_1010[v8 + 2]); /*0x25a85*/
if ( *(_WORD *)(NicContext + 9610) != v10 ) /*0x25a93*/
{
if ( !v10 ) /*0x25ab4*/
v4 = v7; /*0x25ab6*/
goto LABEL_12; /*0x25ab9*/
}
v11 = HIWORD(qword_1010[v8 + 2]); /*0x25a95*/
if ( *(_WORD *)(NicContext + 9612) != v11 ) /*0x25aa3*/
{
if ( !v11 ) /*0x25aa9*/
v5 = v7; /*0x25aab*/
goto LABEL_12; /*0x25aae*/
}
if ( v7 != -1 ) /*0x25aea*/
{
p__r_n = (_BYTE *)qword_1010[2 * v7 + 3]; /*0x25aef*/
goto LABEL_21; /*0x25af4*/
}
LABEL_13:
if ( v5 == -1 ) /*0x25adb*/
{
if ( v4 == -1 ) /*0x25af9*/
{
if ( v3 != -1 ) /*0x25b08*/
p__r_n = (_BYTE *)qword_1010[2 * v3 + 3]; /*0x25b0d*/
}
else
{
p__r_n = (_BYTE *)qword_1010[2 * v4 + 3]; /*0x25afe*/
}
}
else
{
p__r_n = (_BYTE *)qword_1010[2 * v5 + 3]; /*0x25ae0*/
}
LABEL_21:
if ( (unsigned __int8)NvmLookupPciId2((struct NIC_CONTEXT *)NicContext) /*0x25b47*/
|| (n4156 = 4156, *(_WORD *)(NicContext + 9610) == 4156)
&& (n4156 = 5390, *(_WORD *)(NicContext + 9608) == 5390)
&& (n4156 = 6016, *(_WORD *)(NicContext + 9612) == 6016) )
{
p__r_n_1 = p__r_n; /*0x25b49*/
p__r_n = &r_n; /*0x25b4c*/
n4156 = UtlCrc32Calc((char *)&r_n, 0x800u, (unsigned __int8 *)L"%s - NIC", p__r_n_1); /*0x25b62*/
}
if ( p__r_n ) /*0x25b6a*/
{
*(_QWORD *)(NicContext + 12208) = p__r_n; /*0x25b6c*/
UtlHexStrToBin("eng", "eng", (_BYTE **)(NicContext + 12200), p__r_n, 1); /*0x25b90*/
return UtlHexStrToBin( /*0x25bb2*/
"en-US",
eng, // "en-US"
(_BYTE **)(NicContext + 12200),
p__r_n,
0);
}
return n4156; /*0x25bcb*/
}
// Function: NvmGetVersionInfo @ 0x25bd4 (0x9f bytes)
unsigned __int64 __fastcall NvmGetVersionInfo(__int64 (__fastcall **a1)(), char *eng, _QWORD *p_STACK[0x7D0])
{
UtlCrc32Calc(&r_n_, 0x64u, (unsigned __int8 *)L"Intel(R) Gigabit %1d.%1d.%02d"); /*0x25c15*/
if ( a1 ) /*0x25c1d*/
{
if ( eng ) /*0x25c29*/
// "eng" /*0x25c4d*/
return UtlParseTokenStr( /*0x25c4d*/
eng,
(char *)a1[2],
(__int64)&off_1A70,
p_STACK[0x7D0],
a1 == (__int64 (__fastcall **)())&off_E98);
else
return 0x8000000000000002uLL; /*0x25c54*/
}
else
{
*p_STACK[0x7D0] = &r_n_; /*0x25c1f*/
return 0; /*0x25c22*/
}
}
// Function: NvmGetString @ 0x25c74 (0x127 bytes)
__int64 __fastcall NvmGetString(
__int64 (__fastcall **a1)(),
__int64 a2,
__int64 a3,
_DWORD *eng,
_QWORD *p_STACK[0x7D0])
{
__int64 result; // rax
__int64 v10; // [rsp+30h] [rbp-18h] BYREF
__int64 v11; // [rsp+68h] [rbp+20h] BYREF
if ( !eng || !a2 ) /*0x25ca0*/
return 0x8000000000000002uLL; /*0x25d7c*/
if ( (*(__int64 (__fastcall **)(__int64, __int64 *, __int64 *, __int64, __int64, int))(BootServices + 280))( /*0x25ce0*/
a2,
qword_2B0,
&v10,
ImageHandle_1,
a2,
16) != 0x8000000000000014uLL )
{
(*(void (__fastcall **)(__int64, __int64 *, __int64, __int64))(BootServices + 288))( /*0x25cfd*/
a2,
qword_2B0,
ImageHandle_1,
a2);
return 0x8000000000000003uLL; /*0x25d0d*/
}
if ( !a3 ) /*0x25d12*/
return 0x8000000000000003uLL; /*0x25d12*/
result = (*(__int64 (__fastcall **)(__int64, __int64 *, __int64 *, __int64, __int64, int))(BootServices + 280))( /*0x25d3e*/
a3,
qword_1D68,
&v11,
ImageHandle_1,
a3,
2);
if ( result >= 0 ) /*0x25d47*/
return UtlParseTokenStr( /*0x25d75*/
eng,
(char *)a1[2],
*(_QWORD *)(*(_QWORD *)v11 + 12192LL),
p_STACK[0x7D0],
a1 == (__int64 (__fastcall **)())&off_E98);
return result; /*0x25d95*/
}
// Function: NvmReadField @ 0x25d9c (0x85 bytes)
unsigned __int64 __fastcall NvmReadField(__int64 a1, __int16 n2, _BYTE *a3, unsigned __int16 *a4)
{
unsigned __int16 n4; // r11
_BYTE *v6; // rdx
unsigned __int64 v7; // r10
if ( !a1 || !a3 || !a4 ) /*0x25db8*/
return 0x8000000000000002uLL; /*0x25e11*/
n4 = 1; /*0x25dba*/
if ( n2 == 1 ) /*0x25dc2*/
{
v6 = (_BYTE *)(a1 - 1608); /*0x25dc4*/
n4 = 4; /*0x25dcb*/
}
else
{
if ( n2 != 2 ) /*0x25dd5*/
return 0x8000000000000003uLL; /*0x25e0f*/
v6 = (_BYTE *)(a1 - 1604); /*0x25dd7*/
}
if ( *a4 < n4 ) /*0x25de2*/
v7 = 0x8000000000000002uLL; /*0x25df2*/
else
UtlMemCpy(a3, v6, n4); /*0x25deb*/
*a4 = n4; /*0x25dfc*/
return v7; /*0x25e1b*/
}
// Function: NvmReadPciMapping @ 0x25e24 (0x56 bytes)
unsigned __int64 __fastcall Nvm_25e24(__int64 a1, __int64 a2, __int64 a3)
{
__int64 (__fastcall *v3)(__int64, __int64, __int64, __int64); // rax
__int64 v4; // rcx
int v5; // eax
if ( !a1 || !a3 ) /*0x25e33*/
return 0x8000000000000002uLL; /*0x25e6b*/
v3 = *(__int64 (__fastcall **)(__int64, __int64, __int64, __int64))(a1 - 12528); /*0x25e35*/
v4 = a1 - 13688; /*0x25e3c*/
if ( v3 ) /*0x25e46*/
v5 = v3(v4, a2, 1, a3); /*0x25e4e*/
else
v5 = -3; /*0x25e52*/
return -(__int64)(v5 != 0) & 0x8000000000000007uLL; /*0x25e75*/
}
// Function: NvmCheckShadowIntegrity @ 0x25e7c (0x48 bytes)
unsigned __int64 __fastcall Nvm_25e7c(__int64 a1)
{
__int64 (__fastcall *v2)(__int64); // rax
__int64 v3; // rcx
int v4; // eax
if ( !a1 ) /*0x25e83*/
return 0x8000000000000002uLL; /*0x25e85*/
v2 = *(__int64 (__fastcall **)(__int64))(a1 - 12504); /*0x25e91*/
v3 = a1 - 13688; /*0x25e98*/
if ( v2 ) /*0x25ea2*/
v4 = v2(v3); /*0x25ea4*/
else
v4 = -3; /*0x25ea8*/
return -(__int64)(v4 != 0) & 0x8000000000000007uLL; /*0x25ebf*/
}
// Function: NvmValidateChecksum @ 0x25ec4 (0xc0 bytes)
unsigned __int64 __fastcall Nvm_25ec4(__int64 a1, unsigned __int16 a2, __int16 a3)
{
int v3; // ebx
__int64 v6; // rdi
__int64 (__fastcall *v7)(__int64, _QWORD, __int64, __int16 *); // rax
int v8; // eax
__int64 (__fastcall *v9)(__int64, _QWORD, __int64, __int16 *); // rax
__int16 v10; // [rsp+30h] [rbp+8h] BYREF
__int16 v11; // [rsp+40h] [rbp+18h] BYREF
v11 = a3; /*0x25ece*/
v3 = 0; /*0x25ed9*/
if ( !a1 ) /*0x25ee1*/
return 0x8000000000000002uLL; /*0x25ee3*/
v6 = a1 - 13688; /*0x25ef2*/
v7 = *(__int64 (__fastcall **)(__int64, _QWORD, __int64, __int16 *))(a1 - 12528); /*0x25ef9*/
if ( v7 ) /*0x25f03*/
{
v8 = v7(a1 - 13688, a2, 1, &v10); /*0x25f16*/
a3 = v11; /*0x25f18*/
}
else
{
v8 = -3; /*0x25f20*/
}
if ( v8 ) /*0x25f27*/
return 0x8000000000000007uLL; /*0x25f29*/
if ( v10 == a3 ) /*0x25f3b*/
return 0; /*0x25f3d*/
v9 = *(__int64 (__fastcall **)(__int64, _QWORD, __int64, __int16 *))(v6 + 1208); /*0x25f41*/
if ( v9 ) /*0x25f4b*/
v3 = v9(v6, a2, 1, &v11); /*0x25f60*/
return -(__int64)(v3 != 0) & 0x8000000000000007uLL; /*0x25f7e*/
}
// Function: NvmGetImageInfo @ 0x25f84 (0x4d bytes)
unsigned __int64 __fastcall Nvm_25f84(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
{
__int64 (__fastcall *v4)(__int64); // rax
__int64 v5; // rcx
int v6; // eax
if ( !a1 || !a4 ) /*0x25f90*/
return 0x8000000000000002uLL; /*0x25fc2*/
v4 = *(__int64 (__fastcall **)(__int64))(a1 - 12528); /*0x25f92*/
v5 = a1 - 13688; /*0x25f99*/
if ( v4 ) /*0x25fa3*/
v6 = v4(v5); /*0x25fa5*/
else
v6 = -3; /*0x25fa9*/
return -(__int64)(v6 != 0) & 0x8000000000000007uLL; /*0x25fcc*/
}
// Function: NvmSetPciConfig @ 0x25fd4 (0x111 bytes)
unsigned __int64 __fastcall NvmSetPciConfig(__int64 a1, __int64 a2, __int64 n0x200, _WORD *a4)
{
_WORD *v4; // rbx
unsigned __int16 n0x200_1; // di
int v6; // r13d
__int64 v7; // r12
__int64 (__fastcall *v8)(__int64, __int64, __int64, _BYTE *); // rax
int v9; // eax
unsigned __int64 n0x200_2; // rbp
unsigned __int64 n0x200_3; // rsi
_BYTE *v13; // rdi
__int64 (__fastcall *v14)(__int64, _QWORD, __int64, _WORD *); // rax
_BYTE v16[1024]; // [rsp+20h] [rbp-418h] BYREF
v4 = a4; /*0x25ff7*/
n0x200_1 = n0x200; /*0x25ffa*/
v6 = (unsigned __int16)a2; /*0x25ffe*/
if ( !a1 || !a4 || !(_WORD)n0x200 || (unsigned __int16)n0x200 > 0x200u ) /*0x26027*/
return 0x8000000000000002uLL; /*0x260b9*/
v7 = a1 - 13688; /*0x2602d*/
v8 = *(__int64 (__fastcall **)(__int64, __int64, __int64, _BYTE *))(a1 - 12528); /*0x26034*/
if ( v8 ) /*0x2603f*/
v9 = v8(a1 - 13688, a2, n0x200, v16); /*0x26049*/
else
v9 = -3; /*0x2604d*/
if ( v9 ) /*0x26055*/
return 0x8000000000000007uLL; /*0x26061*/
n0x200_2 = n0x200_1; /*0x26063*/
n0x200_3 = 0; /*0x26066*/
if ( n0x200_1 )
{
v13 = (_BYTE *)(v16 - (_BYTE *)v4); /*0x26073*/
while ( 1 )
{
if ( *(_WORD *)((char *)v4 + (_QWORD)v13) != *v4 )
{
v14 = *(__int64 (__fastcall **)(__int64, _QWORD, __int64, _WORD *))(v7 + 1208); /*0x2607f*/
if ( v14 ? v14(v7, (unsigned int)(v6 + n0x200_3), 1, v4) : 0 )
break; /*0x260a7*/
}
++n0x200_3; /*0x260a9*/
++v4; /*0x260ac*/
if ( n0x200_3 >= n0x200_2 ) /*0x260b3*/
return 0; /*0x260b3*/
}
return 0x8000000000000007uLL; /*0x260a7*/
}
return 0; /*0x260db*/
}
// Function: NvmReadEepromWord @ 0x260e8 (0xcc bytes)
__int64 __fastcall Nvm_260e8(__int64 a1, __int64 a2, unsigned __int16 a3)
{
unsigned int v3; // ebx
__int64 v8; // [rsp+48h] [rbp+10h] BYREF
v3 = 0; /*0x260fc*/
if ( !a2 ) /*0x2610b*/
return 1; /*0x2610d*/
if ( qword_118(*(_QWORD *)(a1 + 8), qword_1010, &v8, 0, 0, 2) < 0 ) /*0x26149*/
return 6; /*0x2614b*/
if ( (*(__int64 (__fastcall **)(__int64, _QWORD, __int64))(v8 + 8))(v8, a3, a2) < 0 ) /*0x26166*/
return 2; /*0x26168*/
if ( qword_120(*(_QWORD *)(a1 + 8), qword_1010, 0, 0) < 0 ) /*0x2619a*/
return 6; /*0x2619a*/
return v3; /*0x261ae*/
}
// Function: NvmWriteEepromWord @ 0x261b4 (0xcc bytes)
__int64 __fastcall Nvm_261b4(__int64 a1, unsigned __int16 a2, unsigned __int16 a3)
{
unsigned int v3; // ebx
__int64 v8; // [rsp+40h] [rbp+8h] BYREF
v3 = 0; /*0x261c8*/
if ( !a1 ) /*0x261d6*/
return 1; /*0x261d8*/
if ( qword_118(*(_QWORD *)(a1 + 8), qword_1010, &v8, 0, 0, 2) < 0 ) /*0x26214*/
return 6; /*0x26216*/
if ( (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(v8 + 16))(v8, a2, a3) < 0 ) /*0x26232*/
return 2; /*0x26234*/
if ( qword_120(*(_QWORD *)(a1 + 8), qword_1010, 0, 0) < 0 ) /*0x26266*/
return 6; /*0x26266*/
return v3; /*0x2627a*/
}
// Function: NvmWriteEepromBlock @ 0x26280 (0xd7 bytes)
__int64 __fastcall NvmWriteEepromBlock(_DWORD *Var17, unsigned __int16 a2, unsigned __int16 n6, __int16 *p_n19542)
{
__int64 v9; // rax
unsigned int n2; // ebx
__int64 v11; // [rsp+50h] [rbp+8h] BYREF
if ( !Var17 || !p_n19542 ) /*0x262ab*/
return 1; /*0x2633f*/
if ( (*(__int64 (__fastcall **)(_QWORD, __int64 *, __int64 *, __int64, _QWORD, int))(BootServices + 280))( /*0x262e6*/
*((_QWORD *)Var17 + 1),
qword_1010,
&v11,
ImageHandle_1,
0,
2) < 0 )
return 6; /*0x262e8*/
v9 = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD, __int16 *))(v11 + 32))(v11, a2, n6, p_n19542); /*0x26301*/
n2 = 0; /*0x26316*/
if ( v9 < 0 ) /*0x2631b*/
n2 = 2; /*0x2631b*/
if ( (*(__int64 (__fastcall **)(_QWORD, __int64 *, __int64, _QWORD))(BootServices + 288))( /*0x26338*/
*((_QWORD *)Var17 + 1),
qword_1010,
ImageHandle_1,
0) < 0 )
return 6; /*0x26338*/
return n2; /*0x2634e*/
}
// Function: NvmWriteBlock @ 0x26358 (0xcd bytes)
__int64 __fastcall NvmWriteBlock(_DWORD *Var14, unsigned __int16 a2, unsigned __int16 n0x12E, __int16 *p_n19542)
{
__int64 v9; // rax
unsigned int n2; // ebx
__int64 v11; // [rsp+50h] [rbp+8h] BYREF
if ( !Var14 ) /*0x26379*/
return 1; /*0x2637b*/
if ( (*(__int64 (__fastcall **)(_QWORD, __int64 *, __int64 *, __int64, _QWORD, int))(BootServices + 280))( /*0x263bb*/
*((_QWORD *)Var14 + 1),
qword_1010,
&v11,
ImageHandle_1,
0,
2) < 0 )
return 6; /*0x263bd*/
v9 = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD, __int16 *))(v11 + 40))(v11, a2, n0x12E, p_n19542); /*0x263d6*/
n2 = 0; /*0x263eb*/
if ( v9 < 0 ) /*0x263f0*/
n2 = 2; /*0x263f0*/
if ( (*(__int64 (__fastcall **)(_QWORD, __int64 *, __int64, _QWORD))(BootServices + 288))( /*0x2640d*/
*((_QWORD *)Var14 + 1),
qword_1010,
ImageHandle_1,
0) < 0 )
return 6; /*0x2640d*/
return n2; /*0x2641c*/
}
// Function: NvmGetNvmType @ 0x26428 (0xaf bytes)
__int64 __fastcall NvmGetNvmType(__int64 a1)
{
unsigned int n2; // ebx
__int64 v4; // [rsp+40h] [rbp+8h] BYREF
if ( !a1 ) /*0x2643d*/
return 1; /*0x2643f*/
if ( (*(__int64 (__fastcall **)(_QWORD, __int64 *, __int64 *, __int64, _QWORD, int))(BootServices + 280))( /*0x2647d*/
*(_QWORD *)(a1 + 8),
qword_1010,
&v4,
ImageHandle_1,
0,
2) < 0 )
return 6; /*0x2647f*/
n2 = 0; /*0x264a1*/
if ( (*(__int64 (__fastcall **)(__int64))(v4 + 24))(v4) < 0 ) /*0x264a6*/
n2 = 2; /*0x264a6*/
if ( (*(__int64 (__fastcall **)(_QWORD, __int64 *, __int64, _QWORD))(BootServices + 288))( /*0x264c2*/
*(_QWORD *)(a1 + 8),
qword_1010,
ImageHandle_1,
0) < 0 )
return 6; /*0x264c2*/
return n2; /*0x264d1*/
}
// Function: NvmEraseBlock @ 0x264d8 (0x18c bytes)
__int64 __fastcall NvmEraseBlock(int n128, __int64 a2, _DWORD *a3)
{
unsigned int n6; // ebx
unsigned __int64 n0x80_1; // rdi
__int64 v8; // rsi
__int64 v9; // rcx
__int64 (__fastcall **v10)(_QWORD, __int64, __int64, __int16 *); // rax
unsigned __int64 n0x80; // [rsp+30h] [rbp-38h] BYREF
__int64 v12; // [rsp+38h] [rbp-30h] BYREF
__int64 (__fastcall **v13)(_QWORD, __int64, __int64, __int16 *); // [rsp+40h] [rbp-28h] BYREF
__int16 n4; // [rsp+88h] [rbp+20h] BYREF
n6 = 0; /*0x26500*/
if ( (*(__int64 (__fastcall **)(__int64, __int64 *, _QWORD, unsigned __int64 *, __int64 *))(BootServices + 312))( /*0x2651c*/
2,
qword_1010,
0,
&n0x80,
&v12) < 0 )
return 6; /*0x2651e*/
if ( n0x80 <= 0x80 ) /*0x2652f*/
{
n0x80_1 = 0; /*0x2653b*/
if ( n0x80 ) /*0x26542*/
{
v8 = a2 + 4; /*0x26548*/
while ( (*(__int64 (__fastcall **)(_QWORD, __int64 *, __int64 (__fastcall ***)(_QWORD, __int64, __int64, __int16 *), __int64, _QWORD, int))(BootServices + 280))( /*0x26580*/
*(_QWORD *)(v12 + 8 * n0x80_1),
qword_1010,
&v13,
ImageHandle_1,
0,
2) >= 0 )
{
v9 = *(_QWORD *)(v12 + 8 * n0x80_1); /*0x265a0*/
n4 = 4; /*0x265ac*/
v10 = v13; /*0x265b4*/
*(_QWORD *)(v8 + 4) = v9; /*0x265b9*/
if ( (*v10)(v10, 1, v8 - 4, &n4) < 0 ) /*0x265c5*/
break; /*0x265c5*/
n4 = 1; /*0x265df*/
if ( (*v13)(v13, 2, v8, &n4) < 0 /*0x26619*/
|| (*(__int64 (__fastcall **)(_QWORD, __int64 *, __int64, _QWORD))(BootServices + 288))(
*(_QWORD *)(v12 + 8 * n0x80_1),
qword_1010,
ImageHandle_1,
0) < 0 )
{
break; /*0x26619*/
}
++n0x80_1; /*0x2661b*/
v8 += 24; /*0x2661e*/
if ( n0x80_1 >= n0x80 ) /*0x26627*/
goto LABEL_14; /*0x26627*/
}
n6 = 6; /*0x2662f*/
}
}
else
{
n6 = 3; /*0x26531*/
}
LABEL_14:
*a3 = n0x80; /*0x26634*/
if ( v12 ) /*0x26643*/
(*(void (**)(void))(BootServices + 72))(); /*0x2664c*/
return n6; /*0x2665b*/
}
// Function: NvmValidateImage @ 0x269f8 (0x52 bytes)
__int64 __fastcall NvmValidateImage(_WORD *a1, __int64 a2)
{
__int64 n49152; // rax
if ( *(_QWORD *)(a2 + 11064) == 1 ) /*0x26a05*/
{
a1[13] = 0x8000; /*0x26a0c*/
a1[12] = 3; /*0x26a14*/
return 3; /*0x26a10*/
}
else
{
if ( a1[1] <= 2u ) /*0x26a22*/
{
a1[12] = 0; /*0x26a3c*/
n49152 = 49152; /*0x26a40*/
}
else
{
n49152 = 0x8000; /*0x26a30*/
a1[12] = 1; /*0x26a35*/
}
a1[13] = n49152; /*0x26a45*/
}
return n49152; /*0x26a18*/
}
// Function: NvmValidateChecksum2 @ 0x26ed4 (0x4a bytes)
char __fastcall Nvm_26ed4(__int64 a1)
{
_BYTE *v1; // rdx
int v3; // ecx
v1 = *(_BYTE **)(a1 + 16); /*0x26ed8*/
if ( (*(_BYTE *)(a1 + 2) & 1) != 0 ) /*0x26edc*/
{
*(_WORD *)(a1 + 26) = 0x8000; /*0x26ee3*/
*(_WORD *)(a1 + 24) = 12; /*0x26eec*/
return 12; /*0x26ee7*/
}
else
{
v3 = **(_DWORD **)(a1 + 8); /*0x26ef5*/
*v1 = 1; /*0x26ef7*/
v1[1] = 0; /*0x26efa*/
v1[2] = 94; /*0x26f06*/
v1[3] = BYTE1(v3) & 0x7F; /*0x26f0c*/
v1[4] = BYTE2(v3); /*0x26f13*/
v1[5] = HIBYTE(v3); /*0x26f1a*/
return HIBYTE(v3); /*0x26f16*/
}
}
// Function: UndiGetMacAddr @ 0x27180 (0x93 bytes)
char __fastcall UndiGetMacAddr(__int64 a1)
{
unsigned __int64 n6; // rdx
char result; // al
char *v3; // r8
__int64 v4; // rcx
__int64 v5; // r10
__int64 v6; // rcx
__int64 v7; // r10
n6 = 0; /*0x27180*/
if ( !*(_WORD *)(a1 + 4) ) /*0x27186*/
goto LABEL_2; /*0x2718a*/
v3 = *(char **)(a1 + 8); /*0x2719b*/
if ( (*(_BYTE *)(a1 + 2) & 1) != 0 ) /*0x271a3*/
{
if ( !*((_WORD *)v3 + 36) || *((_DWORD *)v3 + 21) < 0xEu ) /*0x271b1*/
{
LABEL_2:
*(_WORD *)(a1 + 24) = 1; /*0x2718c*/
*(_WORD *)(a1 + 26) = 0x8000; /*0x27196*/
return 0; /*0x2719a*/
}
v4 = *(_QWORD *)(v3 + 76); /*0x271b3*/
*(_WORD *)(v4 + 12) = *((_WORD *)v3 + 34); /*0x271bf*/
v5 = v4 - (_QWORD)v3; /*0x271c3*/
do /*0x271df*/
{
v3[v5] = v3[32]; /*0x271ca*/
result = *v3++; /*0x271ce*/
*(_BYTE *)(v4 + n6++ + 6) = result; /*0x271d4*/
}
while ( n6 < 6 ); /*0x271df*/
}
else
{
v6 = *((_QWORD *)v3 + 8); /*0x271e3*/
*(_WORD *)(v6 + 12) = *((_WORD *)v3 + 38); /*0x271ef*/
v7 = v6 - (_QWORD)v3; /*0x271f3*/
do /*0x2720f*/
{
v3[v7] = v3[32]; /*0x271fa*/
result = *v3++; /*0x271fe*/
*(_BYTE *)(v6 + n6++ + 6) = result; /*0x27204*/
}
while ( n6 < 6 ); /*0x2720f*/
}
return result; /*0x2719a*/
}
// Function: UndiCallbackDispatch @ 0x272ec (0x13c bytes)
void __fastcall UndiCallbackDispatch(unsigned __int16 *Cpb)
{
unsigned __int16 StatusFlag; // ax
unsigned __int16 MediaType; // ax
__int64 *ConfigTable; // r8
__int16 SubsystemId; // ax
_WORD *NicPtr; // rdx
if ( Cpb ) /*0x272f6*/
{
if ( Cpb[14] > HIBYTE(n2) ) /*0x27307*/
goto LABEL_8; /*0x27307*/
*(_QWORD *)(qword_48400[Cpb[14]] + 12168) = 49; /*0x27318*/
if ( *Cpb > 0x11u || Cpb[12] || Cpb[13] ) /*0x27330*/
goto LABEL_8; /*0x27335*/
if ( Cpb[2] ) /*0x27337*/
{
if ( !*((_QWORD *)Cpb + 1) ) /*0x2735f*/
goto LABEL_8; /*0x2735f*/
}
else if ( *((_QWORD *)Cpb + 1) ) /*0x2733e*/
{
goto LABEL_8; /*0x27342*/
}
MediaType = Cpb[3]; /*0x27361*/
if ( MediaType ) /*0x27369*/
{
if ( !*((_QWORD *)Cpb + 2) ) /*0x27377*/
goto LABEL_8; /*0x27377*/
}
else if ( *((_QWORD *)Cpb + 2) ) /*0x2736b*/
{
goto LABEL_8; /*0x2736f*/
}
ConfigTable = &qword_EF0[2 * *Cpb]; /*0x2738e*/
if ( (*(_WORD *)ConfigTable == 0xFFFF || *(_WORD *)ConfigTable == Cpb[2]) /*0x273ad*/
&& (*((_WORD *)ConfigTable + 1) == 0xFFFF || *((_WORD *)ConfigTable + 1) == MediaType) )
{
SubsystemId = *((_WORD *)ConfigTable + 2); /*0x273af*/
if ( SubsystemId == -1 || SubsystemId == Cpb[1] ) /*0x273be*/
{
NicPtr = (_WORD *)(qword_48400[Cpb[14]] + 88); /*0x273c8*/
if ( *((_WORD *)ConfigTable + 3) != 0xFFFF ) /*0x273d1*/
{
if ( !*NicPtr ) /*0x273d3*/
{
Cpb[13] = 0x8000; /*0x273de*/
StatusFlag = 6; /*0x273e2*/
goto LABEL_9; /*0x273e7*/
}
if ( *((_WORD *)ConfigTable + 3) == 2 && *NicPtr != 2 ) /*0x273f8*/
{
Cpb[12] = 9; /*0x273ff*/
Cpb[13] = 0x8000; /*0x27408*/
return; /*0x2740c*/
}
}
Cpb[12] = 0; /*0x27416*/
Cpb[13] = -16384; /*0x2741b*/
((void (__fastcall *)(unsigned __int16 *, _WORD *))ConfigTable[1])(Cpb, NicPtr); /*0x2741f*/
return; /*0x2741f*/
}
}
LABEL_8:
Cpb[13] = 0x8000; /*0x27344*/
StatusFlag = 1; /*0x2734d*/
LABEL_9:
Cpb[12] = StatusFlag; /*0x27352*/
}
}
// Function: UndiCommandEntry @ 0x27428 (0xbc bytes)
__int64 __fastcall UndiCommandEntry(__int64 *a1, int n18, unsigned __int16 *a3)
{
__int64 v4; // rcx
bool i; // zf
unsigned __int16 n16_1; // cx
unsigned __int16 n16_2; // di
unsigned __int16 n16; // [rsp+40h] [rbp+8h] BYREF
v4 = *a1; /*0x2743d*/
n16 = 0; /*0x27448*/
if ( NvmCheckConfigDone(v4) ) /*0x2744e*/
return 0xFFFFFFFFLL; /*0x27458*/
UndiTransmit(a1, 0x34u, (__int64)&n16); /*0x2746a*/
n16_1 = (unsigned __int8)n16; /*0x2747a*/
for ( i = (unsigned __int16)(unsigned __int8)n16 == 0; ; i = HIBYTE(n16) == 0 ) /*0x2747a*/
{
n16 = n16_1; /*0x274a5*/
if ( i ) /*0x274aa*/
return 3; /*0x274ac*/
n16_2 = n16_1; /*0x27480*/
UndiTransmit(a1, n16_1, (__int64)&n16); /*0x2748e*/
if ( (_BYTE)n16 == 16 ) /*0x2749b*/
break; /*0x2749b*/
n16_1 = HIBYTE(n16); /*0x2749d*/
}
UndiTransmit(a1, n18 + n16_2, (__int64)&n16); /*0x274d1*/
*a3 = n16; /*0x274de*/
return 0; /*0x274bb*/
}
// Function: NvmCheckReadConfig @ 0x274e4 (0xaf bytes)
__int64 __fastcall NvmCheckReadConfig(__int64 *a1, int n40, __int64 a3)
{
__int64 v4; // rcx
bool i; // zf
unsigned __int16 n16_1; // cx
unsigned __int16 n16_2; // di
unsigned __int16 n16; // [rsp+30h] [rbp+8h] BYREF
v4 = *a1; /*0x274fb*/
n16 = 0; /*0x27503*/
if ( NvmCheckConfigDone(v4) ) /*0x27507*/
return 0xFFFFFFFFLL; /*0x27511*/
UndiTransmit(a1, 0x34u, (__int64)&n16); /*0x27523*/
n16_1 = (unsigned __int8)n16; /*0x27533*/
for ( i = (unsigned __int16)(unsigned __int8)n16 == 0; ; i = HIBYTE(n16) == 0 ) /*0x27533*/
{
n16 = n16_1; /*0x2755d*/
if ( i ) /*0x27562*/
return 3; /*0x27564*/
n16_2 = n16_1; /*0x27539*/
UndiTransmit(a1, n16_1, (__int64)&n16); /*0x27547*/
if ( (_BYTE)n16 == 16 ) /*0x27554*/
break; /*0x27554*/
n16_1 = HIBYTE(n16); /*0x27556*/
}
UndiReceive(a1, n16_2 + 40, a3); /*0x2758a*/
return 0; /*0x27578*/
}
// Function: UndiTransmit @ 0x27594 (0x52 bytes)
char __fastcall UndiTransmit(__int64 *a1, unsigned int a2, __int64 a3)
{
__int64 v3; // rbx
char result; // al
v3 = *a1; /*0x275a3*/
result = NvmCheckConfigDone(*a1); /*0x275ae*/
if ( !result ) /*0x275b5*/
return (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD, __int64, __int64))(*(_QWORD *)(v3 + 11096) + 48LL))( /*0x275d3*/
*(_QWORD *)(v3 + 11096),
1,
a2,
1,
a3);
return result; /*0x275e0*/
}
// Function: UndiReceive @ 0x275e8 (0x52 bytes)
char __fastcall UndiReceive(__int64 *a1, unsigned int n68, __int64 a3)
{
__int64 v3; // rbx
char result; // al
v3 = *a1; /*0x275f7*/
result = NvmCheckConfigDone(*a1); /*0x27602*/
if ( !result ) /*0x27609*/
return (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD, __int64, __int64))(*(_QWORD *)(v3 + 11096) + 56LL))( /*0x27627*/
*(_QWORD *)(v3 + 11096),
1,
n68,
1,
a3);
return result; /*0x27634*/
}
// Function: UtlRegisterRead @ 0x2763c (0x30 bytes)
__int64 __fastcall UtlRegisterRead(__int64 a1, __int64 a2)
{
__int64 (__fastcall *v2)(_QWORD); // rax
v2 = *(__int64 (__fastcall **)(_QWORD))(a1 + 11104); /*0x27640*/
if ( v2 ) /*0x2764a*/
return v2(*(_QWORD *)(a1 + 11088)); /*0x27653*/
else
return (*(__int64 (__fastcall **)(__int64))(BootServices + 248))(a2); /*0x27661*/
}
// Function: UtlRegisterWrite @ 0x2766c (0x59 bytes)
__int64 __fastcall UtlRegisterWrite(__int64 *a1, unsigned int a2)
{
__int64 v2; // rbx
__int64 v3; // rdi
unsigned int v5; // [rsp+40h] [rbp+8h] BYREF
v2 = *a1; /*0x27676*/
v3 = a2; /*0x27679*/
if ( NvmCheckConfigDone(*a1) ) /*0x2767e*/
return 0xFFFFFFFFLL; /*0x27687*/
(*(void (__fastcall **)(_QWORD, __int64, _QWORD, __int64, __int64, unsigned int *))(*(_QWORD *)(v2 + 11096) + 16LL))( /*0x276b3*/
*(_QWORD *)(v2 + 11096),
2,
0,
v3,
1,
&v5);
return v5; /*0x276bf*/
}
// Function: UtlRegisterAccess @ 0x276c8 (0x55 bytes)
char __fastcall UtlRegisterAccess(__int64 *a1, unsigned int a2, int a3)
{
__int64 v3; // rbx
__int64 v4; // rdi
char result; // al
int v6; // [rsp+50h] [rbp+18h] BYREF
v3 = *a1; /*0x276d2*/
v4 = a2; /*0x276d5*/
v6 = a3; /*0x276d7*/
result = NvmCheckConfigDone(v3); /*0x276df*/
if ( !result ) /*0x276e6*/
return (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD, __int64, __int64, int *))(*(_QWORD *)(v3 + 11096) + 24LL))( /*0x2770f*/
*(_QWORD *)(v3 + 11096),
2,
0,
v4,
1,
&v6);
return result; /*0x27717*/
}
// Function: NvmReadByteConfig @ 0x27720 (0x79 bytes)
__int64 __fastcall NvmReadByteConfig(__int64 a1, unsigned int a2)
{
__int64 v2; // rsi
__int64 v4; // rdi
__int64 v5; // r8
unsigned int v7; // [rsp+40h] [rbp+8h] BYREF
v2 = *(_QWORD *)a1; /*0x2772f*/
v4 = a2; /*0x27735*/
if ( NvmCheckConfigDone(*(_QWORD *)a1) ) /*0x2773a*/
return 0xFFFFFFFFLL; /*0x27743*/
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x2774f*/
return *(unsigned int *)(v4 + *(_QWORD *)(a1 + 16)); /*0x27755*/
LOBYTE(v5) = 1; /*0x2776e*/
(*(void (__fastcall **)(_QWORD, __int64, __int64, __int64, __int64, unsigned int *))(*(_QWORD *)(v2 + 11096) + 16LL))( /*0x27782*/
*(_QWORD *)(v2 + 11096),
2,
v5,
v4,
1,
&v7);
return v7; /*0x27793*/
}
// Function: NvmReadWordConfig @ 0x2779c (0x7b bytes)
__int16 __fastcall NvmReadWordConfig(__int64 a1, unsigned int a2)
{
__int64 v2; // rsi
__int64 v4; // rdi
__int64 v5; // r8
__int16 v7; // [rsp+40h] [rbp+8h] BYREF
v2 = *(_QWORD *)a1; /*0x277ab*/
v4 = a2; /*0x277b1*/
if ( NvmCheckConfigDone(*(_QWORD *)a1) ) /*0x277b6*/
return -1; /*0x277bf*/
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x277cd*/
return *(_WORD *)(v4 + *(_QWORD *)(a1 + 16)); /*0x277d3*/
LOBYTE(v5) = 1; /*0x277f7*/
(*(void (__fastcall **)(_QWORD, __int64, __int64, __int64, __int64, __int16 *))(*(_QWORD *)(v2 + 11096) + 16LL))( /*0x277ff*/
*(_QWORD *)(v2 + 11096),
1,
v5,
v4,
1,
&v7);
return v7; /*0x27811*/
}
// Function: NvmWriteByteConfig @ 0x27818 (0x81 bytes)
char __fastcall NvmWriteByteConfig(__int64 a1, unsigned int a2, int a3)
{
__int64 v3; // rbp
__int64 v6; // rcx
__int64 v7; // rdi
__int64 v8; // rax
__int64 v9; // r8
int v11; // [rsp+50h] [rbp+18h] BYREF
v3 = *(_QWORD *)a1; /*0x2782c*/
v6 = *(_QWORD *)a1; /*0x27835*/
v7 = a2; /*0x27838*/
v11 = a3; /*0x2783a*/
LOBYTE(v8) = NvmCheckConfigDone(v6); /*0x2783e*/
if ( !(_BYTE)v8 ) /*0x27845*/
{
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x2784e*/
{
v8 = *(_QWORD *)(a1 + 16); /*0x27850*/
*(_DWORD *)(v7 + v8) = a3; /*0x27854*/
}
else
{
LOBYTE(v9) = 1; /*0x2786d*/
LOBYTE(v8) = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64, __int64, __int64, int *))(*(_QWORD *)(v3 + 11096) /*0x27881*/
+ 24LL))(
*(_QWORD *)(v3 + 11096),
2,
v9,
v7,
1,
&v11);
}
}
return v8; /*0x27893*/
}
// Function: NvmWriteWordConfig @ 0x2789c (0x7a bytes)
char __fastcall NvmWriteWordConfig(__int64 a1, unsigned int a2, __int16 a3)
{
__int64 v3; // rsi
__int64 v5; // rdi
char result; // al
__int64 v7; // r8
__int16 v8; // [rsp+50h] [rbp+18h] BYREF
v8 = a3; /*0x278a6*/
v3 = *(_QWORD *)a1; /*0x278b1*/
v5 = a2; /*0x278b7*/
result = NvmCheckConfigDone(*(_QWORD *)a1); /*0x278bc*/
if ( !result ) /*0x278c3*/
{
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x278cc*/
{
result = v8; /*0x278d2*/
*(_WORD *)(v5 + *(_QWORD *)(a1 + 16)) = v8; /*0x278d7*/
}
else
{
LOBYTE(v7) = 1; /*0x278fb*/
return (*(__int64 (__fastcall **)(_QWORD, __int64, __int64, __int64, __int64, __int16 *))(*(_QWORD *)(v3 + 11096) /*0x27903*/
+ 24LL))(
*(_QWORD *)(v3 + 11096),
1,
v7,
v5,
1,
&v8);
}
}
return result; /*0x27910*/
}
// Function: UtlMicroStall @ 0x27918 (0x28 bytes)
char __fastcall UtlMicroStall(__int64 *NicConfigPtr)
{
__int64 NicConfig; // rbx
char result; // al
NicConfig = *NicConfigPtr; /*0x2791e*/
result = NvmCheckConfigDone(*NicConfigPtr); /*0x27924*/
if ( !result ) /*0x2792b*/
return (*(char (__fastcall **)(_QWORD))(*(_QWORD *)(NicConfig + 11096) + 104LL))(*(_QWORD *)(NicConfig + 11096)); /*0x27937*/
return result; /*0x2793a*/
}
// Function: UndiDisableAutoNeg @ 0x2806c (0x178 bytes)
__int64 __fastcall Undi_2806c(__int64 a1, __int64 a2, __int64 a3, __int64 a4, __int64 a5)
{
__int64 result; // rax
__int64 v7; // rbx
void (__fastcall *v8)(_QWORD *, __int64, __int64, __int16 *); // rax
_QWORD *v9; // rbx
void (__fastcall *v10)(_QWORD *, __int64, __int64, __int64 *); // rax
void (__fastcall *v11)(_QWORD *, __int64, __int64, __int64 *); // rax
void (__fastcall *v12)(_QWORD *); // rax
__int64 *v13; // [rsp+30h] [rbp-18h] BYREF
_BYTE v14[16]; // [rsp+38h] [rbp-10h] BYREF
__int16 v15; // [rsp+58h] [rbp+10h] BYREF
*(_DWORD *)a5 = 0; /*0x2807a*/
if ( !a2 ) /*0x28080*/
return 0x8000000000000003uLL; /*0x28080*/
if ( qword_118(a2, qword_2B0, v14, 0, a2, 16) != 0x8000000000000014uLL ) /*0x280d8*/
{
qword_120(a2, qword_2B0, 0, a2); /*0x280eb*/
return 0x8000000000000003uLL; /*0x2808c*/
}
result = qword_118(a2, qword_1D68, &v13, 0, a2, 2); /*0x28113*/
if ( result >= 0 ) /*0x2811c*/
{
v7 = *v13; /*0x28127*/
if ( *(_DWORD *)(*v13 + 1204) != 1 ) /*0x28131*/
return 0x8000000000000003uLL; /*0x28131*/
v8 = *(void (__fastcall **)(_QWORD *, __int64, __int64, __int16 *))(v7 + 1248); /*0x28137*/
v9 = (_QWORD *)(v7 + 88); /*0x2813e*/
if ( v8 ) /*0x28145*/
v8(v9, 49, 1, &v15); /*0x28158*/
v10 = (void (__fastcall *)(_QWORD *, __int64, __int64, __int64 *))v9[145]; /*0x2815a*/
if ( v10 ) /*0x28164*/
v10(v9, 48, 1, &a5); /*0x28177*/
if ( (v15 & 0xC000) == 0x4000 && (a5 & 0xC00) != 0 ) /*0x2819d*/
{
LOWORD(a5) = a5 & 0xF3FF; /*0x281a7*/
v11 = (void (__fastcall *)(_QWORD *, __int64, __int64, __int64 *))v9[151]; /*0x281ac*/
if ( v11 ) /*0x281b6*/
v11(v9, 48, 1, &a5); /*0x281c9*/
v12 = (void (__fastcall *)(_QWORD *))v9[148]; /*0x281cb*/
if ( v12 ) /*0x281d5*/
v12(v9); /*0x281da*/
}
return 0; /*0x281dc*/
}
return result; /*0x281de*/
}
// Function: UndiParseNvmTlv @ 0x281e4 (0x191 bytes)
unsigned __int64 __fastcall UndiParseNvmTlv(_BYTE *a1, unsigned __int8 *a2)
{
_BYTE *v2; // r8
_BYTE *v4; // r9
_BYTE *v5; // r9
bool i; // zf
char v7; // al
unsigned __int64 v8; // rsi
__int64 v9; // r10
_BYTE *v10; // r11
__int64 v11; // r9
unsigned __int8 *v12; // rcx
__int64 v13; // rax
unsigned __int64 v14; // rbx
unsigned __int64 v15; // r9
unsigned __int64 v16; // rcx
__int64 k; // rdi
__int64 v18; // rcx
int v19; // eax
unsigned __int64 j_1; // r10
unsigned __int64 j; // rcx
__int64 v22; // r9
__int64 v23; // r10
unsigned __int8 *v24; // rcx
__int64 v25; // rax
*a2 = 0; /*0x281f7*/
v2 = a1; /*0x281fd*/
if ( *a1 != 0x82 ) /*0x28200*/
return 0x8000000000000002uLL; /*0x28202*/
v4 = (_BYTE *)*((_QWORD *)a2 + 26); /*0x28211*/
*v4 = -126; /*0x2821e*/
v5 = v4 + 1; /*0x28225*/
*(_WORD *)&a2[2 * *a2 + 2] = 1; /*0x28228*/
*a2 = 1; /*0x2822e*/
for ( i = *a1 == 120; !i; i = *v2 == 120 ) /*0x28231*/
{
v7 = *v2; /*0x2823a*/
if ( *v2 != 120 ) /*0x2823f*/
{
if ( v7 == -126 ) /*0x28247*/
{
*(_WORD *)&a2[2 * (*a2)++ + 2] = *(_WORD *)(v2 + 1); /*0x282ee*/
j_1 = *(unsigned __int16 *)(v2 + 1); /*0x282f6*/
for ( j = 0; j < j_1; ++j ) /*0x282f6*/
v5[j] = v2[j + 3]; /*0x28307*/
}
else
{
if ( (unsigned __int8)(v7 + 112) > 1u ) /*0x28252*/
return 0x8000000000000007uLL; /*0x2835c*/
v8 = 0; /*0x28258*/
v9 = 0; /*0x2825a*/
v10 = v2 + 3; /*0x2825d*/
if ( *a2 ) /*0x28261*/
{
v11 = *a2; /*0x28266*/
v12 = a2 + 2; /*0x2826a*/
do /*0x2827b*/
{
v13 = *(unsigned __int16 *)v12; /*0x2826e*/
v12 += 2; /*0x28271*/
v9 += v13; /*0x28275*/
--v11; /*0x28278*/
}
while ( v11 ); /*0x2827b*/
}
v14 = *(unsigned __int16 *)(v2 + 1); /*0x2827d*/
if ( *(_WORD *)(v2 + 1) ) /*0x2827d*/
{
do /*0x282e2*/
{
v15 = (unsigned __int8)v10[2]; /*0x2828b*/
v16 = 0; /*0x28297*/
for ( k = v9 + *((_QWORD *)a2 + 26); v16 < v15; ++v16 ) /*0x2828b*/
*(_BYTE *)(v16 + k) = v10[v16 + 3]; /*0x282a7*/
v18 = (unsigned __int8)v10[2]; /*0x282b5*/
*(_WORD *)&a2[2 * *a2 + 2] = v18; /*0x282ba*/
v19 = (unsigned __int8)v10[2]; /*0x282bf*/
++*a2; /*0x282c4*/
v9 += v18; /*0x282ca*/
v8 += v19 + 3; /*0x282cf*/
v10 += (unsigned __int8)v10[2] + 3; /*0x282dc*/
}
while ( v8 < v14 ); /*0x282e2*/
}
}
}
v22 = 0; /*0x28318*/
v2 += *(unsigned __int16 *)(v2 + 1) + 3; /*0x28320*/
if ( *a2 ) /*0x28323*/
{
v23 = *a2; /*0x28328*/
v24 = a2 + 2; /*0x2832c*/
do /*0x2833d*/
{
v25 = *(unsigned __int16 *)v24; /*0x28330*/
v24 += 2; /*0x28333*/
v22 += v25; /*0x28337*/
--v23; /*0x2833a*/
}
while ( v23 ); /*0x2833d*/
}
v5 = (_BYTE *)(*((_QWORD *)a2 + 26) + v22); /*0x28346*/
}
return 0; /*0x28374*/
}
// Function: UndiReadNvmInitData @ 0x28378 (0x1d4 bytes)
__int64 __fastcall UndiReadNvmInitData(__int64 a1, __int64 a2, __int64 a3)
{
__int64 result; // rax
__int64 v5; // rbx
__int64 n512; // rdi
__int64 n216; // rax
_BYTE *v8; // rdx
_BYTE *v9; // rcx
void (__fastcall *v10)(__int64, __int64, __int64, unsigned __int16 *); // rax
void (__fastcall *v11)(__int64, _QWORD, __int64, _BYTE *); // rax
__int64 n256; // rdi
__int64 v13; // r8
unsigned __int8 v14; // dl
unsigned __int64 v15; // rbx
_BYTE *v16; // [rsp+30h] [rbp-28h] BYREF
_QWORD v17[4]; // [rsp+38h] [rbp-20h] BYREF
unsigned __int16 v18; // [rsp+78h] [rbp+20h] BYREF
result = (*(__int64 (__fastcall **)(__int64, __int64 *, _QWORD *, __int64, _QWORD, int))(BootServices + 280))( /*0x283b5*/
a1,
qword_1D68,
v17,
ImageHandle_1,
0,
2);
if ( result >= 0 ) /*0x283be*/
{
v5 = *(_QWORD *)v17[0]; /*0x283c9*/
if ( *(_WORD *)(*(_QWORD *)v17[0] + 9602LL) == 4156 ) /*0x283d8*/
{
n512 = 512; /*0x283f0*/
result = (*(__int64 (__fastcall **)(__int64, __int64, _BYTE **))(BootServices + 64))(4, 512, &v16); /*0x28402*/
if ( result >= 0 ) /*0x28408*/
{
if ( v16 ) /*0x28413*/
{
n216 = 216; /*0x28419*/
v8 = (_BYTE *)a3; /*0x2841e*/
do /*0x2842d*/
{
--n216; /*0x28421*/
*v8++ = 0; /*0x28424*/
}
while ( n216 ); /*0x2842d*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(BootServices + 64))(4, 512, a3 + 208); /*0x28445*/
if ( result >= 0 ) /*0x2844b*/
{
v9 = *(_BYTE **)(a3 + 208); /*0x28451*/
if ( v9 ) /*0x2845b*/
{
do /*0x2846d*/
{
--n512; /*0x28461*/
*v9++ = 0; /*0x28464*/
}
while ( n512 ); /*0x2846d*/
v10 = *(void (__fastcall **)(__int64, __int64, __int64, unsigned __int16 *))(v5 + 1248); /*0x2846f*/
if ( v10 ) /*0x28479*/
v10(v5 + 88, 47, 1, &v18); /*0x2848d*/
if ( !v18 || v18 == 0xFFFF ) /*0x284a6*/
{
return 0x800000000000000CuLL; /*0x2852f*/
}
else
{
v11 = *(void (__fastcall **)(__int64, _QWORD, __int64, _BYTE *))(v5 + 1248); /*0x284ac*/
n256 = 256; /*0x284b3*/
if ( v11 ) /*0x284bb*/
v11(v5 + 88, v18, 256, v16); /*0x284c9*/
v13 = 0; /*0x284cb*/
do /*0x28504*/
{
v14 = *(_WORD *)&v16[v13]; /*0x284de*/
*(_WORD *)&v16[v13] >>= 8; /*0x284e5*/
*(_WORD *)&v16[v13] |= v14 << 8; /*0x284f7*/
v13 += 2; /*0x284fc*/
--n256; /*0x28500*/
}
while ( n256 ); /*0x28504*/
v15 = UndiParseNvmTlv(v16, (unsigned __int8 *)a3); /*0x28518*/
if ( v16 ) /*0x2851e*/
(*(void (**)(void))(BootServices + 72))(); /*0x28527*/
return v15; /*0x2852a*/
}
}
}
}
}
}
else
{
return 0x8000000000000003uLL; /*0x283da*/
}
}
return result; /*0x28543*/
}
// Function: UndiWriteNvmViaPhy @ 0x2854c (0x7b bytes)
// write access to const memory has been detected, the output may be wrong!
__int64 __fastcall UndiWriteNvmViaPhy(_DWORD *Var14, __int16 *p_n19542)
{
__int64 result; // rax
unsigned __int16 v5; // [rsp+38h] [rbp+10h] BYREF
v5 = 0; /*0x28563*/
if ( !p_n19542 ) /*0x2856b*/
return 1; /*0x2856d*/
result = PhyCalcNvmAddr(Var14, &v5); /*0x28577*/
if ( !(_DWORD)result )
{
Var14_0 = 0; /*0x28591*/
if ( (unsigned int)NvmWriteBlock(Var14, v5, 0x12Eu, p_n19542) )
return 2; /*0x285a1*/
else
return (unsigned int)NvmGetNvmType((__int64)Var14) != 0 ? 2 : 0;
}
return result; /*0x285c1*/
}
// Function: PciConfigRead @ 0x285c8 (0xa3 bytes)
// write access to const memory has been detected, the output may be wrong!
__int64 __fastcall PciConfigRead(_DWORD *Var14, __int16 *p_n19542)
{
__int64 result; // rax
unsigned __int16 v5; // [rsp+38h] [rbp+10h] BYREF
v5 = 0; /*0x285df*/
if ( !p_n19542 ) /*0x285e7*/
return 1; /*0x285ec*/
if ( (_DWORD *)Var14_0 == Var14 ) /*0x285f5*/
{
UtlMemCpy(p_n19542, qword_47120, 604); /*0x28607*/
}
else
{
result = PhyCalcNvmAddr(Var14, &v5); /*0x28613*/
if ( (_DWORD)result ) /*0x2861a*/
return result; /*0x2861a*/
if ( (unsigned int)NvmWriteEepromBlock(Var14, v5, 0x12Eu, p_n19542) ) /*0x2862d*/
return 2; /*0x2863b*/
UtlMemCpy(qword_47120, p_n19542, 604); /*0x2864d*/
Var14_0 = (__int64)Var14; /*0x28652*/
}
return 0; /*0x28665*/
}
// Function: UndiValidateName @ 0x2866c (0x2f bytes)
bool __fastcall UndiValidateName(_BYTE *Var22)
{
unsigned int n0xF; // eax
_BYTE *Var22_1; // rdx
if ( !Var22 ) /*0x28673*/
return 0; /*0x28673*/
n0xF = 0; /*0x28675*/
Var22_1 = Var22; /*0x28677*/
if ( !*Var22 ) /*0x2867a*/
return NiiValidateIpString(Var22); /*0x2867a*/
do /*0x28683*/
{
++Var22_1; /*0x2867e*/
++n0xF; /*0x28681*/
}
while ( *Var22_1 ); /*0x28683*/
return n0xF <= 0xF && NiiValidateIpString(Var22); /*0x28694*/
}
// Function: UndiWriteNameBlock @ 0x2869c (0xd3 bytes)
__int64 __fastcall UndiWriteNameBlock(_DWORD *Var14, char *Var22)
{
char *Var22_1; // r9
__int64 n256; // rax
__int16 *p_n19542_1; // rdx
unsigned int v6; // r8d
char *Var22_2; // rcx
char v8; // al
__int64 result; // rax
__int16 p_n19542[132]; // [rsp+20h] [rbp-108h] BYREF
unsigned __int16 v11; // [rsp+130h] [rbp+8h] BYREF
Var22_1 = Var22; /*0x286a5*/
n256 = 256; /*0x286ab*/
p_n19542_1 = p_n19542; /*0x286b0*/
v6 = 1; /*0x286b5*/
do /*0x286c4*/
{
*(_BYTE *)p_n19542_1 = 0; /*0x286bb*/
p_n19542_1 = (__int16 *)((char *)p_n19542_1 + 1); /*0x286be*/
--n256; /*0x286c1*/
}
while ( n256 ); /*0x286c4*/
if ( !Var14 || !Var22_1 ) /*0x286d2*/
return v6; /*0x286d2*/
Var22_2 = Var22_1; /*0x286d8*/
if ( !*Var22_1 ) /*0x286db*/
goto LABEL_9; /*0x286db*/
do /*0x286e6*/
{
++Var22_2; /*0x286e0*/
LODWORD(n256) = n256 + 1; /*0x286e3*/
}
while ( *Var22_2 ); /*0x286e6*/
if ( (unsigned int)n256 > 0xDF ) /*0x286f0*/
v8 = 0; /*0x286f2*/
else
LABEL_9:
v8 = NiiParseIpPrefixLen(Var22_1); /*0x286f9*/
if ( !v8 ) /*0x28700*/
return v6; /*0x28763*/
UtlMemCpy(p_n19542, Var22_1, 224); /*0x28710*/
result = PhyGetNvmOffset(Var14, &v11); /*0x28720*/
if ( !(_DWORD)result )
{
if ( (unsigned int)NvmWriteBlock(Var14, v11 + 3, 0x80u, p_n19542) )
return 2; /*0x2874b*/
else
return (unsigned int)NvmGetNvmType((__int64)Var14) != 0 ? 2 : 0;
}
return result; /*0x28766*/
}
// Function: UndiReadNameBlock @ 0x28770 (0xf9 bytes)
__int64 __fastcall UndiReadNameBlock(_DWORD *Var17, _BYTE *j)
{
__int64 result; // rax
_BYTE *j_1; // rcx
__int64 n224; // rax
__int64 n224_1; // rax
__int16 *p_n19542_1; // rcx
__int16 *p_n19542_2; // rdx
char v10; // cl
int v11; // eax
__int16 p_n19542[112]; // [rsp+20h] [rbp-E8h] BYREF
unsigned __int16 v13; // [rsp+118h] [rbp+10h] BYREF
v13 = 0; /*0x2878f*/
if ( !j ) /*0x28796*/
return 1; /*0x2879d*/
j_1 = j; /*0x287a7*/
n224 = 224; /*0x287aa*/
do /*0x287b9*/
{
--n224; /*0x287ad*/
*j_1++ = 0; /*0x287b0*/
}
while ( n224 ); /*0x287b9*/
n224_1 = 224; /*0x287bb*/
p_n19542_1 = p_n19542; /*0x287be*/
do /*0x287cf*/
{
--n224_1; /*0x287c3*/
*(_BYTE *)p_n19542_1 = 0; /*0x287c6*/
p_n19542_1 = (__int16 *)((char *)p_n19542_1 + 1); /*0x287c9*/
}
while ( n224_1 ); /*0x287cf*/
result = PhyGetNvmOffset(Var17, &v13); /*0x287dc*/
if ( !(_DWORD)result ) /*0x287e3*/
{
if ( (unsigned int)NvmWriteEepromBlock(Var17, v13 + 3, 0x70u, p_n19542) ) /*0x287fe*/
{
return 2; /*0x28807*/
}
else
{
p_n19542_2 = p_n19542; /*0x28813*/
v10 = p_n19542[0]; /*0x2881a*/
v11 = 0; /*0x2881c*/
if ( LOBYTE(p_n19542[0]) == 0xFF ) /*0x2881e*/
v10 = 0; /*0x2881e*/
LOBYTE(p_n19542[0]) = v10; /*0x28821*/
if ( v10 ) /*0x28828*/
{
do /*0x2882f*/
{
p_n19542_2 = (__int16 *)((char *)p_n19542_2 + 1); /*0x2882a*/
++v11; /*0x2882d*/
}
while ( *(_BYTE *)p_n19542_2 ); /*0x2882f*/
}
if ( (unsigned int)(v11 + 1) > 0xE0 ) /*0x28838*/
return 1; /*0x28838*/
UtlMemCpy(j, p_n19542, 224); /*0x28849*/
return 0; /*0x2884e*/
}
}
return result; /*0x28864*/
}
// Function: PhyWriteNameStr224 @ 0x2886c (0xbb bytes)
__int64 __fastcall PhyWriteNameStr224(_DWORD *Var14, char *Var22)
{
__int64 n604; // rax
__int16 *p_n19542_1; // rdx
char *Var22_1; // rcx
char v7; // al
__int64 result; // rax
__int64 n224; // rax
_BYTE *v10; // rcx
__int64 v11; // rcx
char v12; // al
__int16 p_n19542[11]; // [rsp+20h] [rbp-268h] BYREF
_BYTE v14[594]; // [rsp+36h] [rbp-252h] BYREF
n604 = 604; /*0x2887f*/
p_n19542_1 = p_n19542; /*0x28884*/
do /*0x28893*/
{
*(_BYTE *)p_n19542_1 = 0; /*0x28889*/
p_n19542_1 = (__int16 *)((char *)p_n19542_1 + 1); /*0x2888c*/
--n604; /*0x2888f*/
}
while ( n604 ); /*0x28893*/
if ( !Var14 || !Var22 ) /*0x2889d*/
return 1; /*0x2889d*/
Var22_1 = Var22; /*0x2889f*/
if ( !*Var22 ) /*0x288a2*/
goto LABEL_9; /*0x288a2*/
do /*0x288ab*/
{
++Var22_1; /*0x288a6*/
LODWORD(n604) = n604 + 1; /*0x288a9*/
}
while ( *Var22_1 ); /*0x288ab*/
if ( (unsigned int)n604 > 0xDF ) /*0x288b5*/
v7 = 0; /*0x288b7*/
else
LABEL_9:
v7 = NiiParseIpPrefixLen(Var22); /*0x288be*/
if ( !v7 ) /*0x288c5*/
return 1; /*0x28911*/
result = PciConfigRead(Var14, p_n19542); /*0x288cf*/
if ( !(_DWORD)result ) /*0x288d6*/
{
n224 = 224; /*0x288d8*/
v10 = v14; /*0x288dd*/
do /*0x288ec*/
{
*v10++ = 0; /*0x288e2*/
--n224; /*0x288e8*/
}
while ( n224 ); /*0x288ec*/
v11 = v14 - Var22; /*0x288f3*/
do /*0x28900*/
{
v12 = *Var22; /*0x288f6*/
Var22[v11] = *Var22; /*0x288f8*/
++Var22; /*0x288fb*/
}
while ( v12 ); /*0x28900*/
return UndiWriteNvmViaPhy(Var14, p_n19542); /*0x2890a*/
}
return result; /*0x2891e*/
}
// Function: PhyReadNameStr224 @ 0x28928 (0xc6 bytes)
__int64 __fastcall PhyReadNameStr224(_DWORD *Var17, int n224, _BYTE *j)
{
__int64 n604; // rax
__int16 *p_n19542_1; // rdx
__int64 n224_1; // rax
_BYTE *j_1; // rcx
__int64 result; // rax
_BYTE *v10; // rdx
int v11; // r8d
char v12; // cl
char *v13; // rcx
__int64 v14; // rbx
char v15; // al
__int16 p_n19542[11]; // [rsp+20h] [rbp-268h] BYREF
_BYTE v17[594]; // [rsp+36h] [rbp-252h] BYREF
n604 = 604; /*0x28938*/
p_n19542_1 = p_n19542; /*0x2893d*/
do /*0x28953*/
{
--n604; /*0x28947*/
*(_BYTE *)p_n19542_1 = 0; /*0x2894a*/
p_n19542_1 = (__int16 *)((char *)p_n19542_1 + 1); /*0x2894d*/
}
while ( n604 ); /*0x28953*/
if ( !Var17 || !j ) /*0x2895d*/
return 1; /*0x2895d*/
n224_1 = 224; /*0x2895f*/
j_1 = j; /*0x28964*/
do /*0x28973*/
{
--n224_1; /*0x28967*/
*j_1++ = 0; /*0x2896a*/
}
while ( n224_1 ); /*0x28973*/
result = PciConfigRead(Var17, p_n19542); /*0x2897d*/
if ( !(_DWORD)result ) /*0x28984*/
{
v10 = v17; /*0x2898b*/
v11 = 0; /*0x28990*/
v12 = v17[0]; /*0x28995*/
if ( v17[0] == 0xFF ) /*0x28997*/
v12 = 0; /*0x28997*/
v17[0] = v12; /*0x2899a*/
if ( v12 ) /*0x289a1*/
{
do /*0x289a9*/
{
++v10; /*0x289a3*/
++v11; /*0x289a6*/
}
while ( *v10 ); /*0x289a9*/
}
if ( (unsigned int)(v11 + 1) <= 0xE0 ) /*0x289b8*/
{
v13 = v17; /*0x289bf*/
v14 = j - v17; /*0x289c4*/
do /*0x289d2*/
{
v15 = *v13; /*0x289c7*/
v13[v14] = *v13; /*0x289c9*/
++v13; /*0x289cc*/
}
while ( v15 ); /*0x289d2*/
return 0; /*0x289d6*/
}
return 1; /*0x289d8*/
}
return result; /*0x289e5*/
}
// Function: PhyDetectSpeed @ 0x289f0 (0x5d bytes)
bool __fastcall PhyDetectSpeed(_DWORD *Var14)
{
__int64 n604; // rax
__int16 *p_n19542_1; // rdx
bool result; // al
__int16 n2; // ax
__int16 p_n19542[308]; // [rsp+20h] [rbp-268h] BYREF
n604 = 604; /*0x289f9*/
p_n19542_1 = p_n19542; /*0x289fe*/
do /*0x28a11*/
{
*(_BYTE *)p_n19542_1 = 0; /*0x28a08*/
p_n19542_1 = (__int16 *)((char *)p_n19542_1 + 1); /*0x28a0b*/
--n604; /*0x28a0e*/
}
while ( n604 ); /*0x28a11*/
result = 0; /*0x28a42*/
if ( Var14 ) /*0x28a16*/
{
if ( !(unsigned int)PciConfigRead(Var14, p_n19542) ) /*0x28a21*/
{
n2 = ((unsigned __int16)p_n19542[0] >> 2) & 3; /*0x28a33*/
if ( n2 == 1 || n2 == 2 ) /*0x28a40*/
return 1; /*0x28a16*/
}
}
return result; /*0x28a44*/
}
// Function: PhySetSpeed @ 0x28a50 (0xb5 bytes)
__int64 __fastcall PhySetSpeed(_DWORD *Var14, char a2)
{
__int16 *p_n19542_1; // r8
__int64 n604; // rdx
__int64 result; // rax
__int16 v7; // ax
__int16 p_n19542[308]; // [rsp+20h] [rbp-268h] BYREF
p_n19542_1 = p_n19542; /*0x28a62*/
n604 = 604; /*0x28a67*/
do /*0x28a77*/
{
*(_BYTE *)p_n19542_1 = 0; /*0x28a6c*/
p_n19542_1 = (__int16 *)((char *)p_n19542_1 + 1); /*0x28a70*/
--n604; /*0x28a73*/
}
while ( n604 ); /*0x28a77*/
if ( !Var14 ) /*0x28a7c*/
return 1; /*0x28a7c*/
result = PciConfigRead(Var14, p_n19542); /*0x28a8a*/
if ( !(_DWORD)result ) /*0x28a91*/
{
switch ( (*(_DWORD *)p_n19542 >> 2) & 3 ) /*0x28a9d*/
{
case 0: /*0x28a9d*/
if ( a2 ) /*0x28ae5*/
return 1; /*0x28a83*/
return UndiWriteNvmViaPhy(Var14, p_n19542); /*0x28ae5*/
case 1: /*0x28a9d*/
if ( !a2 ) /*0x28ac9*/
return UndiWriteNvmViaPhy(Var14, p_n19542); /*0x28aef*/
v7 = p_n19542[0] & 0xFFF3 | 8; /*0x28ad8*/
break;
case 2: /*0x28a9d*/
if ( a2 ) /*0x28ab2*/
return UndiWriteNvmViaPhy(Var14, p_n19542); /*0x28ab2*/
v7 = p_n19542[0] & 0xFFF3 | 4; /*0x28ac1*/
break;
default:
return 2; /*0x28aae*/
}
p_n19542[0] = v7; /*0x28adc*/
return UndiWriteNvmViaPhy(Var14, p_n19542); /*0x28ae1*/
}
return result; /*0x28afc*/
}
// Function: PhyIsGigabit @ 0x28b08 (0x47 bytes)
bool __fastcall PhyIsGigabit(_DWORD *Var14)
{
__int64 n604; // rax
__int16 *p_n19542_1; // rdx
__int16 p_n19542[308]; // [rsp+20h] [rbp-268h] BYREF
n604 = 604; /*0x28b0f*/
p_n19542_1 = p_n19542; /*0x28b14*/
do /*0x28b23*/
{
*(_BYTE *)p_n19542_1 = 0; /*0x28b19*/
p_n19542_1 = (__int16 *)((char *)p_n19542_1 + 1); /*0x28b1c*/
--n604; /*0x28b1f*/
}
while ( n604 ); /*0x28b23*/
return Var14 && !(unsigned int)PciConfigRead(Var14, p_n19542) && (p_n19542[0] & 0xC) == 8; /*0x28b47*/
}
// Function: PhyWriteNameStr128 @ 0x28b50 (0xbf bytes)
__int64 __fastcall PhyWriteNameStr128(_DWORD *Var14, char *Var22)
{
__int64 n604; // rax
__int16 *p_n19542_1; // rdx
char *Var22_1; // rcx
char v7; // al
__int64 result; // rax
__int64 n128; // rax
_BYTE *v10; // rcx
__int64 v11; // rcx
char v12; // al
__int16 p_n19542[148]; // [rsp+20h] [rbp-268h] BYREF
_BYTE v14[320]; // [rsp+148h] [rbp-140h] BYREF
n604 = 604; /*0x28b63*/
p_n19542_1 = p_n19542; /*0x28b68*/
do /*0x28b77*/
{
*(_BYTE *)p_n19542_1 = 0; /*0x28b6d*/
p_n19542_1 = (__int16 *)((char *)p_n19542_1 + 1); /*0x28b70*/
--n604; /*0x28b73*/
}
while ( n604 ); /*0x28b77*/
if ( !Var14 || !Var22 ) /*0x28b81*/
return 1; /*0x28b81*/
Var22_1 = Var22; /*0x28b83*/
if ( !*Var22 ) /*0x28b86*/
goto LABEL_9; /*0x28b86*/
do /*0x28b8f*/
{
++Var22_1; /*0x28b8a*/
LODWORD(n604) = n604 + 1; /*0x28b8d*/
}
while ( *Var22_1 ); /*0x28b8f*/
if ( (unsigned int)n604 > 0x7F ) /*0x28b97*/
v7 = 0; /*0x28b99*/
else
LABEL_9:
v7 = NiiParseIpPrefixLen(Var22); /*0x28ba0*/
if ( !v7 ) /*0x28ba7*/
return 1; /*0x28bf9*/
result = PciConfigRead(Var14, p_n19542); /*0x28bb1*/
if ( !(_DWORD)result ) /*0x28bb8*/
{
n128 = 128; /*0x28bba*/
v10 = v14; /*0x28bbf*/
do /*0x28bd1*/
{
*v10++ = 0; /*0x28bc7*/
--n128; /*0x28bcd*/
}
while ( n128 ); /*0x28bd1*/
v11 = v14 - Var22; /*0x28bdb*/
do /*0x28be8*/
{
v12 = *Var22; /*0x28bde*/
Var22[v11] = *Var22; /*0x28be0*/
++Var22; /*0x28be3*/
}
while ( v12 ); /*0x28be8*/
return UndiWriteNvmViaPhy(Var14, p_n19542); /*0x28bf2*/
}
return result; /*0x28c06*/
}
// Function: PhyReadNameStr128 @ 0x28c10 (0xdd bytes)
__int64 __fastcall PhyReadNameStr128(_DWORD *Var17, int n128, _BYTE *j)
{
__int64 n604; // rax
__int16 *p_n19542_1; // rdx
__int64 n128_1; // rax
_BYTE *j_1; // rcx
__int64 result; // rax
_BYTE *v10; // rdx
int v11; // r8d
char v12; // cl
char *v13; // rcx
__int64 v14; // rbx
char v15; // al
__int16 p_n19542[148]; // [rsp+20h] [rbp-268h] BYREF
_BYTE v17[320]; // [rsp+148h] [rbp-140h] BYREF
n604 = 604; /*0x28c20*/
p_n19542_1 = p_n19542; /*0x28c25*/
do /*0x28c3b*/
{
--n604; /*0x28c2f*/
*(_BYTE *)p_n19542_1 = 0; /*0x28c32*/
p_n19542_1 = (__int16 *)((char *)p_n19542_1 + 1); /*0x28c35*/
}
while ( n604 ); /*0x28c3b*/
if ( !Var17 || !j ) /*0x28c49*/
return 1; /*0x28c49*/
n128_1 = 128; /*0x28c4f*/
j_1 = j; /*0x28c54*/
do /*0x28c63*/
{
--n128_1; /*0x28c57*/
*j_1++ = 0; /*0x28c5a*/
}
while ( n128_1 ); /*0x28c63*/
result = PciConfigRead(Var17, p_n19542); /*0x28c6d*/
if ( !(_DWORD)result ) /*0x28c74*/
{
v10 = v17; /*0x28c7e*/
v11 = 0; /*0x28c86*/
v12 = v17[0]; /*0x28c8b*/
if ( v17[0] == 0xFF ) /*0x28c8d*/
v12 = 0; /*0x28c8d*/
v17[0] = v12; /*0x28c90*/
if ( v12 ) /*0x28c9a*/
{
do /*0x28ca2*/
{
++v10; /*0x28c9c*/
++v11; /*0x28c9f*/
}
while ( *v10 ); /*0x28ca2*/
}
if ( (unsigned int)(v11 + 1) <= 0x80 ) /*0x28cb1*/
{
v13 = v17; /*0x28cbb*/
v14 = j - v17; /*0x28cc3*/
do /*0x28cd1*/
{
v15 = *v13; /*0x28cc6*/
v13[v14] = *v13; /*0x28cc8*/
++v13; /*0x28ccb*/
}
while ( v15 ); /*0x28cd1*/
return 0; /*0x28cd5*/
}
return 1; /*0x28cd7*/
}
return result; /*0x28ce4*/
}
// Function: PhyWriteOemData @ 0x28cf0 (0xbc bytes)
__int64 __fastcall PhyWriteOemData(_DWORD *Var14, char *Var22)
{
__int64 n604; // rax
__int16 *p_n19542_1; // rdx
int v6; // ecx
char *Var22_1; // rdx
__int64 result; // rax
__int64 n17; // rax
_BYTE *v10; // rcx
__int64 v11; // rcx
char v12; // al
__int16 p_n19542[139]; // [rsp+20h] [rbp-268h] BYREF
_BYTE v14[338]; // [rsp+136h] [rbp-152h] BYREF
n604 = 604; /*0x28d03*/
p_n19542_1 = p_n19542; /*0x28d08*/
do /*0x28d17*/
{
*(_BYTE *)p_n19542_1 = 0; /*0x28d0d*/
p_n19542_1 = (__int16 *)((char *)p_n19542_1 + 1); /*0x28d10*/
--n604; /*0x28d13*/
}
while ( n604 ); /*0x28d17*/
if ( !Var14 || !Var22 ) /*0x28d21*/
return 1; /*0x28d21*/
if ( !PhyWriteNameOrOem(Var22) ) /*0x28d26*/
{
v6 = 0; /*0x28d2f*/
Var22_1 = Var22; /*0x28d31*/
if ( *Var22 ) /*0x28d34*/
{
do /*0x28d3d*/
{
++Var22_1; /*0x28d38*/
++v6; /*0x28d3b*/
}
while ( *Var22_1 ); /*0x28d3d*/
if ( v6 ) /*0x28d44*/
return 1; /*0x28d96*/
}
}
result = PciConfigRead(Var14, p_n19542); /*0x28d4e*/
if ( !(_DWORD)result ) /*0x28d55*/
{
n17 = 17; /*0x28d57*/
v10 = v14; /*0x28d5c*/
do /*0x28d6e*/
{
*v10++ = 0; /*0x28d64*/
--n17; /*0x28d6a*/
}
while ( n17 ); /*0x28d6e*/
v11 = v14 - Var22; /*0x28d78*/
do /*0x28d85*/
{
v12 = *Var22; /*0x28d7b*/
Var22[v11] = *Var22; /*0x28d7d*/
++Var22; /*0x28d80*/
}
while ( v12 ); /*0x28d85*/
return UndiWriteNvmViaPhy(Var14, p_n19542); /*0x28d8f*/
}
return result; /*0x28da3*/
}
// Function: PhyReadOemData @ 0x28dac (0xdd bytes)
__int64 __fastcall PhyReadOemData(_DWORD *Var17, int n128, _BYTE *j)
{
__int64 n604; // rax
__int16 *p_n19542_1; // rdx
__int64 n128_1; // rax
_BYTE *j_1; // rcx
__int64 result; // rax
_BYTE *v10; // rdx
int v11; // r8d
char v12; // cl
char *v13; // rcx
__int64 v14; // rbx
char v15; // al
__int16 p_n19542[139]; // [rsp+20h] [rbp-268h] BYREF
_BYTE v17[338]; // [rsp+136h] [rbp-152h] BYREF
n604 = 604; /*0x28dbc*/
p_n19542_1 = p_n19542; /*0x28dc1*/
do /*0x28dd7*/
{
--n604; /*0x28dcb*/
*(_BYTE *)p_n19542_1 = 0; /*0x28dce*/
p_n19542_1 = (__int16 *)((char *)p_n19542_1 + 1); /*0x28dd1*/
}
while ( n604 ); /*0x28dd7*/
if ( !Var17 || !j ) /*0x28de5*/
return 1; /*0x28de5*/
n128_1 = 128; /*0x28deb*/
j_1 = j; /*0x28df0*/
do /*0x28dff*/
{
--n128_1; /*0x28df3*/
*j_1++ = 0; /*0x28df6*/
}
while ( n128_1 ); /*0x28dff*/
result = PciConfigRead(Var17, p_n19542); /*0x28e09*/
if ( !(_DWORD)result ) /*0x28e10*/
{
v10 = v17; /*0x28e1a*/
v11 = 0; /*0x28e22*/
v12 = v17[0]; /*0x28e27*/
if ( v17[0] == 0xFF ) /*0x28e29*/
v12 = 0; /*0x28e29*/
v17[0] = v12; /*0x28e2c*/
if ( v12 ) /*0x28e36*/
{
do /*0x28e3e*/
{
++v10; /*0x28e38*/
++v11; /*0x28e3b*/
}
while ( *v10 ); /*0x28e3e*/
}
if ( (unsigned int)(v11 + 1) <= 0x80 ) /*0x28e4d*/
{
v13 = v17; /*0x28e57*/
v14 = j - v17; /*0x28e5f*/
do /*0x28e6d*/
{
v15 = *v13; /*0x28e62*/
v13[v14] = *v13; /*0x28e64*/
++v13; /*0x28e67*/
}
while ( v15 ); /*0x28e6d*/
return 0; /*0x28e71*/
}
return 1; /*0x28e73*/
}
return result; /*0x28e80*/
}
// Function: PhyWriteNameOrOem @ 0x28e8c (0x4e bytes)
char __fastcall PhyWriteNameOrOem(char *Var22)
{
char *Var22_1; // rdx
unsigned int n0x10; // eax
char *Var22_2; // rdx
unsigned int n0xC; // eax
if ( !Var22 ) /*0x28e96*/
return 0; /*0x28e96*/
Var22_1 = Var22; /*0x28e98*/
n0x10 = 0; /*0x28e9b*/
if ( *Var22 ) /*0x28e9e*/
{
do /*0x28ea8*/
{
++Var22_1; /*0x28ea3*/
++n0x10; /*0x28ea6*/
}
while ( *Var22_1 ); /*0x28ea8*/
if ( n0x10 > 0x10 ) /*0x28eb0*/
return 0; /*0x28eb0*/
}
Var22_2 = Var22; /*0x28eb2*/
n0xC = 0; /*0x28eb5*/
if ( !*Var22 ) /*0x28eb8*/
return 0; /*0x28eb8*/
do /*0x28ec2*/
{
++Var22_2; /*0x28ebd*/
++n0xC; /*0x28ec0*/
}
while ( *Var22_2 ); /*0x28ec2*/
if ( n0xC >= 0xC ) /*0x28eca*/
return NiiParseIpPrefixLen(Var22); /*0x28ecc*/
else
return 0; /*0x28ed3*/
}
// Function: PhyWriteOemData2 @ 0x28edc (0xbc bytes)
__int64 __fastcall PhyWriteOemData2(_DWORD *Var14, char *Var22)
{
__int64 n604; // rax
__int16 *p_n19542_1; // rdx
int v6; // ecx
char *Var22_1; // rdx
__int64 result; // rax
__int64 n17; // rax
_BYTE *v10; // rcx
__int64 v11; // rcx
char v12; // al
__int16 p_n19542[213]; // [rsp+20h] [rbp-268h] BYREF
_BYTE v14[190]; // [rsp+1CAh] [rbp-BEh] BYREF
n604 = 604; /*0x28eef*/
p_n19542_1 = p_n19542; /*0x28ef4*/
do /*0x28f03*/
{
*(_BYTE *)p_n19542_1 = 0; /*0x28ef9*/
p_n19542_1 = (__int16 *)((char *)p_n19542_1 + 1); /*0x28efc*/
--n604; /*0x28eff*/
}
while ( n604 ); /*0x28f03*/
if ( !Var14 || !Var22 ) /*0x28f0d*/
return 1; /*0x28f0d*/
if ( !PhyWriteNameOrOem(Var22) ) /*0x28f12*/
{
v6 = 0; /*0x28f1b*/
Var22_1 = Var22; /*0x28f1d*/
if ( *Var22 ) /*0x28f20*/
{
do /*0x28f29*/
{
++Var22_1; /*0x28f24*/
++v6; /*0x28f27*/
}
while ( *Var22_1 ); /*0x28f29*/
if ( v6 ) /*0x28f30*/
return 1; /*0x28f82*/
}
}
result = PciConfigRead(Var14, p_n19542); /*0x28f3a*/
if ( !(_DWORD)result ) /*0x28f41*/
{
n17 = 17; /*0x28f43*/
v10 = v14; /*0x28f48*/
do /*0x28f5a*/
{
*v10++ = 0; /*0x28f50*/
--n17; /*0x28f56*/
}
while ( n17 ); /*0x28f5a*/
v11 = v14 - Var22; /*0x28f64*/
do /*0x28f71*/
{
v12 = *Var22; /*0x28f67*/
Var22[v11] = *Var22; /*0x28f69*/
++Var22; /*0x28f6c*/
}
while ( v12 ); /*0x28f71*/
return UndiWriteNvmViaPhy(Var14, p_n19542); /*0x28f7b*/
}
return result; /*0x28f8f*/
}
// Function: PhyReadOemData2 @ 0x28f98 (0xdd bytes)
__int64 __fastcall PhyReadOemData2(_DWORD *Var17, int n128, _BYTE *j)
{
__int64 n604; // rax
__int16 *p_n19542_1; // rdx
__int64 n128_1; // rax
_BYTE *j_1; // rcx
__int64 result; // rax
_BYTE *v10; // rdx
int v11; // r8d
char v12; // cl
char *v13; // rcx
__int64 v14; // rbx
char v15; // al
__int16 p_n19542[213]; // [rsp+20h] [rbp-268h] BYREF
_BYTE v17[190]; // [rsp+1CAh] [rbp-BEh] BYREF
n604 = 604; /*0x28fa8*/
p_n19542_1 = p_n19542; /*0x28fad*/
do /*0x28fc3*/
{
--n604; /*0x28fb7*/
*(_BYTE *)p_n19542_1 = 0; /*0x28fba*/
p_n19542_1 = (__int16 *)((char *)p_n19542_1 + 1); /*0x28fbd*/
}
while ( n604 ); /*0x28fc3*/
if ( !Var17 || !j ) /*0x28fd1*/
return 1; /*0x28fd1*/
n128_1 = 128; /*0x28fd7*/
j_1 = j; /*0x28fdc*/
do /*0x28feb*/
{
--n128_1; /*0x28fdf*/
*j_1++ = 0; /*0x28fe2*/
}
while ( n128_1 ); /*0x28feb*/
result = PciConfigRead(Var17, p_n19542); /*0x28ff5*/
if ( !(_DWORD)result ) /*0x28ffc*/
{
v10 = v17; /*0x29006*/
v11 = 0; /*0x2900e*/
v12 = v17[0]; /*0x29013*/
if ( v17[0] == 0xFF ) /*0x29015*/
v12 = 0; /*0x29015*/
v17[0] = v12; /*0x29018*/
if ( v12 ) /*0x29022*/
{
do /*0x2902a*/
{
++v10; /*0x29024*/
++v11; /*0x29027*/
}
while ( *v10 ); /*0x2902a*/
}
if ( (unsigned int)(v11 + 1) <= 0x80 ) /*0x29039*/
{
v13 = v17; /*0x29043*/
v14 = j - v17; /*0x2904b*/
do /*0x29059*/
{
v15 = *v13; /*0x2904e*/
v13[v14] = *v13; /*0x29050*/
++v13; /*0x29053*/
}
while ( v15 ); /*0x29059*/
return 0; /*0x2905d*/
}
return 1; /*0x2905f*/
}
return result; /*0x2906c*/
}
// Function: PhyGetNvmOffset @ 0x29078 (0xba bytes)
__int64 __fastcall PhyGetNvmOffset(_DWORD *Var14, unsigned __int16 *a2)
{
unsigned __int16 n61; // ax
__int16 v6; // [rsp+38h] [rbp+10h] BYREF
unsigned __int16 n0x40; // [rsp+40h] [rbp+18h] BYREF
v6 = 0; /*0x29090*/
n0x40 = 0; /*0x29094*/
if ( !a2 ) /*0x2909b*/
return 1; /*0x2909b*/
if ( (unsigned int)NvmReadEepromWord((__int64)Var14, (__int64)&v6, 0x33u) /*0x290c2*/
|| (v6 & 0x10) == 0
|| !PhyValidateSignature(Var14) )
{
return 2; /*0x290c2*/
}
if ( *Var14 == 1 ) /*0x290d1*/
{
n61 = 61; /*0x290e2*/
}
else
{
if ( (unsigned int)(*Var14 - 2) > 1 ) /*0x290d9*/
return 1; /*0x290a2*/
n61 = 23; /*0x290db*/
}
if ( (unsigned int)NvmReadEepromWord((__int64)Var14, (__int64)&n0x40, n61) /*0x29114*/
|| !n0x40
|| n0x40 == 0xFFFF
|| n0x40 < 0x40u )
{
return 2; /*0x2911d*/
}
*a2 = n0x40; /*0x29116*/
return 0; /*0x2912c*/
}
// Function: PhyCalcNvmAddr @ 0x29134 (0x63 bytes)
__int64 __fastcall PhyCalcNvmAddr(_DWORD *Var14, _WORD *a2)
{
__int64 result; // rax
unsigned __int16 v5; // [rsp+38h] [rbp+10h] BYREF
v5 = 0; /*0x2914b*/
if ( !a2 ) /*0x29153*/
return 1; /*0x29155*/
result = PhyGetNvmOffset(Var14, &v5); /*0x2915f*/
if ( !(_DWORD)result ) /*0x29166*/
{
*a2 = v5 + 302 * *((unsigned __int8 *)Var14 + 4) + 148; /*0x29182*/
return 0; /*0x29185*/
}
return result; /*0x29191*/
}
// Function: PhyValidateSignature @ 0x29198 (0xf0 bytes)
bool __fastcall PhyValidateSignature(_DWORD *Var14)
{
unsigned __int16 n61; // ax
unsigned __int16 n0x40; // [rsp+30h] [rbp+8h] BYREF
__int16 n21353; // [rsp+38h] [rbp+10h] BYREF
n0x40 = 0; /*0x291a7*/
if ( !Var14 ) /*0x291af*/
return 0; /*0x291af*/
if ( *Var14 == 1 ) /*0x291ba*/
{
n61 = 61; /*0x291cd*/
}
else
{
if ( (unsigned int)(*Var14 - 2) > 1 ) /*0x291c2*/
return 0; /*0x291c2*/
n61 = 23; /*0x291c8*/
}
if ( (unsigned int)NvmReadEepromWord((__int64)Var14, (__int64)&n0x40, n61) /*0x29238*/
|| !n0x40
|| n0x40 == 0xFFFF
|| n0x40 < 0x40u
|| (unsigned int)NvmReadEepromWord((__int64)Var14, (__int64)&n21353, n0x40)
|| n21353 != 21353
|| (unsigned int)NvmReadEepromWord((__int64)Var14, (__int64)&n21353, n0x40 + 1) )
{
return 0; /*0x2923f*/
}
switch ( n21353 ) /*0x2924e*/
{
case 900: /*0x2924e*/
if ( *((_BYTE *)Var14 + 4) ) /*0x2926b*/
return 0; /*0x2926f*/
break;
case 1504: /*0x2924e*/
break;
case 2712: /*0x2924e*/
return 1; /*0x29262*/
default:
return 0; /*0x29262*/
}
return *((_BYTE *)Var14 + 4) <= 1u; /*0x29282*/
}
// Function: PhyReadConfigBlock @ 0x29288 (0x125 bytes)
__int16 __fastcall PhyReadConfigBlock(__int64 a1, _QWORD *Var21)
{
__int16 v2; // bx
__int64 n1824; // rax
_BYTE *Var21_1; // rcx
int EepromWord; // eax
unsigned __int16 v9; // si
__int16 i; // ax
v2 = 0; /*0x292a1*/
if ( !Var21 ) /*0x292ac*/
return 4; /*0x292b1*/
n1824 = 1824; /*0x292b6*/
Var21_1 = Var21; /*0x292bb*/
do /*0x292cf*/
{
--n1824; /*0x292c4*/
*Var21_1++ = 0; /*0x292c7*/
}
while ( n1824 ); /*0x292cf*/
Var21[1] = a1; /*0x292dc*/
*((_WORD *)Var21 + 906) = 256; /*0x292e0*/
*((_WORD *)Var21 + 2) = 47; /*0x292e7*/
if ( a1 ) /*0x292ef*/
EepromWord = NvmReadEepromWord(a1, (__int64)Var21 + 6, 0x2Fu); /*0x292f8*/
else
EepromWord = 1; /*0x292ff*/
if ( EepromWord ) /*0x29304*/
return 1; /*0x29304*/
if ( *((_WORD *)Var21 + 3) && *((_WORD *)Var21 + 3) != 0xFFFF )
{
v9 = 0; /*0x29320*/
while ( !(a1 ? NvmReadEepromWord(a1, (__int64)Var21 + 2 * v9 + 16, v9 + *((_WORD *)Var21 + 3)) : 1) )
{
if ( ++v9 >= 0x80u ) /*0x2935a*/
{
for ( i = 0; *((_WORD *)Var21 + 8) != i || *((_WORD *)Var21 + 9) != i; i += 4369 ) /*0x2935c*/
{
if ( (unsigned __int16)++v2 > 0xFu ) /*0x2937a*/
return PhyReadEntryBlock(Var21); /*0x29384*/
}
return 13; /*0x2938b*/
}
}
return 1; /*0x2930a*/
}
return 3; /*0x293a6*/
}
// Function: PhySearchEntry @ 0x293b0 (0xa5 bytes)
__int16 __fastcall PhySearchEntry(_QWORD *Var21, unsigned int n4, _BYTE *a3, __int64 *p_Var19)
{
unsigned __int16 v8; // r10
unsigned __int16 v9; // r10
unsigned __int16 v10; // r11
v8 = 0; /*0x293df*/
if ( !*((_WORD *)Var21 + 904) ) /*0x293c9*/
return 7; /*0x293c9*/
while ( !PhyEntrySearchTable(n4, a3, (__int64)Var21 + 12 * v8 + 272) ) /*0x29406*/
{
v8 = v9 + 1; /*0x29408*/
if ( v8 >= v10 ) /*0x29410*/
return 7; /*0x29410*/
}
if ( v9 < v10 ) /*0x29436*/
return PhyValidateSignature_0(Var21, p_Var19, (int *)Var21 + 3 * v9 + 68); /*0x2944e*/
else
return 7; /*0x29412*/
}
// Function: PhyEntrySearchTable @ 0x29888 (0x4d bytes)
char __fastcall PhyEntrySearchTable(unsigned int n4, _BYTE *a2, __int64 a3)
{
char v3; // r9
v3 = 1; /*0x29888*/
if ( n4 != 1 || *(_DWORD *)a3 != 1 ) /*0x29896*/
{
if ( n4 != 4 ) /*0x2989b*/
goto LABEL_10; /*0x2989b*/
if ( *(_DWORD *)a3 != 4 || *a2 != *(_BYTE *)(a3 + 4) ) /*0x298a8*/
return 0; /*0x298a8*/
if ( a2[1] != *(_BYTE *)(a3 + 5) ) /*0x298b1*/
{
LABEL_10:
if ( n4 != 5 || *(_DWORD *)a3 != 5 || *a2 != *(_BYTE *)(a3 + 4) || a2[1] != *(_BYTE *)(a3 + 5) ) /*0x298cc*/
return 0; /*0x298ce*/
}
}
return v3; /*0x298d4*/
}
// Function: PhyValidateSignature_0 @ 0x298d8 (0xcd bytes)
__int16 __fastcall PhyValidateSignature_0(_QWORD *Var21, __int64 *p_Var19, int *a3)
{
__int64 v3; // r10
char v7; // al
int n2; // edx
unsigned __int16 v9; // r11
__int64 v10; // rbx
__int64 *v11; // r8
unsigned __int16 v12; // cx
v3 = *((unsigned __int16 *)a3 + 3); /*0x298eb*/
if ( (unsigned int)(v3 + 1) > 0x100 ) /*0x29905*/
return 4; /*0x2990a*/
v7 = *((_BYTE *)a3 + 4); /*0x2990f*/
*((_WORD *)p_Var19 + 3) = v3; /*0x29913*/
*((_BYTE *)p_Var19 + 4) = v7; /*0x2991a*/
*((_BYTE *)p_Var19 + 5) = *((_BYTE *)a3 + 5); /*0x29921*/
n2 = *a3; /*0x29924*/
*(_DWORD *)p_Var19 = *a3; /*0x29927*/
if ( (_WORD)v3 ) /*0x2992e*/
{
v9 = *((_WORD *)a3 + 4); /*0x29930*/
v10 = v3; /*0x29935*/
v11 = p_Var19 + 1; /*0x29938*/
do /*0x29943*/
{
v12 = *((_WORD *)Var21 + ((unsigned __int64)v9 >> 1) + 8); /*0x29943*/
if ( *((_BYTE *)Var21 + 2) ) /*0x29948*/
{
if ( (v9 & 1) == 0 ) /*0x29951*/
goto LABEL_9; /*0x29951*/
}
else if ( (v9 & 1) != 0 ) /*0x29958*/
{
LABEL_9:
v12 >>= 8; /*0x2995a*/
}
*(_BYTE *)v11 = v12; /*0x2995e*/
++v9; /*0x29961*/
v11 = (__int64 *)((char *)v11 + 1); /*0x29965*/
--v10; /*0x29968*/
}
while ( v10 ); /*0x29943*/
}
*((_BYTE *)p_Var19 + v3 + 8) = 0; /*0x2996d*/
if ( n2 == 2 || n2 == 3 || n2 == 6 || n2 == 7 ) /*0x29984*/
return 8; /*0x2998b*/
else
return 0; /*0x29986*/
}
// Function: PhyReadEntryBlock @ 0x299a8 (0x278 bytes)
__int16 __fastcall PhyReadEntryBlock(_QWORD *Var21)
{
__int16 n120; // dx
__int16 n7; // ax
unsigned __int16 v4; // r8
unsigned __int16 v5; // cx
char v6; // dl
char *v7; // r10
__int64 n12_1; // rax
char *v9; // rcx
char v10; // r11
char v11; // cl
unsigned __int16 v12; // dx
char v13; // r9
unsigned __int16 v14; // cx
unsigned __int16 v15; // cx
char *v16; // rdx
__int64 n12; // rax
char *v18; // rcx
unsigned __int16 v19; // [rsp+40h] [rbp+8h] BYREF
*((_BYTE *)Var21 + 2) = 0; /*0x299c5*/
n120 = *((_WORD *)Var21 + 8); /*0x299c9*/
n7 = 0; /*0x299cd*/
if ( (_BYTE)n120 != 0x82 /*0x29a00*/
&& (_BYTE)n120 != 0x90
&& (_BYTE)n120 != 0x91
&& (_BYTE)n120 != 120
&& (HIBYTE(n120) == 0x82 || HIBYTE(n120) == 0x90 || HIBYTE(n120) == 0x91 || HIBYTE(n120) == 120) )
{
*((_BYTE *)Var21 + 2) = 1; /*0x29a02*/
}
*((_WORD *)Var21 + 904) = 0; /*0x29a06*/
v4 = 0; /*0x29a0d*/
v19 = 0; /*0x29a11*/
if ( !*((_WORD *)Var21 + 906) ) /*0x29a22*/
return 6; /*0x29c04*/
while ( !n7 ) /*0x29a33*/
{
v5 = *((_WORD *)Var21 + ((unsigned __int64)v4 >> 1) + 8); /*0x29a40*/
if ( *((_BYTE *)Var21 + 2) ) /*0x29a45*/
{
if ( (v4 & 1) != 0 ) /*0x29a4e*/
goto LABEL_17; /*0x29a4e*/
}
else if ( (v4 & 1) == 0 ) /*0x29a55*/
{
goto LABEL_17; /*0x29a55*/
}
v5 >>= 8; /*0x29a57*/
LABEL_17:
switch ( (unsigned __int8)v5 ) /*0x29a61*/
{
case 0x78u: /*0x29a61*/
v16 = (char *)Var21 + 12 * *((unsigned __int16 *)Var21 + 904) + 272; /*0x29b95*/
if ( v4 + 1 <= *((unsigned __int16 *)Var21 + 906) ) /*0x29ba5*/
{
n12 = 12; /*0x29ba7*/
v18 = (char *)Var21 + 12 * *((unsigned __int16 *)Var21 + 904) + 272; /*0x29bac*/
do /*0x29bbb*/
{
--n12; /*0x29baf*/
*v18++ = 0; /*0x29bb2*/
}
while ( n12 ); /*0x29bbb*/
*((_WORD *)v16 + 4) = v4++; /*0x29bbd*/
*(_DWORD *)v16 = 7; /*0x29bc6*/
*((_WORD *)v16 + 3) = 0; /*0x29bc9*/
++*((_WORD *)Var21 + 904); /*0x29bcd*/
v19 = v4; /*0x29bd4*/
}
*((_WORD *)Var21 + 905) = v4; /*0x29bda*/
n7 = 7; /*0x29be2*/
goto LABEL_46; /*0x29be2*/
case 0x82u: /*0x29a61*/
v7 = (char *)Var21 + 12 * *((unsigned __int16 *)Var21 + 904) + 272; /*0x29aad*/
if ( v4 + 3 > *((unsigned __int16 *)Var21 + 906) ) /*0x29abe*/
{
LABEL_26:
n7 = 6; /*0x29ac0*/
goto LABEL_46; /*0x29ac3*/
}
n12_1 = 12; /*0x29ac8*/
v9 = (char *)Var21 + 12 * *((unsigned __int16 *)Var21 + 904) + 272; /*0x29acd*/
do /*0x29adc*/
{
--n12_1; /*0x29ad0*/
*v9++ = 0; /*0x29ad3*/
}
while ( n12_1 ); /*0x29adc*/
v10 = *((_BYTE *)Var21 + 2); /*0x29ade*/
v11 = v4 + 1; /*0x29ae2*/
v12 = *((_WORD *)Var21 + ((unsigned __int64)(unsigned __int16)(v4 + 1) >> 1) + 8); /*0x29aec*/
if ( v10 ) /*0x29af4*/
{
if ( (v11 & 1) == 0 ) /*0x29af9*/
LABEL_33:
v12 >>= 8; /*0x29b02*/
}
else if ( (v11 & 1) != 0 ) /*0x29b00*/
{
goto LABEL_33; /*0x29b00*/
}
v13 = v4 + 2; /*0x29b06*/
v14 = *((_WORD *)Var21 + ((unsigned __int64)(unsigned __int16)(v4 + 2) >> 1) + 8); /*0x29b11*/
if ( v10 ) /*0x29b19*/
{
if ( (v13 & 1) == 0 ) /*0x29b1e*/
LABEL_38:
v14 >>= 8; /*0x29b27*/
}
else if ( (v13 & 1) != 0 ) /*0x29b25*/
{
goto LABEL_38; /*0x29b25*/
}
v4 += 3; /*0x29b2b*/
v19 = v4; /*0x29b37*/
v15 = (unsigned __int8)v12 + ((unsigned __int8)v14 << 8); /*0x29b44*/
*((_WORD *)v7 + 3) = v15; /*0x29b4e*/
if ( v4 + v15 <= *((unsigned __int16 *)Var21 + 906) ) /*0x29b5e*/
{
*((_WORD *)v7 + 4) = v4; /*0x29b64*/
*(_DWORD *)v7 = 1; /*0x29b69*/
++*((_WORD *)Var21 + 904); /*0x29b6c*/
v4 += *((_WORD *)v7 + 3); /*0x29b73*/
n7 = 0; /*0x29b78*/
v19 = v4; /*0x29b7b*/
goto LABEL_46; /*0x29b81*/
}
goto LABEL_26; /*0x29b5e*/
case 0x90u: /*0x29a61*/
v6 = 1; /*0x29a80*/
goto LABEL_24; /*0x29a80*/
case 0x91u: /*0x29a61*/
v6 = 0; /*0x29a7c*/
LABEL_24:
n7 = PhyFindMatchingEntry(Var21, v6, &v19); /*0x29a83*/
v4 = v19; /*0x29a90*/
goto LABEL_46; /*0x29a96*/
}
n7 = 6; /*0x29a75*/
LABEL_46:
if ( v4 >= *((_WORD *)Var21 + 906) ) /*0x29bee*/
{
if ( !n7 ) /*0x29bf7*/
return 6; /*0x29bf7*/
break; /*0x29bf7*/
}
}
if ( n7 == 7 ) /*0x29bfd*/
return 0; /*0x29bff*/
return n7; /*0x29c16*/
}
// Function: PhyFindMatchingEntry @ 0x29c20 (0x15c bytes)
__int16 __fastcall PhyFindMatchingEntry(_QWORD *Var21, char a2, unsigned __int16 *a3)
{
int v3; // r11d
char *v5; // r10
__int16 result; // ax
__int64 n12; // rax
char *v10; // rcx
char v11; // r9
char v12; // cl
unsigned __int16 v13; // dx
char v14; // r8
unsigned __int16 v15; // cx
__int16 v16; // ax
unsigned __int16 v17; // dx
int v18; // eax
unsigned __int16 v19; // bx
v3 = *a3; /*0x29c3f*/
v5 = (char *)Var21 + 12 * *((unsigned __int16 *)Var21 + 904) + 272; /*0x29c57*/
if ( v3 + 3 > *((unsigned __int16 *)Var21 + 906) ) /*0x29c6d*/
return 6; /*0x29c6d*/
n12 = 12; /*0x29c79*/
v10 = (char *)Var21 + 12 * *((unsigned __int16 *)Var21 + 904) + 272; /*0x29c7e*/
do /*0x29c93*/
{
--n12; /*0x29c87*/
*v10++ = 0; /*0x29c8a*/
}
while ( n12 ); /*0x29c93*/
v11 = *((_BYTE *)Var21 + 2); /*0x29c95*/
v12 = v3 + 1; /*0x29c99*/
v13 = *((_WORD *)Var21 + ((unsigned __int64)(unsigned __int16)(v3 + 1) >> 1) + 8); /*0x29ca3*/
if ( v11 ) /*0x29cab*/
{
if ( (v12 & 1) != 0 ) /*0x29caf*/
goto LABEL_10; /*0x29caf*/
}
else if ( (v12 & 1) == 0 ) /*0x29cb5*/
{
goto LABEL_10; /*0x29cb5*/
}
v13 >>= 8; /*0x29cb7*/
LABEL_10:
v14 = v3 + 2; /*0x29cbb*/
v15 = *((_WORD *)Var21 + ((unsigned __int64)(unsigned __int16)(v3 + 2) >> 1) + 8); /*0x29cc6*/
if ( v11 ) /*0x29cce*/
{
if ( (v14 & 1) != 0 ) /*0x29cd3*/
goto LABEL_15; /*0x29cd3*/
}
else if ( (v14 & 1) == 0 ) /*0x29cda*/
{
goto LABEL_15; /*0x29cda*/
}
v15 >>= 8; /*0x29cdc*/
LABEL_15:
v16 = (unsigned __int8)v13; /*0x29ce0*/
v17 = v3 + 3; /*0x29cf3*/
*a3 = v3 + 3; /*0x29cfa*/
v18 = (unsigned __int16)(v16 + ((unsigned __int8)v15 << 8)); /*0x29cfd*/
*((_WORD *)v5 + 3) = v18; /*0x29d00*/
if ( v18 + (unsigned __int16)(v3 + 3) > *((unsigned __int16 *)Var21 + 906) ) /*0x29d11*/
return 6; /*0x29d11*/
*((_WORD *)v5 + 4) = v17; /*0x29d1a*/
*(_DWORD *)v5 = 3 - (a2 != 0); /*0x29d26*/
++*((_WORD *)Var21 + 904); /*0x29d29*/
v19 = v17 + *((_WORD *)v5 + 3); /*0x29d35*/
if ( v17 >= v19 ) /*0x29d3b*/
{
LABEL_19:
if ( *a3 == v19 ) /*0x29d59*/
return 0; /*0x29d5f*/
return 6; /*0x29c74*/
}
while ( 1 ) /*0x29d46*/
{
result = PhySearchMatchingEntry(Var21, a2, a3); /*0x29d46*/
if ( result ) /*0x29d4f*/
return result; /*0x29d72*/
if ( *a3 >= v19 ) /*0x29d54*/
goto LABEL_19; /*0x29d54*/
}
}
// Function: PhySearchMatchingEntry @ 0x29d7c (0x213 bytes)
__int16 __fastcall PhySearchMatchingEntry(_QWORD *Var21, char a2, _WORD *a3)
{
unsigned __int64 v3; // r11
char *v6; // r10
__int16 n6; // ax
__int64 n12; // rax
char *v10; // rcx
unsigned __int16 v11; // dx
unsigned __int16 v12; // cx
unsigned __int16 v13; // r9
unsigned __int16 v14; // cx
unsigned __int16 v15; // r8
unsigned __int16 v16; // cx
char n82; // al
unsigned __int16 v18; // cx
v3 = (unsigned __int16)*a3; /*0x29d98*/
v6 = (char *)Var21 + 12 * *((unsigned __int16 *)Var21 + 904) + 272; /*0x29dad*/
if ( (int)v3 + 3 > *((unsigned __int16 *)Var21 + 906) ) /*0x29dbf*/
return 6; /*0x29dbf*/
n12 = 12; /*0x29dcb*/
v10 = (char *)Var21 + 12 * *((unsigned __int16 *)Var21 + 904) + 272; /*0x29dd0*/
do /*0x29de5*/
{
--n12; /*0x29dd9*/
*v10++ = 0; /*0x29ddc*/
}
while ( n12 ); /*0x29de5*/
v11 = v3 + 1; /*0x29dea*/
*a3 = v3 + 1; /*0x29df2*/
v12 = *((_WORD *)Var21 + (v3 >> 1) + 8); /*0x29df6*/
if ( *((_BYTE *)Var21 + 2) ) /*0x29dfb*/
{
if ( (v3 & 1) != 0 ) /*0x29e04*/
goto LABEL_10; /*0x29e04*/
}
else if ( (v3 & 1) == 0 ) /*0x29e0b*/
{
goto LABEL_10; /*0x29e0b*/
}
v12 >>= 8; /*0x29e0d*/
LABEL_10:
v6[4] = v12; /*0x29e11*/
v13 = v3 + 2; /*0x29e18*/
*a3 = v3 + 2; /*0x29e20*/
v14 = *((_WORD *)Var21 + ((unsigned __int64)v11 >> 1) + 8); /*0x29e24*/
if ( *((_BYTE *)Var21 + 2) ) /*0x29e29*/
{
if ( (v11 & 1) != 0 ) /*0x29e32*/
goto LABEL_15; /*0x29e32*/
}
else if ( (v11 & 1) == 0 ) /*0x29e39*/
{
goto LABEL_15; /*0x29e39*/
}
v14 >>= 8; /*0x29e3b*/
LABEL_15:
v6[5] = v14; /*0x29e3f*/
v15 = v3 + 3; /*0x29e47*/
*a3 = v3 + 3; /*0x29e4f*/
v16 = *((_WORD *)Var21 + ((unsigned __int64)v13 >> 1) + 8); /*0x29e53*/
if ( *((_BYTE *)Var21 + 2) ) /*0x29e58*/
{
if ( (v13 & 1) != 0 ) /*0x29e61*/
goto LABEL_20; /*0x29e61*/
}
else if ( (v13 & 1) == 0 ) /*0x29e68*/
{
goto LABEL_20; /*0x29e68*/
}
v16 >>= 8; /*0x29e6a*/
LABEL_20:
*((_WORD *)v6 + 4) = v15; /*0x29e6e*/
*((_WORD *)v6 + 3) = (unsigned __int8)v16; /*0x29e7c*/
if ( (unsigned __int8)v16 + v15 > *((unsigned __int16 *)Var21 + 906) ) /*0x29e8a*/
return 6; /*0x29e8a*/
++*((_WORD *)Var21 + 904); /*0x29e90*/
n82 = v6[4]; /*0x29e97*/
if ( n82 != 86 /*0x29ef6*/
&& n82 != 89
&& (n82 != 80 || v6[5] != 78)
&& (n82 != 69 || v6[5] != 67)
&& (n82 != 83 || v6[5] != 78)
&& (n82 != 77 || v6[5] != 78)
&& (n82 != 82 || v6[5] != 87)
&& (n82 != 67 || v6[5] != 80) )
{
if ( n82 == 82 && v6[5] == 86 ) /*0x29f05*/
{
n6 = 6; /*0x29f0b*/
if ( !a2 ) /*0x29f13*/
return n6; /*0x29f13*/
*(_DWORD *)v6 = 6; /*0x29f15*/
*a3 = v3 + 4; /*0x29f24*/
v18 = *((_WORD *)Var21 + ((unsigned __int64)v15 >> 1) + 8); /*0x29f27*/
if ( *((_BYTE *)Var21 + 2) ) /*0x29f2c*/
{
if ( (v15 & 1) == 0 ) /*0x29f35*/
goto LABEL_42; /*0x29f35*/
}
else if ( (v15 & 1) != 0 ) /*0x29f3c*/
{
LABEL_42:
v18 >>= 8; /*0x29f3e*/
}
v6[10] = v18; /*0x29f42*/
if ( *((_WORD *)v6 + 3) > 1u ) /*0x29f4b*/
*a3 = *((_WORD *)v6 + 3) + v15; /*0x29f55*/
*((_BYTE *)Var21 + 1816) = v18; /*0x29f58*/
return 0; /*0x29f5e*/
}
return 6; /*0x29dc6*/
}
*a3 = *((_WORD *)v6 + 3) + v15; /*0x29f6d*/
*(_DWORD *)v6 = 5 - (a2 != 0); /*0x29f71*/
return 0; /*0x29f8c*/
}
// Function: MacGetPhyInfo @ 0x2a334 (0x8c bytes)
__int64 __fastcall MacGetPhyInfo(__int64 a1, __int16 *a2)
{
__int16 n58; // ax
int v6; // ecx
int v7; // ecx
int v8; // ecx
__int16 v9; // [rsp+38h] [rbp+10h] BYREF
if ( !a2 ) /*0x2a347*/
return 1; /*0x2a34c*/
if ( *(_DWORD *)a1 == 3 ) /*0x2a351*/
{
if ( (unsigned int)NvmReadEepromWord(a1, (__int64)&v9, 0x30u) ) /*0x2a35e*/
return 2; /*0x2a36c*/
n58 = v9 + *(unsigned __int8 *)(a1 + 4) + 1; /*0x2a377*/
}
else
{
v6 = *(unsigned __int8 *)(a1 + 4); /*0x2a37c*/
if ( !v6 ) /*0x2a382*/
{
*a2 = 48; /*0x2a3b0*/
return 0; /*0x2a3b0*/
}
v7 = v6 - 1; /*0x2a389*/
if ( v7 ) /*0x2a38b*/
{
v8 = v7 - 1; /*0x2a38d*/
if ( v8 ) /*0x2a38f*/
{
if ( v8 != 1 ) /*0x2a393*/
return 2; /*0x2a393*/
n58 = 58; /*0x2a395*/
}
else
{
n58 = 56; /*0x2a39a*/
}
}
else
{
n58 = 52; /*0x2a3a1*/
}
}
*a2 = n58; /*0x2a3a6*/
return 0; /*0x2a3ba*/
}
// Function: MacSetupPhyLink @ 0x2a3c0 (0x121 bytes)
__int64 __fastcall MacSetupPhyLink(int n2, unsigned int a2, __int64 a3)
{
__int64 result; // rax
unsigned int v7; // edi
unsigned __int16 v8; // r12
_DWORD v9[18]; // [rsp+20h] [rbp-48h] BYREF
unsigned __int16 v10; // [rsp+70h] [rbp+8h] BYREF
unsigned __int16 v11; // [rsp+88h] [rbp+20h] BYREF
v9[0] = 0; /*0x2a3e4*/
v11 = 0; /*0x2a3ec*/
v10 = 0; /*0x2a3f1*/
if ( n2 != 1 && n2 != 2 ) /*0x2a3fe*/
return 1; /*0x2a403*/
v7 = 0; /*0x2a408*/
if ( a2 ) /*0x2a40e*/
{
while ( a3 + 24LL * v7 ) /*0x2a422*/
{
result = MacSetFilterEntry(a3 + 24LL * v7, v9); /*0x2a42c*/
if ( (_DWORD)result ) /*0x2a434*/
return result; /*0x2a434*/
if ( v9[0] == n2 ) /*0x2a43e*/
{
result = MacGetPhyInfo(a3 + 24LL * v7, (__int16 *)&v11); /*0x2a450*/
v8 = v11; /*0x2a455*/
if ( (_DWORD)result ) /*0x2a466*/
return result; /*0x2a466*/
result = NvmReadEepromWord(a3 + 24LL * v7, (__int64)&v10, v11); /*0x2a479*/
if ( (_DWORD)result ) /*0x2a486*/
return result; /*0x2a486*/
v10 = v10 & 0xFFF8 | 1; /*0x2a4a2*/
result = NvmWriteEepromWord(a3 + 24LL * v7, v8, v10); /*0x2a4a8*/
if ( (_DWORD)result ) /*0x2a4b0*/
return result; /*0x2a4b0*/
result = NvmGetNvmType(a3 + 24LL * v7); /*0x2a4b5*/
if ( (_DWORD)result ) /*0x2a4bd*/
return result; /*0x2a4bd*/
}
if ( ++v7 >= a2 ) /*0x2a4c4*/
return 0; /*0x2a4c4*/
}
return 1; /*0x2a422*/
}
return 0; /*0x2a4d1*/
}
// Function: MacCheckPhyLink @ 0x2a4e4 (0x73 bytes)
__int64 __fastcall MacCheckPhyLink(unsigned int a1, __int64 a2, _DWORD *a3)
{
int v6; // ebx
__int64 v7; // rbp
int v8; // [rsp+40h] [rbp+18h] BYREF
v8 = 0; /*0x2a4f8*/
if ( !a3 ) /*0x2a505*/
return 1; /*0x2a507*/
v6 = 0; /*0x2a50d*/
if ( a1 ) /*0x2a511*/
{
v7 = a1; /*0x2a513*/
do /*0x2a53c*/
{
if ( a2 && !(unsigned int)MacSetFilterEntry(a2, &v8) && v8 == 1 ) /*0x2a530*/
++v6; /*0x2a532*/
a2 += 24; /*0x2a534*/
--v7; /*0x2a538*/
}
while ( v7 ); /*0x2a53c*/
}
*a3 = v6; /*0x2a53e*/
return 0; /*0x2a551*/
}
// Function: MacGetLinkStatus @ 0x2a558 (0xa2 bytes)
__int64 __fastcall MacGetLinkStatus(__int64 a1, _BYTE *a2, _BYTE *a3, _BYTE *a4)
{
__int16 v7; // r10
__int64 n16416; // rax
__int16 v9; // [rsp+30h] [rbp+8h] BYREF
v7 = 0; /*0x2a577*/
v9 = 0; /*0x2a57b*/
*a3 = 0; /*0x2a57f*/
*a2 = 0; /*0x2a582*/
*a4 = 0; /*0x2a585*/
if ( a1 ) /*0x2a58b*/
{
n16416 = NvmReadEepromWord(a1, (__int64)&v9, 0x33u); /*0x2a595*/
v7 = v9; /*0x2a59a*/
}
else
{
n16416 = 1; /*0x2a5a2*/
}
if ( !(_DWORD)n16416 ) /*0x2a5a9*/
{
if ( (v7 & 0x4003) == 0x4003 ) /*0x2a5ba*/
*a2 = 1; /*0x2a5bc*/
if ( (v7 & 0x4010) == 0x4010 ) /*0x2a5ce*/
*a3 = 1; /*0x2a5d0*/
n16416 = 16416; /*0x2a5d3*/
if ( (v7 & 0x4020) == 0x4020 ) /*0x2a5e0*/
*a4 = 1; /*0x2a5e2*/
}
return n16416; /*0x2a5f4*/
}
// Function: MacGetLinkCapability @ 0x2a5fc (0x46 bytes)
__int64 __fastcall MacGetLinkCapability(_DWORD *a1)
{
__int64 result; // rax
__int64 v3[385]; // [rsp+20h] [rbp-C08h] BYREF
unsigned int v4; // [rsp+C38h] [rbp+10h] BYREF
v4 = 0; /*0x2a607*/
result = NvmEraseBlock(128, (__int64)v3, &v4); /*0x2a61c*/
if ( !(_DWORD)result ) /*0x2a623*/
return MacCheckPhyLink(v4, (__int64)v3, a1); /*0x2a634*/
return result; /*0x2a639*/
}
// Function: MacSetFilterEntry @ 0x2a644 (0xd1 bytes)
__int64 __fastcall MacSetFilterEntry(__int64 a1, _DWORD *a2)
{
char v5; // cl
int v6; // ecx
int v7; // ecx
int v8; // ecx
unsigned __int16 v9[2]; // [rsp+20h] [rbp-28h] BYREF
__int16 v10[18]; // [rsp+24h] [rbp-24h] BYREF
char v11; // [rsp+50h] [rbp+8h] BYREF
char v12; // [rsp+60h] [rbp+18h] BYREF
char v13; // [rsp+68h] [rbp+20h] BYREF
v9[0] = 0; /*0x2a65a*/
v10[0] = 0; /*0x2a65e*/
v13 = 0; /*0x2a662*/
v11 = 0; /*0x2a666*/
v12 = 0; /*0x2a66a*/
if ( (unsigned int)MacGetPhyInfo(a1, v9) ) /*0x2a66e*/
return 6; /*0x2a677*/
if ( (unsigned int)NvmReadEepromWord(a1, (__int64)v10, v9[0]) ) /*0x2a68d*/
return 2; /*0x2a696*/
MacGetLinkStatus(a1, &v13, &v11, &v12); /*0x2a6af*/
v5 = v10[0]; /*0x2a6b4*/
*a2 = 0; /*0x2a6b9*/
v6 = v5 & 7; /*0x2a6bb*/
if ( v6 ) /*0x2a6c0*/
{
v7 = v6 - 2; /*0x2a6c2*/
if ( v7 ) /*0x2a6c5*/
{
v8 = v7 - 1; /*0x2a6c7*/
if ( v8 ) /*0x2a6ca*/
{
if ( v8 == 1 ) /*0x2a6cf*/
{
if ( v12 ) /*0x2a6d6*/
*a2 = 4; /*0x2a6d8*/
}
}
else if ( v11 ) /*0x2a6e5*/
{
*a2 = 2; /*0x2a6e7*/
}
}
else if ( v11 ) /*0x2a6f4*/
{
*a2 = 1; /*0x2a6f6*/
}
}
else if ( v13 ) /*0x2a703*/
{
*a2 = 3; /*0x2a705*/
}
return 0; /*0x2a70d*/
}
// Function: MacInitReceiveFilters @ 0x2a718 (0x305 bytes)
__int64 __fastcall MacInitReceiveFilters(__int64 a1, __int64 n3)
{
unsigned int v2; // r12d
int n3_1; // edi
__int64 result; // rax
unsigned int EepromWord; // r11d
__int16 n4; // bx
bool v8; // r15
unsigned int PhyInfo; // eax
unsigned __int16 v10; // r14
int v11; // edi
int v12; // edi
int v13; // edi
unsigned __int16 v14[2]; // [rsp+20h] [rbp-C58h] BYREF
unsigned __int16 v15; // [rsp+24h] [rbp-C54h] BYREF
int v16; // [rsp+28h] [rbp-C50h] BYREF
__int64 v17; // [rsp+2Ch] [rbp-C4Ch] BYREF
_DWORD v18[3]; // [rsp+34h] [rbp-C44h] BYREF
__int64 v19[391]; // [rsp+40h] [rbp-C38h] BYREF
char v20; // [rsp+C80h] [rbp+8h] BYREF
char v21; // [rsp+C90h] [rbp+18h] BYREF
char v22; // [rsp+C98h] [rbp+20h] BYREF
v2 = 0; /*0x2a72c*/
n3_1 = n3; /*0x2a72f*/
v16 = 0; /*0x2a739*/
v15 = 0; /*0x2a73e*/
v14[0] = 0; /*0x2a744*/
v17 = 0; /*0x2a74a*/
v22 = 0; /*0x2a74f*/
v20 = 0; /*0x2a753*/
v21 = 0; /*0x2a757*/
if ( !a1 ) /*0x2a75e*/
return 1; /*0x2a765*/
result = MacSetFilterEntry(a1, &v16); /*0x2a76c*/
if ( !(_DWORD)result ) /*0x2a774*/
{
result = NvmEraseBlock(128, (__int64)v19, &v17); /*0x2a785*/
if ( !(_DWORD)result ) /*0x2a78d*/
{
EepromWord = MacCheckPhyLink(v17, (__int64)v19, (_DWORD *)&v17 + 1); /*0x2a7a2*/
if ( !EepromWord ) /*0x2a7a8*/
{
n4 = 1; /*0x2a7aa*/
v8 = n3_1 == 2; /*0x2a7c1*/
if ( n3_1 != 1 && v16 == 1 ) /*0x2a7d1*/
v8 = 1; /*0x2a7d1*/
if ( n3_1 == 2 && (!HIDWORD(v17) || v16 == 1 || (unsigned int)v17 <= 1) ) /*0x2a802*/
{
return 1; /*0x2a7e0*/
}
else
{
if ( n3_1 != 1 ) /*0x2a807*/
goto LABEL_29; /*0x2a807*/
v18[0] = 0; /*0x2a80d*/
LOWORD(v16) = 0; /*0x2a816*/
WORD2(v17) = 0; /*0x2a81c*/
if ( (_DWORD)v17 ) /*0x2a827*/
{
while ( &v19[3 * v2] ) /*0x2a83c*/
{
EepromWord = MacSetFilterEntry((__int64)&v19[3 * v2], v18); /*0x2a84f*/
if ( EepromWord ) /*0x2a854*/
goto LABEL_26; /*0x2a854*/
if ( v18[0] == 1 ) /*0x2a85e*/
{
PhyInfo = MacGetPhyInfo((__int64)&v19[3 * v2], (__int16 *)&v16); /*0x2a871*/
v10 = v16; /*0x2a876*/
EepromWord = PhyInfo; /*0x2a87c*/
if ( PhyInfo ) /*0x2a887*/
goto LABEL_26; /*0x2a887*/
EepromWord = NvmReadEepromWord((__int64)&v19[3 * v2], (__int64)&v17 + 4, v16); /*0x2a8a3*/
if ( EepromWord ) /*0x2a8ae*/
goto LABEL_26; /*0x2a8ae*/
WORD2(v17) = WORD2(v17) & 0xFFF8 | 1; /*0x2a8ce*/
EepromWord = NvmWriteEepromWord((__int64)&v19[3 * v2], v10, WORD2(v17)); /*0x2a8d9*/
if ( EepromWord ) /*0x2a8de*/
goto LABEL_26; /*0x2a8de*/
EepromWord = NvmGetNvmType((__int64)&v19[3 * v2]); /*0x2a8ec*/
if ( EepromWord ) /*0x2a8f1*/
goto LABEL_26; /*0x2a8f1*/
}
if ( ++v2 >= (unsigned int)v17 ) /*0x2a8ff*/
goto LABEL_25; /*0x2a8ff*/
}
EepromWord = 1; /*0x2a97b*/
}
else
{
LABEL_25:
EepromWord = 0; /*0x2a908*/
}
LABEL_26:
if ( !EepromWord ) /*0x2a90e*/
{
LABEL_29:
if ( v8 ) /*0x2a91c*/
EepromWord = MacSetupPhyLink(2, v17, (__int64)v19); /*0x2a92e*/
if ( !EepromWord ) /*0x2a934*/
{
MacGetLinkStatus(a1, &v22, &v20, &v21); /*0x2a955*/
v11 = n3_1 - 1; /*0x2a95a*/
if ( v11 ) /*0x2a95c*/
{
v12 = v11 - 1; /*0x2a95e*/
if ( v12 ) /*0x2a960*/
{
v13 = v12 - 1; /*0x2a962*/
if ( v13 ) /*0x2a964*/
{
if ( v13 != 1 ) /*0x2a968*/
goto LABEL_44; /*0x2a968*/
if ( v21 ) /*0x2a972*/
{
n4 = 4; /*0x2a974*/
goto LABEL_44; /*0x2a979*/
}
return 1; /*0x2a98f*/
}
if ( !v22 ) /*0x2a98b*/
return 1; /*0x2a98b*/
n4 = 0; /*0x2a994*/
}
else
{
if ( !v20 ) /*0x2a9a2*/
return 1; /*0x2a9a2*/
n4 = 3; /*0x2a9a4*/
}
}
else
{
if ( !v20 ) /*0x2a9b3*/
return 1; /*0x2a9b3*/
n4 = 2; /*0x2a9b5*/
}
LABEL_44:
result = MacGetPhyInfo(a1, (__int16 *)v14); /*0x2a9b8*/
if ( !(_DWORD)result ) /*0x2a9c8*/
{
result = NvmReadEepromWord(a1, (__int64)&v15, v14[0]); /*0x2a9dc*/
if ( !(_DWORD)result ) /*0x2a9e4*/
{
v15 = n4 | v15 & 0xFFF8; /*0x2aa05*/
NvmWriteEepromWord(a1, v14[0], v15); /*0x2aa0b*/
return NvmGetNvmType(a1); /*0x2aa13*/
}
}
return result; /*0x2aa13*/
}
}
}
}
return EepromWord; /*0x2a7e3*/
}
}
return result; /*0x2a7e6*/
}
// Function: MacSetMulticastList @ 0x2aa20 (0xe9 bytes)
unsigned __int64 __fastcall MacSetMulticastList(__int64 Handle)
{
unsigned __int64 v2; // rbx
__int64 (__fastcall *v3)(__int64, __int64, __int64, __int16 *); // rax
int v4; // eax
__int64 (__fastcall *v5)(__int64, __int64, __int64, __int16 *); // rax
int v6; // eax
__int16 v8; // [rsp+30h] [rbp+8h] BYREF
v2 = 0x8000000000000007uLL; /*0x2aa45*/
if ( (unsigned int)(*(_DWORD *)(Handle + 364) - 17) > 1 ) /*0x2aa51*/
return 0x8000000000000003uLL; /*0x2aae7*/
v3 = *(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(Handle + 1256); /*0x2aa57*/
if ( v3 ) /*0x2aa61*/
v4 = v3(Handle + 96, 37, 1, &v8); /*0x2aa71*/
else
v4 = -3; /*0x2aa75*/
if ( !v4 ) /*0x2aa7c*/
{
v5 = *(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(Handle + 1304); /*0x2aab6*/
v8 = v8 & 0xFF1E | *(_BYTE *)(Handle + 12268) & 1 | (32 * ((*(_BYTE *)(Handle + 12269) - 1) & 7)); /*0x2aabd*/
if ( v5 ) /*0x2aac6*/
v6 = v5(Handle + 96, 37, 1, &v8); /*0x2aad9*/
else
v6 = 0; /*0x2aadd*/
if ( !v6 ) /*0x2aae1*/
return 0; /*0x2aae3*/
}
return v2; /*0x2ab03*/
}
// Function: MacClearMulticastList @ 0x2ab0c (0x1d6 bytes)
__int64 __fastcall MacClearMulticastList(__int64 Handle, __int64 Result)
{
__int64 v2; // r8
__int16 v3; // ax
__int64 (__fastcall *v5)(__int64, __int64, __int64, __int16 *); // rax
int v6; // eax
__int64 (__fastcall *v7)(__int64, __int64, __int64, __int16 *); // rax
int v8; // eax
void (__fastcall *v9)(__int64, __int64, __int64); // rax
void (__fastcall *v10)(__int64, __int64, __int64); // rax
char v11; // si
__int16 v13; // [rsp+30h] [rbp+8h] BYREF
__int16 v14; // [rsp+38h] [rbp+10h] BYREF
v2 = *(unsigned __int16 *)(Handle + 11166); /*0x2ab1b*/
v3 = *(_WORD *)(Handle + 11170); /*0x2ab23*/
v14 = *(_WORD *)(Handle + 11166); /*0x2ab31*/
v13 = v3; /*0x2ab37*/
if ( (_BYTE)Result ) /*0x2ab3e*/
{
switch ( (unsigned __int8)Result ) /*0x2ab48*/
{
case 1u: /*0x2ab48*/
*(_BYTE *)(Handle + 926) = 1; /*0x2abcb*/
*(_BYTE *)(Handle + 931) = 0; /*0x2abd2*/
LOWORD(v2) = v2 & 0xE3FF | 0x400; /*0x2abe2*/
break;
case 2u: /*0x2ab48*/
*(_BYTE *)(Handle + 931) = 0; /*0x2aba9*/
*(_BYTE *)(Handle + 926) = 2; /*0x2abb0*/
LOWORD(v2) = v2 & 0xE3FF | 0x1400; /*0x2abc0*/
break;
case 3u: /*0x2ab48*/
*(_BYTE *)(Handle + 931) = 0; /*0x2ab87*/
*(_BYTE *)(Handle + 926) = 4; /*0x2ab8e*/
LOWORD(v2) = v2 & 0xE3FF | 0x800; /*0x2ab9e*/
break;
case 4u: /*0x2ab48*/
*(_BYTE *)(Handle + 931) = 0; /*0x2ab65*/
*(_BYTE *)(Handle + 926) = 8; /*0x2ab6c*/
LOWORD(v2) = v2 & 0xE3FF | 0x1800; /*0x2ab7c*/
break;
default:
goto LABEL_12; /*0x2ab5a*/
}
}
else
{
*(_BYTE *)(Handle + 931) = 1; /*0x2abed*/
LOWORD(v2) = v2 & 0xF3FF; /*0x2abf4*/
}
v14 = v2; /*0x2abf8*/
LABEL_12:
if ( (_WORD)v2 != *(_WORD *)(Handle + 11168) ) /*0x2ac06*/
{
v5 = *(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(Handle + 1304); /*0x2ac0c*/
if ( v5 ) /*0x2ac16*/
{
v6 = v5(Handle + 96, 49, 1, &v13); /*0x2ac2a*/
LOWORD(v2) = v14; /*0x2ac2c*/
}
else
{
v6 = 0; /*0x2ac34*/
}
if ( !v6 ) /*0x2ac38*/
{
v7 = *(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(Handle + 1304); /*0x2ac3a*/
if ( v7 ) /*0x2ac44*/
{
v8 = v7(Handle + 96, 48, 1, &v14); /*0x2ac58*/
LOWORD(v2) = v14; /*0x2ac5a*/
}
else
{
v8 = 0; /*0x2ac62*/
}
if ( !v8 ) /*0x2ac66*/
{
v9 = *(void (__fastcall **)(__int64, __int64, __int64))(Handle + 1280); /*0x2ac68*/
if ( v9 ) /*0x2ac72*/
{
v9(Handle + 96, Result, v2); /*0x2ac78*/
LOWORD(v2) = v14; /*0x2ac7a*/
}
*(_WORD *)(Handle + 11168) = v2; /*0x2ac80*/
}
}
if ( *(_BYTE *)(Handle + 11165) ) /*0x2ac88*/
{
v10 = *(void (__fastcall **)(__int64, __int64, __int64))(Handle + 240); /*0x2ac91*/
v11 = *(_BYTE *)(Handle + 11536); /*0x2ac98*/
if ( v10 ) /*0x2aca2*/
v10(Handle + 96, Result, v2); /*0x2aca8*/
*(_QWORD *)(Handle + 11144) = 0; /*0x2acaa*/
if ( *(_WORD *)(Handle + 88) == 2 ) /*0x2acb7*/
{
NvmCheckFwCompat((_QWORD *)(Handle + 88)); /*0x2acbd*/
if ( v11 ) /*0x2acc5*/
NvmReadFwBlock(Handle + 88); /*0x2accb*/
}
}
}
return 0; /*0x2acdc*/
}
// Function: MacSetReceiveFilter @ 0x2ace4 (0x144 bytes)
__int64 __fastcall MacSetReceiveFilter(__int64 a1, _WORD *p_Var37, _WORD *a3)
{
__int64 v3; // rdi
unsigned __int16 v7; // di
void (__fastcall *v8)(__int64, _QWORD, __int64, _WORD *); // rax
void (__fastcall *v9)(__int64, __int64, __int64, unsigned __int16 *); // rax
__int64 v10; // rdx
void (__fastcall *v11)(__int64, __int64, __int64, __int16 *); // rax
void (__fastcall *v12)(__int64, __int64, __int64, _WORD *); // rax
unsigned __int16 v14; // [rsp+50h] [rbp+8h] BYREF
__int16 v15; // [rsp+68h] [rbp+20h] BYREF
v3 = *(_QWORD *)(a1 + 10216); /*0x2acfa*/
if ( v3 ) /*0x2ad15*/
v7 = ((_WORD)v3 + 1) << 6; /*0x2ad1a*/
else
v7 = 0; /*0x2ad20*/
v8 = *(void (__fastcall **)(__int64, _QWORD, __int64, _WORD *))(a1 + 1168); /*0x2ad24*/
if ( v8 ) /*0x2ad2f*/
v8(a1 + 8, v7, 3, a3); /*0x2ad42*/
v9 = *(void (__fastcall **)(__int64, __int64, __int64, unsigned __int16 *))(a1 + 1168); /*0x2ad49*/
if ( v9 ) /*0x2ad54*/
v9(a1 + 8, 55, 1, &v14); /*0x2ad68*/
v10 = v14; /*0x2ad6a*/
if ( v14 == 0xFFFF || !v14 ) /*0x2ad7f*/
{
v12 = *(void (__fastcall **)(__int64, __int64, __int64, _WORD *))(a1 + 1168); /*0x2adef*/
if ( !v12 ) /*0x2adfa*/
return 0; /*0x2adfa*/
v10 = v7; /*0x2adfc*/
goto LABEL_18; /*0x2adfc*/
}
v11 = *(void (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1168); /*0x2ad93*/
LOWORD(v10) = 3 * *(_WORD *)(a1 + 10200) + v14; /*0x2ad9b*/
v14 = v10; /*0x2ad9e*/
if ( v11 ) /*0x2ada6*/
{
v11(a1 + 8, v10, 1, &v15); /*0x2adb8*/
LOWORD(v10) = v14; /*0x2adba*/
}
if ( v15 != -1 ) /*0x2adc5*/
{
v12 = *(void (__fastcall **)(__int64, __int64, __int64, _WORD *))(a1 + 1168); /*0x2ade0*/
if ( !v12 ) /*0x2adeb*/
return 0; /*0x2adeb*/
LABEL_18:
v12(a1 + 8, v10, 3, p_Var37); /*0x2adff*/
return 0; /*0x2ae0d*/
}
*p_Var37 = *a3; /*0x2adcb*/
p_Var37[1] = a3[1]; /*0x2add2*/
p_Var37[2] = a3[2]; /*0x2adda*/
return 0; /*0x2ae1b*/
}
// Function: MacWriteAddress @ 0x2ae28 (0x13b bytes)
unsigned __int64 __fastcall MacWriteAddress(__int64 a1, _WORD *p_Var17)
{
_QWORD *v2; // rbx
void (__fastcall *v4)(__int64, __int64, __int64, unsigned __int16 *); // rax
__int64 v6; // rdx
__int16 v7; // cx
__int64 v8; // rdi
unsigned __int16 v9; // di
void (__fastcall *v10)(_QWORD *, __int64, __int64, __int16 *); // rax
void (__fastcall *v11)(_QWORD *, _QWORD, __int64, __int16 *); // rax
void (__fastcall *v12)(_QWORD *, __int64, __int64, __int16 *); // rax
void (__fastcall *v13)(_QWORD *, _QWORD, __int64, _WORD *); // rax
void (__fastcall *v14)(_QWORD *, __int64); // rax
unsigned __int16 v16; // [rsp+50h] [rbp+8h] BYREF
__int16 v17; // [rsp+60h] [rbp+18h] BYREF
v2 = (_QWORD *)(a1 + 8); /*0x2ae3a*/
v4 = *(void (__fastcall **)(__int64, __int64, __int64, unsigned __int16 *))(a1 + 1168); /*0x2ae41*/
if ( v4 ) /*0x2ae52*/
v4(a1 + 8, 55, 1, &v16); /*0x2ae62*/
v6 = v16; /*0x2ae64*/
if ( v16 == 0xFFFF || !v16 ) /*0x2ae7c*/
return 0x8000000000000003uLL; /*0x2af48*/
v7 = *(_WORD *)(a1 + 10200); /*0x2ae82*/
v8 = *(_QWORD *)(a1 + 10216); /*0x2ae89*/
LOWORD(v6) = 3 * v7 + v16; /*0x2ae99*/
v16 = v6; /*0x2ae9c*/
if ( v8 ) /*0x2aea4*/
v9 = ((_WORD)v8 + 1) << 6; /*0x2aeaa*/
else
v9 = 0; /*0x2aeb0*/
v10 = (void (__fastcall *)(_QWORD *, __int64, __int64, __int16 *))v2[145]; /*0x2aeb3*/
if ( v10 ) /*0x2aebd*/
{
v10(v2, v6, 1, &v17); /*0x2aeca*/
LOWORD(v6) = v16; /*0x2aecc*/
}
if ( v17 == -1 ) /*0x2aedd*/
{
v11 = (void (__fastcall *)(_QWORD *, _QWORD, __int64, __int16 *))v2[145]; /*0x2aedf*/
if ( v11 ) /*0x2aee9*/
{
v11(v2, v9, 3, &v17); /*0x2aef9*/
LOWORD(v6) = v16; /*0x2aefb*/
}
v12 = (void (__fastcall *)(_QWORD *, __int64, __int64, __int16 *))v2[151]; /*0x2af00*/
if ( v12 ) /*0x2af0a*/
v12(v2, v6, 3, &v17); /*0x2af17*/
}
v13 = (void (__fastcall *)(_QWORD *, _QWORD, __int64, _WORD *))v2[151]; /*0x2af19*/
if ( v13 ) /*0x2af23*/
v13(v2, v9, 3, p_Var17); /*0x2af31*/
v14 = (void (__fastcall *)(_QWORD *, __int64))v2[148]; /*0x2af33*/
if ( v14 ) /*0x2af3d*/
v14(v2, v6); /*0x2af42*/
return 0; /*0x2af57*/
}
// Function: MacSetMcastAddr @ 0x2af64 (0xff bytes)
unsigned __int64 __fastcall MacSetMcastAddr(__int64 a1)
{
void (__fastcall *v1)(__int64, __int64, __int64, unsigned __int16 *); // rax
__int64 v3; // rdx
void (__fastcall *v4)(__int64, __int64, __int64, __int16 *); // rax
__int64 v6; // rax
unsigned __int16 v7; // ax
void (__fastcall *v8)(__int64, _QWORD, __int64, __int16 *); // r10
void (__fastcall *v9)(__int64); // rax
unsigned __int16 v10; // [rsp+40h] [rbp+8h] BYREF
__int16 v11; // [rsp+48h] [rbp+10h] BYREF
v1 = *(void (__fastcall **)(__int64, __int64, __int64, unsigned __int16 *))(a1 + 1168); /*0x2af76*/
if ( v1 ) /*0x2af89*/
v1(a1 + 8, 55, 1, &v10); /*0x2af9a*/
v3 = v10; /*0x2af9c*/
if ( v10 == 0xFFFF || !v10 ) /*0x2afb2*/
return 0x8000000000000003uLL; /*0x2b046*/
v4 = *(void (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1168); /*0x2afc8*/
LOWORD(v3) = 3 * *(_WORD *)(a1 + 10200) + v10; /*0x2afcf*/
v10 = v3; /*0x2afd2*/
if ( v4 ) /*0x2afda*/
v4(a1 + 8, v3, 3, &v11); /*0x2afeb*/
if ( v11 != -1 ) /*0x2aff2*/
{
v6 = *(_QWORD *)(a1 + 10216); /*0x2aff8*/
if ( v6 ) /*0x2b002*/
v7 = ((_WORD)v6 + 1) << 6; /*0x2b008*/
else
v7 = 0; /*0x2b00e*/
v8 = *(void (__fastcall **)(__int64, _QWORD, __int64, __int16 *))(a1 + 1216); /*0x2b011*/
if ( v8 ) /*0x2b01b*/
v8(a1 + 8, v7, 3, &v11); /*0x2b02f*/
v9 = *(void (__fastcall **)(__int64))(a1 + 1192); /*0x2b032*/
if ( v9 ) /*0x2b03c*/
v9(a1 + 8); /*0x2b042*/
}
return 0; /*0x2b05a*/
}
// Function: MacClearMcastTable @ 0x2b064 (0xf7 bytes)
__int64 __fastcall MacClearMcastTable(__int64 a1, _WORD *p_Var37, _WORD *a3)
{
void (__fastcall *v3)(__int64, _QWORD, __int64, _WORD *); // rax
void (__fastcall *v7)(__int64, __int64, __int64, unsigned __int16 *); // rax
__int64 v8; // rdx
void (__fastcall *v9)(__int64, __int64, __int64, __int16 *); // rax
void (__fastcall *v10)(__int64, __int64, __int64, _WORD *); // rax
unsigned __int16 v12; // [rsp+50h] [rbp+8h] BYREF
__int16 v13; // [rsp+68h] [rbp+20h] BYREF
v3 = *(void (__fastcall **)(__int64, _QWORD, __int64, _WORD *))(a1 + 1168); /*0x2b074*/
if ( v3 ) /*0x2b08a*/
v3(a1 + 8, 0, 3, a3); /*0x2b09a*/
v7 = *(void (__fastcall **)(__int64, __int64, __int64, unsigned __int16 *))(a1 + 1168); /*0x2b09c*/
if ( v7 ) /*0x2b0a6*/
v7(a1 + 8, 55, 1, &v12); /*0x2b0ba*/
v8 = v12; /*0x2b0bc*/
if ( v12 == 0xFFFF || !v12 ) /*0x2b0d1*/
goto LABEL_12; /*0x2b0d1*/
v9 = *(void (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1168); /*0x2b0e3*/
LOWORD(v8) = 3 * *(_WORD *)(a1 + 10216) + v12; /*0x2b0ea*/
v12 = v8; /*0x2b0ed*/
if ( v9 ) /*0x2b0f5*/
{
v9(a1 + 8, v8, 1, &v13); /*0x2b106*/
LOWORD(v8) = v12; /*0x2b108*/
}
if ( v13 == -1 ) /*0x2b113*/
{
LABEL_12:
*p_Var37 = *a3; /*0x2b135*/
p_Var37[1] = a3[1]; /*0x2b13c*/
p_Var37[2] = a3[2]; /*0x2b144*/
}
else
{
v10 = *(void (__fastcall **)(__int64, __int64, __int64, _WORD *))(a1 + 1168); /*0x2b115*/
if ( v10 ) /*0x2b11f*/
v10(a1 + 8, v8, 3, p_Var37); /*0x2b12e*/
}
return 0; /*0x2b14f*/
}
// Function: MacSetRarEntry @ 0x2b15c (0x3c bytes)
__int64 __fastcall MacSetRarEntry(__int64 Handle, _WORD *p_Var37, _WORD *a3)
{
int n16; // eax
n16 = *(_DWORD *)(Handle + 364); /*0x2b160*/
if ( n16 == 16 || n16 == 17 || n16 == 18 || n16 == 19 || n16 == 20 ) /*0x2b17d*/
return MacSetReceiveFilter(Handle + 88, p_Var37, a3); /*0x2b18e*/
else
return MacClearMcastTable(Handle + 88, p_Var37, a3); /*0x2b183*/
}
// Function: MacInitRarTable @ 0x2b198 (0xe5 bytes)
unsigned __int64 __fastcall MacInitRarTable(__int64 a1, _WORD *p_Var17)
{
void (__fastcall *v4)(__int64, __int64, __int64, unsigned __int16 *); // rax
__int64 v5; // rbx
__int64 v6; // rdx
void (__fastcall *v8)(__int64, _QWORD, __int64, __int16 *); // rax
void (__fastcall *v9)(__int64, __int64, __int64, _WORD *); // rax
unsigned __int16 v10; // [rsp+40h] [rbp+8h] BYREF
__int16 v11; // [rsp+50h] [rbp+18h] BYREF
__int16 v12; // [rsp+52h] [rbp+1Ah]
__int16 v13; // [rsp+54h] [rbp+1Ch]
(*(void (__fastcall **)(_QWORD, __int64, __int64, __int64, __int64))(*(_QWORD *)(a1 + 11096) + 112LL))( /*0x2b1d3*/
*(_QWORD *)(a1 + 11096),
a1 + 10176,
a1 + 10184,
a1 + 10192,
a1 + 10200);
v4 = *(void (__fastcall **)(__int64, __int64, __int64, unsigned __int16 *))(a1 + 1168); /*0x2b1d7*/
v5 = a1 + 8; /*0x2b1de*/
if ( v4 ) /*0x2b1e5*/
v4(v5, 55, 1, &v10); /*0x2b1f8*/
v6 = v10; /*0x2b1fa*/
if ( v10 == 0xFFFF ) /*0x2b207*/
return 0x8000000000000003uLL; /*0x2b209*/
v8 = *(void (__fastcall **)(__int64, _QWORD, __int64, __int16 *))(v5 + 1160); /*0x2b215*/
if ( v8 ) /*0x2b21f*/
{
v8(v5, v10, 3, &v11); /*0x2b22f*/
LOWORD(v6) = v10; /*0x2b231*/
}
if ( *p_Var17 != v11 || p_Var17[1] != v12 || p_Var17[2] != v13 ) /*0x2b254*/
{
v9 = *(void (__fastcall **)(__int64, __int64, __int64, _WORD *))(v5 + 1208); /*0x2b256*/
if ( v9 ) /*0x2b260*/
v9(v5, v6, 3, p_Var17); /*0x2b26e*/
}
return 0; /*0x2b277*/
}
// Function: MacSetRarEntrySlot @ 0x2b280 (0xe7 bytes)
unsigned __int64 MacSetRarEntrySlot(
__int64 a1,
__int64 a2,
__int64 a3,
__int64 a4,
__int64 a5,
__int64 a6,
__int64 a7,
...)
{
__int64 v7; // r10
void (__fastcall *v9)(__int64, __int64, __int64, unsigned __int16 *); // rax
__int64 v10; // rbx
__int64 v11; // rdx
void (__fastcall *v13)(__int64, _QWORD, __int64, __int16 *); // rax
void (__fastcall *v14)(__int64, __int64, __int64, __int16 *); // rax
unsigned __int16 v15; // [rsp+40h] [rbp+8h] BYREF
__int16 v16; // [rsp+48h] [rbp+10h] BYREF
__int16 v17; // [rsp+4Ah] [rbp+12h]
__int16 v18; // [rsp+4Ch] [rbp+14h]
__int16 v19; // [rsp+50h] [rbp+18h] BYREF
__int16 v20; // [rsp+52h] [rbp+1Ah]
__int16 v21; // [rsp+54h] [rbp+1Ch]
v7 = *(_QWORD *)(a1 + 11096); /*0x2b28c*/
v19 = -1; /*0x2b29f*/
v20 = -1; /*0x2b2a3*/
v21 = -1; /*0x2b2a7*/
(*(void (__fastcall **)(__int64, __int64, __int64, __int64, __int64))(v7 + 112))( /*0x2b2cb*/
v7,
a1 + 10176,
a1 + 10184,
a1 + 10192,
a1 + 10200);
v9 = *(void (__fastcall **)(__int64, __int64, __int64, unsigned __int16 *))(a1 + 1168); /*0x2b2cf*/
v10 = a1 + 8; /*0x2b2d6*/
if ( v9 ) /*0x2b2dd*/
v9(v10, 55, 1, &v15); /*0x2b2f0*/
v11 = v15; /*0x2b2f2*/
if ( v15 == 0xFFFF ) /*0x2b2fa*/
return 0x8000000000000003uLL; /*0x2b2fc*/
v13 = *(void (__fastcall **)(__int64, _QWORD, __int64, __int16 *))(v10 + 1160); /*0x2b308*/
if ( v13 ) /*0x2b312*/
{
v13(v10, v15, 3, &v16); /*0x2b322*/
LOWORD(v11) = v15; /*0x2b324*/
}
if ( v16 != -1 || v17 != -1 || v18 != -1 ) /*0x2b33c*/
{
v14 = *(void (__fastcall **)(__int64, __int64, __int64, __int16 *))(v10 + 1208); /*0x2b33e*/
if ( v14 ) /*0x2b348*/
v14(v10, v11, 3, &v19); /*0x2b358*/
}
return 0; /*0x2b361*/
}
// Function: MacSetVlanFilter @ 0x2b368 (0x3c bytes)
// (decompile failed)
// Function: MacReadPhyStatus @ 0x2b3a4 (0x4d bytes)
__int64 __fastcall MacReadPhyStatus(__int64 Status, _WORD *p_Var14, __int64 Result, __int64 Offset)
{
__int64 (__fastcall *v4)(__int64, __int64, __int64, __int16 *); // rax
__int64 v5; // rcx
int v7; // r11d
__int16 v9; // [rsp+30h] [rbp+8h] BYREF
v4 = *(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(Status + 1256); /*0x2b3aa*/
v5 = Status + 96; /*0x2b3b1*/
if ( v4 ) /*0x2b3bb*/
v7 = v4(v5, 51, 1, &v9); /*0x2b3cd*/
else
v7 = -3; /*0x2b3d2*/
*p_Var14 = v9 & 0xBFFF; /*0x2b3e5*/
return v7; /*0x2b3eb*/
}
// Function: MacReadEeprom @ 0x2baa0 (0xf3 bytes)
__int64 __fastcall MacReadEeprom(__int64 Var17, unsigned __int16 a2)
{
__int16 n7; // cx
__int16 v4; // di
__int16 v5; // si
__int64 result; // rax
unsigned __int16 v7; // bp
__int64 v8; // rax
__int16 p_n19542[20]; // [rsp+20h] [rbp-28h] BYREF
unsigned __int16 v10; // [rsp+58h] [rbp+10h] BYREF
v10 = -1; /*0x2babd*/
n7 = 7; /*0x2bac2*/
if ( (a2 & 0xF000) != 0 ) /*0x2bacd*/
n7 = a2 >> 13; /*0x2bad2*/
v4 = a2 & 0xFFF; /*0x2bade*/
if ( !Var17 ) /*0x2bae7*/
return 1; /*0x2bb7b*/
v5 = (n7 << 13) + v4; /*0x2bb04*/
result = MacWriteEeprom((_DWORD *)Var17, &v10); /*0x2bb0a*/
if ( !(_DWORD)result )
{
v7 = v10; /*0x2bb14*/
if ( (unsigned int)NvmWriteEepromBlock((_DWORD *)Var17, v10, 6u, p_n19542) ) /*0x2bb28*/
return 2; /*0x2bb28*/
v8 = *(unsigned __int8 *)(Var17 + 4); /*0x2bb39*/
p_n19542[v8 + 2] = v4 ? v5 : 0;
if ( (unsigned int)NvmWriteBlock((_DWORD *)Var17, v7, 6u, p_n19542) )
return 2; /*0x2bb32*/
else
return (unsigned int)NvmGetNvmType(Var17) != 0 ? 4 : 0;
}
return result; /*0x2bb8a*/
}
// Function: MacWriteEeprom @ 0x2bb94 (0xa1 bytes)
__int64 __fastcall MacWriteEeprom(_DWORD *Var17, unsigned __int16 *a2)
{
unsigned __int16 n60; // ax
unsigned __int16 n0x40; // [rsp+38h] [rbp+10h] BYREF
__int16 v7; // [rsp+40h] [rbp+18h] BYREF
v7 = 0; /*0x2bbac*/
n0x40 = 0; /*0x2bbb0*/
if ( !a2 ) /*0x2bbb7*/
return 1; /*0x2bbb7*/
if ( (unsigned int)NvmReadEepromWord((__int64)Var17, (__int64)&v7, 0x33u) ) /*0x2bbcb*/
return 2; /*0x2bbcb*/
if ( *Var17 == 1 ) /*0x2bbd9*/
{
n60 = 60; /*0x2bbe5*/
}
else
{
if ( *Var17 != 2 ) /*0x2bbde*/
return 1; /*0x2bbbe*/
n60 = 32; /*0x2bbe0*/
}
if ( (unsigned int)NvmReadEepromWord((__int64)Var17, (__int64)&n0x40, n60) /*0x2bc17*/
|| !n0x40
|| n0x40 == 0xFFFF
|| n0x40 < 0x40u )
{
return 2; /*0x2bc20*/
}
*a2 = n0x40; /*0x2bc19*/
return 0; /*0x2bc2f*/
}
// Function: MacEepromBurstRead @ 0x2bc38 (0x48 bytes)
bool __fastcall MacEepromBurstRead(_DWORD *a1)
{
unsigned __int16 v1; // ax
int v2; // r11d
unsigned __int16 v4; // [rsp+30h] [rbp+8h] BYREF
v1 = -1; /*0x2bc43*/
v4 = -1; /*0x2bc46*/
if ( a1 ) /*0x2bc4e*/
{
v2 = MacWriteEeprom(a1, &v4); /*0x2bc5a*/
v1 = v4; /*0x2bc5d*/
}
else
{
v2 = 1; /*0x2bc64*/
}
return !v2 && v1 != 0xFFFF; /*0x2bc7a*/
}
// Function: MacEepromBurstWrite @ 0x2bc80 (0x3a1 bytes)
__int64 __fastcall MacEepromBurstWrite(__int64 a1)
{
unsigned int n61665; // edx
unsigned int v2; // r9d
unsigned int v3; // edx
unsigned int v4; // edx
unsigned int n4; // edx
n61665 = *(unsigned __int16 *)(a1 + 9512); /*0x2bc80*/
v2 = 0; /*0x2bc8c*/
if ( n61665 > 0x1501 ) /*0x2bc94*/
{
if ( *(unsigned __int16 *)(a1 + 9512) <= 0x1570u ) /*0x2be3e*/
{
if ( *(unsigned __int16 *)(a1 + 9512) < 0x156Fu ) /*0x2be46*/
{
switch ( *(_WORD *)(a1 + 9512) ) /*0x2be77*/
{
case 0x1502: /*0x2be77*/
case 0x1503: /*0x2be77*/
*(_DWORD *)(a1 + 268) = 11; /*0x2be89*/
break; /*0x2be94*/
case 0x150A: /*0x2be77*/
case 0x150D: /*0x2be77*/
case 0x1518: /*0x2be77*/
case 0x1526: /*0x2be77*/
goto LABEL_77;
case 0x150C: /*0x2be77*/
*(_DWORD *)(a1 + 268) = 5; /*0x2be79*/
break; /*0x2be84*/
case 0x150E: /*0x2be77*/
case 0x150F: /*0x2be77*/
case 0x1510: /*0x2be77*/
case 0x1511: /*0x2be77*/
case 0x1516: /*0x2be77*/
case 0x1527: /*0x2be77*/
goto LABEL_76;
case 0x1521: /*0x2be77*/
case 0x1522: /*0x2be77*/
case 0x1523: /*0x2be77*/
case 0x1524: /*0x2be77*/
case 0x1546: /*0x2be77*/
goto LABEL_72;
case 0x1525: /*0x2be77*/
goto LABEL_71;
case 0x1533: /*0x2be77*/
case 0x1534: /*0x2be77*/
case 0x1535: /*0x2be77*/
case 0x1536: /*0x2be77*/
case 0x1537: /*0x2be77*/
case 0x1538: /*0x2be77*/
goto LABEL_75;
case 0x1539: /*0x2be77*/
goto LABEL_74;
case 0x153A: /*0x2be77*/
case 0x153B: /*0x2be77*/
case 0x1559: /*0x2be77*/
case 0x155A: /*0x2be77*/
goto LABEL_56;
default:
return (unsigned int)-5;
}
return v2; /*0x2be84*/
}
LABEL_55:
*(_DWORD *)(a1 + 268) = 13; /*0x2bf0f*/
return v2; /*0x2bf19*/
}
if ( *(unsigned __int16 *)(a1 + 9512) > 0xF0E0u ) /*0x2bea0*/
{
if ( n61665 == 61665 ) /*0x2bf7b*/
{
LABEL_77:
*(_DWORD *)(a1 + 268) = 15; /*0x2c012*/
return v2; /*0x2c012*/
}
if ( n61665 == 61666 ) /*0x2bf87*/
goto LABEL_76; /*0x2bf87*/
if ( n61665 != 61680 ) /*0x2bf8f*/
{
if ( n61665 == 61681 ) /*0x2bf97*/
{
LABEL_74:
*(_DWORD *)(a1 + 268) = 20; /*0x2bfeb*/
return v2; /*0x2bff6*/
}
if ( n61665 == 61683 ) /*0x2bf9f*/
{
LABEL_73:
*(_DWORD *)(a1 + 268) = 4; /*0x2bfde*/
return v2; /*0x2bfe9*/
}
if ( *(unsigned __int16 *)(a1 + 9512) > 0xF0F7u ) /*0x2bfa7*/
{
if ( *(unsigned __int16 *)(a1 + 9512) <= 0xF0F9u ) /*0x2bfb3*/
{
LABEL_72:
*(_DWORD *)(a1 + 268) = 17; /*0x2bfd1*/
return v2; /*0x2bfdc*/
}
if ( n61665 - 61692 <= 1 ) /*0x2bfbe*/
{
LABEL_71:
*(_DWORD *)(a1 + 268) = 9; /*0x2bfc4*/
return v2; /*0x2bfcf*/
}
}
return (unsigned int)-5; /*0x2bfbe*/
}
}
else
{
if ( n61665 == 61664 ) /*0x2bea6*/
goto LABEL_28; /*0x2bea6*/
if ( *(unsigned __int16 *)(a1 + 9512) > 0x15E3u ) /*0x2beb3*/
{
if ( *(unsigned __int16 *)(a1 + 9512) < 0x1F40u ) /*0x2bf34*/
return (unsigned int)-5; /*0x2bf34*/
if ( *(unsigned __int16 *)(a1 + 9512) <= 0x1F41u || n61665 == 8005 ) /*0x2bf48*/
{
*(_DWORD *)(a1 + 268) = 18; /*0x2bf66*/
return v2; /*0x2bf70*/
}
if ( n61665 != 10572 ) /*0x2bf50*/
return (unsigned int)-5; /*0x2bf50*/
goto LABEL_61; /*0x2bf50*/
}
if ( n61665 == 5603 ) /*0x2beb5*/
goto LABEL_55; /*0x2beb5*/
if ( *(unsigned __int16 *)(a1 + 9512) < 0x157Bu ) /*0x2bebd*/
return (unsigned int)-5; /*0x2bebd*/
if ( *(unsigned __int16 *)(a1 + 9512) > 0x157Cu ) /*0x2bec9*/
{
if ( *(unsigned __int16 *)(a1 + 9512) <= 0x159Fu ) /*0x2bed5*/
return (unsigned int)-5; /*0x2bed5*/
if ( *(unsigned __int16 *)(a1 + 9512) <= 0x15A3u ) /*0x2bee1*/
{
LABEL_56:
*(_DWORD *)(a1 + 268) = 12; /*0x2bf1e*/
return v2; /*0x2bf29*/
}
if ( *(unsigned __int16 *)(a1 + 9512) <= 0x15B6u /*0x2bf09*/
|| *(unsigned __int16 *)(a1 + 9512) > 0x15B9u
&& (*(unsigned __int16 *)(a1 + 9512) <= 0x15D5u || *(unsigned __int16 *)(a1 + 9512) > 0x15D8u) )
{
return (unsigned int)-5; /*0x2bf09*/
}
goto LABEL_55; /*0x2bf09*/
}
}
LABEL_75:
*(_DWORD *)(a1 + 268) = 19; /*0x2bff8*/
return v2; /*0x2c003*/
}
if ( n61665 == 5377 ) /*0x2bc9a*/
goto LABEL_37; /*0x2bc9a*/
if ( *(unsigned __int16 *)(a1 + 9512) <= 0x10BDu ) /*0x2bca7*/
{
if ( n61665 != 4285 ) /*0x2bcad*/
{
if ( *(unsigned __int16 *)(a1 + 9512) <= 0x1096u ) /*0x2bcba*/
{
if ( n61665 != 4246 ) /*0x2bcc0*/
{
if ( *(unsigned __int16 *)(a1 + 9512) <= 0x104Du ) /*0x2bccc*/
{
if ( *(unsigned __int16 *)(a1 + 9512) < 0x1049u ) /*0x2bcd4*/
{
v3 = n61665 - 1080; /*0x2bcda*/
if ( v3 ) /*0x2bce0*/
{
v4 = v3 - 2; /*0x2bce6*/
if ( v4 ) /*0x2bce9*/
{
n4 = v4 - 2; /*0x2bcef*/
if ( n4 ) /*0x2bcf2*/
{
if ( n4 != 4 ) /*0x2bcfb*/
return (unsigned int)-5; /*0x2bcfb*/
}
}
}
LABEL_76:
*(_DWORD *)(a1 + 268) = 16; /*0x2c005*/
return v2; /*0x2c010*/
}
LABEL_37:
*(_DWORD *)(a1 + 268) = 7; /*0x2be28*/
return v2; /*0x2be33*/
}
if ( *(unsigned __int16 *)(a1 + 9512) < 0x105Eu ) /*0x2bd12*/
return (unsigned int)-5; /*0x2bd12*/
if ( *(unsigned __int16 *)(a1 + 9512) > 0x1060u ) /*0x2bd1a*/
{
if ( *(unsigned __int16 *)(a1 + 9512) > 0x107Cu ) /*0x2bd26*/
{
if ( *(unsigned __int16 *)(a1 + 9512) > 0x107Fu ) /*0x2bd2e*/
{
if ( *(unsigned __int16 *)(a1 + 9512) <= 0x108Au || *(unsigned __int16 *)(a1 + 9512) > 0x108Cu ) /*0x2bd42*/
return (unsigned int)-5; /*0x2bd42*/
LABEL_20:
*(_DWORD *)(a1 + 268) = 3; /*0x2bd44*/
return v2; /*0x2bd4e*/
}
LABEL_34:
*(_DWORD *)(a1 + 268) = 2; /*0x2bddc*/
return v2; /*0x2bde6*/
}
return (unsigned int)-5; /*0x2bd26*/
}
goto LABEL_32; /*0x2bd1a*/
}
goto LABEL_33; /*0x2bcc0*/
}
if ( *(unsigned __int16 *)(a1 + 9512) > 0x10A9u ) /*0x2bd5a*/
{
if ( n61665 == 4281 ) /*0x2bda1*/
goto LABEL_34; /*0x2bda1*/
if ( *(unsigned __int16 *)(a1 + 9512) <= 0x10B9u ) /*0x2bda3*/
return (unsigned int)-5; /*0x2bd07*/
if ( *(unsigned __int16 *)(a1 + 9512) > 0x10BBu ) /*0x2bdaf*/
{
LABEL_32:
*(_DWORD *)(a1 + 268) = 1; /*0x2bdbd*/
return v2; /*0x2bdc8*/
}
LABEL_33:
*(_DWORD *)(a1 + 268) = 6; /*0x2bdcd*/
return v2; /*0x2bdd7*/
}
if ( n61665 != 4265 ) /*0x2bd5c*/
{
if ( n61665 == 4248 ) /*0x2bd64*/
goto LABEL_33; /*0x2bd64*/
if ( n61665 == 4250 ) /*0x2bd6c*/
goto LABEL_20; /*0x2bd6c*/
if ( *(unsigned __int16 *)(a1 + 9512) <= 0x10A3u ) /*0x2bd74*/
return (unsigned int)-5; /*0x2bd74*/
if ( *(unsigned __int16 *)(a1 + 9512) <= 0x10A5u ) /*0x2bd7c*/
goto LABEL_32; /*0x2bd7c*/
if ( n61665 != 4263 ) /*0x2bd84*/
return (unsigned int)-5; /*0x2bd84*/
}
LABEL_28:
*(_DWORD *)(a1 + 268) = 14; /*0x2bd8a*/
return v2; /*0x2bd95*/
}
LABEL_61:
*(_DWORD *)(a1 + 268) = 8; /*0x2bf56*/
return v2; /*0x2bf61*/
}
switch ( *(_WORD *)(a1 + 9512) ) /*0x2be16*/
{
case 0x10BF: /*0x2be16*/
case 0x10C0: /*0x2be16*/
case 0x10C2: /*0x2be16*/
case 0x10C3: /*0x2be16*/
case 0x10CB: /*0x2be16*/
case 0x10CC: /*0x2be16*/
case 0x10CD: /*0x2be16*/
case 0x10CE: /*0x2be16*/
case 0x10E5: /*0x2be16*/
case 0x10F5: /*0x2be16*/
goto LABEL_61;
case 0x10C4: /*0x2be16*/
case 0x10C5: /*0x2be16*/
goto LABEL_37;
case 0x10C9: /*0x2be16*/
case 0x10E6: /*0x2be16*/
case 0x10E7: /*0x2be16*/
case 0x10E8: /*0x2be16*/
goto LABEL_77;
case 0x10D3: /*0x2be16*/
case 0x10F6: /*0x2be16*/
goto LABEL_73;
case 0x10D5: /*0x2be16*/
case 0x10D9: /*0x2be16*/
case 0x10DA: /*0x2be16*/
goto LABEL_32;
case 0x10D6: /*0x2be16*/
goto LABEL_28;
case 0x10DE: /*0x2be16*/
case 0x10DF: /*0x2be16*/
goto LABEL_71;
case 0x10EA: /*0x2be16*/
case 0x10EB: /*0x2be16*/
case 0x10EF: /*0x2be16*/
case 0x10F0: /*0x2be16*/
*(_DWORD *)(a1 + 268) = 10; /*0x2be18*/
break; /*0x2be23*/
default:
return (unsigned int)-5;
}
return v2; /*0x2c020*/
}
// Function: MacInit @ 0x2c104 (0x2df bytes)
__int64 __fastcall MacInit(__int64 a1)
{
__int64 result; // rax
__int64 v3; // r9
int n9; // eax
__int64 (__fastcall *NiiStationsAddr_1)(__int64); // rax
__int64 (__fastcall *v6)(__int64); // rax
__int64 (__fastcall *v7)(__int64); // rax
__int64 (__fastcall *v8)(__int64); // rax
result = MacEepromBurstWrite(a1); /*0x2c10d*/
if ( (_DWORD)result ) /*0x2c114*/
return result; /*0x2c114*/
if ( !*(_QWORD *)(a1 + 8) ) /*0x2c11a*/
return 4294967293LL; /*0x2c11a*/
*(_QWORD *)(a1 + 104) = NiiGetProtoType; /*0x2c13a*/
*(_QWORD *)(a1 + 80) = UbaNoOp; /*0x2c145*/
*(_QWORD *)(a1 + 224) = NiiSnpInitialize; /*0x2c149*/
*(_QWORD *)(a1 + 88) = UbaNoOp; /*0x2c157*/
*(_QWORD *)(a1 + 208) = Nii_3b478; /*0x2c15b*/
*(_QWORD *)(a1 + 112) = CompNameNullThunk; /*0x2c16c*/
*(_QWORD *)(a1 + 32) = CompNameNullThunk; /*0x2c177*/
*(_QWORD *)(a1 + 56) = NiiNullStub; /*0x2c17b*/
*(_QWORD *)(a1 + 152) = CompNameNullThunk; /*0x2c186*/
*(_QWORD *)(a1 + 136) = UbaNoOp; /*0x2c18d*/
*(_QWORD *)(a1 + 144) = CompNameNullThunk; /*0x2c19b*/
*(_QWORD *)(a1 + 200) = UbaNoOp; /*0x2c1a2*/
*(_QWORD *)(a1 + 184) = CompNameNullThunk; /*0x2c1b0*/
*(_QWORD *)(a1 + 216) = NiiStnAddrSet; /*0x2c1b7*/
*(_QWORD *)(a1 + 96) = CompNameNullThunk; /*0x2c1c5*/
*(_QWORD *)(a1 + 72) = CompNameNullThunk; /*0x2c1c9*/
*(_QWORD *)(a1 + 192) = CompNameNullThunk; /*0x2c1cd*/
*(_QWORD *)(a1 + 48) = CompNameNullThunk; /*0x2c1d4*/
*(_QWORD *)(a1 + 232) = CompNameGetDriverName; /*0x2c1d8*/
*(_QWORD *)(a1 + 120) = CompNameNullThunk; /*0x2c1df*/
*(_QWORD *)(a1 + 128) = CompNameNullThunk; /*0x2c1e3*/
*(_QWORD *)(a1 + 176) = CompNameNullThunk; /*0x2c1ea*/
*(_QWORD *)(a1 + 64) = CompNameNullThunk; /*0x2c1f1*/
CompNameInstallTable((_QWORD *)a1); /*0x2c1f5*/
*(_QWORD *)(a1 + 1144) = v3; /*0x2c201*/
*(_QWORD *)(a1 + 1152) = v3; /*0x2c208*/
*(_QWORD *)(a1 + 1160) = CompNameNullThunk; /*0x2c20f*/
*(_QWORD *)(a1 + 1184) = v3; /*0x2c21d*/
*(_QWORD *)(a1 + 1168) = UbaNoOp; /*0x2c224*/
*(_QWORD *)(a1 + 1200) = v3; /*0x2c232*/
*(_QWORD *)(a1 + 1176) = NiiArpInit; /*0x2c239*/
*(_QWORD *)(a1 + 1192) = CompNameNullThunk; /*0x2c247*/
*(_QWORD *)(a1 + 1208) = CompNameNullThunk; /*0x2c255*/
*(_QWORD *)(a1 + 1216) = NiiDhcpCallback; /*0x2c263*/
*(_QWORD *)(a1 + 1232) = NiiMcastIpToMac; /*0x2c271*/
*(_QWORD *)(a1 + 1240) = Nii_371c0; /*0x2c27f*/
n9 = *(_DWORD *)(a1 + 268); /*0x2c286*/
if ( n9 <= 0 ) /*0x2c28e*/
return 4294967293LL; /*0x2c28e*/
if ( n9 <= 5 ) /*0x2c297*/
{
*(_QWORD *)(a1 + 32) = NiiModeGet; /*0x2c370*/
*(_QWORD *)(a1 + 1144) = NiiModeSet; /*0x2c37b*/
NiiStationsAddr_1 = NiiStationsAddr; /*0x2c382*/
}
else if ( n9 == 6 ) /*0x2c2a0*/
{
*(_QWORD *)(a1 + 32) = NiiShutdown; /*0x2c34e*/
*(_QWORD *)(a1 + 1144) = NiiReceive; /*0x2c359*/
NiiStationsAddr_1 = Nii_37758; /*0x2c360*/
}
else if ( n9 <= 13 ) /*0x2c2af*/
{
*(_QWORD *)(a1 + 32) = MngFlashUpdate; /*0x2c317*/
*(_QWORD *)(a1 + 1144) = MngFlashWriteBlock; /*0x2c322*/
if ( n9 <= 9 ) /*0x2c32e*/
NiiStationsAddr_1 = MngApplySettings; /*0x2c33e*/
else
NiiStationsAddr_1 = MngGetVersion; /*0x2c335*/
}
else
{
if ( n9 > 18 ) /*0x2c2b4*/
{
if ( n9 <= 20 ) /*0x2c2b9*/
{
*(_QWORD *)(a1 + 32) = IscsiCmdProcess; /*0x2c2c6*/
*(_QWORD *)(a1 + 872) = IscsiInit; /*0x2c2d1*/
*(_QWORD *)(a1 + 1144) = Sub_3c604; /*0x2c2df*/
goto LABEL_17; /*0x2c2e6*/
}
return 4294967293LL; /*0x2c3d8*/
}
*(_QWORD *)(a1 + 32) = IscsiCmdProcess; /*0x2c2f2*/
*(_QWORD *)(a1 + 1144) = IscsiSetup; /*0x2c2fd*/
NiiStationsAddr_1 = IscsiInit; /*0x2c304*/
}
*(_QWORD *)(a1 + 872) = NiiStationsAddr_1; /*0x2c389*/
LABEL_17:
v6 = *(__int64 (__fastcall **)(__int64))(a1 + 32); /*0x2c390*/
if ( v6 ) /*0x2c397*/
result = v6(a1); /*0x2c39c*/
else
result = 4294967293LL; /*0x2c3a0*/
if ( !(_DWORD)result )
{
v7 = *(__int64 (__fastcall **)(__int64))(a1 + 1144); /*0x2c3a9*/
result = v7 ? v7(a1) : 4294967293LL;
if ( !(_DWORD)result ) /*0x2c3c3*/
{
v8 = *(__int64 (__fastcall **)(__int64))(a1 + 872); /*0x2c3c5*/
if ( v8 ) /*0x2c3cf*/
return v8(a1); /*0x2c3d6*/
return 4294967293LL; /*0x2c3cf*/
}
}
return result; /*0x2c3dd*/
}
// Function: MacSetupLink @ 0x2c3e4 (0x31f bytes)
unsigned __int64 __fastcall MacSetupLink(unsigned __int64 *a1, __int64 a2, int a3, int a4)
{
unsigned __int64 result; // rax
__int16 v6; // r10
__int64 v8; // r11
__int64 v10; // rdi
__int64 v11; // rdx
bool v12; // zf
_DWORD *v13; // rdx
__int64 n64; // rax
int *v15; // rcx
unsigned int v16; // r10d
_DWORD *v17; // rcx
int v18; // eax
__int64 n16_3; // r8
__int64 v20; // rcx
_DWORD *v21; // r8
int v22; // eax
__int64 n16_4; // r9
_DWORD *v24; // rcx
__int64 n16_5; // r8
unsigned int v26; // r9d
__int16 v27; // ax
__int16 v28; // ax
int *v29; // rcx
__int64 n16_6; // r8
int v31; // eax
unsigned int v32; // r9d
int v33; // ecx
__int64 n16_7; // r8
_DWORD *v35; // rax
__int64 v36; // rax
__int64 v37; // rcx
int *v38; // rdx
_BYTE *v39; // rcx
__int64 v40; // rdx
unsigned int v41; // r9d
int v42; // eax
_DWORD *v43; // rcx
__int64 n16; // r8
unsigned __int8 *v45; // rcx
_DWORD *v46; // rcx
__int64 n16_1; // r8
int v48; // r10d
int v49; // r9d
char v50; // al
char v51; // al
char v52; // al
char v53; // al
_DWORD *v54; // rcx
int v55; // eax
__int64 n16_2; // r8
int v57; // [rsp+20h] [rbp-A8h] BYREF
char v58; // [rsp+24h] [rbp-A4h]
char v59; // [rsp+25h] [rbp-A3h]
char v60; // [rsp+26h] [rbp-A2h]
char v61; // [rsp+27h] [rbp-A1h]
char v62; // [rsp+28h] [rbp-A0h]
char v63; // [rsp+29h] [rbp-9Fh]
int v64; // [rsp+30h] [rbp-98h]
int v65; // [rsp+34h] [rbp-94h]
int v66; // [rsp+38h] [rbp-90h]
int v67; // [rsp+60h] [rbp-68h] BYREF
__int16 v68; // [rsp+64h] [rbp-64h]
__int16 v69; // [rsp+66h] [rbp-62h]
int v70; // [rsp+74h] [rbp-54h]
int v71; // [rsp+9Ch] [rbp-2Ch]
result = *a1 + 4; /*0x2c414*/
v6 = *(unsigned __int8 *)(*a1 + 1) - 4; /*0x2c41a*/
v8 = a2; /*0x2c421*/
*a1 = result; /*0x2c42b*/
if ( v6 > 0 ) /*0x2c42e*/
{
v10 = (unsigned __int16)(((unsigned __int16)(v6 - 1) >> 4) + 1); /*0x2c449*/
while ( 1 ) /*0x2c44d*/
{
v11 = *a1; /*0x2c44d*/
v12 = *(_DWORD *)*a1 == 1111707428; /*0x2c450*/
result = *a1 + 16; /*0x2c456*/
*a1 = result; /*0x2c45a*/
if ( !v12 ) /*0x2c45d*/
break; /*0x2c45d*/
v40 = *(_QWORD *)(v11 + 4); /*0x2c5a4*/
v41 = 0; /*0x2c5a8*/
v42 = 0; /*0x2c5ab*/
v43 = (_DWORD *)v40; /*0x2c5ae*/
n16 = 16; /*0x2c5b1*/
do /*0x2c5bc*/
{
v42 += *v43++; /*0x2c5b4*/
--n16; /*0x2c5b9*/
}
while ( n16 ); /*0x2c5bc*/
if ( !v42 ) /*0x2c5c1*/
{
v45 = *(unsigned __int8 **)(v40 + 16); /*0x2c5c3*/
if ( *(_DWORD *)(v40 + 56) ) /*0x2c5c7*/
{
do /*0x2c5cd*/
{
if ( v45[5] == *(_QWORD *)(v8 + 10272) && v45[6] == *(_QWORD *)(v8 + 10280) ) /*0x2c5e5*/
{
result = v45[7]; /*0x2c5e7*/
if ( result == *(_QWORD *)(v8 + 10288) ) /*0x2c5f2*/
goto LABEL_43; /*0x2c5f2*/
}
++v41; /*0x2c5fb*/
v45 += *(unsigned int *)(v40 + 12); /*0x2c5fe*/
}
while ( v41 < *(_DWORD *)(v40 + 56) ); /*0x2c5cd*/
}
}
v46 = (_DWORD *)v40; /*0x2c607*/
LODWORD(result) = 0; /*0x2c60a*/
n16_1 = 16; /*0x2c60d*/
do /*0x2c618*/
{
result = (unsigned int)(*v46++ + result); /*0x2c610*/
--n16_1; /*0x2c615*/
}
while ( n16_1 ); /*0x2c618*/
if ( !(_DWORD)result ) /*0x2c61d*/
{
result = *(unsigned int *)(v40 + 56); /*0x2c623*/
if ( (unsigned int)result < *(_DWORD *)(v40 + 8) ) /*0x2c629*/
{
v48 = *(_DWORD *)(v40 + 12); /*0x2c62f*/
v49 = result + 1; /*0x2c633*/
result = *(unsigned int *)(v40 + 4) - 64LL; /*0x2c63d*/
if ( (unsigned int)(v48 * v49) <= result ) /*0x2c648*/
{
v50 = *(_BYTE *)(v8 + 10272); /*0x2c64e*/
v64 = -1; /*0x2c655*/
v57 = 1; /*0x2c65a*/
v59 = v50; /*0x2c65f*/
v51 = *(_BYTE *)(v8 + 10280); /*0x2c663*/
v58 = -1; /*0x2c66a*/
v60 = v51; /*0x2c66f*/
v52 = *(_BYTE *)(v8 + 10288); /*0x2c673*/
v65 = a4; /*0x2c67a*/
v61 = v52; /*0x2c67e*/
v53 = *(_BYTE *)(v8 + 10297); /*0x2c682*/
v66 = v48; /*0x2c689*/
v62 = v53; /*0x2c68e*/
v54 = (_DWORD *)v40; /*0x2c699*/
v63 = *(_BYTE *)(v8 + 10296); /*0x2c69c*/
*(_DWORD *)(v40 + 56) = v49; /*0x2c6a0*/
*(_DWORD *)(v40 + 60) = 0; /*0x2c6a4*/
v55 = 0; /*0x2c6a8*/
n16_2 = 16; /*0x2c6ab*/
do /*0x2c6b6*/
{
v55 += *v54++; /*0x2c6ae*/
--n16_2; /*0x2c6b3*/
}
while ( n16_2 ); /*0x2c6b6*/
*(_DWORD *)(v40 + 60) = -v55; /*0x2c6be*/
v39 = (_BYTE *)(*(_QWORD *)(v40 + 16) + (unsigned int)(v48 * (v49 - 1))); /*0x2c6c5*/
v38 = &v57; /*0x2c6c9*/
LABEL_42:
result = (unsigned __int64)UtlMemCpy(v39, v38, 64); /*0x2c6ce*/
}
}
}
LABEL_43:
if ( !--v10 ) /*0x2c6dc*/
return result; /*0x2c6dc*/
}
if ( *(_DWORD *)v11 != 1396920100 ) /*0x2c469*/
goto LABEL_43; /*0x2c469*/
v13 = *(_DWORD **)(v11 + 4); /*0x2c46f*/
n64 = 64; /*0x2c473*/
v15 = &v67; /*0x2c478*/
do /*0x2c489*/
{
--n64; /*0x2c47d*/
*(_BYTE *)v15 = 0; /*0x2c480*/
v15 = (int *)((char *)v15 + 1); /*0x2c483*/
}
while ( n64 ); /*0x2c489*/
v16 = 0; /*0x2c48b*/
v17 = v13; /*0x2c48e*/
v18 = 0; /*0x2c491*/
n16_3 = 16; /*0x2c494*/
do /*0x2c49f*/
{
v18 += *v17++; /*0x2c497*/
--n16_3; /*0x2c49c*/
}
while ( n16_3 ); /*0x2c49f*/
if ( !v18 ) /*0x2c4a4*/
{
v20 = (unsigned int)v13[4]; /*0x2c4a6*/
if ( v13[14] ) /*0x2c4a9*/
{
do /*0x2c4af*/
{
v21 = (_DWORD *)v20; /*0x2c4af*/
v22 = 0; /*0x2c4b2*/
n16_4 = 16; /*0x2c4b5*/
do /*0x2c4c1*/
{
v22 += *v21++; /*0x2c4b8*/
--n16_4; /*0x2c4be*/
}
while ( n16_4 ); /*0x2c4c1*/
if ( v22 ) /*0x2c4c6*/
break; /*0x2c4c6*/
if ( *(unsigned __int16 *)(v20 + 4) == *(_QWORD *)(v8 + 10272) ) /*0x2c4d3*/
{
result = *(unsigned __int16 *)(v20 + 6); /*0x2c4d5*/
if ( result == *(_QWORD *)(v8 + 10280) ) /*0x2c4e0*/
goto LABEL_43; /*0x2c4e0*/
}
++v16; /*0x2c4e6*/
v20 += 160; /*0x2c4e9*/
}
while ( v16 < v13[14] ); /*0x2c4af*/
}
}
v24 = v13; /*0x2c4f6*/
LODWORD(result) = 0; /*0x2c4f9*/
n16_5 = 16; /*0x2c4fc*/
do /*0x2c507*/
{
result = (unsigned int)(*v24++ + result); /*0x2c4ff*/
--n16_5; /*0x2c504*/
}
while ( n16_5 ); /*0x2c507*/
if ( (_DWORD)result ) /*0x2c50c*/
goto LABEL_43; /*0x2c50c*/
v26 = v13[14]; /*0x2c512*/
if ( v26 >= v13[2] ) /*0x2c51a*/
goto LABEL_43; /*0x2c51a*/
v27 = *(_WORD *)(v8 + 10272); /*0x2c520*/
v67 = 1; /*0x2c528*/
v70 = a3; /*0x2c52d*/
v68 = v27; /*0x2c531*/
v28 = *(_WORD *)(v8 + 10280); /*0x2c536*/
v71 = 0; /*0x2c53e*/
v69 = v28; /*0x2c546*/
v29 = &v67; /*0x2c54b*/
n16_6 = 16; /*0x2c550*/
v31 = 0; /*0x2c553*/
do /*0x2c55e*/
{
v31 += *v29++; /*0x2c556*/
--n16_6; /*0x2c55b*/
}
while ( n16_6 ); /*0x2c55e*/
v32 = v26 + 1; /*0x2c562*/
v13[15] = 0; /*0x2c565*/
v71 = -v31; /*0x2c569*/
v33 = 0; /*0x2c570*/
n16_7 = 16; /*0x2c573*/
v13[14] = v32; /*0x2c576*/
v35 = v13; /*0x2c57a*/
do /*0x2c585*/
{
v33 += *v35++; /*0x2c57d*/
--n16_7; /*0x2c582*/
}
while ( n16_7 ); /*0x2c585*/
v36 = (unsigned int)v13[4]; /*0x2c587*/
v13[15] = -v33; /*0x2c58c*/
v37 = v13[3] * (v32 - 1); /*0x2c593*/
v38 = &v67; /*0x2c597*/
v39 = (_BYTE *)(v36 + v37); /*0x2c59c*/
goto LABEL_42; /*0x2c59f*/
}
return result; /*0x2c6f6*/
}
// Function: MacCheckLink @ 0x2c704 (0x115 bytes)
unsigned __int64 __fastcall MacCheckLink(struct NIC_CONTEXT *NicContext, int a2, int a3)
{
unsigned __int64 v4; // r10
__int64 v7; // rsi
unsigned __int64 v8; // rax
_OWORD *v9; // r9
unsigned __int64 v11; // rbx
unsigned __int64 v12; // rax
bool v13; // cf
unsigned __int16 i; // di
unsigned __int16 n2; // dx
unsigned __int64 v17; // [rsp+68h] [rbp+20h] BYREF
v4 = *(_QWORD *)(SystemTable + 104); /*0x2c72d*/
v7 = 0; /*0x2c737*/
v8 = 0; /*0x2c73a*/
if ( v4 ) /*0x2c744*/
{
v9 = *(_OWORD **)(SystemTable + 112); /*0x2c758*/
while ( *((_OWORD *)&Var14 + 1) != *v9 ) /*0x2c75e*/
{
++v8; /*0x2c766*/
v9 = (_OWORD *)((char *)v9 + 24); /*0x2c769*/
if ( v8 >= v4 ) /*0x2c770*/
goto LABEL_6; /*0x2c770*/
}
v11 = 0; /*0x2c791*/
v7 = *(_QWORD *)(*(_QWORD *)(SystemTable + 112) + 24 * v8 + 16); /*0x2c794*/
}
else
{
LABEL_6:
v11 = 0x800000000000000EuLL; /*0x2c772*/
}
if ( !v7 ) /*0x2c77f*/
return 0x8000000000000003uLL; /*0x2c781*/
v12 = *(unsigned int *)(v7 + 24); /*0x2c79b*/
v13 = *(_WORD *)(v7 + 28) != 0; /*0x2c79e*/
for ( i = 0; ; v13 = i < *(_WORD *)(v7 + 28) ) /*0x2c7a3*/
{
v17 = v12; /*0x2c7f2*/
if ( !v13 ) /*0x2c7f7*/
break; /*0x2c7f7*/
if ( *(_BYTE *)v12 == 0xE5 ) /*0x2c7ac*/
{
MacSetupLink(&v17, (__int64)NicContext, a2, a3); /*0x2c7bc*/
v12 = v17; /*0x2c7c1*/
}
n2 = 0; /*0x2c7ca*/
v12 += *(unsigned __int8 *)(v12 + 1); /*0x2c7ce*/
do /*0x2c7e8*/
{
if ( *(_BYTE *)v12++ ) /*0x2c7d1*/
n2 = 0; /*0x2c7e1*/
else
++n2; /*0x2c7db*/
}
while ( n2 < 2u ); /*0x2c7e8*/
++i; /*0x2c7ea*/
}
return v11; /*0x2c80b*/
}
// Function: MacInitRxDesc @ 0x2c81c (0x14a bytes)
char *__fastcall MacInitRxDesc(char *a1, _BYTE *a2)
{
_BYTE *v2; // r9
char *v3; // r8
char v4; // al
_BYTE *v6; // rax
int v7; // ecx
_BYTE *v8; // rax
int v9; // ecx
_BYTE *v10; // rax
int v11; // ecx
_BYTE *v12; // rax
int v13; // ecx
_BYTE *v14; // rax
int v15; // ecx
_BYTE *v16; // rax
int v17; // ecx
__int64 v18; // rax
v2 = a2; /*0x2c81c*/
v3 = a1; /*0x2c81f*/
while ( *a1 ) /*0x2c84d*/
{
if ( !*v2 ) /*0x2c830*/
goto LABEL_9; /*0x2c830*/
v4 = *a1++; /*0x2c832*/
if ( v4 == *v2 ) /*0x2c83a*/
{
++v2; /*0x2c847*/
}
else
{
++v3; /*0x2c83c*/
v2 = a2; /*0x2c83f*/
a1 = v3; /*0x2c842*/
}
}
if ( *v2 ) /*0x2c84f*/
v3 = 0; /*0x2c854*/
LABEL_9:
if ( !v3 ) /*0x2c85a*/
return 0; /*0x2c85a*/
v6 = a2; /*0x2c85f*/
v7 = 0; /*0x2c862*/
if ( a2 && *a2 ) /*0x2c86a*/
{
do /*0x2c875*/
{
++v6; /*0x2c86f*/
++v7; /*0x2c872*/
}
while ( *v6 ); /*0x2c875*/
}
if ( !v3[v7] ) /*0x2c87c*/
return v3; /*0x2c87c*/
v8 = a2; /*0x2c886*/
v9 = 0; /*0x2c889*/
if ( a2 && *a2 ) /*0x2c891*/
{
do /*0x2c89c*/
{
++v8; /*0x2c896*/
++v9; /*0x2c899*/
}
while ( *v8 ); /*0x2c89c*/
}
if ( v3[v9] == 32 ) /*0x2c8a8*/
return v3; /*0x2c8a8*/
v10 = a2; /*0x2c8ae*/
v11 = 0; /*0x2c8b1*/
if ( a2 && *a2 ) /*0x2c8b9*/
{
do /*0x2c8c4*/
{
++v10; /*0x2c8be*/
++v11; /*0x2c8c1*/
}
while ( *v10 ); /*0x2c8c4*/
}
if ( v3[v11] == 9 ) /*0x2c8d0*/
return v3; /*0x2c8d0*/
v12 = a2; /*0x2c8d6*/
v13 = 0; /*0x2c8d9*/
if ( a2 && *a2 ) /*0x2c8e1*/
{
do /*0x2c8ec*/
{
++v12; /*0x2c8e6*/
++v13; /*0x2c8e9*/
}
while ( *v12 ); /*0x2c8ec*/
}
if ( v3[v13] == 13 ) /*0x2c8f8*/
return v3; /*0x2c8f8*/
v14 = a2; /*0x2c8fa*/
v15 = 0; /*0x2c8fd*/
if ( a2 && *a2 ) /*0x2c905*/
{
do /*0x2c910*/
{
++v14; /*0x2c90a*/
++v15; /*0x2c90d*/
}
while ( *v14 ); /*0x2c910*/
}
if ( v3[v15] == 10 ) /*0x2c91c*/
return v3; /*0x2c91c*/
v16 = a2; /*0x2c91e*/
v17 = 0; /*0x2c921*/
if ( a2 && *a2 ) /*0x2c929*/
{
do /*0x2c934*/
{
++v16; /*0x2c92e*/
++v17; /*0x2c931*/
}
while ( *v16 ); /*0x2c934*/
}
if ( v3[v17] == 61 ) /*0x2c940*/
return v3; /*0x2c940*/
v18 = 0; /*0x2c942*/
if ( a2 ) /*0x2c948*/
{
while ( *a2 ) /*0x2c955*/
{
++a2; /*0x2c94c*/
v18 = (unsigned int)(v18 + 1); /*0x2c94f*/
}
}
if ( v3[v18] == 44 ) /*0x2c95c*/
return v3; /*0x2c962*/
else
return 0; /*0x2c85c*/
}
// Function: MacReadNvmString @ 0x2c968 (0xc7 bytes)
__int64 __fastcall MacReadNvmString(char **a1, __int64 a2)
{
char *v2; // rbx
char n32; // al
unsigned int v6; // ebp
__int64 v7; // rsi
__int64 v8; // rax
_BYTE *v10; // rax
unsigned int v11; // ecx
v2 = *a1; /*0x2c980*/
if ( *a1 ) /*0x2c980*/
{
while ( 1 ) /*0x2c9a1*/
{
n32 = *v2; /*0x2c9a1*/
if ( !*v2 || n32 != 32 && n32 != 7876665 ) /*0x2c99c*/
break; /*0x2c99c*/
++v2; /*0x2c99e*/
}
}
v6 = 0; /*0x2c9a7*/
v7 = 0; /*0x2c9a9*/
*a1 = v2; /*0x2c9ab*/
v8 = 0; /*0x2c9ae*/
while ( MacInitRxDesc(v2, (_BYTE *)qword_15F48[v8 + 1]) != v2 ) /*0x2c9c7*/
{
++v7; /*0x2c9c9*/
++v6; /*0x2c9cc*/
v8 = 2 * v7; /*0x2c9d1*/
if ( LODWORD(qword_15F48[2 * v7]) == 0xFFFF ) /*0x2c9dd*/
return 253; /*0x2c9e4*/
}
*(_DWORD *)(a2 + 8) = qword_15F48[2 * v6]; /*0x2c9f0*/
v10 = (_BYTE *)qword_15F48[2 * v6 + 1]; /*0x2c9f5*/
v11 = 0; /*0x2c9fa*/
if ( v10 && *v10 ) /*0x2ca01*/
{
do /*0x2ca0a*/
{
++v10; /*0x2ca05*/
++v11; /*0x2ca08*/
}
while ( *v10 ); /*0x2ca0a*/
}
*a1 += v11; /*0x2ca11*/
return 0; /*0x2ca25*/
}
// Function: MacInitTxDesc @ 0x2ca30 (0xdd bytes)
__int64 __fastcall MacInitTxDesc(char **a1, __int64 a2)
{
char *v2; // rbx
char n32; // al
const char *_; // rdx
char *v7; // r8
char *v8; // rcx
char v9; // al
const char *_o; // rax
unsigned int v12; // ecx
*(_DWORD *)(a2 + 4) = 0; /*0x2ca3f*/
v2 = *a1; /*0x2ca43*/
if ( *a1 ) /*0x2ca43*/
{
while ( 1 ) /*0x2ca64*/
{
n32 = *v2; /*0x2ca64*/
if ( !*v2 || n32 != 32 && n32 != 7876665 ) /*0x2ca5f*/
break; /*0x2ca5f*/
++v2; /*0x2ca61*/
}
}
*a1 = v2; /*0x2ca6a*/
_ = "-"; /*0x2ca70*/
v7 = v2; /*0x2ca77*/
v8 = v2; /*0x2ca7a*/
if ( *v2 ) /*0x2ca6d*/
{
while ( *_ ) /*0x2ca82*/
{
v9 = *v7++; /*0x2ca84*/
if ( v9 == *_ ) /*0x2ca8c*/
{
++_; /*0x2ca9d*/
}
else
{
++v8; /*0x2ca8e*/
_ = "-"; /*0x2ca91*/
v7 = v8; /*0x2ca98*/
}
if ( !*v7 ) /*0x2caa0*/
{
if ( !*_ ) /*0x2caa9*/
break; /*0x2caa9*/
goto LABEL_14; /*0x2caa9*/
}
}
}
else
{
LABEL_14:
v8 = 0; /*0x2caab*/
}
if ( v8 != v2 ) /*0x2cab0*/
return 0; /*0x2cab2*/
while ( MacInitRxDesc(v2, "-o") != v2 ) /*0x2cac8*/
; /*0x2cab6*/
*(_DWORD *)(a2 + 4) = 1; /*0x2caca*/
_o = "-o"; /*0x2cad1*/
v12 = 0; /*0x2cad8*/
if ( "-o" && aO[0] ) /*0x2cae1*/
{
do /*0x2cae8*/
{
++_o; /*0x2cae3*/
++v12; /*0x2cae6*/
}
while ( *_o ); /*0x2cae8*/
}
*a1 += v12; /*0x2caf5*/
return MacReadNvmString(a1, a2); /*0x2cb07*/
}
// Function: MacResetHw @ 0x2cb10 (0xe2 bytes)
__int64 __fastcall MacResetHw(char **a1, _DWORD *a2)
{
unsigned int v2; // ebx
char *v5; // rdi
char n32; // al
unsigned int v7; // r13d
__int64 v8; // r12
__int64 v9; // rax
_BYTE *v11; // rax
unsigned int v12; // ecx
v2 = 0; /*0x2cb2d*/
a2[3] = 0; /*0x2cb35*/
v5 = *a1; /*0x2cb38*/
if ( *a1 ) /*0x2cb38*/
{
while ( 1 ) /*0x2cb56*/
{
n32 = *v5; /*0x2cb56*/
if ( !*v5 || n32 != 32 && n32 != 7876665 ) /*0x2cb51*/
break; /*0x2cb51*/
++v5; /*0x2cb53*/
}
}
else
{
v5 = 0; /*0x2cb40*/
}
*a1 = v5; /*0x2cb5c*/
v7 = 0; /*0x2cb5f*/
v8 = 0; /*0x2cb62*/
v9 = 0; /*0x2cb65*/
while ( MacInitRxDesc(v5, (_BYTE *)qword_15F70[v9 + 1]) != v5 ) /*0x2cb7f*/
{
++v8; /*0x2cb81*/
++v7; /*0x2cb84*/
v9 = 2 * v8; /*0x2cb8a*/
if ( LODWORD(qword_15F70[2 * v8]) == 0xFFFF ) /*0x2cb96*/
{
if ( *a2 == 2 ) /*0x2cba1*/
return 242; /*0x2cba1*/
return v2; /*0x2cba6*/
}
}
a2[3] = qword_15F70[2 * v7]; /*0x2cbb2*/
v11 = (_BYTE *)qword_15F70[2 * v7 + 1]; /*0x2cbb5*/
v12 = 0; /*0x2cbba*/
if ( v11 ) /*0x2cbbf*/
{
while ( *v11 ) /*0x2cbca*/
{
++v11; /*0x2cbc3*/
++v12; /*0x2cbc6*/
}
}
*a1 += v12; /*0x2cbce*/
return 0; /*0x2cbe7*/
}
// Function: MacSetupHwDesc @ 0x2cbf4 (0xd7 bytes)
__int64 __fastcall MacSetupHwDesc(char **a1, __int64 a2)
{
char *v2; // rbx
char n32; // al
__int64 v6; // rbp
__int64 *v7; // rdi
_BYTE *v8; // rax
unsigned int v9; // ecx
*(_DWORD *)(a2 + 16) = 0; /*0x2cc0c*/
v2 = *a1; /*0x2cc10*/
if ( *a1 ) /*0x2cc10*/
{
while ( 1 ) /*0x2cc31*/
{
n32 = *v2; /*0x2cc31*/
if ( !*v2 || n32 != 32 && n32 != 7876665 ) /*0x2cc2c*/
break; /*0x2cc2c*/
++v2; /*0x2cc2e*/
}
}
*a1 = v2; /*0x2cc37*/
v6 = 0; /*0x2cc3a*/
v7 = &qword_1B60[26]; /*0x2cc4f*/
while ( *(_DWORD *)v7 != 1 || MacInitRxDesc(v2, (_BYTE *)v7[1]) != v2 ) /*0x2cc66*/
{
v7 += 5; /*0x2cc68*/
v6 = (unsigned int)(v6 + 1); /*0x2cc6c*/
if ( *(_DWORD *)v7 == 0xFFFF ) /*0x2cc74*/
return 0; /*0x2cc74*/
}
*(_DWORD *)(a2 + 16) = HIDWORD(qword_1B60[5 * v6 + 26]); /*0x2cc82*/
*(_DWORD *)(a2 + 20) = qword_1B60[5 * v6 + 28]; /*0x2cc8c*/
v8 = (_BYTE *)qword_1B60[5 * v6 + 27]; /*0x2cc91*/
v9 = 0; /*0x2cc96*/
if ( v8 && *v8 ) /*0x2cc9d*/
{
do /*0x2cca6*/
{
++v8; /*0x2cca1*/
++v9; /*0x2cca4*/
}
while ( *v8 ); /*0x2cca6*/
}
*a1 += v9; /*0x2ccad*/
return 0; /*0x2ccc1*/
}
// Function: MacInitHw @ 0x2cccc (0x195 bytes)
__int64 __fastcall MacInitHw(char **a1, _DWORD *a2)
{
unsigned int v2; // ebx
_BYTE *v3; // rbp
char *v5; // r8
char n32; // al
int v8; // ecx
unsigned int v9; // edx
__int64 *i; // rax
char v12; // r9
const char *_; // rcx
char *v14; // r10
char *v15; // rax
char *v16; // rdi
char *v17; // rax
v2 = 0; /*0x2cce5*/
v3 = a2 + 8; /*0x2cce7*/
a2[8] = 0; /*0x2ccee*/
v5 = *a1; /*0x2ccf1*/
if ( *a1 ) /*0x2ccf1*/
{
while ( 1 ) /*0x2cd12*/
{
n32 = *v5; /*0x2cd12*/
if ( !*v5 || n32 != 32 && n32 != 7876665 ) /*0x2cd0d*/
break; /*0x2cd0d*/
++v5; /*0x2cd0f*/
}
}
else
{
v5 = 0; /*0x2ccfc*/
}
*a1 = v5; /*0x2cd19*/
v8 = a2[4]; /*0x2cd1c*/
v9 = 0; /*0x2cd20*/
if ( v8 ) /*0x2cd2b*/
{
for ( i = &qword_1B60[26]; *(_DWORD *)i != 0xFFFF && *((_DWORD *)i + 1) != v8 || !*(_DWORD *)i; i += 5 ) /*0x2cd2d*/
++v9; /*0x2cd44*/
if ( HIDWORD(qword_1B60[5 * v9 + 26]) == 0xFFFF ) /*0x2cd57*/
return 252; /*0x2cd5e*/
}
v12 = *v5; /*0x2cd63*/
_ = "="; /*0x2cd66*/
v14 = v5; /*0x2cd6d*/
v15 = v5; /*0x2cd70*/
if ( *v5 ) /*0x2cd63*/
{
while ( *_ ) /*0x2cd7a*/
{
++v14; /*0x2cd7c*/
if ( v12 == *_ ) /*0x2cd82*/
{
++_; /*0x2cd93*/
}
else
{
++v15; /*0x2cd84*/
_ = "="; /*0x2cd87*/
v14 = v15; /*0x2cd8e*/
}
v12 = *v14; /*0x2cd96*/
if ( !*v14 ) /*0x2cd96*/
{
if ( !*_ ) /*0x2cda0*/
break; /*0x2cda0*/
goto LABEL_22; /*0x2cda0*/
}
}
}
else
{
LABEL_22:
v15 = 0; /*0x2cda2*/
}
if ( v15 == v5 )
{
v16 = v5 + 1; /*0x2cdcf*/
*a1 = v5 + 1; /*0x2cdd7*/
if ( LODWORD(qword_1B60[5 * v9 + 28]) != 2 )
{
if ( LODWORD(qword_1B60[5 * v9 + 28]) == 3 )
return (unsigned int)NiiStrToMac(a1, (__int64)v3) != 0 ? 0xFC : 0;
return 252; /*0x2ce3f*/
}
if ( MacInitRxDesc(v5 + 1, "disabled") == v16 ) /*0x2ce13*/
{
*v3 = 0; /*0x2ce15*/
v17 = v16 + 8; /*0x2ce18*/
}
else
{
if ( MacInitRxDesc(v16, "enabled") != v16 ) /*0x2ce33*/
return 252; /*0x2ce33*/
*v3 = 1; /*0x2ce35*/
v17 = v16 + 7; /*0x2ce39*/
}
*a1 = v17; /*0x2ce1c*/
return v2; /*0x2ce1f*/
}
if ( *a2 == 1 )
return LODWORD(qword_1B60[5 * v9 + 28]) != 0 ? 0xFC : 0;
else
return 0; /*0x2cdb0*/
}
// Function: MacHwConfig @ 0x2ce64 (0x2c3 bytes)
void __fastcall MacHwConfig(unsigned int n253, _BYTE *a2, _DWORD *a3, int a4)
{
unsigned int n2; // ebp
_BYTE *v8; // rax
int v9; // ecx
_BYTE *v10; // r11
int v11; // ecx
_BYTE *v12; // r11
int v13; // ecx
_BYTE *v14; // r11
int v15; // edx
__int64 v16; // rcx
int i; // eax
_BYTE *v18; // r11
int v19; // ecx
_BYTE *v20; // rax
int v21; // ecx
_BYTE *v22; // r11
int v23; // ecx
_BYTE *v24; // r11
int v25; // ecx
_BYTE *v26; // r11
int v27; // edx
__int64 v28; // rcx
int j; // eax
_BYTE *v30; // r11
int v31; // ecx
char enabled[40]; // [rsp+20h] [rbp-28h] BYREF
if ( n253 ) /*0x2ce8c*/
{
n2 = 2; /*0x2d113*/
if ( a4 == 1 ) /*0x2d11c*/
{
*a2 = 0; /*0x2d122*/
return; /*0x2d122*/
}
}
else
{
n2 = 0; /*0x2ce92*/
if ( a4 == 1 ) /*0x2ce99*/
return; /*0x2ce99*/
}
v8 = a2; /*0x2ce9f*/
v9 = 0; /*0x2cea2*/
if ( a2 && *a2 ) /*0x2ceaa*/
{
do /*0x2ceb4*/
{
++v8; /*0x2ceaf*/
++v9; /*0x2ceb2*/
}
while ( *v8 ); /*0x2ceb4*/
}
NiiTokenApply(a2, "status=", (unsigned int)(*a3 - v9)); /*0x2cec9*/
NiiGetStringLen(n2, enabled); /*0x2cedb*/
v10 = a2; /*0x2cee0*/
v11 = 0; /*0x2cee3*/
if ( a2 && *a2 ) /*0x2ceeb*/
{
do /*0x2cef5*/
{
++v10; /*0x2cef0*/
++v11; /*0x2cef3*/
}
while ( *v10 ); /*0x2cef5*/
}
NiiTokenApply(a2, enabled, (unsigned int)(*a3 - v11)); /*0x2cf08*/
v12 = a2; /*0x2cf0d*/
v13 = 0; /*0x2cf10*/
if ( a2 && *a2 ) /*0x2cf18*/
{
do /*0x2cf22*/
{
++v12; /*0x2cf1d*/
++v13; /*0x2cf20*/
}
while ( *v12 ); /*0x2cf22*/
}
NiiTokenApply(a2, "\nstatus_tag=", (unsigned int)(*a3 - v13)); /*0x2cf37*/
v14 = a2; /*0x2cf3c*/
v15 = 0; /*0x2cf3f*/
if ( a2 && *a2 ) /*0x2cf47*/
{
do /*0x2cf51*/
{
++v14; /*0x2cf4c*/
++v15; /*0x2cf4f*/
}
while ( *v14 ); /*0x2cf51*/
}
v16 = 0; /*0x2cf56*/
for ( i = 0; i != 0xFFFF; i = *(int *)((char *)&dword_16030 + (_QWORD)(&_ImageBase + 2 * v16)) ) /*0x2cf59*/
{
if ( i == n2 ) /*0x2cf65*/
break; /*0x2cf65*/
++v16; /*0x2cf67*/
}
NiiTokenApply(a2, (&off_16038)[2 * (unsigned int)v16], (unsigned int)(*a3 - v15));// "COMMAND COMPLETED" /*0x2cf95*/
v18 = a2; /*0x2cf9a*/
v19 = 0; /*0x2cf9d*/
if ( a2 && *a2 ) /*0x2cfa5*/
{
do /*0x2cfaf*/
{
++v18; /*0x2cfaa*/
++v19; /*0x2cfad*/
}
while ( *v18 ); /*0x2cfaf*/
}
NiiTokenApply(a2, L"\n", (unsigned int)(*a3 - v19)); /*0x2cfc4*/
if ( n2 == 2 ) /*0x2cfcc*/
{
v20 = a2; /*0x2cfd2*/
v21 = 0; /*0x2cfd5*/
if ( a2 && *a2 ) /*0x2cfdd*/
{
do /*0x2cfe7*/
{
++v20; /*0x2cfe2*/
++v21; /*0x2cfe5*/
}
while ( *v20 ); /*0x2cfe7*/
}
NiiTokenApply(a2, "error=", (unsigned int)(*a3 - v21)); /*0x2cffc*/
NiiGetStringLen(n253, enabled); /*0x2d00f*/
v22 = a2; /*0x2d014*/
v23 = 0; /*0x2d017*/
if ( a2 && *a2 ) /*0x2d01f*/
{
do /*0x2d029*/
{
++v22; /*0x2d024*/
++v23; /*0x2d027*/
}
while ( *v22 ); /*0x2d029*/
}
NiiTokenApply(a2, enabled, (unsigned int)(*a3 - v23)); /*0x2d03c*/
v24 = a2; /*0x2d041*/
v25 = 0; /*0x2d044*/
if ( a2 && *a2 ) /*0x2d04c*/
{
do /*0x2d056*/
{
++v24; /*0x2d051*/
++v25; /*0x2d054*/
}
while ( *v24 ); /*0x2d056*/
}
NiiTokenApply(a2, "\nerror_tag=", (unsigned int)(*a3 - v25)); /*0x2d06b*/
v26 = a2; /*0x2d070*/
v27 = 0; /*0x2d073*/
if ( a2 && *a2 ) /*0x2d07b*/
{
do /*0x2d085*/
{
++v26; /*0x2d080*/
++v27; /*0x2d083*/
}
while ( *v26 ); /*0x2d085*/
}
v28 = 0; /*0x2d08a*/
for ( j = 252; j != 0xFFFF; j = *(int *)((char *)&dword_16070 + (_QWORD)(&_ImageBase + 2 * v28)) ) /*0x2d08d*/
{
if ( j == n253 ) /*0x2d095*/
break; /*0x2d095*/
++v28; /*0x2d097*/
}
NiiTokenApply(a2, (&off_16078)[2 * (unsigned int)v28], (unsigned int)(*a3 - v27));// "COMMAND SYNTAX ERROR" /*0x2d0c5*/
v30 = a2; /*0x2d0ca*/
v31 = 0; /*0x2d0cd*/
if ( a2 && *a2 ) /*0x2d0d5*/
{
do /*0x2d0df*/
{
++v30; /*0x2d0da*/
++v31; /*0x2d0dd*/
}
while ( *v30 ); /*0x2d0df*/
}
NiiTokenApply(a2, L"\n", (unsigned int)(*a3 - v31)); /*0x2d0f4*/
}
}
// Function: MacHwSetup @ 0x2d128 (0x3ef bytes)
__int64 __fastcall MacHwSetup(struct NIC_CONTEXT *Handle, _DWORD *a2, __int64 a3, _BYTE *a4, _DWORD *a5)
{
int v7; // r8d
unsigned int v9; // esi
unsigned int v10; // edx
__int64 *i; // rax
unsigned int v13; // ecx
__int64 *j; // rax
EFI_STATUS (__fastcall *v15)(struct NIC_CONTEXT *); // rax
EFI_STATUS (__fastcall *v17)(struct NIC_CONTEXT *); // r8
__int64 v18; // r12
__int64 (__fastcall *v19)(struct NIC_CONTEXT *, unsigned __int64); // r8
_DWORD *v20; // rdi
_BYTE *v21; // rbx
__int64 n6; // rbp
__int64 v23; // rdi
_BYTE *v24; // rax
int v25; // ecx
_BYTE *v26; // r11
int v27; // ecx
_BYTE *v28; // rax
int v29; // ecx
_BYTE *v30; // r11
int v31; // ecx
char *enabled_3; // r12
__int64 n6_1; // rbp
_BYTE *v34; // rax
int v35; // ecx
_BYTE *v36; // r11
int v37; // ecx
const char *enabled_1; // rdx
const char *enabled_2; // rax
const char *disabled; // rax
_BYTE *v41; // rax
int v42; // ecx
_BYTE *v43; // r11
char enabled[32]; // [rsp+20h] [rbp-48h] BYREF
v7 = a2[4]; /*0x2d14d*/
v9 = 0; /*0x2d15b*/
v10 = 0; /*0x2d15e*/
if ( v7 ) /*0x2d16e*/
{
for ( i = &qword_1B60[26]; *(_DWORD *)i != 0xFFFF && *((_DWORD *)i + 1) != v7 || !*(_DWORD *)i; i += 5 ) /*0x2d170*/
++v10; /*0x2d183*/
if ( HIDWORD(qword_1B60[5 * v10 + 26]) == 0xFFFF ) /*0x2d197*/
return 252; /*0x2d19e*/
}
if ( *a2 ) /*0x2d1a3*/
{
if ( *a2 == 1 ) /*0x2d1b2*/
{
v17 = (EFI_STATUS (__fastcall *)(struct NIC_CONTEXT *))*(&funcs_2D237 + 5 * v10); /*0x2d217*/
if ( v17 ) /*0x2d21f*/
return v17(Handle); /*0x2d23a*/
return 254; /*0x2d4f2*/
}
if ( *a2 == 2 ) /*0x2d1b7*/
{
v13 = 0; /*0x2d1c0*/
for ( j = &qword_1B60[26]; *(_DWORD *)j != 0xFFFF && *((_DWORD *)j + 4) != a2[3] || *(_DWORD *)j == 1; j += 5 ) /*0x2d1c3*/
++v13; /*0x2d1d5*/
if ( LODWORD(qword_1B60[5 * v13 + 26]) == 0xFFFF ) /*0x2d1e9*/
return 242; /*0x2d1f0*/
v15 = (EFI_STATUS (__fastcall *)(struct NIC_CONTEXT *))*(&funcs_2D237 + 5 * v13); /*0x2d1f5*/
if ( v15 ) /*0x2d1fd*/
return v15(Handle); /*0x2d20c*/
return 254; /*0x2d1fd*/
}
}
else
{
v18 = 5LL * v10; /*0x2d23e*/
v19 = (__int64 (__fastcall *)(struct NIC_CONTEXT *, unsigned __int64))qword_1B60[5 * v10 + 29]; /*0x2d242*/
if ( !v19 ) /*0x2d24a*/
return 254; /*0x2d24a*/
v20 = a2 + 8; /*0x2d253*/
v9 = v19(Handle, (unsigned __int64)(a2 + 8) & -(__int64)(a2[5] != 0)); /*0x2d265*/
if ( a2[6] == 1 ) /*0x2d26b*/
{
if ( LODWORD(qword_1B60[v18 + 28]) == 3 ) /*0x2d273*/
{
*a4 = 1; /*0x2d2b2*/
v21 = a4 + 1; /*0x2d2b5*/
n6 = 6; /*0x2d2b8*/
v23 = (char *)v20 - v21; /*0x2d2bd*/
do /*0x2d2cb*/
{
*v21 = v21[v23]; /*0x2d2c3*/
++v21; /*0x2d2c5*/
--n6; /*0x2d2c8*/
}
while ( n6 ); /*0x2d2cb*/
}
else if ( LODWORD(qword_1B60[v18 + 28]) == 7 && *v20 ) /*0x2d281*/
{
*a4 = 1; /*0x2d28a*/
*(_WORD *)(a4 + 1) = 0; /*0x2d28d*/
a4[3] = 0; /*0x2d292*/
a4[4] = qword_15FB0[3 * (unsigned int)*v20 + 2]; /*0x2d2a8*/
}
return v9; /*0x2d2ad*/
}
v24 = a4; /*0x2d2d2*/
v25 = 0; /*0x2d2d5*/
if ( a4 && *a4 ) /*0x2d2dd*/
{
do /*0x2d2e8*/
{
++v24; /*0x2d2e2*/
++v25; /*0x2d2e5*/
}
while ( *v24 ); /*0x2d2e8*/
}
NiiTokenApply(a4, (const char *)qword_1B60[v18 + 27], (unsigned int)(*a5 - v25)); /*0x2d30b*/
v26 = a4; /*0x2d310*/
v27 = 0; /*0x2d313*/
if ( a4 && *a4 ) /*0x2d31b*/
{
do /*0x2d326*/
{
++v26; /*0x2d320*/
++v27; /*0x2d323*/
}
while ( *v26 ); /*0x2d326*/
}
NiiTokenApply(a4, "=", (unsigned int)(*a5 - v27)); /*0x2d33c*/
if ( LODWORD(qword_1B60[v18 + 28]) == 2 ) /*0x2d34a*/
{
v37 = 0; /*0x2d44e*/
if ( *(_BYTE *)v20 ) /*0x2d451*/
{
enabled_1 = "enabled"; /*0x2d456*/
enabled_2 = "enabled"; /*0x2d45d*/
do /*0x2d466*/
{
++enabled_2; /*0x2d460*/
++v37; /*0x2d463*/
}
while ( *enabled_2 ); /*0x2d466*/
}
else
{
enabled_1 = "disabled"; /*0x2d46d*/
disabled = "disabled"; /*0x2d474*/
do /*0x2d47d*/
{
++disabled; /*0x2d477*/
++v37; /*0x2d47a*/
}
while ( *disabled ); /*0x2d47d*/
}
NiiTokenSet(enabled, enabled_1, (unsigned int)(v37 + 1)); /*0x2d48b*/
v41 = a4; /*0x2d490*/
v42 = 0; /*0x2d493*/
if ( a4 && *a4 ) /*0x2d49b*/
{
do /*0x2d4a6*/
{
++v41; /*0x2d4a0*/
++v42; /*0x2d4a3*/
}
while ( *v41 ); /*0x2d4a6*/
}
NiiTokenApply(a4, enabled, (unsigned int)(*a5 - v42)); /*0x2d4ba*/
v43 = a4; /*0x2d4bf*/
v31 = 0; /*0x2d4c2*/
if ( a4 && *a4 ) /*0x2d4ca*/
{
do /*0x2d4d5*/
{
++v43; /*0x2d4cf*/
++v31; /*0x2d4d2*/
}
while ( *v43 ); /*0x2d4d5*/
}
}
else if ( LODWORD(qword_1B60[v18 + 28]) == 3 ) /*0x2d353*/
{
enabled_3 = enabled; /*0x2d3cc*/
n6_1 = 6; /*0x2d3d1*/
do /*0x2d3f1*/
{
NiiTokenGet(*(unsigned __int8 *)v20, enabled_3, 16); /*0x2d3e2*/
enabled_3 += 2; /*0x2d3e7*/
v20 = (_DWORD *)((char *)v20 + 1); /*0x2d3eb*/
--n6_1; /*0x2d3ee*/
}
while ( n6_1 ); /*0x2d3f1*/
*enabled_3 = 0; /*0x2d3f3*/
v34 = a4; /*0x2d3f7*/
v35 = 0; /*0x2d3fa*/
if ( a4 && *a4 ) /*0x2d402*/
{
do /*0x2d40d*/
{
++v34; /*0x2d407*/
++v35; /*0x2d40a*/
}
while ( *v34 ); /*0x2d40d*/
}
NiiTokenApply(a4, enabled, (unsigned int)(*a5 - v35)); /*0x2d421*/
v36 = a4; /*0x2d426*/
v31 = 0; /*0x2d429*/
if ( a4 && *a4 ) /*0x2d435*/
{
do /*0x2d444*/
{
++v36; /*0x2d43e*/
++v31; /*0x2d441*/
}
while ( *v36 ); /*0x2d444*/
}
}
else
{
if ( LODWORD(qword_1B60[v18 + 28]) != 7 || !*v20 ) /*0x2d35f*/
return v9; /*0x2d362*/
v28 = a4; /*0x2d368*/
v29 = 0; /*0x2d36b*/
if ( a4 && *a4 ) /*0x2d373*/
{
do /*0x2d37e*/
{
++v28; /*0x2d378*/
++v29; /*0x2d37b*/
}
while ( *v28 ); /*0x2d37e*/
}
NiiTokenApply(a4, (const char *)qword_15FB0[3 * (unsigned int)*v20 + 1], (unsigned int)(*a5 - v29)); /*0x2d39f*/
v30 = a4; /*0x2d3a4*/
v31 = 0; /*0x2d3a7*/
if ( a4 && *a4 ) /*0x2d3b3*/
{
do /*0x2d3c2*/
{
++v30; /*0x2d3bc*/
++v31; /*0x2d3bf*/
}
while ( *v30 ); /*0x2d3c2*/
}
}
NiiTokenApply(a4, L"\n", (unsigned int)(*a5 - v31)); /*0x2d4eb*/
}
return v9; /*0x2d50a*/
}
// Function: MacInitPhy @ 0x2d518 (0x298 bytes)
char __fastcall MacInitPhy(
struct NIC_CONTEXT *Handle,
__int64 a2,
char *PhyReg,
unsigned int a4,
_BYTE *a5,
_DWORD *a6,
_BYTE *a7,
char *a8,
_WORD *a9)
{
char *PhyReg_1; // rbx
__int64 n40; // rax
_BYTE *v12; // rdx
__int64 v13; // rcx
char *PhyReg_2; // rax
char v15; // dl
char i; // al
unsigned int v17; // esi
__int64 v18; // rdi
__int64 v19; // rax
unsigned int n253; // ebx
_BYTE *v21; // rax
int v22; // ecx
char *v23; // rcx
char n32; // al
int v25; // r9d
_BYTE *v26; // rdi
_DWORD *v27; // rsi
_DWORD *v28; // r8
_BYTE *v29; // rdx
unsigned int n253_1; // ecx
unsigned int n253_2; // eax
int v32; // r9d
char result; // al
char n253_3; // dl
_DWORD v35[6]; // [rsp+30h] [rbp-48h] BYREF
int v36; // [rsp+48h] [rbp-30h]
char *v37; // [rsp+90h] [rbp+18h] BYREF
PhyReg_1 = PhyReg; /*0x2d530*/
n40 = 40; /*0x2d536*/
v12 = v35; /*0x2d53b*/
do /*0x2d54e*/
{
--n40; /*0x2d542*/
*v12++ = 0; /*0x2d545*/
}
while ( n40 ); /*0x2d54e*/
v13 = a4; /*0x2d550*/
PhyReg_2 = PhyReg; /*0x2d553*/
while ( v13 ) /*0x2d578*/
{
if ( *PhyReg_2 < 65 || *PhyReg_2 > 90 ) /*0x2d560*/
v15 = *PhyReg_2; /*0x2d56a*/
else
v15 = *PhyReg_2 + 32; /*0x2d565*/
*PhyReg_2 = v15; /*0x2d56d*/
--v13; /*0x2d56f*/
++PhyReg_2; /*0x2d572*/
}
if ( PhyReg ) /*0x2d57d*/
{
for ( i = *PhyReg; i && (i == 32 || i == 7876665); i = *PhyReg_1 ) /*0x2d584*/
++PhyReg_1; /*0x2d597*/
}
else
{
PhyReg_1 = 0; /*0x2d57f*/
}
v17 = 0; /*0x2d5a1*/
v18 = 0; /*0x2d5a4*/
v19 = 0; /*0x2d5a7*/
while ( MacInitRxDesc(PhyReg_1, (_BYTE *)qword_15EB0[v19 + 1]) != PhyReg_1 ) /*0x2d5c1*/
{
++v18; /*0x2d5c3*/
++v17; /*0x2d5c6*/
v19 = 2 * v18; /*0x2d5cb*/
if ( LODWORD(qword_15EB0[2 * v18]) == 0xFFFF ) /*0x2d5d7*/
{
n253 = 253; /*0x2d5d9*/
goto LABEL_36; /*0x2d5de*/
}
}
v35[0] = qword_15EB0[2 * v17]; /*0x2d5ec*/
v21 = (_BYTE *)qword_15EB0[2 * v17 + 1]; /*0x2d5f0*/
v22 = 0; /*0x2d5f5*/
if ( v21 ) /*0x2d5fb*/
{
while ( *v21 ) /*0x2d607*/
{
++v21; /*0x2d5ff*/
++v22; /*0x2d602*/
}
}
v37 = &PhyReg_1[v22]; /*0x2d61b*/
n253 = MacInitTxDesc(&v37, (__int64)v35); /*0x2d628*/
if ( !n253 )
{
n253 = MacResetHw(&v37, v35); /*0x2d645*/
if ( !n253 )
{
n253 = MacSetupHwDesc(&v37, (__int64)v35); /*0x2d665*/
if ( !n253 )
{
n253 = MacInitHw(&v37, v35); /*0x2d685*/
if ( !n253 )
{
v23 = v37; /*0x2d68c*/
if ( v37 ) /*0x2d697*/
{
while ( 1 ) /*0x2d6af*/
{
n32 = *v23; /*0x2d6af*/
if ( !*v23 || n32 != 32 && n32 != 7876665 ) /*0x2d6aa*/
break; /*0x2d6aa*/
++v23; /*0x2d6ac*/
}
}
else
{
v23 = 0; /*0x2d699*/
}
n253 = *v23 != 0 ? 0xFC : 0;
}
}
}
}
LABEL_36:
if ( v35[1] != 1 || v35[2] ) /*0x2d6ce*/
{
v25 = 0; /*0x2d6dd*/
v36 = 0; /*0x2d6e0*/
}
else
{
v25 = 1; /*0x2d6d0*/
v36 = 1; /*0x2d6d6*/
}
v26 = a5; /*0x2d6e5*/
v27 = a6; /*0x2d6ed*/
v28 = a6; /*0x2d6f7*/
v29 = a5; /*0x2d6fa*/
*a5 = 0; /*0x2d6fd*/
MacHwConfig(n253, v29, v28, v25); /*0x2d700*/
if ( !n253 ) /*0x2d70e*/
{
n253 = 0; /*0x2d715*/
if ( v35[3] == 2 ) /*0x2d71d*/
n253 = 246; /*0x2d71d*/
if ( n253 ) /*0x2d723*/
{
n253_1 = n253; /*0x2d725*/
}
else
{
n253_2 = MacHwSetup(Handle, v35, (__int64)&qword_1B60[26], v26, v27); /*0x2d740*/
n253 = n253_2; /*0x2d745*/
if ( !n253_2 ) /*0x2d74a*/
goto LABEL_48; /*0x2d74a*/
n253_1 = n253_2; /*0x2d74c*/
}
v32 = v36; /*0x2d74e*/
*v26 = 0; /*0x2d759*/
MacHwConfig(n253_1, v26, v27, v32); /*0x2d75c*/
}
LABEL_48:
result = 1; /*0x2d761*/
*a7 = n253 != 0 ? 2 : 0;
n253_3 = n253; /*0x2d78e*/
if ( !n253 ) /*0x2d795*/
n253_3 = 2; /*0x2d795*/
*a8 = n253_3; /*0x2d799*/
*a9 = 0; /*0x2d7a3*/
return result; /*0x2d7a7*/
}
// Function: MacRaiseMdi @ 0x2d9fc (0x72 bytes)
bool __fastcall MacRaiseMdi(__int64 a1, _DWORD *Entry, int n32902, int n0xFFFF)
{
int v4; // eax
_DWORD *v5; // rcx
unsigned int v6; // r9d
__int64 v7; // r10
_WORD *v8; // r11
unsigned __int64 v10; // rax
_WORD *i; // r10
if ( !a1 || !Entry ) /*0x2da11*/
return 0; /*0x2da11*/
v4 = UtlTimerPoll(Entry) - 2; /*0x2da1b*/
if ( v4 ) /*0x2da1e*/
{
if ( v4 == 1 ) /*0x2da23*/
return PxeRomDevMatch(v8, 0xFFFF, v5); /*0x2da35*/
return 0; /*0x2da23*/
}
v10 = ((unsigned __int64)*(unsigned __int8 *)(v7 + 4) - 31) >> 1; /*0x2da40*/
if ( (unsigned int)v10 <= v6 ) /*0x2da46*/
return 0; /*0x2da69*/
for ( i = (_WORD *)(v7 + 31); *i != v8[1]; ++i ) /*0x2da4d*/
{
if ( ++v6 >= (unsigned int)v10 ) /*0x2da61*/
return 0; /*0x2da61*/
}
return 1; /*0x2da65*/
}
// Function: MacInitSwFlag @ 0x2da70 (0x207 bytes)
__int64 __fastcall MacInitSwFlag(_WORD *a1, _DWORD *Entry, unsigned int a3, _DWORD *p_n13)
{
__int64 v5; // rdi
_DWORD *Entry_1; // rbx
int n2; // eax
int n32902; // r8d
int n0xFFFF; // r9d
unsigned int n0xF; // edx
__int64 *v12; // rax
__int64 v13; // rcx
int v14; // ecx
unsigned int v15; // eax
char *Entry_4; // rsi
int n32902_1; // r8d
int n0xFFFF_1; // r9d
int n3; // eax
_DWORD *Entry_2; // rcx
int v21; // eax
int n0x80000; // edi
int n13; // eax
int v24; // eax
__int64 Entry_3; // rax
v5 = a3; /*0x2da8c*/
Entry_1 = Entry; /*0x2da8f*/
if ( !Entry || !a3 || !p_n13 || *a1 != 0x8086 ) /*0x2daba*/
return 3362652165LL; /*0x2dc57*/
*p_n13 = 0; /*0x2dac0*/
p_n13[1] = 0; /*0x2dac4*/
n2 = UtlTimerPoll(Entry); /*0x2dacc*/
if ( n2 == 2 ) /*0x2dad4*/
{
for ( ; (_DWORD)v5; LODWORD(v5) = v5 - v15 ) /*0x2dadc*/
{
if ( *Entry_1 != 725765190 || *((_WORD *)Entry_1 + 5) != (_WORD)n32902 ) /*0x2dafa*/
break; /*0x2dafa*/
if ( (*(_WORD *)((_BYTE *)Entry_1 + 29) & 0xA67B) != 0 ) /*0x2db09*/
{
if ( MacRaiseMdi((__int64)a1, Entry_1, n32902, n0xFFFF) ) /*0x2db11*/
{
n0xF = 0; /*0x2db1f*/
v12 = qword_15D50; /*0x2db21*/
v13 = 0; /*0x2db24*/
while ( *((_DWORD *)v12 + 1) != *(unsigned __int16 *)((char *)Entry_1 + 29) || *(_DWORD *)v12 ) /*0x2db2f*/
{
++n0xF; /*0x2db31*/
++v13; /*0x2db33*/
v12 = (__int64 *)((char *)v12 + 12); /*0x2db36*/
if ( n0xF >= 0xF ) /*0x2db3d*/
{
v14 = 0; /*0x2db3f*/
goto LABEL_16; /*0x2db3f*/
}
}
v14 = *((_DWORD *)&qword_15D50[1] + 3 * v13); /*0x2db6b*/
LABEL_16:
UtlMacAddrToHexStr(v14, p_n13); /*0x2db41*/
}
n32902 = 32902; /*0x2db49*/
}
v15 = *(_DWORD *)((char *)Entry_1 + 6) + *((unsigned __int8 *)Entry_1 + 4); /*0x2db56*/
Entry_1 = (_DWORD *)((char *)Entry_1 + v15); /*0x2db5b*/
}
return 0; /*0x2db60*/
}
if ( n2 == 3 ) /*0x2db74*/
{
Entry_4 = (char *)Entry_1 + v5; /*0x2db7a*/
if ( Entry_1 == (_DWORD *)((char *)Entry_1 + v5) ) /*0x2db81*/
return 0; /*0x2dc4e*/
while ( 1 ) /*0x2db87*/
{
if ( *(_WORD *)((char *)Entry_1 + 13) != (_WORD)n32902 ) /*0x2db8c*/
return 0; /*0x2db8c*/
if ( EepromValidateSpeed((__int64)Entry_1) ) /*0x2db95*/
break; /*0x2db95*/
n3 = UtlTimerPoll(Entry_1); /*0x2dba1*/
if ( n3 == 2 ) /*0x2dba9*/
{
if ( !EepromSpeedIsGig(Entry_2) ) /*0x2dbab*/
{
v21 = *(unsigned __int16 *)((char *)Entry_1 + 29); /*0x2dbb4*/
if ( v21 == (_DWORD)&loc_20000 || v21 == (_DWORD)&loc_3FFFF + 1 ) /*0x2dbc4*/
break; /*0x2dbc4*/
}
}
else if ( n3 == 3 ) /*0x2dbd2*/
{
n0x80000 = EepromLookupSpeedVal((__int64)Entry_2); /*0x2dbdc*/
if ( !EepromSpeedIsGig(Entry_1) /*0x2dbfd*/
&& (n0x80000 == (_DWORD)&loc_20000 || n0x80000 == (_DWORD)&loc_3FFFF + 1 || n0x80000 == 0x80000) )
{
break; /*0x2dbfd*/
}
}
n13 = EepromLookupSpeedVal((__int64)Entry_1); /*0x2dc02*/
if ( n13 == 13 || n13 == 2 ) /*0x2dc0f*/
break; /*0x2dc0f*/
LABEL_39:
Entry_3 = EepromNextEntry(Entry_1); /*0x2dc32*/
LOWORD(n32902) = -32634; /*0x2dc3a*/
Entry_1 = (_DWORD *)Entry_3; /*0x2dc40*/
if ( (char *)Entry_3 == Entry_4 ) /*0x2dc46*/
return 0; /*0x2dc46*/
}
if ( MacRaiseMdi((__int64)a1, Entry_1, n32902_1, n0xFFFF_1) ) /*0x2dc17*/
{
v24 = EepromLookupSpeedVal((__int64)Entry_1); /*0x2dc23*/
UtlMacAddrToHexStr(v24, p_n13); /*0x2dc2d*/
}
goto LABEL_39; /*0x2dc2d*/
}
return 3362672647LL; /*0x2dc70*/
}
// Function: MacReadPhyReg @ 0x2dc78 (0x52 bytes)
__int64 __fastcall MacReadPhyReg(unsigned int *p_n13)
{
__int64 n13; // rax
__int64 v2; // r8
unsigned int n13_1; // edx
__int64 v5; // rdx
unsigned int n13_2; // ecx
__int64 v7; // rcx
n13 = *p_n13; /*0x2dc78*/
v2 = 0; /*0x2dc7a*/
if ( (_DWORD)n13 ) /*0x2dc82*/
{
n13_1 = *p_n13; /*0x2dc84*/
while ( n13_1 != 14 ) /*0x2dc89*/
{
n13_1 = p_n13[++v2]; /*0x2dc8e*/
if ( !n13_1 ) /*0x2dc94*/
goto LABEL_5; /*0x2dc94*/
}
return 1; /*0x2dc89*/
}
LABEL_5:
v5 = 0; /*0x2dc96*/
if ( (_DWORD)n13 ) /*0x2dc9a*/
{
n13_2 = *p_n13; /*0x2dc9c*/
while ( n13_2 != 13 ) /*0x2dca1*/
{
n13_2 = p_n13[++v5]; /*0x2dca6*/
if ( !n13_2 ) /*0x2dcac*/
goto LABEL_9; /*0x2dcac*/
}
return 1; /*0x2dcc4*/
}
LABEL_9:
v7 = 0; /*0x2dcae*/
while ( (_DWORD)n13 ) /*0x2dcc0*/
{
if ( (_DWORD)n13 == 4 ) /*0x2dcb5*/
return 1; /*0x2dcb5*/
n13 = p_n13[++v7]; /*0x2dcba*/
}
return n13; /*0x2dcc2*/
}
// Function: MacSetupLinkSpeed @ 0x2dccc (0x587 bytes)
__int64 __fastcall MacSetupLinkSpeed(_WORD *a1, _DWORD *Entry, unsigned int a3, __int64 a4, _WORD *p_n64)
{
char *v5; // rbx
__int64 v6; // r13
unsigned __int16 *v9; // r8
unsigned int v11; // edi
bool v12; // r15
_DWORD *Entry_1; // rbp
int n3_2; // eax
__int64 v15; // rbx
__int16 v16; // ax
__int16 v17; // ax
unsigned int n13_1; // ebx
__int64 v19; // r11
unsigned int n7; // eax
unsigned int v21; // esi
__int64 v22; // rbp
__int64 v23; // rcx
unsigned int n7_1; // eax
unsigned int n2_2; // ebx
int n32902; // r8d
int n0xFFFF; // r9d
__int64 v28; // rcx
unsigned int v29; // eax
__int64 v30; // rcx
unsigned int n3; // eax
__int64 v32; // r11
unsigned int n2; // eax
__int64 v34; // rcx
unsigned int n13; // eax
__int64 v36; // rcx
unsigned int n3_1; // eax
__int64 v38; // rcx
unsigned int n2_1; // eax
__int64 v40; // rax
__int64 v41; // [rsp+0h] [rbp-1218h] BYREF
unsigned int v42; // [rsp+30h] [rbp-11E8h] BYREF
unsigned int v43; // [rsp+34h] [rbp-11E4h]
__int64 PhyReg; // [rsp+38h] [rbp-11E0h]
__int64 p_n7; // [rsp+40h] [rbp-11D8h] BYREF
unsigned int p_n13[20]; // [rsp+90h] [rbp-1188h] BYREF
_BYTE v47[4408]; // [rsp+E0h] [rbp-1138h] BYREF
unsigned int v48; // [rsp+1220h] [rbp+8h] BYREF
__int64 v49; // [rsp+1238h] [rbp+20h]
v49 = a4; /*0x2dcd1*/
v5 = 0; /*0x2dce8*/
v6 = a3; /*0x2dced*/
v42 = 0; /*0x2dcf6*/
if ( !a1 || !Entry || !a3 || !a4 || !p_n64 ) /*0x2dd29*/
return 3362652165LL; /*0x2e233*/
if ( (unsigned int)UtlTimerPoll(Entry) != 3 ) /*0x2dd3a*/
return 3362672640LL; /*0x2dd41*/
v11 = 0; /*0x2dd5b*/
v43 = *v9; /*0x2dd5d*/
v48 = 0; /*0x2dd61*/
v12 = 1; /*0x2dd68*/
if ( (unsigned int)MacInitSwFlag(a1, Entry, v6, p_n13) ) /*0x2dd6b*/
LODWORD(PhyReg) = 0; /*0x2dd74*/
else
LODWORD(PhyReg) = MacReadPhyReg(p_n13); /*0x2dd87*/
Entry_1 = Entry; /*0x2dd8f*/
if ( Entry == (_DWORD *)((char *)Entry + v6) ) /*0x2dd95*/
{
LABEL_35:
MacInitSwFlag(a1, Entry, v6, p_n13); /*0x2dee0*/
n13_1 = p_n13[0]; /*0x2def6*/
v19 = 0; /*0x2df00*/
if ( p_n13[0] ) /*0x2df0b*/
{
n7 = p_n13[0]; /*0x2df0d*/
while ( n7 != 7 ) /*0x2df12*/
{
n7 = p_n13[++v19]; /*0x2df18*/
if ( !n7 ) /*0x2df26*/
goto LABEL_39; /*0x2df26*/
}
v28 = 0; /*0x2e00d*/
v29 = p_n13[0]; /*0x2e010*/
while ( v29 != 1 ) /*0x2e015*/
{
v29 = p_n13[++v28]; /*0x2e017*/
if ( !v29 ) /*0x2e024*/
goto LABEL_39; /*0x2e024*/
}
v21 = v43; /*0x2e02b*/
if ( v11 + 1 >= v43 ) /*0x2e034*/
return 3362672641LL; /*0x2e034*/
p_n7 = 7; /*0x2e040*/
UtlMacAddrToHexStr(1, &p_n7); /*0x2e04a*/
v22 = v49; /*0x2e04f*/
SpiEraseSector(v49, &v48, (int *)&p_n7, (__int64)v47, &v42); /*0x2e079*/
v11 = v48; /*0x2e07e*/
}
else
{
LABEL_39:
v21 = v43; /*0x2df28*/
v22 = v49; /*0x2df2c*/
}
v23 = 0; /*0x2df34*/
if ( !n13_1 ) /*0x2df3a*/
goto LABEL_76; /*0x2df3a*/
n7_1 = n13_1; /*0x2df40*/
while ( n7_1 != 7 ) /*0x2df45*/
{
n7_1 = p_n13[++v23]; /*0x2df4b*/
if ( !n7_1 ) /*0x2df58*/
goto LABEL_76; /*0x2df58*/
}
v30 = 0; /*0x2e08a*/
n3 = n13_1; /*0x2e08d*/
while ( n3 != 3 ) /*0x2e092*/
{
n3 = p_n13[++v30]; /*0x2e094*/
if ( !n3 ) /*0x2e0a1*/
goto LABEL_76; /*0x2e0a1*/
}
if ( v11 + 1 < v21 ) /*0x2e0ad*/
{
p_n7 = 7; /*0x2e0bd*/
UtlMacAddrToHexStr(3, &p_n7); /*0x2e0c7*/
SpiEraseSector(v22, &v48, (int *)&p_n7, (__int64)v47, &v42); /*0x2e0ee*/
v32 = 0; /*0x2e0f3*/
n2 = n13_1; /*0x2e0f6*/
while ( n2 != 2 ) /*0x2e0fb*/
{
n2 = p_n13[++v32]; /*0x2e0fd*/
if ( !n2 ) /*0x2e10b*/
{
v34 = 0; /*0x2e10d*/
n13 = n13_1; /*0x2e110*/
while ( n13 != 13 ) /*0x2e115*/
{
n13 = p_n13[++v34]; /*0x2e117*/
if ( !n13 ) /*0x2e124*/
goto LABEL_75; /*0x2e124*/
}
break; /*0x2e115*/
}
}
if ( v48 + 1 < v21 ) /*0x2e133*/
{
UtlMacAddrToHexStr(2, &p_n7); /*0x2e143*/
SpiEraseSector(v22, &v48, (int *)&p_n7, (__int64)v47, &v42); /*0x2e16a*/
LABEL_75:
v11 = v48; /*0x2e16f*/
LABEL_76:
v36 = 0; /*0x2e176*/
if ( !n13_1 ) /*0x2e17c*/
goto LABEL_90; /*0x2e17c*/
n3_1 = n13_1; /*0x2e182*/
while ( n3_1 != 3 ) /*0x2e187*/
{
n3_1 = p_n13[++v36]; /*0x2e189*/
if ( !n3_1 ) /*0x2e196*/
goto LABEL_90; /*0x2e196*/
}
v38 = 0; /*0x2e19d*/
n2_1 = n13_1; /*0x2e1a0*/
while ( n2_1 != 2 ) /*0x2e1a5*/
{
n2_1 = p_n13[++v38]; /*0x2e1a7*/
if ( !n2_1 ) /*0x2e1b4*/
{
v40 = 0; /*0x2e1b6*/
while ( n13_1 != 13 ) /*0x2e1bc*/
{
n13_1 = p_n13[++v40]; /*0x2e1be*/
if ( !n13_1 ) /*0x2e1cb*/
goto LABEL_90; /*0x2e1cb*/
}
break; /*0x2e1bc*/
}
}
if ( v11 + 1 < v21 ) /*0x2e1d4*/
{
p_n7 = 3; /*0x2e1e4*/
UtlMacAddrToHexStr(2, &p_n7); /*0x2e1f1*/
SpiEraseSector(v22, &v48, (int *)&p_n7, (__int64)v47, &v42); /*0x2e218*/
LOWORD(v11) = v48; /*0x2e21d*/
goto LABEL_90; /*0x2e21d*/
}
}
}
return 3362672641LL; /*0x2e008*/
}
do /*0x2ded1*/
{
if ( EepromSpeedIsGig(Entry_1) ) /*0x2dd9e*/
{
n3_2 = UtlTimerPoll(Entry_1); /*0x2ddae*/
if ( n3_2 == 2 ) /*0x2ddb6*/
{
v15 = *((unsigned __int8 *)Entry_1 + 4); /*0x2ddb8*/
}
else
{
if ( n3_2 != 3 ) /*0x2ddc1*/
goto LABEL_31; /*0x2ddc1*/
v15 = (unsigned int)Entry_1[1]; /*0x2ddc7*/
}
v5 = (char *)Entry_1 + v15; /*0x2ddca*/
LABEL_31:
while ( *(_WORD *)v5 ) /*0x2debb*/
{
if ( *((_WORD *)v5 + 1) == a1[1] && *(_WORD *)v5 == 0x8086 ) /*0x2ddea*/
{
v16 = *((_WORD *)v5 + 3); /*0x2ddf0*/
if ( v16 == a1[3] || v16 == -1 ) /*0x2de04*/
{
v17 = *((_WORD *)v5 + 2); /*0x2de0a*/
if ( v17 == a1[2] || v17 == -1 ) /*0x2de19*/
{
v12 = (v5[16] & 2) == 0; /*0x2de29*/
if ( v11 >= v43 ) /*0x2de31*/
return 3362672641LL; /*0x2de31*/
if ( &v41 != (__int64 *)-64LL ) /*0x2de41*/
EepromDevIdMatchToStr(PhyReg, *((_DWORD *)v5 + 2), *((_DWORD *)v5 + 3), (int *)&p_n7); /*0x2de53*/
if ( (v5[16] & 0x20) != 0 ) /*0x2de63*/
{
SpiEraseSector((__int64)v47, &v42, (int *)&p_n7, 0, 0); /*0x2de7a*/
}
else
{
SpiEraseSector(v49, &v48, (int *)&p_n7, (__int64)v47, &v42); /*0x2dea3*/
v11 = v48; /*0x2dea8*/
}
}
}
}
v5 += 32; /*0x2deaf*/
}
LABEL_32:
v5 = 0; /*0x2dec1*/
goto LABEL_33; /*0x2dec1*/
}
n2_2 = EepromLookupSpeedVal((__int64)Entry_1); /*0x2df64*/
if ( !v12 /*0x2dfb2*/
|| !MacRaiseMdi((__int64)a1, Entry_1, n32902, n0xFFFF)
|| !EepromValidateSpeed((__int64)Entry_1)
|| n2_2 == 2
|| n2_2 == 13
|| n2_2 == 14
|| n2_2 == 4 )
{
goto LABEL_32; /*0x2dfb2*/
}
if ( v11 + 1 >= v43 ) /*0x2dfbf*/
return 3362672641LL; /*0x2dfbf*/
p_n7 = n2_2; /*0x2dfce*/
v5 = 0; /*0x2dfd2*/
SpiEraseSector(v49, &v48, (int *)&p_n7, (__int64)v47, &v42); /*0x2dff2*/
v11 = v48; /*0x2dff7*/
LABEL_33:
Entry_1 = (_DWORD *)EepromNextEntry(Entry_1); /*0x2dec3*/
}
while ( Entry_1 != (_DWORD *)((char *)Entry + v6) ); /*0x2ded1*/
if ( v12 ) /*0x2deda*/
goto LABEL_35; /*0x2deda*/
LABEL_90:
*p_n64 = v11; /*0x2e224*/
return 0; /*0x2e240*/
}
// Function: MacAutoNeg @ 0x2e254 (0x339 bytes)
__int64 __fastcall MacAutoNeg(_WORD *a1, _DWORD *Entry, unsigned int a3, __int64 a4, __int16 *p_n64)
{
__int16 v5; // r11
__int64 v6; // rbx
unsigned int n64; // edx
unsigned int n64_1; // edi
char v13; // r13
_DWORD *Entry_1; // r12
char *j; // rbx
__int16 v16; // ax
__int16 v17; // ax
int *p_n7; // r9
unsigned __int8 *v19; // rcx
_DWORD *v20; // rdx
bool v21; // al
unsigned int n0xF; // ecx
__int64 *v23; // rax
__int64 v24; // rdx
int v25; // edx
int *v26; // rcx
unsigned int n64_2; // r10d
int n3; // r9d
__int64 v29; // r11
int n7; // r10d
int n7_1; // eax
__int64 v32; // rcx
int v33; // eax
_DWORD *v34; // rdx
__int64 v35; // rcx
int n7_2; // eax
__int64 v37; // rax
int *v38; // rdx
_DWORD *v39; // rdx
unsigned int v40; // [rsp+30h] [rbp-98h]
_DWORD p_n13[34]; // [rsp+40h] [rbp-88h] BYREF
unsigned int i; // [rsp+D8h] [rbp+10h]
v5 = 0; /*0x2e270*/
v6 = a4; /*0x2e273*/
if ( !Entry || !a3 || !a4 || !p_n64 ) /*0x2e2a5*/
return 3362652165LL; /*0x2e56d*/
if ( *Entry != 725765190 ) /*0x2e2b1*/
return MacSetupLinkSpeed(a1, Entry, a3, a4, p_n64); /*0x2e2b8*/
n64 = (unsigned __int16)*p_n64; /*0x2e2c2*/
n64_1 = 0; /*0x2e2c6*/
v13 = 1; /*0x2e2c9*/
Entry_1 = Entry; /*0x2e2cc*/
v40 = a3; /*0x2e2cf*/
for ( i = n64; ; n64 = i ) /*0x2e2d4*/
{
if ( *Entry_1 != 725765190 || *((_WORD *)Entry_1 + 5) != 0x8086 ) /*0x2e304*/
return 3362672640LL; /*0x2e4d7*/
if ( *(_WORD *)((char *)Entry_1 + 29) == 256 ) /*0x2e315*/
{
for ( j = (char *)Entry_1 + *((unsigned __int8 *)Entry_1 + 4); *(_WORD *)j != v5; j += 16 ) /*0x2e321*/
{
if ( *((_WORD *)j + 1) == a1[1] && *(_WORD *)j == 0x8086 ) /*0x2e338*/
{
v16 = *((_WORD *)j + 3); /*0x2e33a*/
if ( v16 == a1[3] || v16 == -1 ) /*0x2e349*/
{
v17 = *((_WORD *)j + 2); /*0x2e34b*/
if ( v17 == a1[2] || v17 == -1 ) /*0x2e35a*/
{
v13 = (j[10] & 2) == 0; /*0x2e366*/
if ( n64_1 >= n64 ) /*0x2e36c*/
return 3362672641LL; /*0x2e36c*/
p_n7 = (int *)(a4 + 68LL * n64_1); /*0x2e379*/
if ( p_n7 ) /*0x2e381*/
{
EepromDevIdMatchToStr(0, *((unsigned __int16 *)j + 4), 0, p_n7); /*0x2e38c*/
n64 = i; /*0x2e391*/
v5 = 0; /*0x2e398*/
}
++n64_1; /*0x2e3a1*/
}
}
}
}
v6 = a4; /*0x2e3ba*/
}
else if ( v13 != (_BYTE)v5 ) /*0x2e3f2*/
{
v21 = MacRaiseMdi((__int64)a1, Entry_1, 32902, 0xFFFF); /*0x2e3fa*/
v5 = 0; /*0x2e3ff*/
if ( v21 && *(_WORD *)((char *)Entry_1 + 29) != 64 ) /*0x2e40e*/
{
if ( n64_1 + 1 >= i ) /*0x2e41c*/
return 3362672641LL; /*0x2e41c*/
n0xF = 0; /*0x2e42b*/
v23 = qword_15D50; /*0x2e42e*/
v24 = 0; /*0x2e431*/
while ( *((_DWORD *)v23 + 1) != *(unsigned __int16 *)((char *)Entry_1 + 29) || *(_DWORD *)v23 ) /*0x2e43d*/
{
++n0xF; /*0x2e43f*/
++v24; /*0x2e441*/
v23 = (__int64 *)((char *)v23 + 12); /*0x2e444*/
if ( n0xF >= 0xF ) /*0x2e44b*/
{
v25 = 0; /*0x2e44d*/
goto LABEL_36; /*0x2e44d*/
}
}
v25 = *((_DWORD *)&qword_15D50[1] + 3 * v24); /*0x2e470*/
LABEL_36:
v26 = (int *)(v6 + 68LL * n64_1); /*0x2e450*/
*v26 = v25; /*0x2e459*/
v26[1] = 0; /*0x2e45b*/
MacCheckEepromRange(v26); /*0x2e45f*/
n64_1 = n64_2; /*0x2e464*/
}
}
v19 = (unsigned __int8 *)(Entry_1 + 1); /*0x2e3c2*/
v20 = (_DWORD *)((char *)Entry_1 + 6); /*0x2e3c7*/
Entry_1 = (_DWORD *)((char *)Entry_1 /*0x2e3d1*/
+ *(_DWORD *)((char *)Entry_1 + 6)
+ (unsigned int)*((unsigned __int8 *)Entry_1 + 4));
v40 -= *v20 + *v19; /*0x2e3d9*/
if ( !v40 ) /*0x2e3dd*/
break; /*0x2e3dd*/
}
if ( v13 != (_BYTE)v5 ) /*0x2e484*/
{
if ( n64_1 + 2 >= i ) /*0x2e496*/
return 3362672641LL; /*0x2e47c*/
MacInitSwFlag(a1, Entry, a3, p_n13); /*0x2e4a6*/
n3 = p_n13[0]; /*0x2e4ab*/
v29 = 0; /*0x2e4b0*/
n7 = 7; /*0x2e4b3*/
if ( p_n13[0] ) /*0x2e4ba*/
{
n7_1 = p_n13[0]; /*0x2e4bc*/
while ( n7_1 != 7 ) /*0x2e4c2*/
{
n7_1 = p_n13[++v29]; /*0x2e4c4*/
if ( !n7_1 ) /*0x2e4ce*/
goto LABEL_52; /*0x2e4ce*/
}
v32 = 0; /*0x2e4dc*/
v33 = p_n13[0]; /*0x2e4de*/
while ( v33 != 1 ) /*0x2e4e4*/
{
v33 = p_n13[++v32]; /*0x2e4e6*/
if ( !v33 ) /*0x2e4ef*/
goto LABEL_52; /*0x2e4ef*/
}
v34 = (_DWORD *)(v6 + 68LL * n64_1); /*0x2e4fe*/
*(_QWORD *)v34 = 7; /*0x2e505*/
UtlMacAddrToHexStr(1, v34); /*0x2e508*/
++n64_1; /*0x2e50d*/
}
LABEL_52:
v35 = 0; /*0x2e50f*/
if ( n3 ) /*0x2e514*/
{
n7_2 = n3; /*0x2e516*/
while ( n7_2 != n7 ) /*0x2e51c*/
{
n7_2 = p_n13[++v35]; /*0x2e51e*/
if ( !n7_2 ) /*0x2e527*/
goto LABEL_62; /*0x2e527*/
}
v37 = 0; /*0x2e52b*/
while ( n3 != 3 ) /*0x2e533*/
{
n3 = p_n13[++v37]; /*0x2e535*/
if ( !n3 ) /*0x2e540*/
goto LABEL_62; /*0x2e540*/
}
v38 = (int *)(v6 + 68LL * n64_1); /*0x2e54a*/
v38[1] = 0; /*0x2e54d*/
*v38 = n7; /*0x2e551*/
UtlMacAddrToHexStr(3, v38); /*0x2e554*/
UtlMacAddrToHexStr(2, v39); /*0x2e55e*/
LOWORD(n64_1) = n64_1 + 1; /*0x2e563*/
}
}
LABEL_62:
*p_n64 = n64_1; /*0x2e565*/
return 0; /*0x2e57a*/
}
// Function: MacCheckEepromRange @ 0x2f7c0 (0x95 bytes)
void __fastcall MacCheckEepromRange(int *a1)
{
unsigned int n2_1; // r9d
int n3; // edx
__int64 v3; // r8
int n2; // eax
__int64 v5; // r8
int v6; // eax
__int64 v7; // r8
int n5; // eax
__int64 v9; // rax
n2_1 = 0; /*0x2f7c4*/
if ( a1 ) /*0x2f7ca*/
{
n3 = *a1; /*0x2f7d0*/
v3 = 0; /*0x2f7d2*/
if ( *a1 ) /*0x2f7d0*/
{
n2 = *a1; /*0x2f7d9*/
while ( n2 != 2 ) /*0x2f7de*/
{
n2 = a1[++v3]; /*0x2f7e3*/
if ( !n2 ) /*0x2f7e9*/
goto LABEL_6; /*0x2f7e9*/
}
}
else
{
LABEL_6:
v5 = 0; /*0x2f7eb*/
if ( n3 ) /*0x2f7f0*/
{
v6 = *a1; /*0x2f7f2*/
while ( v6 != 1 ) /*0x2f7f7*/
{
v6 = a1[++v5]; /*0x2f7fc*/
if ( !v6 ) /*0x2f802*/
goto LABEL_12; /*0x2f802*/
}
n2_1 = 1; /*0x2f806*/
}
LABEL_12:
v7 = 0; /*0x2f80c*/
if ( n3 ) /*0x2f811*/
{
n5 = *a1; /*0x2f813*/
while ( n5 != 5 ) /*0x2f818*/
{
n5 = a1[++v7]; /*0x2f81d*/
if ( !n5 ) /*0x2f823*/
goto LABEL_18; /*0x2f823*/
}
++n2_1; /*0x2f827*/
}
LABEL_18:
v9 = 0; /*0x2f82a*/
while ( n3 ) /*0x2f83b*/
{
if ( n3 == 3 ) /*0x2f831*/
goto LABEL_23; /*0x2f831*/
n3 = a1[++v9]; /*0x2f836*/
}
if ( n2_1 < 2 ) /*0x2f841*/
return; /*0x2f841*/
LABEL_23:
UtlMacAddrToHexStr(2, a1); /*0x2f843*/
}
}
}
// Function: MacReadEepromWord @ 0x2f858 (0x18e bytes)
__int64 __fastcall MacReadEepromWord(
__int64 a1,
_DWORD *a2,
int n9,
__int64 a4,
__int64 a5,
unsigned int a6,
_BYTE *a7,
int a8)
{
__int64 n4; // rax
char *v10; // rcx
char *v11; // r9
__int64 v12; // r10
__int64 v13; // r8
int v14; // r11d
unsigned int v15; // ebx
__int64 v16; // rcx
char v17; // al
int v18; // eax
unsigned int v19; // r9d
_WORD *v20; // rcx
__int16 *v21; // rdx
__int16 v22; // ax
__int64 v23; // rcx
char v24; // al
__int64 v25; // r10
__int64 v26; // r11
int v27; // edi
_DWORD v29[6]; // [rsp+20h] [rbp-18h] BYREF
char v30; // [rsp+40h] [rbp+8h] BYREF
char v31; // [rsp+41h] [rbp+9h]
char v32; // [rsp+42h] [rbp+Ah]
char v33; // [rsp+43h] [rbp+Bh]
int v34; // [rsp+48h] [rbp+10h] BYREF
v34 = 0; /*0x2f870*/
v29[0] = 0; /*0x2f873*/
n4 = 4; /*0x2f879*/
v10 = &v30; /*0x2f87c*/
do /*0x2f88d*/
{
--n4; /*0x2f881*/
*v10++ = 0; /*0x2f884*/
}
while ( n4 ); /*0x2f88d*/
EepromProtoTypeToSize(n9, &v34, v29); /*0x2f89c*/
v13 = a6; /*0x2f8a1*/
v14 = a8; /*0x2f8a8*/
v15 = 12 * a6 + 151; /*0x2f8b1*/
if ( *a2 - a8 < v15 ) /*0x2f8bd*/
return 3362652165LL; /*0x2f8bd*/
*(_DWORD *)v12 = 859982918; /*0x2f8cb*/
*(_WORD *)(v12 + 13) = -32634; /*0x2f8d2*/
v16 = v12 - (_QWORD)v11; /*0x2f8d7*/
do /*0x2f8e8*/
{
v17 = *v11++; /*0x2f8da*/
v11[v16 + 14] = v17; /*0x2f8e0*/
}
while ( v17 ); /*0x2f8e8*/
v18 = v34; /*0x2f8ea*/
*(_DWORD *)(v12 + 9) = v14; /*0x2f8ee*/
*(_DWORD *)(v12 + 4) = v15; /*0x2f8f2*/
*(_DWORD *)(v12 + 99) = v18; /*0x2f8f6*/
v19 = 0; /*0x2f8fe*/
*(_DWORD *)(v12 + 103) = v29[0]; /*0x2f901*/
*(_BYTE *)(v12 + 95) = v30; /*0x2f909*/
*(_BYTE *)(v12 + 96) = v31; /*0x2f911*/
*(_BYTE *)(v12 + 97) = v32; /*0x2f919*/
*(_BYTE *)(v12 + 98) = v33; /*0x2f921*/
if ( (_DWORD)v13 ) /*0x2f928*/
{
v20 = (_WORD *)(v12 + 145); /*0x2f92f*/
v19 = v13; /*0x2f936*/
v21 = (__int16 *)(a5 + 6); /*0x2f939*/
do /*0x2f96b*/
{
*(v20 - 2) = *(v21 - 2); /*0x2f941*/
v22 = *v21; /*0x2f945*/
v21 += 4; /*0x2f948*/
*v20 = v22; /*0x2f94c*/
v20 += 6; /*0x2f953*/
--v13; /*0x2f957*/
*(v20 - 9) = *(v21 - 7); /*0x2f95b*/
*(v20 - 7) = *(v21 - 5); /*0x2f963*/
*(v20 - 4) = 0; /*0x2f967*/
}
while ( v13 ); /*0x2f96b*/
}
v23 = 3LL * v19; /*0x2f970*/
*(_WORD *)(v12 + 4 * v23 + 141) = 0; /*0x2f974*/
*(_WORD *)(v12 + 4 * v23 + 145) = 0; /*0x2f97d*/
*(_WORD *)(v12 + 4 * v23 + 139) = 0; /*0x2f986*/
*(_WORD *)(v12 + 4 * v23 + 143) = 0; /*0x2f98f*/
*(_WORD *)(v12 + 4 * v23 + 149) = 0; /*0x2f998*/
*(_BYTE *)(v12 + 8) = 0; /*0x2f9a4*/
v24 = EepromCfgBlkChecksum(v12); /*0x2f9a8*/
v27 = v15 + v26; /*0x2f9ad*/
*(_BYTE *)(v25 + 8) = v24; /*0x2f9b1*/
if ( v15 + (unsigned int)v26 > *a2 ) /*0x2f9b7*/
return 3362652165LL; /*0x2f9d1*/
UtlMemCpy((_BYTE *)(v25 + v15), a7, v26); /*0x2f9c6*/
*a2 = v27; /*0x2f9cb*/
return 0; /*0x2f9e0*/
}
// Function: UtlTimerPoll @ 0x2f9e8 (0x40 bytes)
__int64 __fastcall UtlTimerPoll(_DWORD *a1)
{
__int64 result; // rax
result = 0; /*0x2f9e8*/
if ( !a1 ) /*0x2f9ed*/
return 4; /*0x2f9ef*/
if ( *(_WORD *)a1 != 0xAA55 ) /*0x2f9fd*/
{
if ( *a1 == 557993030 ) /*0x2fa05*/
{
return 1; /*0x2fa07*/
}
else if ( *a1 == 725765190 ) /*0x2fa13*/
{
return 2; /*0x2fa15*/
}
else
{
LOBYTE(result) = *a1 != 859982918; /*0x2fa21*/
return (unsigned int)(result + 3); /*0x2fa24*/
}
}
return result; /*0x2f9f4*/
}
// Function: EepromNextEntry @ 0x2fa28 (0x2e bytes)
__int64 __fastcall EepromNextEntry(_DWORD *a1)
{
int n3; // eax
__int64 v2; // rcx
__int64 v3; // rax
n3 = UtlTimerPoll(a1); /*0x2fa2c*/
if ( n3 == 2 ) /*0x2fa34*/
{
v3 = *(_DWORD *)(v2 + 6) + (unsigned int)*(unsigned __int8 *)(v2 + 4); /*0x2fa3a*/
}
else if ( n3 == 3 ) /*0x2fa42*/
{
v3 = (unsigned int)(*(_DWORD *)(v2 + 4) + *(_DWORD *)(v2 + 9)); /*0x2fa47*/
}
else
{
v3 = 0; /*0x2fa4c*/
}
return v2 + v3; /*0x2fa51*/
}
// Function: EepromLookupSpeedVal @ 0x2fa58 (0x40 bytes)
__int64 __fastcall EepromLookupSpeedVal(__int64 a1)
{
unsigned int v1; // r8d
__int64 *v2; // rdx
unsigned int n0xF; // r9d
v1 = 0; /*0x2fa63*/
v2 = qword_15D50; /*0x2fa66*/
n0xF = 0; /*0x2fa69*/
while ( *((_DWORD *)v2 + 1) != *(_DWORD *)(a1 + 99) || *(_DWORD *)v2 != *(_DWORD *)(a1 + 103) ) /*0x2fa77*/
{
++n0xF; /*0x2fa79*/
v2 = (__int64 *)((char *)v2 + 12); /*0x2fa7c*/
if ( n0xF >= 0xF ) /*0x2fa84*/
return v1; /*0x2fa84*/
}
return *((unsigned int *)&qword_15D50[1] + 3 * n0xF); /*0x2fa97*/
}
// Function: EepromGetSpeedVal @ 0x2fa98 (0x5e bytes)
__int64 __fastcall EepromGetSpeedVal(_DWORD *a1)
{
int n3; // eax
__int64 v2; // rcx
unsigned int v3; // edx
__int64 *v4; // rax
unsigned int n0xF; // r8d
n3 = UtlTimerPoll(a1); /*0x2fa9c*/
if ( n3 == 2 ) /*0x2faa4*/
{
v3 = 0; /*0x2fab2*/
v4 = qword_15D50; /*0x2fab4*/
n0xF = 0; /*0x2fab7*/
while ( *((_DWORD *)v4 + 1) != *(unsigned __int16 *)(v2 + 29) || *(_DWORD *)v4 ) /*0x2fac2*/
{
++n0xF; /*0x2fac4*/
v4 = (__int64 *)((char *)v4 + 12); /*0x2fac7*/
if ( n0xF >= 0xF ) /*0x2facf*/
return v3; /*0x2facf*/
}
return *((unsigned int *)&qword_15D50[1] + 3 * n0xF); /*0x2fadf*/
}
else if ( n3 == 3 ) /*0x2fae6*/
{
return EepromLookupSpeedVal(v2); /*0x2fae8*/
}
else
{
return 0; /*0x2faef*/
}
}
// Function: EepromValidateSpeed @ 0x2faf8 (0x67 bytes)
char __fastcall EepromValidateSpeed(__int64 Entry)
{
int n2; // eax
_DWORD *Entry_1; // rcx
bool IsGig; // al
char v5; // dl
bool v6; // zf
int n9; // edi
bool v9; // al
n2 = UtlTimerPoll((_DWORD *)Entry); /*0x2fb05*/
if ( n2 == 2 ) /*0x2fb0d*/
{
IsGig = EepromSpeedIsGig(Entry_1); /*0x2fb0f*/
v5 = 0; /*0x2fb14*/
if ( IsGig ) /*0x2fb18*/
return v5; /*0x2fb2c*/
v6 = *(_WORD *)(Entry + 29) == 4096; /*0x2fb1f*/
LABEL_4:
if ( !v6 ) /*0x2fb23*/
return 1; /*0x2fb25*/
return v5; /*0x2fb25*/
}
if ( n2 == 3 ) /*0x2fb31*/
{
n9 = EepromLookupSpeedVal((__int64)Entry_1); /*0x2fb3b*/
v9 = EepromSpeedIsGig((_DWORD *)Entry); /*0x2fb3d*/
v5 = 0; /*0x2fb42*/
if ( v9 || n9 == 9 ) /*0x2fb4b*/
return v5; /*0x2fb4b*/
v6 = n9 == 12; /*0x2fb4d*/
goto LABEL_4; /*0x2fb50*/
}
return 0; /*0x2fb59*/
}
// Function: EepromSpeedIsGig @ 0x2fb60 (0x32 bytes)
bool __fastcall EepromSpeedIsGig(_DWORD *Entry)
{
int n2; // eax
__int64 v2; // rcx
n2 = UtlTimerPoll(Entry); /*0x2fb64*/
if ( n2 == 2 ) /*0x2fb6c*/
return *(_WORD *)(v2 + 29) == 256; /*0x2fb7a*/
if ( n2 == 3 ) /*0x2fb7f*/
return (unsigned int)EepromLookupSpeedVal(v2) == 10; /*0x2fb89*/
return 0; /*0x2fb8d*/
}
// Function: EepromProtoTypeToHex @ 0x2fb94 (0x59 bytes)
_BYTE *__fastcall EepromProtoTypeToHex(int *a1)
{
int *v1; // r10
int n2; // ecx
__int64 v3; // r9
_DWORD v5[22]; // [rsp+20h] [rbp-58h] BYREF
v5[0] = 0; /*0x2fb98*/
v5[1] = 0; /*0x2fb9d*/
v1 = a1; /*0x2fba2*/
n2 = *a1; /*0x2fba5*/
v3 = 0; /*0x2fba7*/
while ( n2 ) /*0x2fbd5*/
{
if ( n2 == 13 ) /*0x2fbaf*/
{
n2 = 2; /*0x2fbb1*/
LABEL_6:
UtlMacAddrToHexStr(n2, v5); /*0x2fbc2*/
goto LABEL_7; /*0x2fbc7*/
}
if ( n2 != 4 && n2 != 14 ) /*0x2fbc0*/
goto LABEL_6; /*0x2fbc0*/
LABEL_7:
n2 = v1[++v3]; /*0x2fbcf*/
}
return UtlMemCpy(v1, v5, 68); /*0x2fbe8*/
}
// Function: EepromProtoValToStr @ 0x2fbf0 (0x78 bytes)
_BYTE *__fastcall EepromProtoValToStr(int *a1)
{
int *v1; // r9
int n3; // ecx
int n4; // ecx
int n3_1; // r11d
__int64 v5; // r10
_DWORD v7[22]; // [rsp+20h] [rbp-58h] BYREF
v7[0] = 0; /*0x2fbf4*/
v7[1] = 0; /*0x2fbf9*/
v1 = a1; /*0x2fbfe*/
n3 = *a1; /*0x2fc01*/
if ( n3 ) /*0x2fc08*/
{
while ( n3 != 2 ) /*0x2fc11*/
{
if ( n3 == 3 ) /*0x2fc1d*/
{
UtlMacAddrToHexStr(3, v7); /*0x2fc24*/
n4 = 4; /*0x2fc29*/
goto LABEL_6; /*0x2fc29*/
}
LABEL_7:
UtlMacAddrToHexStr(n3, v7); /*0x2fc3b*/
n3 = v1[v5 + 1]; /*0x2fc48*/
if ( !n3 ) /*0x2fc4e*/
return UtlMemCpy(v1, v7, 68); /*0x2fc4e*/
}
n4 = 13; /*0x2fc13*/
LABEL_6:
UtlMacAddrToHexStr(n4, v7); /*0x2fc2e*/
n3 = n3_1; /*0x2fc38*/
goto LABEL_7; /*0x2fc38*/
}
return UtlMemCpy(v1, v7, 68); /*0x2fc63*/
}
// Function: EepromRomProtoMatch @ 0x2fc68 (0xaa bytes)
char __fastcall EepromRomProtoMatch(_WORD *a1, _DWORD *Entry, unsigned int a3, unsigned int *p_n13)
{
unsigned __int16 n64; // si
unsigned __int16 v6; // di
int *v7; // rbx
int PhyReg; // eax
__int64 v10[544]; // [rsp+30h] [rbp-1118h] BYREF
unsigned __int16 p_n64; // [rsp+1150h] [rbp+8h] BYREF
n64 = 64; /*0x2fc81*/
p_n64 = 64; /*0x2fc89*/
if ( a1 ) /*0x2fc90*/
{
MacAutoNeg(a1, Entry, a3, (__int64)v10, (__int16 *)&p_n64); /*0x2fca0*/
n64 = p_n64; /*0x2fca5*/
}
v6 = 0; /*0x2fcad*/
if ( !n64 ) /*0x2fcb5*/
return 0; /*0x2fcf4*/
while ( 1 ) /*0x2fcc1*/
{
v7 = (int *)v10 + 17 * v6; /*0x2fcc1*/
PhyReg = MacReadPhyReg(p_n13); /*0x2fcc6*/
((void (__fastcall *)(int *))funcs_2FCD8[PhyReg])(v7); /*0x2fcd8*/
if ( EepromProtoArraysMatch((int *)p_n13, v7) ) /*0x2fce2*/
break; /*0x2fce2*/
if ( ++v6 >= n64 ) /*0x2fcf2*/
return 0; /*0x2fcf2*/
}
return 1; /*0x2fd06*/
}
// Function: EepromCfgBlkChecksum @ 0x2fd14 (0x37 bytes)
__int64 __fastcall Mac_2fd14(__int64 a1)
{
__int64 result; // rax
_BYTE *v2; // r8
char v3; // dl
__int64 v4; // r9
result = 0; /*0x2fd14*/
if ( !a1 ) /*0x2fd19*/
return 3362652165LL; /*0x2fd19*/
if ( *(_DWORD *)a1 != 859982918 ) /*0x2fd21*/
return 3362652165LL; /*0x2fd21*/
v2 = (_BYTE *)a1; /*0x2fd23*/
v3 = 0; /*0x2fd26*/
if ( !*(_DWORD *)(a1 + 4) ) /*0x2fd28*/
return 3362652165LL; /*0x2fd45*/
v4 = *(unsigned int *)(a1 + 4); /*0x2fd2f*/
do /*0x2fd3d*/
{
v3 += *v2++; /*0x2fd33*/
--v4; /*0x2fd39*/
}
while ( v4 ); /*0x2fd3d*/
*(_BYTE *)(a1 + 8) = -v3; /*0x2fd41*/
return result; /*0x2fd44*/
}
// Function: EepromProtoTypeToSize @ 0x2fd4c (0xc6 bytes)
__int64 __fastcall EepromProtoTypeToSize(int n9, _DWORD *a2, _DWORD *a3)
{
__int64 result; // rax
int v4; // ecx
int v5; // ecx
int v6; // ecx
int v7; // ecx
int v8; // ecx
int v9; // ecx
int v10; // ecx
int v11; // ecx
int v12; // ecx
int v13; // ecx
int v14; // ecx
int v15; // ecx
int v16; // ecx
*a3 = 0; /*0x2fd4c*/
if ( n9 <= 9 ) /*0x2fd53*/
{
if ( n9 == 9 ) /*0x2fd55*/
{
*a2 = 4096; /*0x2fdb4*/
return result; /*0x2fdba*/
}
result = 1; /*0x2fd57*/
v4 = n9 - 1; /*0x2fd5c*/
if ( !v4 ) /*0x2fd5e*/
{
*a2 = 3; /*0x2fdad*/
return result; /*0x2fdb3*/
}
v5 = v4 - 1; /*0x2fd60*/
if ( !v5 ) /*0x2fd62*/
{
*a2 = 64; /*0x2fda6*/
return result; /*0x2fdac*/
}
v6 = v5 - 1; /*0x2fd64*/
if ( !v6 ) /*0x2fd66*/
{
*a2 = 16; /*0x2fd9f*/
return result; /*0x2fda5*/
}
v7 = v6 - 1; /*0x2fd68*/
if ( !v7 ) /*0x2fd6a*/
{
*a2 = (_DWORD)n0x8000_0; /*0x2fd98*/
return result; /*0x2fd9e*/
}
v8 = v7 - 1; /*0x2fd6c*/
if ( !v8 ) /*0x2fd6e*/
{
*a2 = 32; /*0x2fd91*/
return result; /*0x2fd97*/
}
v9 = v8 - 1; /*0x2fd70*/
if ( !v9 ) /*0x2fd72*/
{
*a2 = 512; /*0x2fd8a*/
return result; /*0x2fd90*/
}
v10 = v9 - 1; /*0x2fd74*/
if ( !v10 ) /*0x2fd76*/
{
*a2 = 8; /*0x2fd83*/
return result; /*0x2fd89*/
}
if ( v10 == 1 ) /*0x2fd7a*/
{
*a2 = 1024; /*0x2fd7c*/
return result; /*0x2fd82*/
}
goto LABEL_27; /*0x2fd7a*/
}
v11 = n9 - 10; /*0x2fdbb*/
if ( v11 ) /*0x2fdbe*/
{
result = 1; /*0x2fdc0*/
v12 = v11 - 1; /*0x2fdc5*/
if ( v12 ) /*0x2fdc7*/
{
v13 = v12 - 1; /*0x2fdc9*/
if ( v13 ) /*0x2fdcb*/
{
v14 = v13 - 1; /*0x2fdcd*/
if ( v14 ) /*0x2fdcf*/
{
v15 = v14 - 1; /*0x2fdd1*/
if ( v15 ) /*0x2fdd3*/
{
v16 = v15 - 1; /*0x2fdd5*/
if ( v16 ) /*0x2fdd7*/
{
if ( v16 != 1 ) /*0x2fddb*/
{
LABEL_27:
*a2 = 0; /*0x2fddd*/
return result; /*0x2fde0*/
}
*a2 = 0x80000; /*0x2fde1*/
}
else
{
*a2 = 0x40000; /*0x2fde8*/
}
}
else
{
*a2 = (_DWORD)&loc_20000; /*0x2fdef*/
}
}
else
{
*a2 = 0x8000; /*0x2fdf6*/
}
}
else
{
*a2 = 0x4000; /*0x2fdfd*/
}
}
else
{
*a2 = 0x2000; /*0x2fe04*/
}
}
else
{
*a2 = 256; /*0x2fe0b*/
}
return result; /*0x2fd82*/
}
// Function: EepromProtoArraysMatch @ 0x2fe14 (0x66 bytes)
char __fastcall EepromProtoArraysMatch(int *a1, int *a2)
{
unsigned __int64 n0x34; // r8
__int64 v5; // rax
int v6; // ecx
char v7; // dl
__int64 v8; // rcx
int v9; // eax
char v10; // al
n0x34 = 0; /*0x2fe1a*/
while ( 1 ) /*0x2fe24*/
{
v5 = 0; /*0x2fe24*/
if ( *a1 ) /*0x2fe26*/
{
v6 = *a1; /*0x2fe2b*/
while ( v6 != *(_DWORD *)((char *)qword_15C60 + n0x34) ) /*0x2fe32*/
{
v6 = a1[++v5]; /*0x2fe37*/
if ( !v6 ) /*0x2fe3d*/
goto LABEL_6; /*0x2fe3d*/
}
v7 = 1; /*0x2fe6f*/
}
else
{
LABEL_6:
v7 = 0; /*0x2fe3f*/
}
v8 = 0; /*0x2fe41*/
if ( *a2 ) /*0x2fe43*/
{
v9 = *a2; /*0x2fe48*/
while ( v9 != *(_DWORD *)((char *)qword_15C60 + n0x34) ) /*0x2fe4f*/
{
v9 = a2[++v8]; /*0x2fe54*/
if ( !v9 ) /*0x2fe5a*/
goto LABEL_11; /*0x2fe5a*/
}
v10 = 1; /*0x2fe73*/
}
else
{
LABEL_11:
v10 = 0; /*0x2fe5c*/
}
if ( v7 != v10 ) /*0x2fe60*/
return 0; /*0x2fe6e*/
n0x34 += 4LL; /*0x2fe62*/
if ( n0x34 >= 0x34 ) /*0x2fe6a*/
return 1; /*0x2fe6e*/
}
}
// Function: UtlMacAddrToHexStr @ 0x2fe7c (0x2b bytes)
unsigned __int64 __fastcall UtlMacAddrToHexStr(int a1, _DWORD *a2)
{
__int64 n0x11; // r8
unsigned __int64 result; // rax
n0x11 = 0; /*0x2fe7c*/
result = (unsigned __int64)a2; /*0x2fe7f*/
while ( *(_DWORD *)result != a1 ) /*0x2fe84*/
{
if ( !*(_DWORD *)result ) /*0x2fe89*/
{
result = (unsigned int)(n0x11 + 1); /*0x2fe9a*/
a2[n0x11] = a1; /*0x2fe9e*/
a2[result] = 0; /*0x2fea2*/
return result; /*0x2fea2*/
}
n0x11 = (unsigned int)(n0x11 + 1); /*0x2fe8b*/
result += 4LL; /*0x2fe8e*/
if ( (unsigned int)n0x11 >= 0x11 ) /*0x2fe96*/
return result; /*0x2fe96*/
}
return result; /*0x2fe98*/
}
// Function: UtlIntToHexStr @ 0x2fea8 (0x5a bytes)
__int64 __fastcall UtlIntToHexStr(_DWORD *a1, _DWORD *a2, unsigned int *a3)
{
_DWORD *v4; // r9
__int64 v5; // rcx
int v6; // r11d
__int64 v7; // r10
int v9; // [rsp+30h] [rbp+8h] BYREF
char v10; // [rsp+48h] [rbp+20h] BYREF
v4 = a1; /*0x2feaf*/
if ( !a1 || !a2 ) /*0x2feba*/
return 3362652165LL; /*0x2fef8*/
*a1 = 0; /*0x2febc*/
v9 = 0; /*0x2febf*/
*a2 = 0; /*0x2fec4*/
do /*0x2fef2*/
{
v5 = *a3; /*0x2feca*/
if ( !(_DWORD)v5 ) /*0x2fecf*/
break; /*0x2fecf*/
EepromProtoTypeToSize(v5, &v9, &v10, v4); /*0x2fedb*/
*v4 |= v9; /*0x2fee7*/
a3 = (unsigned int *)(v7 + 4); /*0x2feea*/
}
while ( (unsigned int)(v6 + 1) < 0x11 ); /*0x2fef2*/
return 0; /*0x2fefd*/
}
// Function: EepromDevIdMatchToStr @ 0x2ff04 (0x91 bytes)
_BYTE *__fastcall EepromDevIdMatchToStr(int PhyReg, int a2, int a3, int *p_n7)
{
unsigned __int64 n0xA8; // r10
int *p_n7_1; // r11
__int64 PhyReg_1; // rbx
n0xA8 = 0; /*0x2ff18*/
p_n7_1 = p_n7; /*0x2ff1b*/
PhyReg_1 = PhyReg; /*0x2ff23*/
*p_n7 = 0; /*0x2ff2d*/
p_n7[1] = 0; /*0x2ff30*/
do /*0x2ff71*/
{
if ( (a3 & *(int *)((_BYTE *)&dword_15CA0 + (_QWORD)&_ImageBase + n0xA8)) == *(int *)((char *)&dword_15CA0 /*0x2ff54*/
+ (_QWORD)&_ImageBase
+ n0xA8)
&& (a2 & *(int *)((_BYTE *)&dword_15CA4 + (_QWORD)&_ImageBase + n0xA8)) == *(int *)((char *)&dword_15CA4
+ (_QWORD)&_ImageBase
+ n0xA8) )
{
UtlMacAddrToHexStr(*(int *)((char *)&dword_15CA8 + (_QWORD)&_ImageBase + n0xA8), p_n7_1); /*0x2ff61*/
}
n0xA8 += 12LL; /*0x2ff66*/
}
while ( n0xA8 < 0xA8 ); /*0x2ff71*/
return (*(_BYTE *(__fastcall **)(int *))((char *)funcs_2FCD8 + (_QWORD)(&_ImageBase + PhyReg_1)))(p_n7_1); /*0x2ff8d*/
}
// Function: EepromUndiRomReadCfg @ 0x2ff98 (0x14a bytes)
__int64 __fastcall EepromUndiRomReadCfg(
__int64 a1,
__int16 n0xFFFF,
__int64 Entry,
unsigned int a4,
_BYTE *a5,
unsigned int a6)
{
_BYTE *v6; // rdi
__int64 Entry_1; // rbx
__int64 Entry_2; // rsi
bool i; // zf
_DWORD *v11; // rcx
__int64 v12; // rcx
bool v14; // al
int n3; // eax
_DWORD *v16; // rcx
unsigned int v17; // eax
_DWORD *v18; // rcx
int n2; // eax
__int64 v20; // r8
__int64 v21; // rdi
__int64 v23; // [rsp+30h] [rbp+8h] BYREF
v23 = a1; /*0x2ffa7*/
v6 = 0; /*0x2ffb0*/
Entry_1 = Entry; /*0x2ffb2*/
if ( Entry && a5 ) /*0x2ffc6*/
{
Entry_2 = Entry + a4; /*0x2ffcf*/
for ( i = Entry == Entry_2; ; i = Entry_1 == Entry_2 ) /*0x2ffd2*/
{
if ( i || (unsigned int)UtlTimerPoll((_DWORD *)Entry_1) != 3 ) /*0x2ffe6*/
return 3362652163LL; /*0x300c6*/
if ( (unsigned int)UtlTimerPoll(v11) == 3 && (unsigned int)EepromLookupSpeedVal(v12) == 12 ) /*0x2fffe*/
{
if ( Entry_1 ) /*0x3000e*/
{
if ( (unsigned int)UtlTimerPoll((_DWORD *)Entry_1) != 3 ) /*0x3001b*/
goto LABEL_16; /*0x3001b*/
v14 = PxeRomDevMatch(&v23, n0xFFFF, (_DWORD *)Entry_1); /*0x30028*/
}
else
{
v14 = 0; /*0x3002f*/
}
if ( v14 && Entry_1 != -139 ) /*0x30041*/
{
n3 = UtlTimerPoll((_DWORD *)Entry_1); /*0x30056*/
if ( n3 == 2 ) /*0x3005e*/
{
v17 = *(_DWORD *)(Entry_1 + 6); /*0x30060*/
}
else if ( n3 == 3 ) /*0x30068*/
{
v17 = *(_DWORD *)(Entry_1 + 9); /*0x3006a*/
}
else
{
v17 = 0; /*0x3006f*/
}
if ( v17 <= a6 ) /*0x30075*/
{
UtlTimerPoll(v16); /*0x30077*/
n2 = UtlTimerPoll(v18); /*0x30095*/
if ( n2 == 2 ) /*0x3009d*/
{
v21 = *(unsigned __int8 *)(Entry_1 + 4); /*0x3009f*/
goto LABEL_27; /*0x300a3*/
}
if ( n2 == 3 ) /*0x300a8*/
{
v21 = *(unsigned int *)(Entry_1 + 4); /*0x300aa*/
LABEL_27:
v6 = (_BYTE *)(Entry_1 + v21); /*0x300ad*/
}
UtlMemCpy(a5, v6, v20); /*0x300b8*/
return 0; /*0x300bf*/
}
return 3362652165LL; /*0x30075*/
}
}
LABEL_16:
Entry_1 = EepromNextEntry((_DWORD *)Entry_1); /*0x30043*/
}
}
return 3362652165LL; /*0x300dc*/
}
// Function: PxeRomDevMatch @ 0x30378 (0xdd bytes)
bool __fastcall PxeRomDevMatch(_WORD *a1, unsigned __int16 n0xFFFF, _DWORD *Entry)
{
unsigned int v5; // r9d
unsigned __int64 v6; // rdx
_WORD *v7; // rax
__int16 v8; // cx
__int16 v9; // cx
__int16 v10; // cx
bool result; // al
__int16 n0xFFFF_1; // ax
if ( a1 ) /*0x3038e*/
{
if ( Entry ) /*0x30397*/
{
if ( *Entry == 859982918 ) /*0x303a4*/
{
v5 = 0; /*0x303be*/
v6 = ((unsigned __int64)(unsigned int)Entry[1] - 139) / 0xC; /*0x303c1*/
if ( (_DWORD)v6 ) /*0x303c8*/
{
v7 = (_WORD *)((char *)Entry + 139); /*0x303ca*/
do /*0x303d6*/
{
v8 = v7[1]; /*0x303d6*/
if ( !v8 ) /*0x303de*/
break; /*0x303de*/
if ( v8 == a1[1] && (*v7 == 0x8086 || *v7 == 0xFFFF) ) /*0x303f4*/
{
v9 = v7[2]; /*0x303f6*/
if ( v9 == a1[2] || v9 == -1 ) /*0x30404*/
{
v10 = v7[3]; /*0x30406*/
if ( v10 == a1[3] || v10 == -1 ) /*0x30414*/
{
result = n0xFFFF == 0xFFFF /*0x30451*/
|| (n0xFFFF_1 = *(_WORD *)((char *)&Entry[3 * v5 + 36] + 3), n0xFFFF_1 == -1)
|| n0xFFFF_1 == (__int16)n0xFFFF;
return result; /*0x3044f*/
}
}
}
++v5; /*0x30416*/
v7 += 6; /*0x30419*/
}
while ( v5 < (unsigned int)v6 ); /*0x303d6*/
}
}
}
}
return 0; /*0x3042e*/
}
// Function: SpiReadStatus @ 0x30458 (0x74 bytes)
char __fastcall SpiReadStatus(__int64 a1, unsigned int a2, int *a3)
{
unsigned __int16 v6; // bx
if ( !a1 ) /*0x3047f*/
return 0; /*0x3047f*/
v6 = 0; /*0x30481*/
if ( !a2 ) /*0x30488*/
return 0; /*0x304ab*/
while ( !EepromProtoArraysMatch((int *)(a1 + 68LL * v6), a3) ) /*0x3049f*/
{
if ( ++v6 >= a2 ) /*0x304a9*/
return 0; /*0x304a9*/
}
return 1; /*0x304c1*/
}
// Function: SpiEraseSector @ 0x304cc (0x6a bytes)
char __fastcall SpiEraseSector(__int64 a1, unsigned int *a2, int *a3, __int64 a4, unsigned int *a5)
{
char result; // al
if ( !a4 || (result = SpiReadStatus(a4, *a5, a3)) == 0 ) /*0x304fa*/
{
result = SpiReadStatus(a1, *a2, a3); /*0x30504*/
if ( !result ) /*0x3050b*/
{
result = (unsigned __int8)UtlMemCpy((_BYTE *)(a1 + 68LL * *a2), a3, 68); /*0x3051f*/
++*a2; /*0x30524*/
}
}
return result; /*0x30530*/
}
// Function: SpiWaitReady @ 0x30538 (0x47 bytes)
__int64 __fastcall SpiWaitReady(__int64 a1)
{
int v2; // eax
v2 = UtlRegisterWrite((__int64 *)(a1 + 96), 0x1Cu); /*0x3054e*/
UtlRegisterAccess((__int64 *)(a1 + 96), 0x1Cu, v2 | 1); /*0x30562*/
return UtlRegisterRead(a1 + 88, 1); /*0x30575*/
}
// Function: SpiWriteEnable @ 0x30580 (0x47 bytes)
__int64 __fastcall SpiWriteEnable(__int64 a1)
{
int v2; // eax
v2 = UtlRegisterWrite((__int64 *)(a1 + 96), 0x1Cu); /*0x30596*/
UtlRegisterAccess((__int64 *)(a1 + 96), 0x1Cu, v2 & 0xFFFFFFFE); /*0x305aa*/
return UtlRegisterRead(a1 + 88, 1); /*0x305bd*/
}
// Function: RegRegister_56 @ 0x305c8 (0x2f bytes)
bool __fastcall RegRegister_56(__int64 a1)
{
SpiWaitReady(a1); /*0x305d1*/
SpiWriteEnable(a1); /*0x305d9*/
return (UtlRegisterWrite((__int64 *)(a1 + 96), 0x1Cu) & 8) != 0; /*0x305f1*/
}
// Function: SpiSendByte @ 0x305f8 (0x54 bytes)
__int64 __fastcall SpiSendByte(__int64 a1, unsigned __int8 a2)
{
int n7; // ebx
int v4; // esi
__int64 result; // rax
n7 = 7; /*0x3060a*/
v4 = a2; /*0x3060f*/
do /*0x3063a*/
{
SpiSendAddr(a1, (v4 & (1 << n7)) >> n7); /*0x30622*/
SpiWaitReady(a1); /*0x3062a*/
result = SpiWriteEnable(a1); /*0x30632*/
--n7; /*0x30637*/
}
while ( n7 >= 0 ); /*0x3063a*/
return result; /*0x30646*/
}
// Function: SpiChipSelect @ 0x3064c (0x61 bytes)
__int64 __fastcall SpiChipSelect(__int64 a1, int a2)
{
int v4; // eax
v4 = UtlRegisterWrite((__int64 *)(a1 + 96), 0x1Cu); /*0x30669*/
if ( a2 == 1 ) /*0x30671*/
{
v4 |= 2u; /*0x30673*/
}
else if ( !a2 ) /*0x3067a*/
{
v4 &= ~2u; /*0x3067c*/
}
UtlRegisterAccess((__int64 *)(a1 + 96), 0x1Cu, v4); /*0x3068b*/
return UtlRegisterRead(a1 + 88, 1); /*0x306a3*/
}
// Function: SpiSendAddr @ 0x306b0 (0x61 bytes)
__int64 __fastcall SpiSendAddr(__int64 a1, char a2)
{
int v4; // eax
v4 = UtlRegisterWrite((__int64 *)(a1 + 96), 0x1Cu); /*0x306cd*/
if ( a2 == 1 ) /*0x306d5*/
{
v4 |= 4u; /*0x306d7*/
}
else if ( !a2 ) /*0x306de*/
{
v4 &= ~4u; /*0x306e0*/
}
UtlRegisterAccess((__int64 *)(a1 + 96), 0x1Cu, v4); /*0x306ef*/
return UtlRegisterRead(a1 + 88, 1); /*0x30707*/
}
// Function: SpiSendCmd @ 0x30714 (0xc4 bytes)
__int64 __fastcall SpiSendCmd(__int64 a1)
{
int n10000; // edi
int v3; // eax
char v4; // bl
int v5; // eax
n10000 = 10000; /*0x3073c*/
v3 = UtlRegisterWrite((__int64 *)(a1 + 96), 0x1Cu); /*0x30741*/
UtlRegisterAccess((__int64 *)(a1 + 96), 0x1Cu, v3 | 0x10); /*0x30753*/
do /*0x3077d*/
{
v4 = UtlRegisterWrite((__int64 *)(a1 + 96), 0x1Cu); /*0x3076d*/
UtlRegisterRead(a1 + 88, 100); /*0x3076f*/
if ( (v4 & 0x20) != 0 ) /*0x30777*/
break; /*0x30777*/
--n10000; /*0x30779*/
}
while ( n10000 > 0 ); /*0x3077d*/
SpiChipSelect(a1, 1); /*0x30787*/
v5 = UtlRegisterWrite((__int64 *)(a1 + 96), 0x1Cu); /*0x30793*/
UtlRegisterAccess((__int64 *)(a1 + 96), 0x1Cu, v5 & 0xFFFFFFFB); /*0x307a5*/
UtlRegisterRead(a1 + 88, 1); /*0x307b3*/
return SpiWriteEnable(a1); /*0x307ca*/
}
// Function: SpiFlashErase @ 0x309a8 (0x21d bytes)
// write access to const memory has been detected, the output may be wrong!
unsigned __int64 __fastcall SpiFlashErase(__int64 a1, unsigned int n49038)
{
__int64 v2; // r8
char n82; // cl
__int64 *n0x8000; // rcx
v2 = 0; /*0x309aa*/
if ( n49038 >> 8 != 31 ) /*0x309b3*/
{
if ( n49038 >> 8 != 32 ) /*0x309bc*/
{
switch ( n49038 >> 8 ) /*0x309c5*/
{
case 0x9Du: /*0x309c5*/
n96 = -57; /*0x30a74*/
n2_0 = 2; /*0x30a7b*/
n82 = -40; /*0x30a82*/
n32 = -41; /*0x30a8d*/
n0x8000 = 0x8000; /*0x30a94*/
n3 = 3; /*0x30a9f*/
n6 = 6; /*0x30aa6*/
LABEL_28:
n4096 = 4096; /*0x30bb7*/
return v2; /*0x30bb7*/
case 0xBFu: /*0x309c5*/
case 0xC2u: /*0x309c5*/
n82 = 82; /*0x30a2a*/
if ( n49038 == 49038 ) /*0x30a35*/
n82 = -40; /*0x30a35*/
n96 = 96; /*0x30a3d*/
n6 = 20486; /*0x30a44*/
n2_0 = 2; /*0x30a50*/
n82 = n82; /*0x30a57*/
n3 = 3; /*0x30a5d*/
n0x8000 = 0x8000; /*0x30a64*/
break;
case 0xEFu: /*0x309c5*/
n96 = -57; /*0x309f3*/
n82 = -40; /*0x309fa*/
n2_0 = 2; /*0x30a05*/
n3 = 3; /*0x30a0c*/
n0x8000 = (unsigned int)n0x8000_0; /*0x30a13*/
n6 = 6; /*0x30a19*/
break;
default:
return 0x8000000000000002uLL; /*0x309e4*/
}
LABEL_27:
n32 = 32; /*0x30bb0*/
goto LABEL_28; /*0x30bb0*/
}
n0x8000 = n0x8000_0; /*0x30ab7*/
n6 = 6; /*0x30ac2*/
n96 = -57; /*0x30ace*/
n82 = -40; /*0x30ad5*/
n2_0 = 2; /*0x30ae0*/
if ( n49038 == 8208 ) /*0x30ae7*/
LODWORD(n0x8000) = 0x8000; /*0x30ae7*/
n3 = 3; /*0x30aea*/
n4096 = 256; /*0x30af1*/
n0x8000 = (int)n0x8000; /*0x30afb*/
n32 = -37; /*0x30b01*/
return v2; /*0x30b08*/
}
if ( n49038 == 8032 ) /*0x30b13*/
{
n0x8000 = 0x8000; /*0x30b1a*/
}
else
{
n0x8000 = (unsigned int)n0x8000_0; /*0x30b27*/
if ( n49038 == 8038 || n49038 == 8003 || n49038 == 8005 || n49038 == 8006 ) /*0x30b4b*/
{
n96 = -57; /*0x30b56*/
goto LABEL_24; /*0x30b56*/
}
}
n96 = 98; /*0x30b4d*/
LABEL_24:
n2_0 = 2; /*0x30b5d*/
n32 = 0; /*0x30b69*/
n3 = 3; /*0x30b73*/
n4096 = 0; /*0x30b7a*/
n82 = 82; /*0x30b81*/
n6 = 6; /*0x30b87*/
if ( n49038 == 8005 || n49038 == 8006 ) /*0x30b9c*/
{
n3 = 11; /*0x30ba3*/
n82 = -40; /*0x30baa*/
goto LABEL_27; /*0x30baa*/
}
return v2; /*0x30bc4*/
}
// Function: SpiFlashWriteBlock @ 0x30bc8 (0x1bb bytes)
void __fastcall SpiFlashWriteBlock(__int64 a1, int i, __int64 a3, _WORD *p_n49038)
{
unsigned __int8 v4; // r14
unsigned __int8 v8; // r15
unsigned int n16; // ebp
unsigned __int8 v10; // dl
unsigned __int8 n21; // dl
int n6; // esi
unsigned __int8 v13; // di
int n7; // r12d
int j; // esi
__int16 n8003; // r14
int v17; // eax
__int64 *v18; // [rsp+60h] [rbp+8h]
unsigned __int8 v19; // [rsp+68h] [rbp+10h]
v4 = 0; /*0x30be6*/
v8 = 0; /*0x30bf1*/
n16 = 16; /*0x30bf4*/
SpiSendCmd(a1); /*0x30bfb*/
SpiChipSelect(a1, 0); /*0x30c05*/
if ( i == 1 ) /*0x30c0d*/
{
n21 = 21; /*0x30c57*/
goto LABEL_11; /*0x30c57*/
}
if ( i == 2 ) /*0x30c12*/
{
SpiSendByte(a1, 0x9Fu); /*0x30c4b*/
n16 = 24; /*0x30c50*/
}
else if ( i > 2 ) /*0x30c14*/
{
if ( i <= 4 ) /*0x30c19*/
{
v10 = -85; /*0x30c42*/
goto LABEL_7; /*0x30c44*/
}
if ( i == 5 ) /*0x30c1e*/
{
v10 = -112; /*0x30c20*/
LABEL_7:
SpiSendByte(a1, v10); /*0x30c22*/
SpiSendByte(a1, 0); /*0x30c2f*/
SpiSendByte(a1, 0); /*0x30c39*/
n21 = 0; /*0x30c3e*/
LABEL_11:
SpiSendByte(a1, n21); /*0x30c59*/
}
}
v18 = (__int64 *)(a1 + 96); /*0x30c61*/
n6 = 6; /*0x30c77*/
v13 = (unsigned __int8)((unsigned int)UtlRegisterWrite((__int64 *)(a1 + 96), 0x1Cu) >> 3) << 7; /*0x30c81*/
do /*0x30c97*/
v13 |= RegRegister_56(a1) << n6--; /*0x30c91*/
while ( n6 >= 0 ); /*0x30c97*/
n7 = 7; /*0x30c99*/
for ( j = 7; j >= 0; --j ) /*0x30ca4*/
v4 |= RegRegister_56(a1) << j; /*0x30cb3*/
v19 = v4; /*0x30cbb*/
n8003 = v4 | (v13 << 8); /*0x30cd2*/
if ( n8003 == 8003 ) /*0x30ce4*/
n16 = 16; /*0x30ce4*/
if ( n16 > 0x10 ) /*0x30ce9*/
{
do /*0x30cff*/
v8 |= RegRegister_56(a1) << n7--; /*0x30cf8*/
while ( n7 >= 0 ); /*0x30cff*/
}
SpiChipSelect(a1, 1); /*0x30d09*/
v17 = UtlRegisterWrite(v18, 0x1Cu); /*0x30d1d*/
UtlRegisterAccess(v18, 0x1Cu, v17 & 0xFFFFFFEF); /*0x30d2d*/
if ( v13 == v19 && v13 && v13 != 0xFF ) /*0x30d42*/
*p_n49038 = v13 | 0x2000; /*0x30d4c*/
else
*p_n49038 = n8003 + v8; /*0x30d5b*/
JUMPOUT(0x307D8); /*0x307d8*/
}
// Function: UndiProtoIdentify @ 0x30d84 (0x9d bytes)
unsigned __int64 __fastcall UndiProtoIdentify(__int64 a1, _DWORD *a2, _WORD *p_n49038)
{
unsigned int i; // ebx
if ( !p_n49038 ) /*0x30dac*/
return 0x8000000000000002uLL; /*0x30dae*/
for ( i = 1; i < 6; ++i ) /*0x30dba*/
{
if ( i != 4 ) /*0x30dc2*/
{
SpiFlashWriteBlock(a1, i, (__int64)a2, p_n49038); /*0x30dcf*/
if ( *a2 ) /*0x30dd4*/
{
if ( *p_n49038 != 0xFFFF && *p_n49038 && *p_n49038 != 254 ) /*0x30df2*/
break; /*0x30df2*/
}
}
}
return SpiFlashErase(a1, (unsigned __int16)*p_n49038); /*0x30e1a*/
}
// Function: SpiReadResponse @ 0x30e24 (0x70 bytes)
char __fastcall SpiReadResponse(__int64 a1)
{
int n6; // edi
char v3; // bl
SpiChipSelect(a1, 0); /*0x30e38*/
SpiSendByte(a1, 5u); /*0x30e42*/
n6 = 6; /*0x30e55*/
v3 = (unsigned __int8)((unsigned int)UtlRegisterWrite((__int64 *)(a1 + 96), 0x1Cu) >> 3) << 7; /*0x30e5f*/
do /*0x30e73*/
v3 |= RegRegister_56(a1) << n6--; /*0x30e6e*/
while ( n6 >= 0 ); /*0x30e73*/
SpiChipSelect(a1, 1); /*0x30e7d*/
return v3; /*0x30e8e*/
}
// Function: SpiFlashRead @ 0x30e94 (0x6b bytes)
__int64 __fastcall SpiFlashRead(__int64 a1, int a2, _BYTE *p_n49038)
{
int n16; // eax
void *v4; // r9
__int64 v6; // r8
__int64 result; // rax
char v8; // [rsp+48h] [rbp+10h] BYREF
n16 = *(_DWORD *)(a1 + 364); /*0x30e9a*/
LODWORD(v4) = 0; /*0x30ea6*/
v6 = 1; /*0x30eac*/
if ( n16 == 16 || n16 == 17 || n16 == 18 || n16 == 19 || n16 == 20 ) /*0x30ec6*/
{
v6 = 0; /*0x30ec8*/
v4 = &loc_20000; /*0x30ecb*/
}
result = (*(__int64 (__fastcall **)(_QWORD, _QWORD, __int64, _QWORD, __int64, char *))(*(_QWORD *)(a1 + 11184) + 16LL))( /*0x30eef*/
*(_QWORD *)(a1 + 11184),
0,
v6,
(unsigned int)(a2 + (_DWORD)v4),
1,
&v8);
*p_n49038 = v8; /*0x30ef7*/
return result; /*0x30ef9*/
}
// Function: UndiFwLoad @ 0x3110c (0x2a0 bytes)
__int64 __fastcall UndiFwLoad(__int64 a1, __int64 a2, unsigned int a3)
{
__int64 v3; // rdi
int n0x2000; // ebx
__int64 v8; // rsi
__int64 v9; // rbx
char Response; // bl
int v11; // eax
int v12; // ebx
int v13; // eax
int v14; // eax
int v15; // ebp
__int16 p_n49038; // [rsp+50h] [rbp+8h] BYREF
int v17; // [rsp+68h] [rbp+20h] BYREF
v3 = a1 + 96; /*0x3111c*/
if ( (*(unsigned int (__fastcall **)(__int64))(a1 + 1248))(a1 + 96) ) /*0x31129*/
return 0x8000000000000007uLL; /*0x3113d*/
if ( *(_DWORD *)(v3 + 268) == 19 ) /*0x31149*/
{
n0x2000 = 0x2000; /*0x3114b*/
if ( a3 ) /*0x31153*/
{
v8 = ((a3 - 1) >> 12) + 1; /*0x31162*/
do /*0x311a0*/
{
while ( (UtlRegisterWrite((__int64 *)v3, (unsigned int)qword_12048) & 0x40000000) == 0 ) /*0x31172*/
; /*0x31164*/
UtlRegisterAccess((__int64 *)v3, (unsigned int)qword_12048, n0x2000 | 0x2000000); /*0x31181*/
while ( (UtlRegisterWrite((__int64 *)v3, (unsigned int)qword_12048) & 0x40000000) == 0 ) /*0x31194*/
; /*0x31186*/
n0x2000 += 4096; /*0x31196*/
--v8; /*0x3119c*/
}
while ( v8 ); /*0x311a0*/
}
v9 = 0; /*0x311a2*/
}
else
{
v9 = UndiProtoIdentify(a1, &v17, &p_n49038); /*0x311bb*/
if ( !v9 ) /*0x311c1*/
{
SpiSendCmd(a1); /*0x311ca*/
SpiChipSelect(a1, 0); /*0x311d4*/
SpiSendByte(a1, 6u); /*0x311de*/
SpiChipSelect(a1, 1); /*0x311e9*/
Response = SpiReadResponse(a1); /*0x311f6*/
if ( (Response & 0x3C) != 0 ) /*0x311fa*/
{
SpiChipSelect(a1, 0); /*0x31201*/
SpiSendByte(a1, 1u); /*0x3120b*/
SpiSendByte(a1, Response & 0xC3); /*0x31218*/
SpiChipSelect(a1, 1); /*0x31225*/
SpiReadResponse(a1); /*0x3122d*/
}
SpiChipSelect(a1, 0); /*0x31237*/
SpiSendByte(a1, 4u); /*0x31241*/
SpiChipSelect(a1, 1); /*0x3124e*/
v11 = UtlRegisterWrite((__int64 *)v3, 0x1Cu); /*0x3125f*/
UtlRegisterAccess((__int64 *)v3, 0x1Cu, v11 & 0xFFFFFFEF); /*0x31270*/
UtlRegisterAccess((__int64 *)v3, 0x103Cu, (unsigned __int8)n96); /*0x31287*/
UtlRegisterWrite((__int64 *)v3, 0x103Cu); /*0x31291*/
UtlRegisterWrite((__int64 *)v3, 0x1Cu); /*0x3129c*/
UtlRegisterWrite((__int64 *)v3, 0x10u); /*0x312a8*/
NvmReadShadow((struct NIC_CONTEXT *)(a1 + 88), 0x1Cu, 0x80000000); /*0x312ba*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(300); /*0x312ce*/
NvmWriteShadow((struct NIC_CONTEXT *)(a1 + 88), 0x10u, 0x30u); /*0x312e0*/
(*(void (__fastcall **)(__int64))(BootServices + 248))(300); /*0x312ef*/
v12 = 0; /*0x312f5*/
while ( 1 ) /*0x31300*/
{
UtlRegisterRead(a1 + 88, (__int64)L"tion I218-V"); /*0x31300*/
v13 = UtlRegisterWrite((__int64 *)v3, 0x1Cu); /*0x3130b*/
if ( (unsigned int)++v12 > 0x64 ) /*0x31315*/
return 0x8000000000000007uLL; /*0x31315*/
if ( (v13 & 0x40000000) == 0 ) /*0x3131f*/
{
v14 = UtlRegisterWrite((__int64 *)v3, 0x10u); /*0x31329*/
UtlRegisterAccess((__int64 *)v3, 0x10u, v14 & 0xFFFFFFCF | 0x20); /*0x3133f*/
while ( (UtlRegisterWrite((__int64 *)v3, 0x1Cu) & 0x40000000) != 0 ) /*0x31353*/
; /*0x31344*/
v9 = 0; /*0x31355*/
v15 = 0; /*0x31357*/
if ( a3 ) /*0x3135c*/
{
while ( 1 ) /*0x3136d*/
{
v9 = SpiFlashRead(a1, v15, &p_n49038); /*0x3136d*/
if ( v9 ) /*0x31373*/
break; /*0x31373*/
if ( (_BYTE)p_n49038 != 0xFF ) /*0x3137a*/
{
v9 = 0x8000000000000007uLL; /*0x31385*/
goto LABEL_25; /*0x31385*/
}
if ( ++v15 >= a3 ) /*0x31381*/
goto LABEL_25; /*0x31381*/
}
}
break; /*0x31373*/
}
}
}
}
LABEL_25:
(*(void (__fastcall **)(__int64))(v3 + 1168))(v3); /*0x3138f*/
return v9; /*0x313a0*/
}
// Function: PxeRomGetImageSize @ 0x313ac (0x45 bytes)
__int64 __fastcall PxeRomGetImageSize(_WORD *a1)
{
char *Pcir; // rcx
if ( a1 && *a1 == 0xAA55 && (Pcir = PxeRomFindPcir(a1)) != 0 && (Pcir == "PCIR" || *Pcir == 80) ) /*0x313df*/
return *((unsigned __int16 *)Pcir + 8) << 9; /*0x313e5*/
else
return 0; /*0x313ea*/
}
// Function: PxeRomUpdateChecksum @ 0x313f4 (0x90 bytes)
void __fastcall PxeRomUpdateChecksum(_WORD *a1)
{
char *Pcir; // rax
char Pcir_2; // r8
char *Pcir_1; // r10
__int64 v4; // r11
unsigned int v5; // r10d
char *v6; // r11
_BYTE *v7; // rdx
unsigned int v8; // r9d
__int64 v9; // rcx
char v10; // al
if ( a1 )
{
if ( *a1 == 0xAA55 )
{
Pcir = PxeRomFindPcir(a1); /*0x31410*/
if ( Pcir != Pcir_1 && (Pcir == "PCIR" || *Pcir == 80) )
{
Pcir[21] = Pcir_2 == (_BYTE)Pcir_1 ? Pcir[21] & 0x7F : Pcir[21] | 0x80;
if ( *(_DWORD *)(v4 + 4) != 3825 ) /*0x31446*/
{
PxeRomChecksum(v4); /*0x3144b*/
v7 = v6 + 7; /*0x31455*/
v8 = (unsigned __int8)v6[2] << 9; /*0x31459*/
v6[7] = v5; /*0x3145d*/
if ( v8 > v5 ) /*0x31463*/
{
v9 = v8; /*0x31465*/
do /*0x31477*/
{
v10 = *v6++; /*0x31468*/
LOBYTE(v5) = v10 + v5; /*0x3146f*/
--v9; /*0x31473*/
}
while ( v9 ); /*0x31477*/
}
*v7 = -(char)v5; /*0x3147c*/
}
}
}
}
}
// Function: PxeRomWriteDevId @ 0x31484 (0xe2 bytes)
void __fastcall PxeRomWriteDevId(__int64 a1, _WORD *i, _BYTE *a3)
{
_WORD *j; // r10
__int64 v6; // r10
char *Pcir; // r11
char *v8; // r10
_BYTE *v9; // r8
unsigned int v10; // r9d
char v11; // cl
__int64 v12; // rdx
char v13; // al
if ( a1 && i ) /*0x314a7*/
{
for ( j = i; j; j = &i[256 * *((unsigned __int16 *)Pcir + 8)] ) /*0x314ad*/
{
if ( *j != 0xAA55 ) /*0x314c2*/
break; /*0x314c2*/
Pcir = PxeRomFindPcir(j); /*0x314d0*/
if ( !Pcir || Pcir != "PCIR" && *Pcir != 80 ) /*0x314ec*/
break; /*0x314ec*/
*((_WORD *)Pcir + 3) = *(_WORD *)(a1 + 2); /*0x314f7*/
*((_WORD *)Pcir + 2) = -32634; /*0x314fc*/
if ( *(_DWORD *)(v6 + 4) != 3825 ) /*0x31509*/
{
PxeRomChecksum(v6); /*0x3150e*/
v9 = v8 + 7; /*0x31518*/
v10 = (unsigned __int8)v8[2] << 9; /*0x3151c*/
v11 = 0; /*0x31520*/
v8[7] = 0; /*0x31523*/
if ( v10 ) /*0x31529*/
{
v12 = v10; /*0x3152b*/
do /*0x3153c*/
{
v13 = *v8++; /*0x3152e*/
v11 += v13; /*0x31535*/
--v12; /*0x31538*/
}
while ( v12 ); /*0x3153c*/
}
*v9 = -v11; /*0x31540*/
}
}
}
}
// Function: PxeRomParseVersion @ 0x31568 (0x11a bytes)
__int64 __fastcall PxeRomParseVersion(__int64 a1, int a2, const char *$CLP)
{
_WORD *v4; // r9
_WORD *v5; // r8
char *Pcir; // rax
__int64 v7; // r8
_WORD *v8; // r9
int v9; // r10d
unsigned int v10; // r11d
int n8; // ecx
__int16 v12; // ax
__int16 v13; // dx
if ( !a1 ) /*0x31578*/
return 3362652165LL; /*0x3157f*/
if ( a2 ) /*0x31589*/
{
v4 = (_WORD *)(a1 + 24); /*0x3158f*/
while ( 1 ) /*0x31597*/
{
v5 = (_WORD *)*((_QWORD *)v4 - 2); /*0x31597*/
if ( !v5 || *v5 != 0xAA55 ) /*0x315ad*/
return 0; /*0x315ad*/
Pcir = PxeRomFindPcir(*((_WORD **)v4 - 2)); /*0x315b6*/
n8 = *((_DWORD *)v8 - 6); /*0x315bb*/
if ( n8 == 1 ) /*0x315c5*/
{
*v8 = *(unsigned __int8 *)(*(unsigned __int16 *)(v7 + 30) + v7 + 2) /*0x31661*/
+ ((*(unsigned __int8 *)(*(unsigned __int16 *)(v7 + 30) + v7 + 1)
+ 16 * *(unsigned __int8 *)(*(unsigned __int16 *)(v7 + 30) + v7)) << 8);
goto LABEL_18; /*0x31661*/
}
if ( n8 > 1 ) /*0x315c7*/
break; /*0x315c7*/
LABEL_18:
v4 = v8 + 16; /*0x31665*/
if ( v9 + 1 >= v10 ) /*0x3166f*/
return 0; /*0x3166f*/
}
if ( n8 > 5 ) /*0x315d0*/
{
if ( n8 <= 8 ) /*0x315d5*/
{
v13 = 10 * ((*((_WORD *)Pcir + 9) >> 4) & 0xF) + (*((_WORD *)Pcir + 9) & 0xF); /*0x31624*/
*v8 = v13; /*0x31628*/
v12 = v13 + (*((_WORD *)Pcir + 9) & 0xFF00); /*0x31633*/
goto LABEL_15; /*0x31636*/
}
if ( n8 != 11 && (n8 <= 12 || n8 > 16) ) /*0x315e8*/
goto LABEL_18; /*0x315e8*/
}
v12 = *((_WORD *)Pcir + 9); /*0x315ea*/
LABEL_15:
*v8 = v12; /*0x315ee*/
goto LABEL_18; /*0x315f2*/
}
return 0; /*0x3167c*/
}
// Function: PxeRomParseStrings @ 0x31684 (0x651 bytes)
__int64 __fastcall PxeRomParseStrings(_WORD *a1, char *$LDR, __int64 a3, unsigned int *a4)
{
__int64 v5; // r11
unsigned int $LDR_1; // r13d
unsigned int $LDR_3; // r14d
unsigned int v9; // ebx
const char *$CLP; // r8
unsigned int ImageSize; // eax
__int64 v13; // r10
__int64 ImageSize_1; // rbp
char *$LDR_2; // rdx
_BYTE *v16; // rcx
__int64 n3; // r9
_BYTE *v18; // rcx
__int64 n3_1; // r9
int v20; // eax
int n6; // eax
_BYTE *v22; // rcx
__int64 n5; // r9
const char *$ISE; // rcx
__int64 n4; // r9
__int64 n5_1; // rcx
char *UNDI_1; // rcx
const char *UNDI; // rdx
__int64 v29; // rax
__int64 v30; // rdi
int ImageSize_3; // r9d
__int64 v32; // r8
_WORD *v33; // rcx
int v34; // eax
int v35; // r9d
__int64 v36; // r8
_WORD *v37; // rcx
int v38; // eax
int v39; // r9d
__int64 v40; // r8
_WORD *v41; // rcx
int v42; // eax
int v43; // r9d
__int64 v44; // r8
__int64 v45; // rcx
unsigned int ImageSize_2; // r9d
... [15656 chars total]
// Function: PxeRomChecksum @ 0x31ec4 (0x40 bytes)
void __fastcall PxeRomChecksum(__int64 a1)
{
char v1; // dl
char *v2; // r8
_BYTE *v3; // r9
unsigned int v4; // eax
__int64 v5; // rcx
char v6; // al
v1 = 0; /*0x31ec4*/
if ( a1 && *(_WORD *)(a1 + 26) ) /*0x31ecb*/
{
v2 = (char *)(a1 + *(unsigned __int16 *)(a1 + 26)); /*0x31ed6*/
v3 = v2 + 9; /*0x31ede*/
v4 = 16 * (unsigned __int8)v2[5]; /*0x31ee2*/
v2[9] = 0; /*0x31ee5*/
if ( v4 ) /*0x31eea*/
{
v5 = v4; /*0x31eec*/
do /*0x31efc*/
{
v6 = *v2++; /*0x31eee*/
v1 += v6; /*0x31ef5*/
--v5; /*0x31ef8*/
}
while ( v5 ); /*0x31efc*/
}
*v3 = -v1; /*0x31f00*/
}
}
// Function: PxeRomFindPcir @ 0x31f04 (0x22 bytes)
char *__fastcall PxeRomFindPcir(_WORD *a1)
{
if ( a1 && *a1 == 0xAA55 && a1[12] ) /*0x31f15*/
return (char *)a1 + (unsigned __int16)a1[12]; /*0x31f1f*/
else
return 0; /*0x31f23*/
}
// Function: RegRegister_53 @ 0x31f28 (0x47 bytes)
bool __fastcall RegRegister_53(__int64 a1)
{
int n20; // eax
char v2; // dl
n20 = *(_DWORD *)(a1 + 268); /*0x31f2c*/
v2 = 0; /*0x31f32*/
if ( n20 >= 14 ) /*0x31f37*/
{
if ( n20 <= 15 ) /*0x31f3c*/
{
return (int)UtlRegisterWrite((__int64 *)a1, 0x20u) < 0; /*0x31f66*/
}
else if ( n20 <= 20 ) /*0x31f41*/
{
return (int)UtlRegisterWrite((__int64 *)a1, 0xE04u) < 0; /*0x31f52*/
}
}
return v2; /*0x31f6a*/
}
// Function: IscsiInit @ 0x31f70 (0x483 bytes)
__int64 __fastcall IscsiInit(__int64 a1)
{
unsigned int v1; // edi
int v3; // eax
__int64 (__fastcall *DxeRegister_59)(__int64); // rcx
int v5; // eax
__int64 (__fastcall *RegRegister_16)(__int64, unsigned int, unsigned __int16); // rax
int n18; // eax
unsigned int n22283168; // ecx
__int64 n21040624; // rdx
__int64 (__fastcall *RegRegister_58)(__int64, char); // rax
__int64 n21040272; // r8
__int64 (__fastcall *PhyCalcLinkSpeed_1)(__int64); // rax
__int16 n2; // ax
unsigned __int16 v15; // [rsp+30h] [rbp+8h] BYREF
v1 = 0; /*0x31f8c*/
*(_QWORD *)(a1 + 1056) = RegRegister_8; /*0x31f91*/
*(_QWORD *)(a1 + 1064) = DxeRegister_53; /*0x31f9f*/
if ( *(_DWORD *)(a1 + 1116) != 1 ) /*0x31fad*/
{
*(_DWORD *)(a1 + 1072) = 1; /*0x31faf*/
return v1; /*0x31fb9*/
}
*(_DWORD *)(a1 + 1108) = 100; /*0x31fca*/
*(_QWORD *)(a1 + 1040) = MngInitSession; /*0x31fd4*/
*(_QWORD *)(a1 + 1048) = MngCleanupCallback; /*0x31fe4*/
*(_WORD *)(a1 + 1122) = 47; /*0x31ff0*/
*(_QWORD *)(a1 + 880) = IscsiSessionGetBufSize; /*0x31ffe*/
*(_QWORD *)(a1 + 904) = CompNameGuidToString; /*0x3200c*/
*(_QWORD *)(a1 + 912) = MngConfigSet; /*0x3201a*/
*(_QWORD *)(a1 + 928) = RegRegister_31; /*0x32028*/
*(_QWORD *)(a1 + 984) = IscsiSessionSetBufSize; /*0x32036*/
v3 = UtlRegisterWrite((__int64 *)a1, 0x18u); /*0x3203d*/
if ( *(_BYTE *)(a1 + 1312) ) /*0x32042*/
{
DxeRegister_59 = DxeRegister_37; /*0x3204b*/
v5 = v3 | 0x2000000; /*0x32052*/
}
else
{
DxeRegister_59 = UtlParseKeyValue; /*0x32058*/
v5 = v3 & 0xFDFFFFFF; /*0x3205f*/
}
*(_QWORD *)(a1 + 992) = DxeRegister_59; /*0x32063*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v5); /*0x32072*/
RegRegister_34(a1); /*0x3207a*/
if ( *(_BYTE *)(a1 + 1312) && !RegRegister_53(a1) ) /*0x3208b*/
{
*(_QWORD *)(a1 + 960) = RegRegister_24; /*0x3209b*/
RegRegister_16 = (__int64 (__fastcall *)(__int64, unsigned int, unsigned __int16))RegRegister_25; /*0x320a2*/
goto LABEL_15; /*0x320a9*/
}
n18 = *(_DWORD *)(a1 + 268); /*0x320ab*/
if ( n18 >= 16 ) /*0x320b4*/
{
if ( n18 <= 18 ) /*0x320b9*/
{
*(_QWORD *)(a1 + 960) = IscsiStrToBin; /*0x320de*/
RegRegister_16 = IscsiTokenize; /*0x320e5*/
goto LABEL_15; /*0x320ec*/
}
if ( n18 <= 20 ) /*0x320be*/
{
*(_QWORD *)(a1 + 960) = MngProcessCommand; /*0x320c7*/
RegRegister_16 = (__int64 (__fastcall *)(__int64, unsigned int, unsigned __int16))IscsiTokenize2; /*0x320ce*/
goto LABEL_15; /*0x320d5*/
}
}
*(_QWORD *)(a1 + 960) = UtlStrToUpper; /*0x320f5*/
RegRegister_16 = UtlStrCaseCmp; /*0x320fc*/
LABEL_15:
*(_QWORD *)(a1 + 1016) = RegRegister_16; /*0x32103*/
if ( *(_BYTE *)(a1 + 846) ) /*0x3210d*/
{
*(_QWORD *)(a1 + 880) = CompNameNullThunk; /*0x3211d*/
*(_QWORD *)(a1 + 984) = UbaNoOp; /*0x3212b*/
MngReadResponse(a1); /*0x32132*/
}
else
{
v1 = RegRegister_17(a1); /*0x3213e*/
}
n22283168 = *(_DWORD *)(a1 + 1104); /*0x32140*/
n21040624 = 21040624; /*0x32146*/
if ( n22283168 > 0x1410DD0 ) /*0x32150*/
{
if ( n22283168 != 21040624 && n22283168 != 21040800 ) /*0x32208*/
{
if ( n22283168 == 22283168 || n22283168 == 22283184 ) /*0x3221c*/
{
*(_DWORD *)(a1 + 1072) = 13; /*0x32297*/
*(_QWORD *)(a1 + 896) = UtlTimerGetCurrent; /*0x322a1*/
*(_QWORD *)(a1 + 920) = UtlTimerSetEvent; /*0x322af*/
*(_QWORD *)(a1 + 936) = UtlTimerCancel; /*0x322bd*/
*(_QWORD *)(a1 + 944) = UtlTimerCheckExpire; /*0x322cb*/
*(_QWORD *)(a1 + 1000) = RegRegister_43; /*0x322d9*/
RegRegister_58 = RegRegister_39; /*0x322e0*/
}
else
{
if ( n22283168 - 44565392 > 1 ) /*0x32227*/
return (unsigned int)-2; /*0x32192*/
*(_DWORD *)(a1 + 1072) = 6; /*0x32234*/
*(_QWORD *)(a1 + 896) = UtlStrToInt; /*0x3223e*/
*(_QWORD *)(a1 + 944) = UtlGetNumericArg; /*0x3224c*/
*(_QWORD *)(a1 + 936) = UtlParseCmdLine; /*0x3225a*/
*(_QWORD *)(a1 + 920) = UtlGuidToString; /*0x32268*/
*(_QWORD *)(a1 + 1000) = MngSetVlanFilter; /*0x32276*/
RegRegister_58 = UtlHexToBin; /*0x3227d*/
}
*(_QWORD *)(a1 + 1008) = RegRegister_58; /*0x32284*/
return v1; /*0x3228b*/
}
}
else if ( n22283168 != 21040592 ) /*0x32156*/
{
if ( n22283168 == 21040128 ) /*0x32163*/
{
*(_DWORD *)(a1 + 1072) = 15; /*0x3219e*/
*(_QWORD *)(a1 + 896) = MngConfigGet; /*0x321a8*/
*(_QWORD *)(a1 + 944) = UtlGetCmdToken; /*0x321b6*/
*(_QWORD *)(a1 + 936) = PhyCalcLinkSpeed; /*0x321c4*/
*(_QWORD *)(a1 + 1000) = RegRegister_43; /*0x321d2*/
*(_QWORD *)(a1 + 1008) = RegRegister_39; /*0x321e0*/
*(_QWORD *)(a1 + 920) = UtlStringToGuid; /*0x321ee*/
return v1; /*0x321f5*/
}
if ( n22283168 != 21040272 && n22283168 != 21040320 && n22283168 != 21040336 && n22283168 != 21040576 ) /*0x32187*/
return (unsigned int)-2; /*0x32187*/
}
n21040272 = 21040272; /*0x322f6*/
*(_QWORD *)(a1 + 896) = MngConfigGet; /*0x322fc*/
*(_DWORD *)(a1 + 1072) = 2; /*0x3230a*/
*(_QWORD *)(a1 + 944) = UtlGetCmdToken; /*0x32311*/
if ( n22283168 == 21040576 /*0x3233a*/
|| n22283168 == 21040272
|| n22283168 == 21040624
|| n22283168 == 21040800
|| (PhyCalcLinkSpeed_1 = UtlHexStringToInt, n22283168 == 21040592) )
{
PhyCalcLinkSpeed_1 = PhyCalcLinkSpeed; /*0x3233c*/
}
*(_QWORD *)(a1 + 936) = PhyCalcLinkSpeed_1; /*0x32343*/
*(_QWORD *)(a1 + 920) = UtlStringToGuid; /*0x32351*/
if ( n22283168 == 21040272 ) /*0x3235b*/
{
v1 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 22, 2); /*0x3236e*/
if ( v1 ) /*0x32372*/
return v1; /*0x32372*/
v1 = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 16, &v15); /*0x32385*/
if ( v1 ) /*0x32389*/
return v1; /*0x32389*/
n2 = (v15 >> 7) & 7; /*0x32394*/
if ( n2 == 2 || n2 == 3 ) /*0x323a2*/
*(_QWORD *)(a1 + 64) = NvmReadRomEntry; /*0x323ab*/
}
if ( (*(_DWORD *)(a1 + 1104) != 21040592 || (v1 = RegRegister_7(a1, n21040624, n21040272)) == 0) /*0x323cf*/
&& *(_DWORD *)(a1 + 1104) == 21040800 )
{
return (unsigned int)RegRegister_4(a1, n21040624, n21040272); /*0x323d9*/
}
return v1; /*0x323ec*/
}
// Function: IscsiSetup @ 0x323f4 (0x1f7 bytes)
__int64 __fastcall IscsiSetup(__int64 a1)
{
unsigned int v2; // eax
unsigned __int16 n0xF; // cx
unsigned __int16 n0x8000; // dx
int v5; // ecx
int v6; // ecx
__int64 (__fastcall *DxeRegister_59)(__int64, unsigned __int16, unsigned __int16, _WORD *); // rax
int n15; // eax
__int64 (__fastcall *DhcpBuildOptions_1)(__int64, __int64, unsigned __int16 *, int, __int64, unsigned int); // rax
int n16; // eax
__int64 (__fastcall *IscsiSetConfigFlag_1)(__int64); // rax
v2 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x3240d*/
n0xF = ((v2 >> 11) & 0xF) + 6; /*0x32422*/
if ( n0xF > 0xFu ) /*0x3242a*/
LOBYTE(n0xF) = 15; /*0x3242c*/
n0x8000 = 1 << n0xF; /*0x3243e*/
*(_WORD *)(a1 + 1264) = 1 << n0xF; /*0x32441*/
if ( *(int *)(a1 + 268) >= 19 )
{
*(_DWORD *)(a1 + 1248) = 4; /*0x324f0*/
}
else
{
v5 = *(_DWORD *)(a1 + 1252); /*0x32455*/
*(_WORD *)(a1 + 1266) = 1; /*0x3245f*/
v6 = v5 - 1; /*0x32467*/
*(_WORD *)(a1 + 1270) = 8; /*0x3246a*/
if ( v6 )
{
if ( v6 == 1 )
{
*(_WORD *)(a1 + 1268) = 16; /*0x324b3*/
*(_WORD *)(a1 + 1272) = 32; /*0x324ba*/
}
else
{
*(_WORD *)(a1 + 1272) = (v2 & 0x400) != 0 ? 32 : 8;
*(_WORD *)(a1 + 1268) = (v2 & 0x400) != 0 ? 16 : 8;
}
}
else
{
*(_WORD *)(a1 + 1272) = 8; /*0x324c3*/
*(_WORD *)(a1 + 1268) = 8; /*0x324cb*/
}
if ( n0x8000 == 0x8000 ) /*0x324d6*/
*(_WORD *)(a1 + 1272) = 128; /*0x324dd*/
*(_DWORD *)(a1 + 1248) = 2; /*0x324e4*/
}
*(_QWORD *)(a1 + 1152) = RegRegister_35; /*0x3250b*/
*(_QWORD *)(a1 + 1168) = DxeRegister_47; /*0x32519*/
DxeRegister_59 = DxeRegister_50; /*0x32520*/
if ( n0x8000 < 0x8000u ) /*0x32527*/
DxeRegister_59 = NiiTransmit; /*0x32527*/
*(_QWORD *)(a1 + 1160) = DxeRegister_59; /*0x3252b*/
*(_QWORD *)(a1 + 1208) = RegRegister_10; /*0x32539*/
*(_QWORD *)(a1 + 1200) = NiiParseMacString; /*0x32547*/
*(_QWORD *)(a1 + 1184) = NvmCalcProtocolChecksum; /*0x32555*/
*(_QWORD *)(a1 + 1192) = IscsiGetProtocolValue; /*0x32563*/
n15 = *(_DWORD *)(a1 + 268); /*0x3256a*/
if ( n15 == 15 ) /*0x32573*/
{
DhcpBuildOptions_1 = DhcpBuildOptions; /*0x32586*/
}
else
{
if ( (unsigned int)(n15 - 16) > 2 ) /*0x3257b*/
goto LABEL_20; /*0x3257b*/
DhcpBuildOptions_1 = DhcpParseOptions; /*0x3257d*/
}
*(_QWORD *)(a1 + 1224) = DhcpBuildOptions_1; /*0x3258d*/
LABEL_20:
n16 = *(_DWORD *)(a1 + 268); /*0x32594*/
if ( n16 == 16 ) /*0x3259c*/
{
*(_QWORD *)(a1 + 1200) = IscsiReadConfigFlags; /*0x325c4*/
IscsiSetConfigFlag_1 = IscsiSetConfigFlag; /*0x325cb*/
goto LABEL_24; /*0x325cb*/
}
if ( (unsigned int)(n16 - 17) <= 1 ) /*0x325a4*/
{
*(_QWORD *)(a1 + 1200) = IscsiWriteAllFieldRanges; /*0x325ad*/
IscsiSetConfigFlag_1 = IscsiReadAllFieldRanges; /*0x325b4*/
LABEL_24:
*(_QWORD *)(a1 + 1184) = IscsiSetConfigFlag_1; /*0x325d2*/
}
return 0; /*0x325e5*/
}
// Function: IscsiCmdProcess @ 0x325ec (0x3c2 bytes)
__int64 __fastcall IscsiCmdProcess(__int64 a1)
{
int v2; // eax
__int64 n32; // rdx
int v4; // edi
int n12582912; // esi
int v6; // eax
unsigned int v7; // edi
int v8; // edi
bool v9; // cf
int n15; // eax
char v11; // al
int n16; // ecx
void *RegDriverEntry_1; // rax
__int64 (__fastcall *RegRegister_16)(__int64); // rax
__int64 (__fastcall *RegRegister_58)(__int64); // rax
char (__fastcall *RegRegister_59)(__int64 *); // rax
unsigned int n0xF0E0; // eax
*(_BYTE *)(a1 + 1312) = 0; /*0x3260a*/
*(_BYTE *)(a1 + 1315) = 0; /*0x32614*/
v2 = UtlRegisterWrite((__int64 *)a1, 0x18u); /*0x3261b*/
n32 = 32; /*0x32620*/
v4 = v2; /*0x32626*/
n12582912 = v2 & 0xC00000; /*0x32628*/
if ( (v2 & 0xC00000) != 0 ) /*0x3262e*/
{
if ( n12582912 != 0x400000 ) /*0x3263a*/
{
if ( n12582912 == 0x800000 ) /*0x32646*/
{
if ( RegRegister_53(a1) ) /*0x32696*/
goto LABEL_11; /*0x3269d*/
}
else if ( n12582912 != 12582912 ) /*0x3264e*/
{
goto LABEL_13; /*0x3264e*/
}
if ( !(unsigned int)RegRegister_22(a1, n32) ) /*0x32653*/
{
v6 = *(_DWORD *)(a1 + 1116); /*0x32660*/
if ( v6 ) /*0x32668*/
{
LOWORD(n32) = 32; /*0x3266e*/
if ( (*(_BYTE *)(a1 + 1324) & 0x20) != 0 ) /*0x32679*/
goto LABEL_13; /*0x32679*/
v7 = v4 & 0xFF3FFFFF; /*0x3267b*/
if ( v6 == 1 ) /*0x32684*/
v8 = v7 | 0x800000; /*0x3268a*/
else
v8 = v7 | 0xC00000; /*0x32844*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v8); /*0x32853*/
goto LABEL_12; /*0x32858*/
}
}
*(_DWORD *)(a1 + 1116) = 3; /*0x3285d*/
if ( n12582912 != 0x800000 ) /*0x3286d*/
{
LABEL_12:
LOWORD(n32) = 32; /*0x326b0*/
goto LABEL_13; /*0x326b0*/
}
LABEL_11:
*(_DWORD *)(a1 + 1116) = 1; /*0x3269f*/
*(_BYTE *)(a1 + 1312) = 1; /*0x326a9*/
goto LABEL_12; /*0x326a9*/
}
*(_DWORD *)(a1 + 1116) = 3; /*0x32878*/
}
else
{
*(_DWORD *)(a1 + 1116) = 1; /*0x32887*/
}
LABEL_13:
*(_WORD *)(a1 + 310) = 128; /*0x326b5*/
v9 = *(_DWORD *)(a1 + 268) != 14; /*0x326cd*/
*(_WORD *)(a1 + 828) = 16; /*0x326cf*/
*(_WORD *)(a1 + 312) = v9 ? 0x80 : 0;
n15 = *(_DWORD *)(a1 + 268); /*0x326e3*/
if ( n15 == 15 ) /*0x326ec*/
*(_WORD *)(a1 + 828) = 24; /*0x326ee*/
if ( n15 == 16 ) /*0x326f8*/
*(_WORD *)(a1 + 828) = 24; /*0x326fa*/
if ( n15 == 17 || n15 == 18 ) /*0x3270a*/
*(_WORD *)(a1 + 828) = n32; /*0x3270c*/
if ( n15 >= 17 ) /*0x32716*/
*(_BYTE *)(a1 + 1314) = 0; /*0x32718*/
if ( *(int *)(a1 + 268) >= 19 ) /*0x32726*/
*(_BYTE *)(a1 + 1316) = 1; /*0x32728*/
*(_BYTE *)(a1 + 834) = 1; /*0x32737*/
*(_BYTE *)(a1 + 832) = 1; /*0x3273e*/
v11 = UtlRegisterWrite((__int64 *)a1, 0x5B54u); /*0x32745*/
n16 = *(_DWORD *)(a1 + 268); /*0x3274a*/
*(_BYTE *)(a1 + 833) = (v11 & 0xE) != 0; /*0x3275e*/
*(_QWORD *)(a1 + 96) = NiiStationAddrSet; /*0x3276b*/
RegDriverEntry_1 = RegDriverEntry; /*0x3276f*/
if ( n16 >= 16 ) /*0x32776*/
RegDriverEntry_1 = RegRegister_11; /*0x32776*/
*(_QWORD *)(a1 + 144) = RegDriverEntry_1; /*0x3277a*/
if ( n16 == 19 || (RegRegister_16 = RegRegister_32, n16 == 20) ) /*0x32790*/
RegRegister_16 = RegRegister_51; /*0x32792*/
*(_QWORD *)(a1 + 152) = RegRegister_16; /*0x32799*/
*(_QWORD *)(a1 + 176) = Nii_3b234; /*0x327ae*/
RegRegister_58 = RegRegister_6; /*0x327bc*/
if ( *(_DWORD *)(a1 + 1116) == 1 ) /*0x327c3*/
RegRegister_58 = RegRegister_21; /*0x327c3*/
*(_QWORD *)(a1 + 184) = RegRegister_58; /*0x327c7*/
*(_QWORD *)(a1 + 160) = RegRegister_38; /*0x327d5*/
*(_QWORD *)(a1 + 168) = RegRegister_40; /*0x327e3*/
*(_QWORD *)(a1 + 64) = DxeRegister_57; /*0x327f1*/
*(_QWORD *)(a1 + 224) = DxeInit_0; /*0x327fc*/
*(_QWORD *)(a1 + 208) = RegRegister_55; /*0x3280a*/
*(_QWORD *)(a1 + 136) = NiiStnAddrGet; /*0x32818*/
if ( *(_DWORD *)(a1 + 268) == 17 || n16 == 18 ) /*0x3282b*/
{
*(_QWORD *)(a1 + 200) = RegRegister_45; /*0x3289d*/
RegRegister_59 = RegRegister_48; /*0x328a4*/
}
else
{
*(_QWORD *)(a1 + 200) = RegRegister_57; /*0x32834*/
RegRegister_59 = RegRegister_54; /*0x3283b*/
}
*(_QWORD *)(a1 + 88) = RegRegister_59; /*0x328ab*/
if ( *(int *)(a1 + 268) >= 16 ) /*0x328b5*/
*(_QWORD *)(a1 + 232) = CompNameNullThunk; /*0x328be*/
*(_QWORD *)(a1 + 40) = NiiStatistics; /*0x328cf*/
*(_QWORD *)(a1 + 48) = NiiInterruptSet; /*0x328da*/
*(_QWORD *)(a1 + 192) = NiiStatisticsReset; /*0x328e5*/
*(_QWORD *)(a1 + 72) = UtlRegisterAccessE00; /*0x328f3*/
*(_QWORD *)(a1 + 120) = RegRegister_50; /*0x328fe*/
*(_QWORD *)(a1 + 128) = RegRegister_52; /*0x32909*/
*(_QWORD *)(a1 + 80) = RegRegister_0; /*0x32917*/
*(_QWORD *)(a1 + 112) = NvmGetRomEntrySize; /*0x32922*/
*(_QWORD *)(a1 + 240) = RegRegister_29; /*0x3292d*/
*(_QWORD *)(a1 + 248) = RegRegister_46; /*0x3293b*/
if ( n16 >= 19 ) /*0x32942*/
{
*(_QWORD *)(a1 + 240) = RegRegister_30; /*0x3294b*/
*(_QWORD *)(a1 + 248) = RegRegister_47; /*0x32959*/
}
n0xF0E0 = *(unsigned __int16 *)(a1 + 9512); /*0x32960*/
if ( n0xF0E0 >= 0xF0E0 && (*(unsigned __int16 *)(a1 + 9512) <= 0xF0E2u || n0xF0E0 == 61680 || n0xF0E0 - 61688 <= 1) ) /*0x32984*/
*(_BYTE *)(a1 + 846) = 1; /*0x32986*/
(*(void (__fastcall **)(__int64))(a1 + 104))(a1); /*0x32994*/
return 0; /*0x329a7*/
}
// Function: IscsiSessionGetBufSize @ 0x329b0 (0x3d bytes)
__int64 __fastcall IscsiSessionGetBufSize(__int64 a1)
{
__int16 v1; // dx
unsigned __int16 n2; // ax
v1 = *(_WORD *)(a1 + 1292); /*0x329b0*/
n2 = 2; /*0x329ba*/
switch ( v1 ) /*0x329c3*/
{
case 1: /*0x329c3*/
n2 = 4; /*0x329c5*/
break;
case 2: /*0x329c3*/
n2 = 32; /*0x329d1*/
break;
case 3: /*0x329c3*/
n2 = 64; /*0x329de*/
break;
}
return (*(__int64 (__fastcall **)(__int64, _QWORD))(a1 + 240))(a1, n2);
}
// Function: IscsiSessionSetBufSize @ 0x329f0 (0x3d bytes)
__int64 __fastcall IscsiSessionSetBufSize(__int64 a1)
{
__int16 v1; // dx
unsigned __int16 n2; // ax
v1 = *(_WORD *)(a1 + 1292); /*0x329f0*/
n2 = 2; /*0x329fa*/
switch ( v1 ) /*0x32a03*/
{
case 1: /*0x32a03*/
n2 = 4; /*0x32a05*/
break;
case 2: /*0x32a03*/
n2 = 32; /*0x32a11*/
break;
case 3: /*0x32a03*/
n2 = 64; /*0x32a1e*/
break;
}
return (*(__int64 (__fastcall **)(__int64, _QWORD))(a1 + 248))(a1, n2);
}
// Function: RegRegister_24 @ 0x32a30 (0xe3 bytes)
__int64 __fastcall RegRegister_24(__int64 a1, unsigned int n2, __int16 *p_n321)
{
unsigned int n0xC8; // ebx
int v7; // eax
n0xC8 = -4; /*0x32a57*/
if ( n2 <= 0xFF ) /*0x32a5f*/
{
n0xC8 = (*(__int64 (**)(void))(a1 + 880))(); /*0x32a6b*/
if ( !n0xC8 ) /*0x32a6f*/
{
UtlRegisterAccess((__int64 *)a1, 0x1028u, (n2 | ((*(_DWORD *)(a1 + 1100) | 8) << 8)) << 16); /*0x32a95*/
do /*0x32ac2*/
{
UtlRegisterRead(*(_QWORD *)a1, 50); /*0x32aa2*/
v7 = UtlRegisterWrite((__int64 *)a1, 0x1028u); /*0x32aac*/
if ( (v7 & 0x20000000) != 0 ) /*0x32ab8*/
break; /*0x32ab8*/
++n0xC8; /*0x32aba*/
}
while ( n0xC8 < 0xC8 ); /*0x32ac2*/
if ( (v7 & 0x20000000) != 0 && v7 >= 0 ) /*0x32ad5*/
{
n0xC8 = 0; /*0x32ae7*/
*p_n321 = ((_WORD)v7 << 8) | BYTE1(v7); /*0x32ae9*/
}
else
{
n0xC8 = -2; /*0x32aca*/
}
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x32af0*/
}
}
return n0xC8; /*0x32b0c*/
}
// Function: RegRegister_25 @ 0x32b14 (0xdd bytes)
__int64 __fastcall RegRegister_25(__int64 a1, unsigned int n0xFF, __int16 a3)
{
unsigned int v6; // ebx
unsigned int n0xC8; // esi
unsigned int n7; // eax
int v9; // eax
v6 = -4; /*0x32b36*/
if ( n0xFF <= 0xFF )
{
n0xC8 = 0; /*0x32b4d*/
v6 = (*(__int64 (**)(void))(a1 + 880))(); /*0x32b4f*/
if ( !v6 )
{
n7 = *(_DWORD *)(a1 + 1100); /*0x32b55*/
if ( n7 && n7 <= 7 )
{
UtlRegisterAccess((__int64 *)a1, 0x1028u, ((n0xFF | (n7 << 8)) << 16) | (unsigned __int16)__ROL2__(a3, 8)); /*0x32b82*/
do /*0x32bac*/
{
UtlRegisterRead(*(_QWORD *)a1, 50); /*0x32b8f*/
v9 = UtlRegisterWrite((__int64 *)a1, 0x1028u); /*0x32b99*/
if ( (v9 & 0x20000000) != 0 ) /*0x32ba2*/
break; /*0x32ba2*/
++n0xC8; /*0x32ba4*/
}
while ( n0xC8 < 0xC8 ); /*0x32bac*/
v6 = -2; /*0x32bb2*/
if ( (v9 & 0x20000000) != 0 )
v6 = v9 < 0 ? 0xFFFFFFFE : 0;
}
else
{
v6 = -3; /*0x32bc6*/
}
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x32bce*/
}
}
return v6; /*0x32bea*/
}
// Function: RegRegister_17 @ 0x32bf4 (0x146 bytes)
__int64 __fastcall RegRegister_17(__int64 a1)
{
__int64 v2; // rcx
unsigned int v3; // edi
int n15; // eax
unsigned int n32; // edx
unsigned int v6; // eax
int v7; // esi
__int16 n321; // [rsp+30h] [rbp+8h] BYREF
if ( *(_DWORD *)(a1 + 268) == 18 ) /*0x32c0d*/
CompNameInstall(a1); /*0x32c0f*/
v2 = a1; /*0x32c1b*/
if ( !*(_BYTE *)(a1 + 1312) ) /*0x32c14*/
{
*(_DWORD *)(a1 + 1100) = 1; /*0x32c20*/
return (unsigned int)CompNameInstall(v2); /*0x32c31*/
}
if ( RegRegister_53(a1) ) /*0x32c36*/
{
n15 = *(_DWORD *)(a1 + 268); /*0x32c3f*/
if ( n15 >= 14 ) /*0x32c48*/
{
if ( n15 <= 15 ) /*0x32c4d*/
{
n32 = 32; /*0x32c5b*/
goto LABEL_12; /*0x32c5b*/
}
if ( n15 <= 20 ) /*0x32c52*/
{
n32 = 3588; /*0x32c54*/
LABEL_12:
v6 = UtlRegisterWrite((__int64 *)a1, n32); /*0x32c60*/
v2 = a1; /*0x32c68*/
*(_DWORD *)(a1 + 1100) = (v6 >> 21) & 0x1F; /*0x32c71*/
return (unsigned int)CompNameInstall(v2); /*0x32c77*/
}
}
return (unsigned int)-2; /*0x32c7e*/
}
v7 = UtlRegisterWrite((__int64 *)a1, 0x18u); /*0x32c9b*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v7 & 0xFFFFFF7F); /*0x32ca2*/
UtlMicroStall((__int64 *)a1); /*0x32caa*/
UtlRegisterRead(*(_QWORD *)a1, (__int64)&unk_493E0); /*0x32cb7*/
*(_DWORD *)(a1 + 1100) = 1; /*0x32cbc*/
do /*0x32cf5*/
{
if ( !(unsigned int)RegRegister_24(a1, 2u, &n321) && n321 == 321 ) /*0x32ce6*/
break; /*0x32ce6*/
++*(_DWORD *)(a1 + 1100); /*0x32ce8*/
}
while ( *(_DWORD *)(a1 + 1100) < 8u ); /*0x32cf5*/
if ( *(_DWORD *)(a1 + 1100) == 8 ) /*0x32cfe*/
{
*(_DWORD *)(a1 + 1100) = 0; /*0x32d00*/
v3 = -2; /*0x32d07*/
}
else
{
v3 = CompNameInstall(a1); /*0x32d16*/
}
UtlRegisterAccess((__int64 *)a1, 0x18u, v7); /*0x32d23*/
return v3; /*0x32d34*/
}
// Function: DxeRegister_37 @ 0x32d3c (0x4e bytes)
__int64 __fastcall DxeRegister_37(__int64 a1)
{
__int64 (__fastcall *v1)(__int64, __int64, __int64); // r9
__int64 result; // rax
__int64 n21040624; // rdx
__int64 n21040272; // r8
v1 = *(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016); /*0x32d42*/
result = 0; /*0x32d49*/
if ( v1 ) /*0x32d51*/
{
result = v1(a1, 27, 32900); /*0x32d5c*/
if ( !(_DWORD)result ) /*0x32d61*/
{
result = (*(__int64 (__fastcall **)(__int64))(a1 + 912))(a1); /*0x32d66*/
if ( !(_DWORD)result && *(_DWORD *)(a1 + 1104) == 21040592 ) /*0x32d7a*/
return RegRegister_7(a1, n21040624, n21040272); /*0x32d7f*/
}
}
return result; /*0x32d84*/
}
// Function: MngSetVlanFilter @ 0x32d8c (0x106 bytes)
__int64 __fastcall MngSetVlanFilter(__int64 a1, char a2)
{
__int64 result; // rax
int n2; // edx
__int16 v6; // r8
__int16 v7; // [rsp+30h] [rbp+8h] BYREF
result = 0; /*0x32d96*/
if ( *(_QWORD *)(a1 + 960) ) /*0x32d9e*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 25, &v7); /*0x32db3*/
if ( !(_DWORD)result ) /*0x32dbb*/
{
if ( a2 ) /*0x32dd0*/
{
v7 |= 2u; /*0x32dd7*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 25); /*0x32ddd*/
if ( (_DWORD)result ) /*0x32de5*/
return result; /*0x32de5*/
(*(void (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v7); /*0x32df8*/
goto LABEL_11; /*0x32dfe*/
}
v7 &= ~2u; /*0x32e09*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 25); /*0x32e0f*/
n2 = *(_DWORD *)(a1 + 1096); /*0x32e15*/
if ( n2 == 1 ) /*0x32e1e*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v7); /*0x32e2d*/
if ( (_DWORD)result ) /*0x32e35*/
return result; /*0x32e35*/
v6 = v7 | 0x80; /*0x32e40*/
goto LABEL_12; /*0x32e44*/
}
if ( n2 == 2 ) /*0x32e4d*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v7); /*0x32e5c*/
if ( !(_DWORD)result ) /*0x32e64*/
{
LABEL_11:
v6 = v7 & 0xFF7F; /*0x32e66*/
LABEL_12:
v7 = v6; /*0x32e76*/
return (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 16); /*0x32e81*/
}
}
}
}
return result; /*0x32e8c*/
}
// Function: RegRegister_43 @ 0x32e94 (0x5c bytes)
__int64 __fastcall RegRegister_43(__int64 a1, char a2)
{
int v4; // eax
unsigned int v5; // eax
int n2; // ecx
v4 = UtlRegisterWrite((__int64 *)a1, 0xE14u); /*0x32ea8*/
if ( a2 ) /*0x32eaf*/
{
v5 = v4 & 0xFFFFFFFC | 2; /*0x32eb4*/
}
else
{
n2 = *(_DWORD *)(a1 + 1096); /*0x32eb9*/
v5 = v4 & 0xFFFFFFFD; /*0x32ebf*/
if ( n2 == 1 ) /*0x32ec5*/
{
v5 |= 1u; /*0x32ec7*/
}
else if ( n2 == 2 ) /*0x32ece*/
{
v5 &= ~1u; /*0x32ed0*/
}
}
UtlRegisterAccess((__int64 *)a1, 0xE14u, v5); /*0x32ede*/
return 0; /*0x32eea*/
}
// Function: RegRegister_39 @ 0x32ef0 (0x75 bytes)
__int64 __fastcall RegRegister_39(__int64 a1, char a2)
{
int v4; // eax
int n2; // edx
__int16 n47; // cx
v4 = UtlRegisterWrite((__int64 *)a1, 0xE14u); /*0x32f04*/
if ( a2 ) /*0x32f0b*/
{
n47 = *(_WORD *)(a1 + 1120); /*0x32f29*/
if ( n47 == 47 || n47 == 15 || n47 == 3 ) /*0x32f40*/
v4 = v4 & 0xFFFFFFFA | 4; /*0x32f45*/
}
else
{
n2 = *(_DWORD *)(a1 + 1096); /*0x32f0d*/
v4 &= ~4u; /*0x32f13*/
if ( n2 == 1 ) /*0x32f19*/
{
v4 |= 1u; /*0x32f1b*/
}
else if ( n2 == 2 ) /*0x32f22*/
{
v4 &= ~1u; /*0x32f24*/
}
}
UtlRegisterAccess((__int64 *)a1, 0xE14u, v4); /*0x32f53*/
return 0; /*0x32f5f*/
}
// Function: RegRegister_35 @ 0x32f68 (0x9c bytes)
__int64 __fastcall RegRegister_35(__int64 a1)
{
unsigned int v2; // edi
int v3; // eax
int v4; // eax
v2 = RegRegister_29((__int64 *)a1, 1u); /*0x32f7f*/
if ( !v2 ) /*0x32f83*/
{
if ( *(_DWORD *)(a1 + 268) == 17 ) /*0x32f8f*/
{
v3 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x32f96*/
if ( (((unsigned int)&loc_37FF9 + 7) & v3) != 0 ) /*0x32fa0*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v3 | 0x40000); /*0x32fae*/
}
if ( *(_DWORD *)(a1 + 268) == 16 ) /*0x32fb9*/
{
v4 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x32fc0*/
if ( (v4 & 0x8000) != 0 ) /*0x32fc9*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v4 | 0x8000); /*0x32fd7*/
}
v2 = DxeRegister_26(a1); /*0x32fe4*/
if ( v2 ) /*0x32fe8*/
RegRegister_46((__int64 *)a1, 1u); /*0x32ff2*/
}
return v2; /*0x32ffe*/
}
// Function: DxeRegister_47 @ 0x33004 (0x20 bytes)
__int64 __fastcall DxeRegister_47(__int64 *a1)
{
DxeRegister_27(); /*0x3300d*/
return RegRegister_46(a1, 1u); /*0x3301a*/
}
// Function: RegRegister_29 @ 0x33024 (0xb3 bytes)
__int64 __fastcall RegRegister_29(__int64 *a1, unsigned __int16 a2)
{
int v2; // r12d
int v4; // r13d
unsigned int v5; // ebx
int n200; // esi
int v7; // ebp
v2 = a2; /*0x3303c*/
v4 = a2 << 16; /*0x33046*/
v5 = 0; /*0x3304a*/
n200 = 0; /*0x3304c*/
while ( !(unsigned int)DxeRegister_16((__int64)a1) ) /*0x33058*/
{
v7 = UtlRegisterWrite(a1, 0x5B5Cu); /*0x3306d*/
if ( ((v2 | v4) & v7) != 0 ) /*0x33071*/
{
DxeRegister_46(a1); /*0x33076*/
UtlRegisterRead(*a1, 5000); /*0x33083*/
if ( ++n200 < 200 ) /*0x33090*/
continue; /*0x33090*/
}
if ( n200 != 200 ) /*0x33098*/
{
UtlRegisterAccess(a1, 0x5B5Cu, v2 | v7); /*0x330a8*/
DxeRegister_46(a1); /*0x330b0*/
return v5; /*0x330b5*/
}
return (unsigned int)-13; /*0x33098*/
}
return (unsigned int)-13; /*0x330cd*/
}
// Function: RegRegister_46 @ 0x330d8 (0x53 bytes)
__int64 __fastcall RegRegister_46(__int64 *a1, unsigned __int16 a2)
{
int v4; // eax
while ( (unsigned int)DxeRegister_16(a1) ) /*0x330eb*/
; /*0x330e8*/
v4 = UtlRegisterWrite(a1, 0x5B5Cu); /*0x330fc*/
UtlRegisterAccess(a1, 0x5B5Cu, ~a2 & v4); /*0x33114*/
return DxeRegister_46(a1); /*0x33121*/
}
// Function: RegRegister_31 @ 0x3312c (0xad bytes)
__int64 __fastcall RegRegister_31(__int64 a1)
{
__int16 v1; // ax
int n100; // esi
char *v4; // rdi
v1 = *(_WORD *)(a1 + 1292); /*0x33140*/
n100 = 100; /*0x33147*/
v4 = (char *)&loc_3FFFF + 1; /*0x33152*/
switch ( v1 ) /*0x3315a*/
{
case 1: /*0x3315a*/
LODWORD(v4) = 0x80000; /*0x3315c*/
break;
case 2: /*0x3315a*/
LODWORD(v4) = 0x100000; /*0x33169*/
break;
case 3: /*0x3315a*/
LODWORD(v4) = 0x200000; /*0x33179*/
break;
}
do /*0x3319c*/
{
if ( ((unsigned int)UtlRegisterWrite((__int64 *)a1, 0x1010u) & (unsigned int)v4) != 0 ) /*0x3318b*/
break; /*0x3318b*/
UtlRegisterRead(*(_QWORD *)a1, 1000); /*0x33195*/
--n100; /*0x3319a*/
}
while ( n100 ); /*0x3319c*/
if ( (UtlRegisterWrite((__int64 *)a1, 0x10u) & 0x100) == 0 && *(_DWORD *)(a1 + 1072) == 6 ) /*0x331b8*/
MngSetDefaultConfig(a1); /*0x331bd*/
return 0; /*0x331d3*/
}
// Function: NvmGetRomEntrySize @ 0x331dc (0x1e bytes)
__int64 __fastcall NvmGetRomEntrySize(__int64 a1, __int16 *a2, _WORD *a3)
{
if ( *(_DWORD *)(a1 + 1116) == 1 ) /*0x331e7*/
NiiMcIpToMacSet((__int64 *)a1, a2, a3); /*0x331f0*/
return DxeRegister_18(a1, a2, a3); /*0x331f5*/
}
// Function: DxeRegister_57 @ 0x331fc (0x46 bytes)
__int64 __fastcall DxeRegister_57(__int64 a1)
{
__int64 v3; // [rsp+30h] [rbp+8h] BYREF
__int64 v4; // [rsp+38h] [rbp+10h] BYREF
if ( *(_DWORD *)(a1 + 1116) == 1 ) /*0x3320c*/
return NiiGetVlanState(a1); /*0x33237*/
DxeRegister_18(a1, &v4, &v3); /*0x33218*/
*(_BYTE *)(a1 + 837) = *(_BYTE *)(a1 + 844) == 0; /*0x3322a*/
return NiiReceiveFilterReset(a1); /*0x3323c*/
}
// Function: NvmReadRomEntry @ 0x33244 (0xf7 bytes)
__int64 __fastcall NvmReadRomEntry(__int64 a1)
{
__int64 result; // rax
bool n2_1; // di
char n2; // al
char v5; // [rsp+30h] [rbp+8h] BYREF
result = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1016))(a1, 22, 0); /*0x33263*/
if ( !(_DWORD)result ) /*0x3326b*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, char *))(a1 + 960))(a1, 1, &v5); /*0x3327e*/
if ( !(_DWORD)result ) /*0x33286*/
{
n2_1 = (v5 & 4) != 0; /*0x3329e*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 22, 1); /*0x332a1*/
if ( !(_DWORD)result ) /*0x332a9*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, char *))(a1 + 960))(a1, 1, &v5); /*0x332b5*/
if ( !(_DWORD)result ) /*0x332bd*/
{
n2 = n2_1; /*0x332c7*/
if ( (v5 & 4) != 0 ) /*0x332cb*/
n2 = 2; /*0x332cb*/
if ( n2 ) /*0x332d1*/
{
if ( *(_BYTE *)(a1 + 1325) != n2 ) /*0x332d9*/
{
*(_BYTE *)(a1 + 1325) = n2; /*0x332db*/
*(_BYTE *)(a1 + 1326) = 1; /*0x332e1*/
}
}
if ( n2 == 1 ) /*0x332ee*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 22); /*0x332f7*/
if ( (_DWORD)result ) /*0x332ff*/
return result; /*0x332ff*/
DxeRegister_57(a1); /*0x33304*/
}
else
{
DxeRegister_57(a1); /*0x3330b*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 22); /*0x3331a*/
if ( (_DWORD)result ) /*0x33322*/
return result; /*0x33322*/
}
return 0; /*0x33324*/
}
}
}
}
return result; /*0x33335*/
}
// Function: RegRegister_40 @ 0x3333c (0x74 bytes)
void __fastcall RegRegister_40(__int64 a1)
{
int v2; // eax
int v3; // eax
if ( *(_DWORD *)(a1 + 1116) == 3 || *(_BYTE *)(a1 + 1312) ) /*0x3334e*/
{
v2 = UtlRegisterWrite((__int64 *)a1, 0x4200u); /*0x3335c*/
UtlRegisterAccess((__int64 *)a1, 0x4200u, v2 | 8); /*0x3336f*/
v3 = UtlRegisterWrite((__int64 *)a1, 0x18u); /*0x3337c*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v3 & 0xFFFFFF7F); /*0x33390*/
UtlMicroStall((__int64 *)a1); /*0x33398*/
UtlRegisterRead(*(_QWORD *)a1, 1000); /*0x333a5*/
}
}
// Function: DxeRegister_18 @ 0x333b0 (0xbb bytes)
__int64 __fastcall DxeRegister_18(__int64 a1, __int16 *a2, _WORD *a3)
{
char v6; // al
__int16 n1000; // cx
__int16 v8; // ax
v6 = UtlRegisterWrite((__int64 *)a1, 0x420Cu); /*0x333d2*/
if ( (v6 & 1) != 0 ) /*0x333e0*/
{
*(_BYTE *)(a1 + 844) = 1; /*0x333e2*/
if ( (v6 & 4) != 0 ) /*0x333ef*/
{
n1000 = 1000; /*0x333f1*/
}
else
{
n1000 = 100; /*0x333f8*/
if ( (v6 & 2) == 0 ) /*0x33400*/
n1000 = 10; /*0x33402*/
}
*a2 = n1000; /*0x3340c*/
if ( (v6 & 8) != 0 ) /*0x33411*/
*a3 = 2; /*0x33413*/
else
*a3 = 1; /*0x33418*/
if ( *(_DWORD *)(a1 + 268) == 18 ) /*0x33423*/
{
v8 = UtlRegisterWrite((__int64 *)a1, 8u); /*0x33428*/
if ( (v8 & 0x1000) != 0 && (v8 & 0x2000) == 0 ) /*0x33437*/
{
*a2 = 2500; /*0x3343e*/
*a3 = 2; /*0x33441*/
}
}
}
else
{
*(_BYTE *)(a1 + 844) = 0; /*0x33448*/
*a2 = 0; /*0x3344e*/
*a3 = 0; /*0x33451*/
}
return 0; /*0x33465*/
}
// Function: RegRegister_38 @ 0x3346c (0x80 bytes)
void __fastcall RegRegister_38(__int64 a1)
{
int v2; // eax
int v3; // eax
if ( (*(_DWORD *)(a1 + 1116) == 3 || *(_BYTE *)(a1 + 1312)) && !Nii_3a7e4(a1) ) /*0x33487*/
{
v2 = UtlRegisterWrite((__int64 *)a1, 0x4200u); /*0x33498*/
UtlRegisterAccess((__int64 *)a1, 0x4200u, v2 & 0xFFFFFFF7); /*0x334ab*/
v3 = UtlRegisterWrite((__int64 *)a1, 0x18u); /*0x334b8*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v3 | 0x80); /*0x334cc*/
UtlMicroStall((__int64 *)a1); /*0x334d4*/
UtlRegisterRead(*(_QWORD *)a1, 1000); /*0x334e1*/
}
}
// Function: RegDriverEntry @ 0x334ec (0x12c bytes)
__int64 __fastcall RegDriverEntry(__int64 *a1)
{
int v2; // eax
int v3; // edi
int v4; // eax
__int64 v5; // rdx
__int64 v6; // r8
__int64 v7; // r9
__int64 v9; // [rsp+38h] [rbp+10h] BYREF
RegRegister_41((__int64)a1); /*0x334f9*/
v2 = UtlRegisterWrite(a1, 0x5B00u); /*0x33506*/
v3 = v2; /*0x3350b*/
if ( (v2 & 0xF000) == 0 ) /*0x33512*/
{
if ( (v2 & 0x40000) != 0 ) /*0x33518*/
{
if ( !(unsigned int)UndiCommandEntry(a1, 40, (unsigned __int16 *)&v9) ) /*0x3352d*/
{
LOWORD(v9) = v9 | 5; /*0x33536*/
NvmCheckReadConfig(a1, 40, (__int64)&v9); /*0x33547*/
}
}
else
{
v3 = v2 | 0x1000; /*0x3351a*/
}
}
UtlRegisterAccess(a1, 0x5B00u, v3 & 0xFFFEFFFF); /*0x3355b*/
UtlRegisterAccess(a1, 0xD8u, -1); /*0x3356e*/
UtlRegisterAccess(a1, 0x100u, 0); /*0x3357e*/
UtlRegisterAccess(a1, 0x400u, 8); /*0x33591*/
UtlMicroStall(a1); /*0x33599*/
UtlRegisterRead(*a1, 10000); /*0x335a6*/
v4 = UtlRegisterWrite(a1, 0); /*0x335b0*/
UtlRegisterAccess(a1, 0, v4 | 0x4000000); /*0x335c1*/
RegRegister_44(a1); /*0x335c9*/
if ( (UtlRegisterWrite(a1, 0x10u) & 0x100) == 0 ) /*0x335df*/
DxeRegister_51((__int64)a1, v5, v6, v7); /*0x335e4*/
UtlRegisterAccess(a1, 0xD8u, -1); /*0x335f4*/
UtlRegisterWrite(a1, 0xC0u); /*0x33601*/
return NiiMediaState((__int64)a1); /*0x3360e*/
}
// Function: RegRegister_32 @ 0x33618 (0xab bytes)
__int64 __fastcall RegRegister_32(__int64 a1)
{
unsigned __int16 i_1; // bx
unsigned __int16 v3; // bx
unsigned __int16 i; // si
unsigned int v5; // eax
unsigned int v6; // ebx
i_1 = *(_WORD *)(a1 + 828); /*0x33627*/
(*(void (**)(void))(a1 + 40))(); /*0x33631*/
(*(void (__fastcall **)(__int64))(a1 + 88))(a1); /*0x33637*/
NiiSetMacAddressList(a1, i_1); /*0x33640*/
v3 = 0; /*0x33645*/
for ( i = 0; i < *(_WORD *)(a1 + 310); ++i ) /*0x3364a*/
UtlRegisterAccess((__int64 *)a1, 4 * i + 20992, 0); /*0x33663*/
while ( v3 < *(_WORD *)(a1 + 312) ) /*0x33695*/
UtlRegisterAccess((__int64 *)a1, 4 * v3++ + 40960, 0); /*0x33683*/
v5 = (*(__int64 (__fastcall **)(__int64))(a1 + 176))(a1); /*0x33697*/
*(_DWORD *)(a1 + 1320) = 1500; /*0x336a0*/
v6 = v5; /*0x336aa*/
RegRegister_0(a1); /*0x336ac*/
return v6; /*0x336bd*/
}
// Function: RegRegister_21 @ 0x336c4 (0x11c bytes)
__int64 __fastcall RegRegister_21(__int64 a1)
{
int v2; // eax
int n16; // eax
int v4; // eax
__int64 result; // rax
int n2; // eax
v2 = UtlRegisterWrite((__int64 *)a1, 0); /*0x336cf*/
UtlRegisterAccess((__int64 *)a1, 0, v2 & 0xFFFFE7BF | 0x40); /*0x336e4*/
n16 = *(_DWORD *)(a1 + 268); /*0x336e9*/
if ( n16 >= 16 && (n16 <= 17 || (unsigned int)(n16 - 19) <= 1) ) /*0x336ff*/
{
v4 = UtlRegisterWrite((__int64 *)a1, 0xE14u); /*0x33709*/
UtlRegisterAccess((__int64 *)a1, 0xE14u, v4 & 0xFFFFFFDF); /*0x3371c*/
}
result = RegRegister_6(a1); /*0x33724*/
if ( !(_DWORD)result ) /*0x3372b*/
{
if ( !*(_BYTE *)(a1 + 1312) /*0x33759*/
|| *(_BYTE *)(a1 + 1134)
|| (UtlRegisterRead(*(_QWORD *)a1, (__int64)&unk_493E0),
result = (*(__int64 (__fastcall **)(__int64))(a1 + 992))(a1),
!(_DWORD)result) )
{
n2 = *(_DWORD *)(a1 + 1072); /*0x3375b*/
if ( n2 != 2 ) /*0x33764*/
{
switch ( n2 ) /*0x33769*/
{
case 6: /*0x33769*/
result = RegRegister_15(a1); /*0x33789*/
break;
case 13: /*0x33769*/
result = MacCheckBootMode(a1); /*0x3377f*/
break;
case 15: /*0x33769*/
goto LABEL_16; /*0x33773*/
default:
return 4294967294LL; /*0x3377a*/
}
LABEL_24:
if ( !(_DWORD)result ) /*0x337d0*/
return DxeRegister_56(a1); /*0x337d5*/
return result; /*0x337d5*/
}
LABEL_16:
if ( *(_DWORD *)(a1 + 1104) == 21040128 /*0x337ba*/
|| *(_DWORD *)(a1 + 1104) == 21040272
|| *(_DWORD *)(a1 + 1104) == 21040576
|| *(_DWORD *)(a1 + 1104) == 21040592
|| *(_DWORD *)(a1 + 1104) == 21040624
|| *(_DWORD *)(a1 + 1104) == 21040800 )
{
result = MacUpdateConfigFlags(a1); /*0x337c9*/
}
else
{
result = MacInitConfigFlags(a1); /*0x337bf*/
}
goto LABEL_24; /*0x337c4*/
}
}
return result; /*0x337da*/
}
// Function: RegRegister_6 @ 0x337e0 (0x1c4 bytes)
__int64 __fastcall RegRegister_6(__int64 a1)
{
int v2; // r12d
int v3; // ebp
int n14; // eax
int v5; // ebp
int v6; // eax
char v7; // si
int n0x800000; // r12d
int v9; // edi
unsigned int v10; // edi
int n14_1; // eax
__int64 result; // rax
unsigned int v13; // edi
int v14; // edi
int v15; // r8d
__int16 v16; // [rsp+40h] [rbp+8h] BYREF
if ( *(_DWORD *)(a1 + 1116) == 3 || *(_BYTE *)(a1 + 1312) ) /*0x33807*/
{
UtlRegisterAccess((__int64 *)a1, 0x24u, 1024); /*0x3381f*/
v2 = UtlRegisterWrite((__int64 *)a1, 0x18u) & 0xFFFFFF7F; /*0x3383b*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v2); /*0x33843*/
v3 = UtlRegisterWrite((__int64 *)a1, 0); /*0x33852*/
n14 = *(_DWORD *)(a1 + 268); /*0x33854*/
v5 = v3 | 0x40; /*0x3385a*/
if ( n14 == 14 || n14 == 15 ) /*0x33865*/
v5 |= 0xC0000u; /*0x33867*/
v6 = UtlRegisterWrite((__int64 *)a1, 0x4208u); /*0x33875*/
v7 = *(_BYTE *)(a1 + 835); /*0x3387a*/
n0x800000 = v2 & 0xC00000; /*0x33881*/
v9 = v6; /*0x33888*/
if ( n0x800000 == 0x400000 ) /*0x33891*/
{
v7 = 0; /*0x338a5*/
}
else if ( n0x800000 == 0x800000 ) /*0x3389a*/
{
v7 = 1; /*0x3389c*/
v10 = v6 & 0xFFFBFFFF; /*0x3389f*/
LABEL_16:
UtlRegisterAccess((__int64 *)a1, 0, v5); /*0x338f3*/
v13 = v10 & 0xFFFEFFCE; /*0x33900*/
if ( !v7 ) /*0x33909*/
{
v14 = v13 | 0x90; /*0x3395d*/
LABEL_24:
UtlRegisterAccess((__int64 *)a1, 0x4208u, v14); /*0x33963*/
if ( !v7 && !*(_BYTE *)(a1 + 1312) ) /*0x33978*/
NiiReceiveFilterGet(a1); /*0x33984*/
return 0; /*0x33984*/
}
v14 = v13 & 0xFFFCFF7F | 0x30000; /*0x33919*/
v15 = UtlRegisterWrite((__int64 *)a1, 0x4218u) & 0xFFFFFE7F; /*0x3392d*/
switch ( *(_DWORD *)(a1 + 868) ) /*0x33937*/
{
case 1: /*0x33937*/
goto LABEL_20; /*0x33937*/
case 2: /*0x33937*/
v15 |= 0x100u; /*0x33956*/
break; /*0x3395b*/
case 3: /*0x33937*/
LABEL_20:
v15 |= 0x180u; /*0x33943*/
break;
}
UtlRegisterAccess((__int64 *)a1, 0x4218u, v15); /*0x3394a*/
goto LABEL_24; /*0x33954*/
}
n14_1 = *(_DWORD *)(a1 + 268); /*0x338a8*/
if ( n14_1 == 14 || n14_1 == 15 ) /*0x338b6*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1160))(a1, 3, 1, &v16); /*0x338c9*/
if ( (_DWORD)result ) /*0x338d2*/
return result; /*0x338d2*/
if ( (v16 & 0x4000) != 0 ) /*0x338e6*/
v7 = 0; /*0x338e6*/
}
v5 |= 0x1A01u; /*0x338ea*/
v10 = v9 | 0xC; /*0x338f0*/
goto LABEL_16; /*0x338f0*/
}
return 0; /*0x3399a*/
}
// Function: RegRegister_22 @ 0x339a4 (0x112 bytes)
__int64 __fastcall RegRegister_22(__int64 a1, __int64 n32)
{
int n3; // esi
int v4; // eax
unsigned int v5; // r12d
unsigned int v6; // edi
char v7; // al
char n3_1; // [rsp+40h] [rbp+8h] BYREF
n3 = 3; /*0x339b6*/
n3_1 = 0; /*0x339be*/
v4 = UtlRegisterWrite((__int64 *)a1, 0x18u); /*0x339c6*/
v5 = v4 & 0xFFFFFF7F; /*0x339d4*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v4 & 0xFDFFFF7F | 0x2000000); /*0x339e1*/
UtlMicroStall((__int64 *)a1); /*0x339e9*/
while ( 1 ) /*0x339fd*/
{
v6 = DxeRegister_28((__int64 *)a1, 0, &n3_1); /*0x339fd*/
if ( !v6 ) /*0x33a01*/
break; /*0x33a01*/
UtlRegisterRead(*(_QWORD *)a1, (__int64)L"tion I218-V"); /*0x33a0b*/
if ( !--n3 ) /*0x33a13*/
goto LABEL_15; /*0x33a13*/
}
v6 = DxeRegister_28((__int64 *)a1, 6u, (char *)(a1 + 1324)); /*0x33a2b*/
if ( !v6 ) /*0x33a2f*/
{
if ( n3_1 == 3 || n3_1 == 2 ) /*0x33a3b*/
{
*(_BYTE *)(a1 + 1315) = 1; /*0x33a45*/
v7 = *(_BYTE *)(a1 + 1324); /*0x33a4c*/
if ( (v7 & 2) == 0 && (v7 & 1) == 0 ) /*0x33a58*/
{
if ( (v7 & 0x20) == 0 ) /*0x33a5c*/
{
if ( (v7 & 8) == 0 ) /*0x33a98*/
{
*(_DWORD *)(a1 + 1116) = 0; /*0x33aad*/
goto LABEL_15; /*0x33ab4*/
}
*(_BYTE *)(a1 + 1312) = 1; /*0x33a9a*/
*(_DWORD *)(a1 + 1116) = 1; /*0x33aa1*/
goto LABEL_14; /*0x33aab*/
}
*(_BYTE *)(a1 + 1312) = 1; /*0x33a5e*/
}
*(_DWORD *)(a1 + 1116) = 3; /*0x33a65*/
}
else
{
*(_DWORD *)(a1 + 1116) = 0; /*0x33a3d*/
}
LABEL_14:
v6 = 0; /*0x33a6f*/
}
LABEL_15:
UtlRegisterAccess((__int64 *)a1, 0x18u, v5); /*0x33a71*/
return v6; /*0x33a8d*/
}
// Function: IscsiGetProtocolValue @ 0x33ab8 (0x58 bytes)
__int64 __fastcall IscsiGetProtocolValue(__int64 a1, __int16 *a2)
{
__int64 result; // rax
__int16 n4376; // cx
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1160))(a1, 4, 1, a2); /*0x33ad4*/
if ( !(_DWORD)result && (!*a2 || *a2 == -1) ) /*0x33aed*/
{
n4376 = -30447; /*0x33af6*/
if ( *(_DWORD *)(a1 + 1116) == 3 ) /*0x33afb*/
n4376 = 4376; /*0x33afd*/
*a2 = n4376; /*0x33b02*/
}
return result; /*0x33b0a*/
}
// Function: DxeRegister_51 @ 0x33b10 (0x11a bytes)
__int64 __fastcall DxeRegister_51(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
{
if ( *(_DWORD *)(a1 + 268) == 14 ) /*0x33b24*/
{
DxeRegister_34((__int64 *)a1, 0x24u, 0, 0xCu); /*0x33b36*/
DxeRegister_34((__int64 *)a1, 0x24u, 1, 0x78u); /*0x33b47*/
DxeRegister_34((__int64 *)a1, 0x24u, 27, 0x23u); /*0x33b58*/
DxeRegister_34((__int64 *)a1, 0x24u, 35, 0x15u); /*0x33b69*/
DxeRegister_34((__int64 *)a1, 0x5B48u, 20, 0); /*0x33b7f*/
DxeRegister_34((__int64 *)a1, 0x5B48u, 16, 0); /*0x33b90*/
DxeRegister_34((__int64 *)a1, 0x5B44u, 0, 0xECu); /*0x33ba5*/
DxeRegister_34((__int64 *)a1, 0x5B44u, 97, 0xDFu); /*0x33bb8*/
DxeRegister_34((__int64 *)a1, 0x5B44u, 52, 5u); /*0x33bcb*/
DxeRegister_34((__int64 *)a1, 0x5B44u, 47, 0x81u); /*0x33bde*/
DxeRegister_34((__int64 *)a1, 0x5B4Cu, 2, 0x47u); /*0x33bf6*/
DxeRegister_34((__int64 *)a1, 0x5B4Cu, 20, 0); /*0x33c07*/
DxeRegister_34((__int64 *)a1, 0x5B4Cu, 16, 0); /*0x33c18*/
}
return 0; /*0x33c24*/
}
// Function: RegRegister_55 @ 0x33c2c (0x3a bytes)
char __fastcall RegRegister_55(__int64 *a1)
{
int v2; // eax
v2 = UtlRegisterWrite(a1, 0x404u); /*0x33c3a*/
UtlRegisterAccess(a1, 0x404u, v2 & 0xFFF003FF | 0xFC00); /*0x33c54*/
return UtlMicroStall(a1); /*0x33c5c*/
}
// Function: MngCleanupCallback @ 0x33c68 (0x37 bytes)
void __fastcall MngCleanupCallback(__int64 a1)
{
if ( *(_QWORD *)(a1 + 904) && !Nii_3a7e4(a1) && !(*(unsigned int (__fastcall **)(__int64))(a1 + 904))(a1) ) /*0x33c87*/
MngCloseSession(a1); /*0x33c94*/
}
// Function: RegRegister_0 @ 0x33ca0 (0x248 bytes)
__int64 __fastcall RegRegister_0(__int64 a1)
{
__int64 result; // rax
RegRegister_5((__int64 *)a1); /*0x33ca9*/
UtlRegisterWrite((__int64 *)a1, 0x405Cu); /*0x33cb6*/
UtlRegisterWrite((__int64 *)a1, 0x4060u); /*0x33cc3*/
UtlRegisterWrite((__int64 *)a1, 0x4064u); /*0x33cd0*/
UtlRegisterWrite((__int64 *)a1, 0x4068u); /*0x33cdd*/
UtlRegisterWrite((__int64 *)a1, 0x406Cu); /*0x33cea*/
UtlRegisterWrite((__int64 *)a1, 0x4070u); /*0x33cf7*/
UtlRegisterWrite((__int64 *)a1, 0x40D8u); /*0x33d04*/
UtlRegisterWrite((__int64 *)a1, 0x40DCu); /*0x33d11*/
UtlRegisterWrite((__int64 *)a1, 0x40E0u); /*0x33d1e*/
UtlRegisterWrite((__int64 *)a1, 0x40E4u); /*0x33d2b*/
UtlRegisterWrite((__int64 *)a1, 0x40E8u); /*0x33d38*/
UtlRegisterWrite((__int64 *)a1, 0x40ECu); /*0x33d45*/
UtlRegisterWrite((__int64 *)a1, 0x4004u); /*0x33d52*/
UtlRegisterWrite((__int64 *)a1, 0x400Cu); /*0x33d5f*/
UtlRegisterWrite((__int64 *)a1, 0x4034u); /*0x33d6c*/
UtlRegisterWrite((__int64 *)a1, 0x403Cu); /*0x33d79*/
UtlRegisterWrite((__int64 *)a1, 0x40F8u); /*0x33d86*/
UtlRegisterWrite((__int64 *)a1, 0x40FCu); /*0x33d93*/
UtlRegisterWrite((__int64 *)a1, 0x40B4u); /*0x33da0*/
UtlRegisterWrite((__int64 *)a1, 0x40B8u); /*0x33dad*/
UtlRegisterWrite((__int64 *)a1, 0x40BCu); /*0x33dba*/
UtlRegisterWrite((__int64 *)a1, 0x4100u); /*0x33dc7*/
UtlRegisterWrite((__int64 *)a1, 0x4124u); /*0x33dd4*/
UtlRegisterWrite((__int64 *)a1, 0x4104u); /*0x33de1*/
UtlRegisterWrite((__int64 *)a1, 0x4108u); /*0x33dee*/
UtlRegisterWrite((__int64 *)a1, 0x410Cu); /*0x33dfb*/
UtlRegisterWrite((__int64 *)a1, 0x4110u); /*0x33e08*/
UtlRegisterWrite((__int64 *)a1, 0x4118u); /*0x33e15*/
UtlRegisterWrite((__int64 *)a1, 0x411Cu); /*0x33e22*/
UtlRegisterWrite((__int64 *)a1, 0x4120u); /*0x33e2f*/
UtlRegisterWrite((__int64 *)a1, 0x402Cu); /*0x33e3c*/
UtlRegisterWrite((__int64 *)a1, 0x403Cu); /*0x33e49*/
UtlRegisterWrite((__int64 *)a1, 0x40FCu); /*0x33e56*/
UtlRegisterWrite((__int64 *)a1, 0x4104u); /*0x33e63*/
UtlRegisterWrite((__int64 *)a1, 0x4118u); /*0x33e70*/
UtlRegisterWrite((__int64 *)a1, 0x4124u); /*0x33e7d*/
UtlRegisterWrite((__int64 *)a1, 0x4128u); /*0x33e8a*/
UtlRegisterWrite((__int64 *)a1, 0x412Cu); /*0x33e97*/
UtlRegisterWrite((__int64 *)a1, 0x4130u); /*0x33ea4*/
UtlRegisterWrite((__int64 *)a1, 0x4134u); /*0x33eb1*/
result = UtlRegisterWrite((__int64 *)a1, 0x4138u); /*0x33ebe*/
if ( *(_DWORD *)(a1 + 1116) == 3 || *(_BYTE *)(a1 + 1312) ) /*0x33ecc*/
return UtlRegisterWrite((__int64 *)a1, 0x4228u); /*0x33edd*/
return result; /*0x33ee2*/
}
// Function: DxeRegister_0 @ 0x33ee8 (0x24b bytes)
char __fastcall DxeRegister_0(__int64 a1)
{
__int64 v2; // rax
int n49192; // r12d
int n10280; // r14d
int n4; // r15d
_DWORD *v6; // rbp
unsigned int n49192_1; // ebx
int v8; // eax
int n10; // ebx
int n10280_1; // ebp
int n49192_2; // r12d
int v12; // r15d
int n4_1; // r13d
int n49192_3; // esi
int n10280_2; // r14d
unsigned int n49192_4; // edx
int n4_2; // esi
int v18; // r15d
int v19; // r14d
int *v20; // rbx
unsigned int n49192_5; // edx
_BYTE v23[72]; // [rsp+20h] [rbp-48h] BYREF
int v24; // [rsp+78h] [rbp+10h]
v24 = UtlRegisterWrite((__int64 *)a1, 0x5008u) | 0x10000; /*0x33f1b*/
LOBYTE(v2) = UtlRegisterAccess((__int64 *)a1, 0x5008u, v24); /*0x33f20*/
if ( *(_DWORD *)(a1 + 268) == 14 ) /*0x33f2c*/
{
v2 = UtlRegisterWrite((__int64 *)a1, 0x5820u); /*0x33f3a*/
if ( (v2 & 0x20000) != 0 ) /*0x33f43*/
{
n49192 = 49192; /*0x33f4b*/
n10280 = 10280; /*0x33f51*/
n4 = 0; /*0x33f57*/
v6 = v23; /*0x33f5a*/
do /*0x33fa1*/
{
n49192_1 = n49192; /*0x33f5f*/
if ( n4 < 4 ) /*0x33f69*/
n49192_1 = n10280; /*0x33f69*/
v8 = UtlRegisterWrite((__int64 *)a1, n49192_1); /*0x33f6f*/
*v6 = v8; /*0x33f79*/
UtlRegisterAccess((__int64 *)a1, n49192_1, v8 & 0xFDFFFFFF); /*0x33f83*/
n10280 += 256; /*0x33f88*/
++n4; /*0x33f8f*/
n49192 += 64; /*0x33f92*/
++v6; /*0x33f96*/
}
while ( n10280 < 11304 ); /*0x33fa1*/
n10 = 0; /*0x33fa3*/
n10280_1 = 10280; /*0x33fa5*/
n49192_2 = 49192; /*0x33faa*/
do /*0x34002*/
{
UtlRegisterRead(*(_QWORD *)a1, 1000); /*0x33fb8*/
v12 = 0; /*0x33fbd*/
n4_1 = 0; /*0x33fc0*/
n49192_3 = 49192; /*0x33fc3*/
n10280_2 = 10280; /*0x33fc6*/
do /*0x33ff2*/
{
n49192_4 = n49192_3; /*0x33fc9*/
if ( n4_1 < 4 ) /*0x33fd2*/
n49192_4 = n10280_2; /*0x33fd2*/
n10280_2 += 256; /*0x33fdb*/
++n4_1; /*0x33fe2*/
v12 |= UtlRegisterWrite((__int64 *)a1, n49192_4); /*0x33fe5*/
n49192_3 += 64; /*0x33fe8*/
}
while ( n10280_2 < 11304 ); /*0x33ff2*/
n4_2 = 0; /*0x33ff4*/
if ( (v12 & 0x2000000) == 0 ) /*0x33ffb*/
break; /*0x33ffb*/
++n10; /*0x33ffd*/
}
while ( n10 < 10 ); /*0x34002*/
UtlRegisterAccess((__int64 *)a1, 0x5008u, v24 & 0xFFFBFFFF); /*0x34019*/
v18 = UtlRegisterWrite((__int64 *)a1, 0x5004u); /*0x34035*/
UtlRegisterAccess((__int64 *)a1, 0x5004u, 0); /*0x34038*/
v19 = UtlRegisterWrite((__int64 *)a1, 0x100u); /*0x34054*/
UtlRegisterAccess((__int64 *)a1, 0x100u, v19 & 0xFFFFFFD9 | 0x20); /*0x34060*/
UtlRegisterAccess((__int64 *)a1, 0x100u, v19 & 0xFFFFFFD9 | 0x22); /*0x34073*/
UtlMicroStall((__int64 *)a1); /*0x3407b*/
UtlRegisterRead(*(_QWORD *)a1, 2000); /*0x34088*/
v20 = (int *)v23; /*0x3408d*/
do /*0x340bd*/
{
n49192_5 = n49192_2; /*0x34095*/
if ( n4_2 < 4 ) /*0x3409b*/
n49192_5 = n10280_1; /*0x3409b*/
UtlRegisterAccess((__int64 *)a1, n49192_5, *v20); /*0x340a1*/
++n4_2; /*0x340ab*/
n10280_1 += 256; /*0x340ad*/
n49192_2 += 64; /*0x340af*/
++v20; /*0x340b3*/
}
while ( n10280_1 < 11304 ); /*0x340bd*/
UtlRegisterAccess((__int64 *)a1, 0x100u, v19); /*0x340c7*/
UtlMicroStall((__int64 *)a1); /*0x340cf*/
UtlRegisterAccess((__int64 *)a1, 0x5004u, v18); /*0x340df*/
UtlRegisterAccess((__int64 *)a1, 0x5008u, v24); /*0x340ef*/
UtlRegisterWrite((__int64 *)a1, 0x40ACu); /*0x340fc*/
UtlRegisterWrite((__int64 *)a1, 0x40A0u); /*0x34109*/
LOBYTE(v2) = UtlRegisterWrite((__int64 *)a1, 0x4010u); /*0x34116*/
}
}
return v2; /*0x34123*/
}
// Function: IscsiStrToBin @ 0x34134 (0x57 bytes)
__int64 __fastcall IscsiStrToBin(__int64 a1, unsigned int n0x1F, _WORD *a3)
{
unsigned int v6; // ebx
v6 = (*(__int64 (**)(void))(a1 + 880))(); /*0x34156*/
if ( !v6 ) /*0x3415a*/
{
v6 = UtlStrToBin(a1, n0x1F, a3); /*0x3416c*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3416e*/
}
return v6; /*0x34185*/
}
// Function: IscsiTokenize @ 0x3418c (0x59 bytes)
__int64 __fastcall IscsiTokenize(__int64 a1, unsigned int n0x1F, unsigned __int16 a3)
{
unsigned int v6; // ebx
v6 = (*(__int64 (**)(void))(a1 + 880))(); /*0x341af*/
if ( !v6 ) /*0x341b3*/
{
v6 = UtlTokenize(a1, n0x1F, a3); /*0x341c6*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x341c8*/
}
return v6; /*0x341df*/
}
// Function: RegRegister_34 @ 0x341e8 (0xa2 bytes)
__int64 __fastcall RegRegister_34(__int64 a1)
{
bool v1; // zf
unsigned int v3; // edi
unsigned __int16 v4; // ax
int v5; // eax
int v6; // eax
__int16 v8; // [rsp+30h] [rbp+8h] BYREF
v1 = *(_DWORD *)(a1 + 268) == 16; /*0x341f9*/
v3 = 0; /*0x34203*/
v8 = 0; /*0x34205*/
if ( v1 && *(_BYTE *)(a1 + 1312) )
{
v4 = *(_WORD *)(a1 + 1292); /*0x34215*/
v5 = v4 ? (v4 + 1) << 6 : 0;
v3 = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, __int16 *))(a1 + 1160))( /*0x34240*/
a1,
(unsigned int)(v5 + 36),
1,
&v8);
if ( !v3 ) /*0x34244*/
{
v6 = UtlRegisterWrite((__int64 *)a1, 0xE04u); /*0x34250*/
if ( (v8 & 4) != 0 ) /*0x3425a*/
v6 |= 0x80000000; /*0x3425c*/
if ( (v8 & 8) != 0 ) /*0x34265*/
v6 |= 0x40000000u; /*0x34267*/
UtlRegisterAccess((__int64 *)a1, 0xE04u, v6); /*0x34273*/
}
}
return v3; /*0x34284*/
}
// Function: RegRegister_11 @ 0x3428c (0x17b bytes)
__int64 __fastcall RegRegister_11(__int64 a1)
{
char v1; // si
int v3; // edi
int v4; // eax
char v5; // cl
int v6; // edi
unsigned int v7; // edi
v1 = *(_BYTE *)(a1 + 1313); /*0x342a5*/
if ( *(_DWORD *)(a1 + 268) == 16 ) /*0x342b5*/
v1 = 0; /*0x342b5*/
*(_BYTE *)(a1 + 1313) = 0; /*0x342bd*/
v3 = UtlRegisterWrite((__int64 *)a1, 0); /*0x342cc*/
RegRegister_41(a1); /*0x342ce*/
UtlRegisterAccess((__int64 *)a1, 0xD8u, -1); /*0x342df*/
UtlRegisterAccess((__int64 *)a1, 0x100u, 0); /*0x342f3*/
UtlRegisterAccess((__int64 *)a1, 0x400u, 8); /*0x34304*/
UtlMicroStall((__int64 *)a1); /*0x3430c*/
UtlRegisterRead(*(_QWORD *)a1, 10000); /*0x34319*/
if ( !v1 ) /*0x34321*/
goto LABEL_9; /*0x34321*/
v4 = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 240))(a1, 256); /*0x3432a*/
v5 = v1; /*0x34330*/
if ( v4 ) /*0x34336*/
v5 = 0; /*0x34336*/
v1 = v5; /*0x34339*/
if ( v5 && (UtlRegisterWrite((__int64 *)a1, 8u) & 0x100000) == 0 ) /*0x34350*/
v6 = v3 | 0x20000000; /*0x34352*/
else
LABEL_9:
v6 = v3 | 0x4000000; /*0x34358*/
UtlRegisterAccess((__int64 *)a1, 0, v6); /*0x34364*/
if ( *(_WORD *)(a1 + 9512) != 1080 ) /*0x34377*/
UtlMicroStall((__int64 *)a1); /*0x3437c*/
UtlRegisterRead(*(_QWORD *)a1, 5000); /*0x34389*/
RegRegister_44((__int64 *)a1); /*0x34391*/
UtlRegisterAccess((__int64 *)a1, 8u, 0x100000); /*0x343a4*/
UtlRegisterAccess((__int64 *)a1, 0xD8u, -1); /*0x343b5*/
UtlRegisterWrite((__int64 *)a1, 0xC0u); /*0x343c2*/
RegRegister_34(a1); /*0x343ca*/
v7 = NiiMediaState(a1); /*0x343d7*/
if ( v1 ) /*0x343dc*/
(*(void (__fastcall **)(__int64, __int64))(a1 + 248))(a1, 256); /*0x343e4*/
return v7; /*0x34400*/
}
// Function: NvmWriteFieldRange64 @ 0x34408 (0x7f bytes)
__int64 __fastcall NvmWriteFieldRange64(__int64 a1, unsigned __int16 a2)
{
unsigned __int16 v2; // bx
int v4; // esi
__int16 v5; // di
__int64 result; // rax
__int16 v7; // [rsp+48h] [rbp+10h] BYREF
v2 = a2; /*0x34420*/
v4 = a2 + 64; /*0x34429*/
v5 = 0; /*0x3442c*/
if ( a2 >= v4 ) /*0x34432*/
return 0xFFFFFFFFLL; /*0x3446b*/
while ( 1 ) /*0x34446*/
{
result = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, __int16 *))(a1 + 1160))(a1, v2, 1, &v7); /*0x34446*/
if ( (_DWORD)result ) /*0x3444f*/
break; /*0x3444f*/
v5 += v7; /*0x34451*/
if ( ++v2 >= v4 ) /*0x3445f*/
{
if ( v5 == -17734 ) /*0x34469*/
return result; /*0x34469*/
return 0xFFFFFFFFLL; /*0x34469*/
}
}
return result; /*0x3447d*/
}
// Function: NvmReadFieldRange64 @ 0x34488 (0x9a bytes)
__int64 __fastcall NvmReadFieldRange64(__int64 a1, unsigned __int16 a2)
{
int v2; // edi
int v4; // esi
__int16 v5; // r8
unsigned __int16 v6; // bx
__int64 result; // rax
__int16 v8; // [rsp+58h] [rbp+10h] BYREF
__int16 v9; // [rsp+60h] [rbp+18h] BYREF
v2 = a2; /*0x3449b*/
v4 = a2 + 63; /*0x344a1*/
v5 = 0; /*0x344a4*/
v8 = 0; /*0x344a8*/
v6 = a2; /*0x344b0*/
if ( a2 >= v4 ) /*0x344b7*/
{
LABEL_4:
v8 = -17734 - v5; /*0x344ef*/
return (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, __int16 *))(a1 + 1208))( /*0x3450b*/
a1,
(unsigned int)(v2 + 63),
1,
&v8);
}
else
{
while ( 1 ) /*0x344c7*/
{
result = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, __int16 *))(a1 + 1160))(a1, v6, 1, &v9); /*0x344c7*/
if ( (_DWORD)result ) /*0x344d0*/
break; /*0x344d0*/
++v6; /*0x344d8*/
v5 = v9 + v8; /*0x344dc*/
v8 += v9; /*0x344e7*/
if ( v6 >= v4 ) /*0x344ed*/
goto LABEL_4; /*0x344ed*/
}
}
return result; /*0x34516*/
}
// Function: IscsiReadConfigFlags @ 0x34524 (0x9d bytes)
__int64 __fastcall IscsiReadConfigFlags(__int64 a1)
{
unsigned __int16 n4; // si
__int64 result; // rax
unsigned __int16 n4_1; // bx
__int16 n64; // di
__int16 v6; // [rsp+50h] [rbp+8h] BYREF
n4 = 1; /*0x3454f*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1160))(a1, 3, 1, &v6); /*0x34553*/
if ( !(_DWORD)result ) /*0x3455f*/
{
if ( v6 < 0 ) /*0x3456b*/
n4 = 4; /*0x3456d*/
n4_1 = 0; /*0x34571*/
n64 = 64; /*0x34581*/
do /*0x345a8*/
{
result = NvmWriteFieldRange64(a1, n64 & (unsigned __int16)-(n4_1 != 0)); /*0x34593*/
if ( (_DWORD)result ) /*0x3459b*/
break; /*0x3459b*/
++n4_1; /*0x3459d*/
n64 += 64; /*0x345a1*/
}
while ( n4_1 < n4 ); /*0x345a8*/
}
return result; /*0x345b4*/
}
// Function: IscsiSetConfigFlag @ 0x345c4 (0xb9 bytes)
__int64 __fastcall IscsiSetConfigFlag(__int64 a1)
{
__int64 result; // rax
__int16 v3; // di
__int16 i; // bx
__int16 v5; // [rsp+40h] [rbp+8h] BYREF
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1160))(a1, 3, 1, &v5); /*0x345f2*/
if ( !(_DWORD)result ) /*0x345fe*/
{
if ( v5 < 0 /*0x3462d*/
|| (v5 |= 0x8000u,
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1208))(a1, 3, 1, &v5),
!(_DWORD)result) )
{
v3 = 0; /*0x34634*/
for ( i = 64; (unsigned __int16)i < 0x140u; i += 64 ) /*0x34638*/
{
result = NvmReadFieldRange64(a1, i & (unsigned __int16)-(v3 != 0)); /*0x34649*/
if ( (_DWORD)result ) /*0x34651*/
break; /*0x34651*/
++v3; /*0x3465b*/
}
}
}
return result; /*0x34673*/
}
// Function: IscsiWriteAllFieldRanges @ 0x34680 (0x6e bytes)
__int64 __fastcall IscsiWriteAllFieldRanges(__int64 a1)
{
__int16 v2; // di
__int16 i; // bx
__int64 result; // rax
v2 = 0; /*0x346a4*/
for ( i = 64; (unsigned __int16)i < 0x140u; i += 64 ) /*0x346a8*/
{
result = NvmWriteFieldRange64(a1, i & (unsigned __int16)-(v2 != 0)); /*0x346b9*/
if ( (_DWORD)result ) /*0x346c1*/
break; /*0x346c1*/
++v2; /*0x346cb*/
}
return result; /*0x346e7*/
}
// Function: IscsiReadAllFieldRanges @ 0x346f0 (0x6e bytes)
__int64 __fastcall IscsiReadAllFieldRanges(__int64 a1)
{
__int16 v2; // di
__int16 i; // bx
__int64 result; // rax
v2 = 0; /*0x34714*/
for ( i = 64; (unsigned __int16)i < 0x140u; i += 64 ) /*0x34718*/
{
result = NvmReadFieldRange64(a1, i & (unsigned __int16)-(v2 != 0)); /*0x34729*/
if ( (_DWORD)result ) /*0x34731*/
break; /*0x34731*/
++v2; /*0x3473b*/
}
return result; /*0x34757*/
}
// Function: RegRegister_7 @ 0x34760 (0x1b2 bytes)
__int64 __fastcall RegRegister_7(__int64 a1, __int64 n21040624, __int64 n21040272)
{
unsigned int v3; // ebx
__int64 result; // rax
v3 = 0; /*0x3476a*/
if ( *(_DWORD *)(a1 + 1104) == 21040592 ) /*0x34779*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 22, 255); /*0x3478e*/
if ( !v3 ) /*0x34792*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 17, 8523); /*0x347aa*/
if ( !v3 ) /*0x347ae*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 16, 8516); /*0x347c6*/
if ( !v3 ) /*0x347ca*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 17, 3112); /*0x347e2*/
if ( !v3 ) /*0x347e6*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 16, 8518); /*0x347fe*/
if ( !v3 ) /*0x34802*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 17, 45619); /*0x3481a*/
if ( !v3 ) /*0x3481e*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 16, 8525); /*0x34836*/
if ( !v3 ) /*0x3483a*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 17, 52236); /*0x34852*/
if ( !v3 ) /*0x34856*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 16, 8537); /*0x3486e*/
if ( !v3 ) /*0x34872*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 22, 251); /*0x3488a*/
if ( !v3 ) /*0x3488e*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 7, 13); /*0x348a0*/
if ( !v3 ) /*0x348a4*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 22, 18); /*0x348b6*/
if ( !v3 ) /*0x348ba*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 20, 32769); /*0x348ce*/
if ( !v3 ) /*0x348d2*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1016))(a1, 22, 0); /*0x348e3*/
if ( !v3 ) /*0x348e7*/
{
result = (*(__int64 (__fastcall **)(__int64))(a1 + 912))(a1); /*0x348ec*/
v3 = result; /*0x348f2*/
if ( (_DWORD)result ) /*0x348f6*/
return result; /*0x348f6*/
UtlRegisterRead(*(_QWORD *)a1, 1000000); /*0x34900*/
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
return v3; /*0x3490c*/
}
// Function: RegRegister_4 @ 0x34914 (0x1f1 bytes)
__int64 __fastcall RegRegister_4(__int64 a1, __int64 n21040624, __int64 n21040272)
{
unsigned int v3; // ebx
__int64 result; // rax
v3 = 0; /*0x34923*/
if ( *(_DWORD *)(a1 + 1104) == 21040800 ) /*0x34932*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 22, 255); /*0x34949*/
if ( !v3 ) /*0x3494d*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 17, 8523); /*0x34965*/
if ( !v3 ) /*0x34969*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 16, 8516); /*0x34981*/
if ( !v3 ) /*0x34985*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 17, 3112); /*0x3499d*/
if ( !v3 ) /*0x349a1*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 16, 8518); /*0x349b9*/
if ( !v3 ) /*0x349bd*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 17, 45619); /*0x349d5*/
if ( !v3 ) /*0x349d9*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 16, 8525); /*0x349f1*/
if ( !v3 ) /*0x349f5*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 17, 56332); /*0x34a0d*/
if ( !v3 ) /*0x34a11*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 16, 8537); /*0x34a29*/
if ( !v3 ) /*0x34a2d*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 22, 251); /*0x34a44*/
if ( !v3 ) /*0x34a48*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 7, 49165); /*0x34a60*/
if ( !v3 ) /*0x34a64*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 22, 18); /*0x34a79*/
if ( !v3 ) /*0x34a7d*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 20, 32769); /*0x34a91*/
if ( !v3 ) /*0x34a95*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 22, 1); /*0x34aa6*/
if ( !v3 ) /*0x34aaa*/
{
v3 = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64))(a1 + 1016))(a1, 0, 37184); /*0x34abd*/
if ( !v3 ) /*0x34ac1*/
{
v3 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1016))(a1, 22, 0); /*0x34ad1*/
if ( !v3 ) /*0x34ad5*/
{
result = (*(__int64 (__fastcall **)(__int64))(a1 + 912))(a1); /*0x34ada*/
v3 = result; /*0x34ae0*/
if ( (_DWORD)result ) /*0x34ae4*/
return result; /*0x34ae4*/
UtlRegisterRead(*(_QWORD *)a1, 1000000); /*0x34aee*/
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
return v3; /*0x34aff*/
}
// Function: RegRegister_48 @ 0x34b08 (0x52 bytes)
char __fastcall RegRegister_48(__int64 *a1)
{
unsigned int i; // ebx
__int64 n10; // rsi
char result; // al
for ( i = 22016; i < 0x5800; i += 4 ) /*0x34b1a*/
{
n10 = 10; /*0x34b1f*/
do /*0x34b35*/
{
UtlRegisterAccess(a1, i, 0); /*0x34b2c*/
--n10; /*0x34b31*/
}
while ( n10 ); /*0x34b35*/
result = UtlMicroStall(a1); /*0x34b3a*/
}
return result; /*0x34b54*/
}
// Function: RegRegister_45 @ 0x34b5c (0x55 bytes)
char __fastcall RegRegister_45(__int64 *a1, int a2, int a3)
{
unsigned int v5; // ebp
__int64 n10; // rdi
v5 = 4 * a2 + 22016; /*0x34b76*/
n10 = 10; /*0x34b7d*/
do /*0x34b93*/
{
UtlRegisterAccess(a1, v5, a3); /*0x34b8a*/
--n10; /*0x34b8f*/
}
while ( n10 ); /*0x34b93*/
return UtlMicroStall(a1); /*0x34ba7*/
}
// Function: RegRegister_8 @ 0x34bb4 (0x1ae bytes)
__int64 __fastcall RegRegister_8(__int64 a1, char a2, char a3, _BYTE *a4)
{
int v8; // esi
__int64 v9; // rdx
unsigned int v10; // ebx
__int64 v11; // rdx
__int64 v12; // rdx
int i; // r12d
char v14; // bl
__int64 v15; // rdx
int v17; // [rsp+50h] [rbp+8h] BYREF
v8 = 1; /*0x34bd6*/
while ( !(*(unsigned int (__fastcall **)(__int64, __int64))(a1 + 240))(a1, 2) ) /*0x34beb*/
{
DxeRegister_29(a1); /*0x34bf4*/
LOBYTE(v9) = a3; /*0x34bf9*/
v10 = DxeRegister_55(a1, v9); /*0x34c04*/
if ( !v10 ) /*0x34c08*/
{
v10 = DxeRegister_20(a1); /*0x34c16*/
if ( !v10 ) /*0x34c1a*/
{
LOBYTE(v11) = a2; /*0x34c20*/
v10 = DxeRegister_55(a1, v11); /*0x34c2b*/
if ( !v10 ) /*0x34c2f*/
{
v10 = DxeRegister_20(a1); /*0x34c3d*/
if ( !v10 ) /*0x34c41*/
{
DxeRegister_29(a1); /*0x34c4a*/
LOBYTE(v12) = a3 | 1; /*0x34c55*/
v10 = DxeRegister_55(a1, v12); /*0x34c5d*/
if ( !v10 ) /*0x34c61*/
{
v10 = DxeRegister_20(a1); /*0x34c6f*/
if ( !v10 ) /*0x34c73*/
{
*a4 = 0; /*0x34c79*/
for ( i = 7; i >= 0; --i ) /*0x34c7d*/
{
v17 = UtlRegisterWrite((__int64 *)a1, 0x102Cu); /*0x34c98*/
DxeRegister_40(a1, &v17); /*0x34c9c*/
UtlRegisterRead(*(_QWORD *)a1, 4); /*0x34ca9*/
v17 = UtlRegisterWrite((__int64 *)a1, 0x102Cu); /*0x34cc2*/
v14 = (v17 & 0x1000) != 0; /*0x34cc9*/
DxeRegister_42(a1, &v17); /*0x34ccc*/
UtlRegisterRead(*(_QWORD *)a1, 5); /*0x34cd9*/
*a4 |= v14 << i; /*0x34ce3*/
}
LOBYTE(v15) = 1; /*0x34ced*/
v10 = DxeRegister_31(a1, v15); /*0x34cf7*/
if ( !v10 ) /*0x34cfb*/
{
DxeRegister_35(a1); /*0x34d2f*/
LABEL_15:
(*(void (__fastcall **)(__int64, __int64))(a1 + 248))(a1, 2); /*0x34d34*/
return v10; /*0x34d42*/
}
}
}
}
}
}
}
(*(void (__fastcall **)(__int64, __int64))(a1 + 248))(a1, 2); /*0x34d05*/
UtlRegisterRead(*(_QWORD *)a1, (__int64)L"tion I218-V"); /*0x34d13*/
DxeRegister_54(a1); /*0x34d1b*/
if ( (unsigned int)++v8 >= 0xA ) /*0x34d25*/
goto LABEL_15; /*0x34d25*/
}
return 13; /*0x34d55*/
}
// Function: DxeRegister_53 @ 0x34d64 (0xe2 bytes)
__int64 __fastcall DxeRegister_53(__int64 a1, char a2, char a3, char a4)
{
int v5; // esi
unsigned int v9; // ebx
__int64 v10; // rdx
__int64 v11; // rdx
__int64 v12; // rdx
v5 = 0; /*0x34d7f*/
if ( (*(unsigned int (__fastcall **)(__int64, __int64))(a1 + 240))(a1, 2) ) /*0x34d8d*/
{
return 13; /*0x34d97*/
}
else
{
while ( 1 ) /*0x34da2*/
{
DxeRegister_29(a1); /*0x34da2*/
LOBYTE(v10) = a3; /*0x34da7*/
v9 = DxeRegister_55(a1, v10); /*0x34db2*/
if ( !v9 ) /*0x34db6*/
{
v9 = DxeRegister_20(a1); /*0x34dc0*/
if ( !v9 ) /*0x34dc4*/
{
LOBYTE(v11) = a2; /*0x34dc6*/
v9 = DxeRegister_55(a1, v11); /*0x34dd1*/
if ( !v9 ) /*0x34dd5*/
{
v9 = DxeRegister_20(a1); /*0x34ddf*/
if ( !v9 ) /*0x34de3*/
{
LOBYTE(v12) = a4; /*0x34de5*/
v9 = DxeRegister_55(a1, v12); /*0x34df0*/
if ( !v9 ) /*0x34df4*/
{
v9 = DxeRegister_20(a1); /*0x34dfe*/
if ( !v9 ) /*0x34e02*/
break; /*0x34e02*/
}
}
}
}
}
DxeRegister_54(a1); /*0x34e07*/
if ( ++v5 ) /*0x34e11*/
goto LABEL_12; /*0x34e11*/
}
DxeRegister_35(a1); /*0x34e18*/
LABEL_12:
(*(void (__fastcall **)(__int64, __int64))(a1 + 248))(a1, 2); /*0x34e1d*/
}
return v9; /*0x34e3c*/
}
// Function: DxeRegister_29 @ 0x34e48 (0x7d bytes)
__int64 __fastcall DxeRegister_29(__int64 *a1)
{
int v3; // [rsp+38h] [rbp+10h] BYREF
v3 = UtlRegisterWrite(a1, 0x102Cu); /*0x34e66*/
DxeRegister_24(a1, &v3, 1); /*0x34e6a*/
DxeRegister_40(a1, (unsigned int *)&v3); /*0x34e77*/
UtlRegisterRead(*a1, 5); /*0x34e84*/
DxeRegister_24(a1, &v3, 0); /*0x34e94*/
UtlRegisterRead(*a1, 4); /*0x34ea1*/
DxeRegister_42(a1, &v3); /*0x34eae*/
return UtlRegisterRead(*a1, 5); /*0x34ebb*/
}
// Function: DxeRegister_35 @ 0x34ec8 (0x63 bytes)
__int64 __fastcall DxeRegister_35(__int64 *a1)
{
int v3; // [rsp+38h] [rbp+10h] BYREF
v3 = UtlRegisterWrite(a1, 0x102Cu); /*0x34ee6*/
DxeRegister_24(a1, &v3, 0); /*0x34eea*/
DxeRegister_40(a1, (unsigned int *)&v3); /*0x34ef7*/
UtlRegisterRead(*a1, 4); /*0x34f04*/
DxeRegister_24(a1, &v3, 1); /*0x34f14*/
return UtlRegisterRead(*a1, 5); /*0x34f21*/
}
// Function: DxeRegister_55 @ 0x34f2c (0x7b bytes)
__int64 __fastcall DxeRegister_55(__int64 *a1, unsigned __int8 a2)
{
int i; // ebx
unsigned int v5; // ebp
int v6; // eax
for ( i = 7; i >= 0; --i ) /*0x34f46*/
{
v5 = DxeRegister_31(a1, (a2 >> i) & 1); /*0x34f5d*/
if ( v5 ) /*0x34f61*/
break; /*0x34f61*/
}
v6 = UtlRegisterWrite(a1, 0x102Cu); /*0x34f72*/
UtlRegisterAccess(a1, 0x102Cu, v6 | 0x800); /*0x34f83*/
UtlMicroStall(a1); /*0x34f8b*/
return v5; /*0x34fa1*/
}
// Function: DxeRegister_20 @ 0x34fa8 (0xa9 bytes)
__int64 __fastcall DxeRegister_20(__int64 *a1)
{
unsigned int n19_1; // esi
unsigned int i; // ebx
int v4; // eax
__int16 v5; // r11
bool v6; // cf
__int64 n19; // rax
int v8; // [rsp+38h] [rbp+10h] BYREF
n19_1 = 0; /*0x34fbf*/
v8 = UtlRegisterWrite(a1, 0x102Cu); /*0x34fce*/
DxeRegister_40(a1, (unsigned int *)&v8); /*0x34fd2*/
UtlRegisterRead(*a1, 4); /*0x34fdd*/
for ( i = 0; i < 0xA; ++i ) /*0x34fe2*/
{
UtlRegisterRead(*a1, 1); /*0x34fec*/
v4 = UtlRegisterWrite(a1, 0x102Cu); /*0x34ff9*/
v5 = v4; /*0x35002*/
v8 = v4; /*0x35005*/
if ( (v4 & 0x4000) != 0 ) /*0x35009*/
break; /*0x35009*/
}
v6 = (v4 & 0x4000) != 0; /*0x35012*/
n19 = 19; /*0x35016*/
if ( v6 ) /*0x3501b*/
{
if ( (v5 & 0x1000) != 0 ) /*0x3502a*/
n19_1 = 19; /*0x3502a*/
DxeRegister_42(a1, &v8); /*0x3502d*/
UtlRegisterRead(*a1, 5); /*0x3503a*/
return n19_1; /*0x3503f*/
}
return n19; /*0x3504b*/
}
// Function: DxeRegister_31 @ 0x35054 (0x77 bytes)
__int64 __fastcall DxeRegister_31(__int64 *a1, char a2)
{
unsigned int v4; // ebx
int v6; // [rsp+40h] [rbp+18h] BYREF
v6 = UtlRegisterWrite(a1, 0x102Cu); /*0x35078*/
v4 = DxeRegister_24(a1, &v6, a2); /*0x35081*/
if ( v4 ) /*0x35085*/
{
return 19; /*0x350b9*/
}
else
{
DxeRegister_40(a1, (unsigned int *)&v6); /*0x3508f*/
UtlRegisterRead(*a1, 4); /*0x3509a*/
DxeRegister_42(a1, &v6); /*0x350a7*/
UtlRegisterRead(*a1, 5); /*0x350b2*/
}
return v4; /*0x350c5*/
}
// Function: DxeRegister_40 @ 0x350cc (0x3d bytes)
__int64 __fastcall DxeRegister_40(__int64 *a1, unsigned int *a2)
{
unsigned int v3; // r8d
v3 = *a2 & 0xFFFFDDFF | 0x200; /*0x350dd*/
*a2 = v3; /*0x350e2*/
UtlRegisterAccess(a1, 0x102Cu, v3); /*0x350ea*/
UtlMicroStall(a1); /*0x350f2*/
return UtlRegisterRead(*a1, 1); /*0x350ff*/
}
// Function: DxeRegister_42 @ 0x3510c (0x36 bytes)
__int64 __fastcall DxeRegister_42(__int64 *a1, int *a2)
{
*a2 &= 0xFFFFDDFF; /*0x35112*/
UtlRegisterAccess(a1, 0x102Cu, *a2); /*0x35123*/
UtlMicroStall(a1); /*0x3512b*/
return UtlRegisterRead(*a1, 1); /*0x35138*/
}
// Function: DxeRegister_24 @ 0x35144 (0x8f bytes)
__int64 __fastcall DxeRegister_24(__int64 *a1, int *a2, char a3)
{
unsigned int v3; // edi
int v7; // eax
v3 = 0; /*0x35158*/
if ( a3 ) /*0x35166*/
*a2 |= 0x400u; /*0x35168*/
else
*a2 &= ~0x400u; /*0x3516e*/
*a2 &= ~0x800u; /*0x35172*/
*a2 |= 0x2000u; /*0x35176*/
UtlRegisterAccess(a1, 0x102Cu, *a2); /*0x35182*/
UtlMicroStall(a1); /*0x3518a*/
UtlRegisterRead(*a1, 3); /*0x35198*/
v7 = UtlRegisterWrite(a1, 0x102Cu); /*0x351a5*/
*a2 = v7; /*0x351b4*/
if ( a3 != ((v7 & 0x1000) != 0) ) /*0x351c8*/
return 19; /*0x351c8*/
return v3; /*0x351cd*/
}
// Function: DxeRegister_54 @ 0x351d4 (0x8c bytes)
__int64 __fastcall DxeRegister_54(__int64 *a1)
{
__int64 n9; // rdi
int v4; // [rsp+38h] [rbp+10h] BYREF
v4 = UtlRegisterWrite(a1, 0x102Cu); /*0x351ee*/
DxeRegister_29(a1); /*0x351f2*/
DxeRegister_24(a1, &v4, 1); /*0x35202*/
n9 = 9; /*0x35207*/
do /*0x35244*/
{
DxeRegister_40(a1, (unsigned int *)&v4); /*0x35214*/
UtlRegisterRead(*a1, 4); /*0x35221*/
DxeRegister_42(a1, &v4); /*0x3522e*/
UtlRegisterRead(*a1, 5); /*0x3523b*/
--n9; /*0x35240*/
}
while ( n9 ); /*0x35244*/
DxeRegister_29(a1); /*0x35249*/
return DxeRegister_35(a1); /*0x35256*/
}
// Function: DhcpBuildOptions @ 0x35260 (0x2bb bytes)
__int64 __fastcall DhcpBuildOptions(__int64 a1, __int64 a2, unsigned __int16 *a3, int a4, __int64 a5, unsigned int a6)
{
__int64 result; // rax
__int64 v7; // [rsp+40h] [rbp-148h] BYREF
char v8; // [rsp+48h] [rbp-140h]
int v9; // [rsp+4Ch] [rbp-13Ch]
int n3; // [rsp+50h] [rbp-138h]
__int16 v11; // [rsp+54h] [rbp-134h]
__int64 v12; // [rsp+58h] [rbp-130h]
int n20; // [rsp+60h] [rbp-128h]
int n8; // [rsp+64h] [rbp-124h]
char v15; // [rsp+68h] [rbp-120h]
int v16; // [rsp+6Ch] [rbp-11Ch]
int v17; // [rsp+70h] [rbp-118h]
__int16 n1152; // [rsp+74h] [rbp-114h]
__int64 v19; // [rsp+78h] [rbp-110h]
int n36; // [rsp+80h] [rbp-108h]
int n8_1; // [rsp+84h] [rbp-104h]
char v22; // [rsp+88h] [rbp-100h]
int v23; // [rsp+8Ch] [rbp-FCh]
int v24; // [rsp+90h] [rbp-F8h]
__int16 n1152_1; // [rsp+94h] [rbp-F4h]
__int64 v26; // [rsp+98h] [rbp-F0h]
int n48; // [rsp+A0h] [rbp-E8h]
int n64; // [rsp+A4h] [rbp-E4h]
char v29; // [rsp+A8h] [rbp-E0h]
int v30; // [rsp+ACh] [rbp-DCh]
int n7; // [rsp+B0h] [rbp-D8h]
__int16 v32; // [rsp+B4h] [rbp-D4h]
__int64 v33; // [rsp+B8h] [rbp-D0h]
int n56; // [rsp+C0h] [rbp-C8h]
int n64_1; // [rsp+C4h] [rbp-C4h]
char v36; // [rsp+C8h] [rbp-C0h]
int v37; // [rsp+CCh] [rbp-BCh]
int n4; // [rsp+D0h] [rbp-B8h]
__int16 v39; // [rsp+D4h] [rbp-B4h]
__int64 v40; // [rsp+D8h] [rbp-B0h]
int n55; // [rsp+E0h] [rbp-A8h]
int n2; // [rsp+E4h] [rbp-A4h]
char v43; // [rsp+E8h] [rbp-A0h]
int v44; // [rsp+ECh] [rbp-9Ch]
int n3_1; // [rsp+F0h] [rbp-98h]
__int16 v46; // [rsp+F4h] [rbp-94h]
__int64 v47; // [rsp+F8h] [rbp-90h]
int n61; // [rsp+100h] [rbp-88h]
int n128; // [rsp+104h] [rbp-84h]
char v50; // [rsp+108h] [rbp-80h]
int v51; // [rsp+10Ch] [rbp-7Ch]
int v52; // [rsp+110h] [rbp-78h]
__int16 v53; // [rsp+114h] [rbp-74h]
__int64 v54; // [rsp+118h] [rbp-70h]
int n20_1; // [rsp+120h] [rbp-68h]
int n256; // [rsp+124h] [rbp-64h]
char v57; // [rsp+128h] [rbp-60h]
int v58; // [rsp+12Ch] [rbp-5Ch]
int v59; // [rsp+130h] [rbp-58h]
__int16 n0x2000; // [rsp+134h] [rbp-54h]
__int64 v61; // [rsp+138h] [rbp-50h]
int n36_1; // [rsp+140h] [rbp-48h]
int n256_1; // [rsp+144h] [rbp-44h]
char v64; // [rsp+148h] [rbp-40h]
int v65; // [rsp+14Ch] [rbp-3Ch]
int v66; // [rsp+150h] [rbp-38h]
__int16 n0x2000_1; // [rsp+154h] [rbp-34h]
__int64 v68; // [rsp+158h] [rbp-30h]
int n15; // [rsp+160h] [rbp-28h]
int n256_2; // [rsp+164h] [rbp-24h]
char v71; // [rsp+168h] [rbp-20h]
int v72; // [rsp+16Ch] [rbp-1Ch]
int v73; // [rsp+170h] [rbp-18h]
__int16 n1792; // [rsp+174h] [rbp-14h]
__int64 v75; // [rsp+178h] [rbp-10h]
n1152 = 1152; /*0x35291*/
n1152_1 = 1152; /*0x35297*/
n8 = 8; /*0x352a0*/
n8_1 = 8; /*0x352a4*/
n64 = 64; /*0x352b4*/
n64_1 = 64; /*0x352bb*/
v7 = 0x100000000LL; /*0x352c7*/
n0x2000 = 0x2000; /*0x352d0*/
n0x2000_1 = 0x2000; /*0x352d8*/
v8 = 0; /*0x352e5*/
v9 = 0; /*0x352ea*/
n3 = 3; /*0x352ef*/
n1792 = 1792; /*0x352f4*/
v11 = -1; /*0x352fc*/
v12 = 0; /*0x35301*/
n20 = 20; /*0x35306*/
v15 = 0; /*0x3530e*/
v16 = 0; /*0x35313*/
v17 = 1; /*0x35318*/
v19 = 0; /*0x3531c*/
n36 = 36; /*0x35321*/
v22 = 0; /*0x3532c*/
v23 = 0; /*0x35334*/
v24 = 1; /*0x3533c*/
v26 = 0; /*0x35343*/
n48 = 48; /*0x3534b*/
v29 = 0; /*0x35356*/
v30 = 0; /*0x3535e*/
n7 = 7; /*0x35366*/
v32 = -1; /*0x35371*/
v33 = 0; /*0x35379*/
n56 = 56; /*0x35381*/
v36 = 0; /*0x3538c*/
v37 = 0; /*0x35394*/
n4 = 4; /*0x3539c*/
v39 = -1; /*0x353a7*/
v40 = 0; /*0x353af*/
n55 = 55; /*0x353b7*/
n2 = 2; /*0x353c2*/
v43 = 1; /*0x353cd*/
v44 = 0; /*0x353d5*/
n3_1 = 3; /*0x353dd*/
v46 = -1; /*0x353e5*/
v47 = 0; /*0x353ed*/
n61 = 61; /*0x353f5*/
n128 = 128; /*0x35400*/
v50 = 1; /*0x3540b*/
v51 = 0; /*0x35413*/
v52 = 0; /*0x3541b*/
v53 = -1; /*0x35423*/
v54 = 0; /*0x3542b*/
n20_1 = 20; /*0x35433*/
n256 = 256; /*0x3543e*/
v57 = 0; /*0x35446*/
v58 = 0; /*0x3544e*/
v59 = 1; /*0x35456*/
v61 = 0; /*0x3545d*/
n36_1 = 36; /*0x35465*/
n256_1 = 256; /*0x35470*/
v64 = 0; /*0x35478*/
v65 = 0; /*0x35480*/
v66 = 1; /*0x35488*/
v68 = 0; /*0x3548f*/
n15 = 15; /*0x35497*/
n256_2 = 256; /*0x354a2*/
v71 = 0; /*0x354aa*/
v72 = 0; /*0x354b2*/
v73 = 1; /*0x354ba*/
v75 = 0; /*0x354c1*/
result = 4294967280LL; /*0x354c9*/
if ( a3 ) /*0x354cf*/
return Nii_37268(a1, (__int64)&v7, 0xAu, a2, a3, a4, a5, a6); /*0x35500*/
return result; /*0x35515*/
}
// Function: DhcpParseOptions @ 0x3551c (0x349 bytes)
__int64 __fastcall DhcpParseOptions(__int64 a1, __int64 a2, unsigned __int16 *a3, int a4, __int64 a5, unsigned int a6)
{
__int64 result; // rax
__int64 v7; // [rsp+40h] [rbp-1A8h] BYREF
char v8; // [rsp+48h] [rbp-1A0h]
int v9; // [rsp+4Ch] [rbp-19Ch]
int n3; // [rsp+50h] [rbp-198h]
__int16 v11; // [rsp+54h] [rbp-194h]
__int64 v12; // [rsp+58h] [rbp-190h]
int n128; // [rsp+60h] [rbp-188h]
int v14; // [rsp+64h] [rbp-184h]
char v15; // [rsp+68h] [rbp-180h]
int v16; // [rsp+6Ch] [rbp-17Ch]
int n3_1; // [rsp+70h] [rbp-178h]
__int16 v18; // [rsp+74h] [rbp-174h]
__int64 v19; // [rsp+78h] [rbp-170h]
int n192; // [rsp+80h] [rbp-168h]
int v21; // [rsp+84h] [rbp-164h]
char v22; // [rsp+88h] [rbp-160h]
int v23; // [rsp+8Ch] [rbp-15Ch]
int n3_2; // [rsp+90h] [rbp-158h]
__int16 v25; // [rsp+94h] [rbp-154h]
__int64 v26; // [rsp+98h] [rbp-150h]
int n256; // [rsp+A0h] [rbp-148h]
int v28; // [rsp+A4h] [rbp-144h]
char v29; // [rsp+A8h] [rbp-140h]
int v30; // [rsp+ACh] [rbp-13Ch]
int n3_3; // [rsp+B0h] [rbp-138h]
__int16 v32; // [rsp+B4h] [rbp-134h]
__int64 v33; // [rsp+B8h] [rbp-130h]
int n36; // [rsp+C0h] [rbp-128h]
int n8; // [rsp+C4h] [rbp-124h]
char v36; // [rsp+C8h] [rbp-120h]
int v37; // [rsp+CCh] [rbp-11Ch]
int v38; // [rsp+D0h] [rbp-118h]
__int16 n1152; // [rsp+D4h] [rbp-114h]
__int64 v40; // [rsp+D8h] [rbp-110h]
int n164; // [rsp+E0h] [rbp-108h]
int n8_1; // [rsp+E4h] [rbp-104h]
char v43; // [rsp+E8h] [rbp-100h]
int v44; // [rsp+ECh] [rbp-FCh]
int v45; // [rsp+F0h] [rbp-F8h]
__int16 n1152_1; // [rsp+F4h] [rbp-F4h]
__int64 v47; // [rsp+F8h] [rbp-F0h]
int n228; // [rsp+100h] [rbp-E8h]
int n8_2; // [rsp+104h] [rbp-E4h]
char v50; // [rsp+108h] [rbp-E0h]
int v51; // [rsp+10Ch] [rbp-DCh]
int v52; // [rsp+110h] [rbp-D8h]
__int16 n1152_2; // [rsp+114h] [rbp-D4h]
__int64 v54; // [rsp+118h] [rbp-D0h]
int n292; // [rsp+120h] [rbp-C8h]
int n8_3; // [rsp+124h] [rbp-C4h]
char v57; // [rsp+128h] [rbp-C0h]
int v58; // [rsp+12Ch] [rbp-BCh]
int v59; // [rsp+130h] [rbp-B8h]
__int16 n1152_3; // [rsp+134h] [rbp-B4h]
__int64 v61; // [rsp+138h] [rbp-B0h]
int n48; // [rsp+140h] [rbp-A8h]
int n64; // [rsp+144h] [rbp-A4h]
char v64; // [rsp+148h] [rbp-A0h]
int v65; // [rsp+14Ch] [rbp-9Ch]
int n7; // [rsp+150h] [rbp-98h]
__int16 v67; // [rsp+154h] [rbp-94h]
__int64 v68; // [rsp+158h] [rbp-90h]
int n56; // [rsp+160h] [rbp-88h]
int n64_1; // [rsp+164h] [rbp-84h]
char v71; // [rsp+168h] [rbp-80h]
int v72; // [rsp+16Ch] [rbp-7Ch]
int n4; // [rsp+170h] [rbp-78h]
__int16 v74; // [rsp+174h] [rbp-74h]
__int64 v75; // [rsp+178h] [rbp-70h]
int n55; // [rsp+180h] [rbp-68h]
int n2; // [rsp+184h] [rbp-64h]
char v78; // [rsp+188h] [rbp-60h]
int v79; // [rsp+18Ch] [rbp-5Ch]
int n12; // [rsp+190h] [rbp-58h]
__int16 v81; // [rsp+194h] [rbp-54h]
__int64 v82; // [rsp+198h] [rbp-50h]
int n61; // [rsp+1A0h] [rbp-48h]
int n128_1; // [rsp+1A4h] [rbp-44h]
char v85; // [rsp+1A8h] [rbp-40h]
int v86; // [rsp+1ACh] [rbp-3Ch]
int v87; // [rsp+1B0h] [rbp-38h]
__int16 v88; // [rsp+1B4h] [rbp-34h]
__int64 v89; // [rsp+1B8h] [rbp-30h]
int n15; // [rsp+1C0h] [rbp-28h]
int n256_1; // [rsp+1C4h] [rbp-24h]
char v92; // [rsp+1C8h] [rbp-20h]
int v93; // [rsp+1CCh] [rbp-1Ch]
int v94; // [rsp+1D0h] [rbp-18h]
__int16 n1824; // [rsp+1D4h] [rbp-14h]
__int64 v96; // [rsp+1D8h] [rbp-10h]
n3 = 3; /*0x35544*/
n3_1 = 3; /*0x35548*/
n3_2 = 3; /*0x3554c*/
n3_3 = 3; /*0x35553*/
n8 = 8; /*0x35563*/
n8_1 = 8; /*0x3556a*/
n8_2 = 8; /*0x35571*/
n8_3 = 8; /*0x35578*/
v7 = 0x100000000LL; /*0x35582*/
v8 = 0; /*0x3558a*/
v9 = 0; /*0x3558f*/
n64 = 64; /*0x35593*/
n64_1 = 64; /*0x3559a*/
v11 = -1; /*0x355a1*/
v12 = 0; /*0x355a6*/
n128 = 128; /*0x355ab*/
v14 = 1; /*0x355b3*/
v15 = 0; /*0x355b7*/
v16 = 0; /*0x355bc*/
v18 = -1; /*0x355c0*/
v19 = 0; /*0x355c5*/
n192 = 192; /*0x355ca*/
v21 = 1; /*0x355d5*/
v22 = 0; /*0x355dc*/
v23 = 0; /*0x355e4*/
v25 = -1; /*0x355eb*/
v26 = 0; /*0x355f3*/
n256 = 256; /*0x355fb*/
v28 = 1; /*0x35603*/
v29 = 0; /*0x3560a*/
v30 = 0; /*0x35612*/
v32 = -1; /*0x35619*/
v33 = 0; /*0x35621*/
n36 = 36; /*0x35629*/
v36 = 0; /*0x35634*/
v37 = 0; /*0x3563c*/
v38 = 1; /*0x35643*/
n1152 = 1152; /*0x3564a*/
v40 = 0; /*0x35653*/
n164 = 164; /*0x3565b*/
v43 = 0; /*0x35666*/
v44 = 0; /*0x3566e*/
v45 = 1; /*0x35675*/
n1152_1 = 1152; /*0x3567c*/
v47 = 0; /*0x35685*/
n228 = 228; /*0x3568d*/
v50 = 0; /*0x35698*/
v51 = 0; /*0x356a0*/
v52 = 1; /*0x356a7*/
n1152_2 = 1152; /*0x356ae*/
v54 = 0; /*0x356b7*/
n292 = 292; /*0x356bf*/
v57 = 0; /*0x356ca*/
v58 = 0; /*0x356d2*/
v59 = 1; /*0x356d9*/
n1152_3 = 1152; /*0x356e0*/
v61 = 0; /*0x356e9*/
n48 = 48; /*0x356f1*/
v64 = 0; /*0x356fc*/
v65 = 0; /*0x35704*/
n7 = 7; /*0x3570b*/
v67 = -1; /*0x35716*/
v68 = 0; /*0x3571e*/
n56 = 56; /*0x35726*/
v71 = 0; /*0x35731*/
v72 = 0; /*0x35739*/
n4 = 4; /*0x35740*/
v74 = -1; /*0x3574b*/
v75 = 0; /*0x35753*/
n55 = 55; /*0x3575b*/
n2 = 2; /*0x35766*/
v78 = 1; /*0x35776*/
v79 = 0; /*0x3577e*/
n1824 = 1824; /*0x35785*/
n12 = 12; /*0x3578d*/
v81 = -1; /*0x35798*/
result = 4294967280LL; /*0x357a0*/
v82 = 0; /*0x357a3*/
n61 = 61; /*0x357ab*/
n128_1 = 128; /*0x357b6*/
v85 = 1; /*0x357c1*/
v86 = 0; /*0x357c9*/
v87 = 0; /*0x357d0*/
v88 = -1; /*0x357d7*/
v89 = 0; /*0x357df*/
n15 = 15; /*0x357e7*/
n256_1 = 256; /*0x357f2*/
v92 = 0; /*0x357fa*/
v93 = 0; /*0x35802*/
v94 = 1; /*0x35809*/
v96 = 0; /*0x35810*/
if ( a3 ) /*0x3581b*/
return Nii_37268(a1, (__int64)&v7, 0xDu, a2, a3, a4, a5, a6); /*0x3584b*/
return result; /*0x35860*/
}
// Function: NiiGetStringLen @ 0x35868 (0x86 bytes)
_BYTE *__fastcall NiiGetStringLen(unsigned int a1, _BYTE *a2)
{
_BYTE *v2; // r8
char *v3; // r9
char v4; // al
char v6[16]; // [rsp+0h] [rbp-38h] BYREF
char _0123456789ABCDEF[40]; // [rsp+10h] [rbp-28h] BYREF
v2 = a2; /*0x35873*/
strcpy(_0123456789ABCDEF, "0123456789ABCDEF"); /*0x3587e*/
if ( a1 ) /*0x35897*/
{
v3 = v6; /*0x358a2*/
do /*0x358c9*/
{
v4 = _0123456789ABCDEF[a1 % 0xA]; /*0x358bb*/
a1 /= 0xAu; /*0x358bf*/
*v3++ = v4; /*0x358c1*/
}
while ( a1 ); /*0x358c9*/
while ( v3 > v6 ) /*0x358e0*/
*v2++ = *--v3; /*0x358d3*/
}
else
{
*a2 = 48; /*0x35899*/
v2 = a2 + 1; /*0x3589d*/
}
*v2 = 0; /*0x358e2*/
return a2; /*0x358e9*/
}
// Function: NiiTokenGet @ 0x358f0 (0xb3 bytes)
_BYTE *__fastcall NiiTokenGet(unsigned int a1, _BYTE *enabled, int n16)
{
unsigned int v3; // r11d
_BYTE *v6; // r8
unsigned __int8 n2; // r10
char *v8; // r9
__int64 v9; // rdx
__int64 n2_1; // rcx
_BYTE *enabled_1; // rdx
char v13[16]; // [rsp+0h] [rbp-38h] BYREF
char _0123456789ABCDEF[40]; // [rsp+10h] [rbp-28h] BYREF
v3 = a1; /*0x358fd*/
strcpy(_0123456789ABCDEF, "0123456789ABCDEF"); /*0x35905*/
if ( a1 ) /*0x35925*/
{
n2 = 2; /*0x35934*/
v8 = v13; /*0x35937*/
while ( v3 ) /*0x3595f*/
{
v9 = v3 % 0x10; /*0x35945*/
v3 /= 0x10u; /*0x35947*/
*v8++ = _0123456789ABCDEF[v9]; /*0x3594e*/
if ( n2 ) /*0x35957*/
--n2; /*0x35959*/
}
if ( n2 ) /*0x35968*/
{
n2_1 = n2; /*0x3596a*/
enabled_1 = enabled; /*0x3596d*/
do /*0x3597a*/
{
*enabled_1++ = 48; /*0x35970*/
--n2_1; /*0x35976*/
}
while ( n2_1 ); /*0x3597a*/
}
v6 = &enabled[n2]; /*0x3597c*/
while ( v8 > v13 ) /*0x35994*/
*v6++ = *--v8; /*0x35987*/
}
else
{
*enabled = 48; /*0x35927*/
v6 = enabled + 2; /*0x3592a*/
enabled[1] = 48; /*0x3592e*/
}
*v6 = 0; /*0x35996*/
return enabled; /*0x3599d*/
}
// Function: NiiTokenSet @ 0x359a4 (0x41 bytes)
_BYTE *__fastcall NiiTokenSet(_BYTE *enabled, const char *a2, __int64 a3)
{
_BYTE *enabled_1; // r9
if ( !a3 ) /*0x359a7*/
return enabled; /*0x359a9*/
if ( !enabled ) /*0x359b0*/
return 0; /*0x359b2*/
enabled_1 = enabled; /*0x359b5*/
while ( *a2 ) /*0x359ce*/
{
if ( !a3 ) /*0x359bd*/
return enabled_1; /*0x359bd*/
*enabled++ = *a2++; /*0x359bf*/
--a3; /*0x359c7*/
}
for ( ; a3; --a3 ) /*0x359d3*/
*enabled++ = 0; /*0x359d5*/
return enabled_1; /*0x359ac*/
}
// Function: NiiTokenApply @ 0x359e8 (0x40 bytes)
__int64 __fastcall NiiTokenApply(_BYTE *a1, const char *enabled, __int64 a3)
{
_BYTE *v3; // rax
int v5; // ecx
__int64 v7; // r10
__int64 v8; // r11
v3 = a1; /*0x359ee*/
v5 = 0; /*0x359f4*/
if ( v3 && *v3 ) /*0x359fe*/
{
do /*0x35a07*/
{
++v3; /*0x35a02*/
++v5; /*0x35a05*/
}
while ( *v3 ); /*0x35a07*/
}
NiiTokenSet(&a1[v5], enabled, a3); /*0x35a15*/
*(_BYTE *)(v7 + a3) = 0; /*0x35a1a*/
return v8; /*0x35a22*/
}
// Function: NiiIpToString @ 0x35a28 (0x138 bytes)
void __fastcall NiiIpToString(_BYTE *j, unsigned int a2)
{
_BYTE *j_1; // rbx
int *v4; // rdi
_BYTE *j_2; // rcx
int *v6; // r8
char v7; // al
_BYTE *j_3; // rcx
_BYTE *j_4; // rdx
char i; // al
_BYTE *j_6; // r11
int *v12; // r10
_BYTE *j_5; // rcx
char j_11; // al
_BYTE *j_7; // rcx
_BYTE *j_8; // rdx
char k; // al
_BYTE *j_10; // r11
_BYTE *j_9; // rcx
char j_12; // al
j_1 = j; /*0x35a37*/
NiiGetStringLen(HIBYTE(a2), j); /*0x35a4a*/
v4 = &dword_1A30C; /*0x35a4f*/
j_2 = j_1; /*0x35a59*/
v6 = &dword_1A30C; /*0x35a5c*/
if ( j_1 ) /*0x35a62*/
{
if ( *j_1 ) /*0x35a64*/
{
do /*0x35a6c*/
++j_2; /*0x35a69*/
while ( *j_2 ); /*0x35a6c*/
}
do /*0x35a7f*/
{
v7 = *(_BYTE *)v6; /*0x35a71*/
v6 = (int *)((char *)v6 + 1); /*0x35a74*/
*j_2++ = v7; /*0x35a77*/
}
while ( v7 ); /*0x35a7f*/
}
j_3 = j_1; /*0x35a81*/
j_4 = 0; /*0x35a84*/
if ( j_1 ) /*0x35a8a*/
{
for ( i = *j_1; i; i = *j_3 ) /*0x35a8c*/
++j_3; /*0x35a90*/
j_4 = j_3; /*0x35a9a*/
}
NiiGetStringLen(BYTE2(a2), j_4); /*0x35aab*/
v12 = &dword_1A30C; /*0x35ab0*/
j_5 = j_1; /*0x35ab3*/
if ( j_1 != j_6 ) /*0x35ab9*/
{
if ( *j_1 != (_BYTE)j_6 ) /*0x35abe*/
{
do /*0x35ac6*/
++j_5; /*0x35ac0*/
while ( *j_5 != (_BYTE)j_6 ); /*0x35ac6*/
}
do /*0x35ad6*/
{
j_11 = *(_BYTE *)v12; /*0x35ac8*/
v12 = (int *)((char *)v12 + 1); /*0x35acb*/
*j_5++ = j_11; /*0x35ace*/
}
while ( j_11 != (_BYTE)j_6 ); /*0x35ad6*/
}
j_7 = j_1; /*0x35ad8*/
j_8 = j_6; /*0x35adb*/
if ( j_1 != j_6 ) /*0x35ae1*/
{
for ( k = *j_1; k != (_BYTE)j_6; k = *j_7 ) /*0x35ae3*/
++j_7; /*0x35ae7*/
j_8 = j_7; /*0x35af1*/
}
NiiGetStringLen(BYTE1(a2), j_8); /*0x35b02*/
j_9 = j_1; /*0x35b07*/
if ( j_1 != j_10 ) /*0x35b0d*/
{
if ( *j_1 != (_BYTE)j_10 ) /*0x35b12*/
{
do /*0x35b1a*/
++j_9; /*0x35b14*/
while ( *j_9 != (_BYTE)j_10 ); /*0x35b1a*/
}
do /*0x35b29*/
{
j_12 = *(_BYTE *)v4; /*0x35b1c*/
v4 = (int *)((char *)v4 + 1); /*0x35b1e*/
*j_9++ = j_12; /*0x35b21*/
}
while ( j_12 != (_BYTE)j_10 ); /*0x35b29*/
if ( j_1 != j_10 ) /*0x35b2e*/
{
while ( *j_1 != (_BYTE)j_10 ) /*0x35b3a*/
++j_1; /*0x35b32*/
j_10 = j_1; /*0x35b3c*/
}
}
NiiGetStringLen((unsigned __int8)a2, j_10); /*0x35b5b*/
}
// Function: NiiStringToIp @ 0x35b60 (0xa1 bytes)
__int64 __fastcall NiiStringToIp(char *Var22)
{
char *Var22_1; // r8
unsigned int v2; // r10d
__int16 i; // r9
char *Var22_2; // r11
char n48; // cl
unsigned __int8 v6; // dl
Var22_1 = Var22; /*0x35b6a*/
v2 = 0; /*0x35b6d*/
if ( *Var22 == 91 ) /*0x35b70*/
Var22_1 = Var22 + 1; /*0x35b72*/
for ( i = 24; ; i -= 8 ) /*0x35b75*/
{
Var22_2 = Var22_1; /*0x35b7b*/
if ( Var22_1 ) /*0x35b81*/
{
n48 = *Var22_1; /*0x35b83*/
v6 = 0; /*0x35b86*/
while ( n48 >= 48 && n48 <= 57 ) /*0x35b93*/
{
v6 = n48 + 10 * v6 - 48; /*0x35ba8*/
n48 = *++Var22_2; /*0x35baf*/
}
}
else
{
v6 = 0; /*0x35bb8*/
}
v2 |= v6 << i; /*0x35bc5*/
if ( !i ) /*0x35bcc*/
break; /*0x35bcc*/
if ( !Var22_1 ) /*0x35bd1*/
return 0; /*0x35bd1*/
while ( *Var22_1 != 46 ) /*0x35be3*/
{
if ( !*Var22_1 ) /*0x35bd9*/
return 0; /*0x35bd9*/
++Var22_1; /*0x35bdb*/
}
if ( !Var22_1 ) /*0x35be8*/
return 0; /*0x35bd5*/
++Var22_1; /*0x35bef*/
}
return v2; /*0x35c00*/
}
// Function: NiiValidateIpString @ 0x35c04 (0x8f bytes)
bool __fastcall NiiValidateIpString(_BYTE *Var22)
{
unsigned int n0xFF; // ebx
char n3; // r8
char n4; // r10
char v4; // dl
_BYTE *Var22_1; // rax
int v7; // r9d
char v8; // dl
char n46; // cl
n0xFF = 0; /*0x35c09*/
n3 = 0; /*0x35c0b*/
n4 = 0; /*0x35c0e*/
v4 = 0; /*0x35c11*/
Var22_1 = Var22; /*0x35c16*/
v7 = 1; /*0x35c19*/
if ( Var22 && *Var22 ) /*0x35c22*/
{
do /*0x35c2b*/
{
++Var22_1; /*0x35c26*/
++v4; /*0x35c29*/
}
while ( *Var22_1 ); /*0x35c2b*/
}
v8 = v4 - 1; /*0x35c2f*/
if ( v8 < 0 ) /*0x35c32*/
return 0; /*0x35c32*/
do /*0x35c7a*/
{
n46 = Var22[v8]; /*0x35c38*/
if ( n46 == 46 ) /*0x35c3f*/
{
++n3; /*0x35c41*/
n0xFF = 0; /*0x35c44*/
v7 = 1; /*0x35c46*/
}
else
{
if ( (unsigned __int8)(n46 - 48) > 9u ) /*0x35c51*/
return 0; /*0x35c51*/
if ( v7 == 1 ) /*0x35c57*/
++n4; /*0x35c59*/
n0xFF += v7 * (n46 - 48); /*0x35c66*/
if ( n0xFF > 0xFF ) /*0x35c6e*/
return 0; /*0x35c6e*/
v7 *= 10; /*0x35c74*/
}
--v8; /*0x35c77*/
}
while ( v8 >= 0 ); /*0x35c7a*/
return n3 == 3 && n4 == 4; /*0x35c86*/
}
// Function: NiiParseIpPrefixLen @ 0x35c94 (0x3b bytes)
char __fastcall NiiParseIpPrefixLen(char *a1)
{
char n48; // dl
while ( 1 ) /*0x35c96*/
{
n48 = *a1; /*0x35c96*/
if ( !*a1 ) /*0x35c96*/
break; /*0x35c96*/
++a1; /*0x35c9c*/
if ( (n48 < 48 || n48 > 57) /*0x35cc7*/
&& (n48 < 65 || n48 > 90)
&& (unsigned __int8)(n48 - 97) > 0x19u
&& n48 != 46
&& n48 != 58
&& n48 != 45 )
{
return 0; /*0x35ccb*/
}
}
return 1; /*0x35ccb*/
}
// Function: NiiStrToMac @ 0x35cd0 (0xe5 bytes)
__int64 __fastcall NiiStrToMac(char **a1, __int64 a2)
{
__int64 n6; // rsi
unsigned __int64 v3; // r10
__int64 n5; // r11
unsigned int v5; // r8d
char *v7; // r9
char n58; // dl
char v9; // dl
char *v10; // r9
n6 = 0; /*0x35cdf*/
v3 = 0; /*0x35ce1*/
n5 = 0; /*0x35ce4*/
v5 = 0; /*0x35ce7*/
if ( !a1 || !a2 ) /*0x35cfc*/
return 3362652165LL; /*0x35da0*/
v7 = *a1; /*0x35d02*/
while ( 1 ) /*0x35d0a*/
{
n58 = *v7; /*0x35d0a*/
if ( !*v7 ) /*0x35d0a*/
break; /*0x35d0a*/
if ( (unsigned __int8)(n58 - 65) <= 5u ) /*0x35d16*/
{
v9 = n58 - 55; /*0x35d18*/
goto LABEL_11; /*0x35d1b*/
}
if ( (unsigned __int8)(n58 - 97) <= 5u ) /*0x35d22*/
{
v9 = n58 - 87; /*0x35d24*/
goto LABEL_11; /*0x35d27*/
}
if ( (unsigned __int8)(n58 - 48) > 9u ) /*0x35d2e*/
{
if ( n58 != 58 && n58 != 45 || (v3 & 1) != 0 || (++n5, ++v7, n5 != n6) ) /*0x35d76*/
{
v5 = -932315131; /*0x35d78*/
break; /*0x35d78*/
}
}
else
{
v9 = n58 - 48; /*0x35d30*/
LABEL_11:
if ( (v3 & 1) != 0 ) /*0x35d39*/
{
*(_BYTE *)((v3 >> 1) + a2) |= v9; /*0x35d3e*/
++n6; /*0x35d41*/
}
else
{
*(_BYTE *)((v3 >> 1) + a2) = 16 * v9; /*0x35d4c*/
}
if ( ++v3 >= 0xC ) /*0x35d56*/
break; /*0x35d56*/
++v7; /*0x35d58*/
}
}
v10 = v7 + 1; /*0x35d7b*/
if ( n6 != 6 ) /*0x35d82*/
v5 = -932315131; /*0x35d82*/
if ( n5 && n5 != 5 ) /*0x35d8f*/
v5 = -932315131; /*0x35d8f*/
if ( !v5 ) /*0x35d96*/
*a1 = v10; /*0x35d98*/
return v5; /*0x35db4*/
}
// Function: UbaNoOp @ 0x35db8 (0x3 bytes)
void UbaNoOp()
{
; /*0x35db8*/
}
// Function: DxeRegister_43 @ 0x35dbc (0x35 bytes)
__int64 __fastcall DxeRegister_43(__int64 a1, int *a2)
{
*a2 |= 1u; /*0x35dc2*/
UtlRegisterAccess((__int64 *)a1, 0x10u, *a2); /*0x35dd0*/
UtlMicroStall((__int64 *)a1); /*0x35dd8*/
return UtlRegisterRead(*(_QWORD *)a1, *(unsigned __int16 *)(a1 + 1266)); /*0x35de7*/
}
// Function: DxeRegister_44 @ 0x35df4 (0x35 bytes)
__int64 __fastcall DxeRegister_44(__int64 a1, int *a2)
{
*a2 &= ~1u; /*0x35dfa*/
UtlRegisterAccess((__int64 *)a1, 0x10u, *a2); /*0x35e08*/
UtlMicroStall((__int64 *)a1); /*0x35e10*/
return UtlRegisterRead(*(_QWORD *)a1, *(unsigned __int16 *)(a1 + 1266)); /*0x35e1f*/
}
// Function: DxeRegister_14 @ 0x35e2c (0xd8 bytes)
char __fastcall DxeRegister_14(__int64 a1, unsigned __int16 a2, char a3)
{
int v6; // eax
unsigned int v7; // esi
int n2; // ecx
unsigned int v9; // eax
unsigned int v11; // [rsp+38h] [rbp+10h] BYREF
v6 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x35e4f*/
v7 = 1 << (a3 - 1); /*0x35e5d*/
n2 = *(_DWORD *)(a1 + 1248); /*0x35e5f*/
if ( n2 == 3 ) /*0x35e68*/
{
v6 &= ~8u; /*0x35e6a*/
}
else if ( n2 == 2 ) /*0x35e72*/
{
v6 |= 8u; /*0x35e74*/
}
while ( 1 ) /*0x35e7f*/
{
v9 = v6 & 0xFFFFFFFB; /*0x35e7f*/
v11 = v9; /*0x35e81*/
if ( (a2 & (unsigned __int16)v7) != 0 ) /*0x35e87*/
{
v9 |= 4u; /*0x35e89*/
v11 = v9; /*0x35e8c*/
}
UtlRegisterAccess((__int64 *)a1, 0x10u, v9); /*0x35e9b*/
UtlMicroStall((__int64 *)a1); /*0x35ea3*/
UtlRegisterRead(*(_QWORD *)a1, *(unsigned __int16 *)(a1 + 1266)); /*0x35eb2*/
DxeRegister_43(a1, (int *)&v11); /*0x35ebf*/
DxeRegister_44(a1, (int *)&v11); /*0x35ecc*/
v7 >>= 1; /*0x35ed1*/
if ( !v7 ) /*0x35ed3*/
break; /*0x35ed3*/
v6 = v11; /*0x35ed5*/
}
return UtlRegisterAccess((__int64 *)a1, 0x10u, v11 & 0xFFFFFFFB); /*0x35efa*/
}
// Function: DxeRegister_25 @ 0x35f04 (0x89 bytes)
__int16 __fastcall DxeRegister_25(__int64 *a1, unsigned __int16 n16)
{
__int64 n16_1; // rbx
__int16 v4; // di
int v5; // eax
int v7; // [rsp+38h] [rbp+10h] BYREF
n16_1 = n16; /*0x35f18*/
v4 = 0; /*0x35f28*/
v7 = UtlRegisterWrite(a1, 0x10u) & 0xFFFFFFF3; /*0x35f2d*/
if ( (_DWORD)n16_1 ) /*0x35f33*/
{
do /*0x35f73*/
{
v4 *= 2; /*0x35f40*/
DxeRegister_43((__int64)a1, &v7); /*0x35f43*/
v5 = UtlRegisterWrite(a1, 0x10u); /*0x35f50*/
v7 = v5 & 0xFFFFFFFB; /*0x35f58*/
if ( (v5 & 8) != 0 ) /*0x35f5e*/
v4 |= 1u; /*0x35f60*/
DxeRegister_44((__int64)a1, &v7); /*0x35f6b*/
--n16_1; /*0x35f70*/
}
while ( n16_1 ); /*0x35f73*/
}
return v4; /*0x35f87*/
}
// Function: RegRegister_42 @ 0x35f90 (0x5e bytes)
__int64 __fastcall RegRegister_42(__int64 *a1, int a2)
{
int v4; // ebx
unsigned int n20; // edx
v4 = 0; /*0x35fa4*/
while ( 1 ) /*0x35fa9*/
{
n20 = 20; /*0x35fa9*/
if ( a2 ) /*0x35fb0*/
n20 = 4140; /*0x35fb2*/
if ( (UtlRegisterWrite(a1, n20) & 2) != 0 ) /*0x35fbe*/
break; /*0x35fbe*/
UtlRegisterRead(*a1, 5); /*0x35fc8*/
if ( ++v4 >= (unsigned int)L"tion I218-V" ) /*0x35fd5*/
return 0xFFFFFFFFLL; /*0x35fda*/
}
return 0; /*0x35fe8*/
}
// Function: DxeRegister_26 @ 0x35ff0 (0x88 bytes)
__int64 __fastcall DxeRegister_26(__int64 *a1)
{
int v2; // eax
int n1000; // ebx
int v4; // eax
v2 = UtlRegisterWrite(a1, 0x10u); /*0x36009*/
n1000 = 1000; /*0x36016*/
UtlRegisterAccess(a1, 0x10u, v2 | 0x40); /*0x3601e*/
v4 = UtlRegisterWrite(a1, 0x10u); /*0x36028*/
do /*0x3604b*/
{
if ( (v4 & 0x80u) != 0 ) /*0x3602f*/
break; /*0x3602f*/
UtlRegisterRead(*a1, 5); /*0x36039*/
v4 = UtlRegisterWrite(a1, 0x10u); /*0x36043*/
--n1000; /*0x36048*/
}
while ( n1000 ); /*0x3604b*/
if ( n1000 ) /*0x3604f*/
return 0; /*0x36066*/
UtlRegisterAccess(a1, 0x10u, v4 & 0xFFFFFFBF); /*0x3605c*/
return 0xFFFFFFFFLL; /*0x36072*/
}
// Function: DxeRegister_12 @ 0x36078 (0x103 bytes)
__int64 __fastcall DxeRegister_12(__int64 a1)
{
int v2; // edi
__int64 n2; // rax
int v4; // edi
unsigned int v5; // [rsp+30h] [rbp+8h] BYREF
v2 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x36096*/
n2 = *(unsigned int *)(a1 + 1248); /*0x36098*/
if ( (_DWORD)n2 == 3 ) /*0x360a1*/
{
v5 = v2 & 0xFFFFFFFC; /*0x360ae*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v2 & 0xFFFFFFFC); /*0x360b2*/
UtlMicroStall((__int64 *)a1); /*0x360ba*/
UtlRegisterRead(*(_QWORD *)a1, *(unsigned __int16 *)(a1 + 1266)); /*0x360c9*/
DxeRegister_43(a1, (int *)&v5); /*0x360d6*/
v5 |= 2u; /*0x360e9*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v5); /*0x360ee*/
UtlMicroStall((__int64 *)a1); /*0x360f6*/
UtlRegisterRead(*(_QWORD *)a1, *(unsigned __int16 *)(a1 + 1266)); /*0x36105*/
return DxeRegister_44(a1, (int *)&v5); /*0x36112*/
}
else if ( (_DWORD)n2 == 2 ) /*0x3611c*/
{
v4 = v2 | 2; /*0x3611e*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v4); /*0x36128*/
UtlMicroStall((__int64 *)a1); /*0x36130*/
UtlRegisterRead(*(_QWORD *)a1, *(unsigned __int16 *)(a1 + 1266)); /*0x3613f*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v4 & 0xFFFFFFFD); /*0x3614f*/
UtlMicroStall((__int64 *)a1); /*0x36157*/
return UtlRegisterRead(*(_QWORD *)a1, *(unsigned __int16 *)(a1 + 1266)); /*0x36166*/
}
return n2; /*0x36175*/
}
// Function: DxeRegister_27 @ 0x3617c (0x7f bytes)
char __fastcall DxeRegister_27(__int64 a1)
{
int v2; // eax
int n2; // ecx
int v4; // eax
unsigned int v6; // [rsp+30h] [rbp+8h] BYREF
v2 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x3618a*/
n2 = *(_DWORD *)(a1 + 1248); /*0x3618f*/
if ( n2 == 2 ) /*0x36198*/
{
v6 = v2 | 2; /*0x3619c*/
LABEL_5:
DxeRegister_44(a1, (int *)&v6); /*0x361c9*/
goto LABEL_6; /*0x361d1*/
}
if ( n2 == 3 ) /*0x361a5*/
{
v6 = v2 & 0xFFFFFFF9; /*0x361b3*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v2 & 0xFFFFFFF9); /*0x361b7*/
DxeRegister_43(a1, (int *)&v6); /*0x361c4*/
goto LABEL_5; /*0x361c4*/
}
LABEL_6:
v4 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x361d6*/
return UtlRegisterAccess((__int64 *)a1, 0x10u, v4 & 0xFFFFFFBF); /*0x361f1*/
}
// Function: DxeRegister_52 @ 0x361fc (0xe7 bytes)
__int64 __fastcall DxeRegister_52(__int64 a1)
{
int v2; // edi
int n3; // eax
unsigned int v4; // edi
__int16 n5000; // si
v2 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x36218*/
n3 = *(_DWORD *)(a1 + 1248); /*0x3621a*/
if ( n3 == 3 ) /*0x36223*/
{
v4 = v2 & 0xFFFFFFFA; /*0x36225*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v4); /*0x36231*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v4 | 2); /*0x36244*/
return 0; /*0x36249*/
}
if ( n3 != 2 ) /*0x3625e*/
return 0; /*0x3625e*/
n5000 = 5000; /*0x3626c*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v2 & 0xFFFFFFFC); /*0x36271*/
UtlMicroStall((__int64 *)a1); /*0x36279*/
UtlRegisterRead(*(_QWORD *)a1, 1); /*0x36286*/
do /*0x362d0*/
{
DxeRegister_14(a1, 5u, *(_WORD *)(a1 + 1270)); /*0x3629d*/
if ( (DxeRegister_25((__int64 *)a1, 8u) & 1) == 0 ) /*0x362b1*/
break; /*0x362b1*/
UtlRegisterRead(*(_QWORD *)a1, 5); /*0x362b9*/
DxeRegister_12(a1); /*0x362c1*/
--n5000; /*0x362cc*/
}
while ( n5000 ); /*0x362d0*/
if ( n5000 ) /*0x362d5*/
return 0; /*0x362d5*/
return 0xFFFFFFFFLL; /*0x36255*/
}
// Function: DxeRegister_50 @ 0x362e4 (0x11b bytes)
__int64 __fastcall DxeRegister_50(__int64 a1, unsigned __int16 n0x80, unsigned __int16 a3, _WORD *a4)
{
unsigned __int16 n0x80_1; // ax
unsigned __int8 n3; // r12
__int64 v9; // r13
__int64 result; // rax
unsigned int v11; // ebp
__int64 v12; // rdi
n0x80_1 = *(_WORD *)(a1 + 1264); /*0x36301*/
n3 = 3; /*0x36311*/
if ( n0x80 >= n0x80_1 ) /*0x36317*/
return 0xFFFFFFFFLL; /*0x36317*/
v9 = a3; /*0x36324*/
if ( a3 > n0x80_1 - n0x80 || !a3 ) /*0x3633b*/
return 0xFFFFFFFFLL; /*0x363dd*/
result = (*(__int64 (**)(void))(a1 + 1152))(); /*0x36341*/
if ( !(_DWORD)result ) /*0x3634a*/
{
v11 = DxeRegister_52(a1); /*0x36358*/
if ( !v11 ) /*0x3635d*/
{
DxeRegister_12(a1); /*0x36362*/
if ( *(_WORD *)(a1 + 1268) == 8 ) /*0x3636f*/
{
n3 = 3; /*0x36375*/
if ( n0x80 >= 0x80u ) /*0x3637f*/
n3 = 11; /*0x3637f*/
}
DxeRegister_14(a1, n3, *(_WORD *)(a1 + 1270)); /*0x36392*/
DxeRegister_14(a1, 2 * n0x80, *(_WORD *)(a1 + 1268)); /*0x363a5*/
if ( (_DWORD)v9 ) /*0x363ad*/
{
v12 = v9; /*0x363af*/
do /*0x363ce*/
{
*a4++ = __ROL2__(DxeRegister_25((__int64 *)a1, 0x10u), 8); /*0x363c3*/
--v12; /*0x363ca*/
}
while ( v12 ); /*0x363ce*/
}
}
(*(void (__fastcall **)(__int64))(a1 + 1168))(a1); /*0x363d3*/
return v11; /*0x363d9*/
}
return result; /*0x363f4*/
}
// Function: NiiTransmit @ 0x36400 (0xc3 bytes)
__int64 __fastcall NiiTransmit(__int64 a1, unsigned __int16 i, unsigned __int16 n512, _WORD *a4)
{
unsigned __int16 i_1; // ax
unsigned int n512_1; // ebx
unsigned int n512_2; // esi
int v9; // ebp
unsigned int v10; // edi
i_1 = *(_WORD *)(a1 + 1264); /*0x3641d*/
if ( i >= i_1 ) /*0x36433*/
return 0xFFFFFFFFLL; /*0x36433*/
n512_1 = n512; /*0x3643b*/
if ( n512 > i_1 - i || !n512 ) /*0x36449*/
return 0xFFFFFFFFLL; /*0x364a1*/
n512_2 = 0; /*0x3644b*/
v9 = 4 * i + 1; /*0x36453*/
do /*0x3649b*/
{
UtlRegisterAccess((__int64 *)a1, 0x14u, v9); /*0x36465*/
v10 = RegRegister_42((__int64 *)a1, 0); /*0x36474*/
if ( v10 ) /*0x36479*/
break; /*0x36479*/
++n512_2; /*0x36488*/
v9 += 4; /*0x3648a*/
*a4++ = (unsigned int)UtlRegisterWrite((__int64 *)a1, 0x14u) >> 16; /*0x36490*/
}
while ( n512_2 < n512_1 ); /*0x3649b*/
return v10; /*0x364b8*/
}
// Function: RegRegister_10 @ 0x364c4 (0x188 bytes)
__int64 __fastcall RegRegister_10(__int64 a1, unsigned __int16 a2, unsigned __int16 a3, __int64 a4)
{
unsigned int v5; // edi
unsigned __int16 v6; // ax
unsigned __int16 v10; // r12
int v11; // r14d
unsigned __int8 n2; // bp
__int64 result; // rax
v5 = -1; /*0x364e5*/
v6 = *(_WORD *)(a1 + 1264); /*0x364e8*/
v10 = 0; /*0x364fa*/
if ( a2 >= v6 ) /*0x36501*/
return v5; /*0x36501*/
v11 = a2; /*0x3650b*/
if ( a3 > v6 - a2 || !a3 ) /*0x36521*/
return v5; /*0x3662d*/
while ( 1 ) /*0x36530*/
{
n2 = 2; /*0x36530*/
result = (*(__int64 (__fastcall **)(__int64))(a1 + 1152))(a1); /*0x36533*/
if ( (_DWORD)result ) /*0x3653b*/
return result; /*0x3663e*/
v5 = DxeRegister_52(a1); /*0x3654c*/
if ( v5 ) /*0x36550*/
{
(*(void (__fastcall **)(__int64))(a1 + 1168))(a1); /*0x36627*/
return v5; /*0x36627*/
}
DxeRegister_12(a1); /*0x36556*/
DxeRegister_14(a1, 6u, *(_WORD *)(a1 + 1270)); /*0x36569*/
DxeRegister_12(a1); /*0x36571*/
if ( *(_WORD *)(a1 + 1268) == 8 ) /*0x3657e*/
{
n2 = 2; /*0x36583*/
if ( a2 >= (unsigned __int16)(v5 + 128) ) /*0x3658e*/
n2 = v5 + 10; /*0x3658e*/
}
DxeRegister_14(a1, n2, *(_WORD *)(a1 + 1270)); /*0x365a0*/
DxeRegister_14(a1, 2 * (a2 + v10), *(_WORD *)(a1 + 1268)); /*0x365b8*/
while ( v10 < a3 ) /*0x365f9*/
{
DxeRegister_14(a1, __ROL2__(*(_WORD *)(a4 + 2LL * v10++), 8), 16); /*0x365d5*/
if ( !(2 * (v11 + v10) % *(unsigned __int16 *)(a1 + 1272)) ) /*0x365f3*/
{
DxeRegister_12(a1); /*0x36600*/
break; /*0x36600*/
}
}
UtlRegisterRead(*(_QWORD *)a1, 10000); /*0x36605*/
(*(void (__fastcall **)(__int64))(a1 + 1168))(a1); /*0x36615*/
if ( v10 >= a3 ) /*0x3661f*/
return v5; /*0x3661f*/
}
}
// Function: NiiSnpTransmit @ 0x3664c (0x1ea bytes)
__int64 __fastcall NiiSnpTransmit(__int64 a1, __int64 *p_Var15, int n15)
{
__int64 result; // rax
unsigned __int16 v6; // cx
unsigned __int8 v7; // al
unsigned __int16 v8; // cx
char v9; // al
__int64 n10; // rcx
unsigned __int8 Var15; // al
char v12; // al
unsigned __int16 v13; // cx
int v14; // esi
int v15; // eax
__int64 v16; // rdx
unsigned __int16 v17[20]; // [rsp+20h] [rbp-28h] BYREF
unsigned __int16 v18; // [rsp+50h] [rbp+8h] BYREF
unsigned __int16 v19; // [rsp+68h] [rbp+20h] BYREF
if ( *(int *)(a1 + 268) >= 19 && (UtlRegisterWrite((__int64 *)a1, 0x10u) & 0x80000) == 0 ) /*0x3667b*/
return 4294967278LL; /*0x3667b*/
if ( !p_Var15 ) /*0x36686*/
return 4294967280LL; /*0x3668b*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, unsigned __int16 *))(a1 + 1160))(a1, 8, 1, &v19); /*0x366a6*/
if ( !(_DWORD)result ) /*0x366ae*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, unsigned __int16 *))(a1 + 1160))(a1, 9, 1, &v18); /*0x366c4*/
if ( !(_DWORD)result ) /*0x366cc*/
{
v6 = v19; /*0x366d2*/
if ( v19 != 0xFAFA ) /*0x366df*/
{
*((_BYTE *)p_Var15 + 6) = 45; /*0x366e8*/
*((_BYTE *)p_Var15 + 7) = 0; /*0x366ec*/
*((_BYTE *)p_Var15 + 10) = 0; /*0x366f4*/
*(_BYTE *)p_Var15 = (v6 >> 12) & 0xF; /*0x366fa*/
*((_BYTE *)p_Var15 + 1) = HIBYTE(v6) & 0xF; /*0x36705*/
v7 = v6; /*0x36708*/
*((_BYTE *)p_Var15 + 3) = v6 & 0xF; /*0x36710*/
v8 = v18; /*0x36713*/
*((_BYTE *)p_Var15 + 2) = v7 >> 4; /*0x3671a*/
*((_BYTE *)p_Var15 + 4) = (v8 >> 12) & 0xF; /*0x36726*/
*((_BYTE *)p_Var15 + 5) = HIBYTE(v8) & 0xF; /*0x36732*/
v9 = (unsigned __int8)v8 >> 4; /*0x3673a*/
*((_BYTE *)p_Var15 + 9) = v8 & 0xF; /*0x3673f*/
n10 = 10; /*0x36742*/
*((_BYTE *)p_Var15 + 8) = v9; /*0x36747*/
while ( 1 ) /*0x3674a*/
{
Var15 = *(_BYTE *)p_Var15; /*0x3674a*/
if ( *(_BYTE *)p_Var15 < 0xAu ) /*0x3674e*/
break; /*0x3674e*/
if ( Var15 < 0x10u ) /*0x36756*/
{
v12 = Var15 + 55; /*0x36758*/
goto LABEL_13; /*0x36758*/
}
LABEL_14:
p_Var15 = (__int64 *)((char *)p_Var15 + 1); /*0x3675c*/
if ( !--n10 ) /*0x36762*/
return 0; /*0x36762*/
}
v12 = Var15 + 48; /*0x36750*/
LABEL_13:
*(_BYTE *)p_Var15 = v12; /*0x3675a*/
goto LABEL_14; /*0x3675a*/
}
result = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, unsigned __int16 *))(a1 + 1160))(a1, v18, 1, v17); /*0x3677b*/
if ( !(_DWORD)result ) /*0x36783*/
{
v13 = v17[0]; /*0x36789*/
if ( v17[0] != 0xFFFF && v17[0] ) /*0x3679f*/
{
if ( 2 * (unsigned int)v17[0] - 1 > 0xF ) /*0x367ab*/
return 4294967279LL; /*0x367ad*/
v15 = v18; /*0x367b4*/
v14 = 0; /*0x367bc*/
LOWORD(v15) = v18 + 1; /*0x367bf*/
--v17[0]; /*0x367c3*/
++v18; /*0x367c8*/
if ( v13 == 1 ) /*0x367d0*/
{
LABEL_25:
*((_BYTE *)p_Var15 + 2 * (unsigned __int16)v14) = 0; /*0x36812*/
return 0; /*0x36764*/
}
else
{
while ( 1 ) /*0x367e0*/
{
result = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, unsigned __int16 *))(a1 + 1160))( /*0x367e0*/
a1,
(unsigned int)(v15 + v14),
1,
&v19);
if ( (_DWORD)result ) /*0x367e8*/
break; /*0x367e8*/
v16 = (unsigned __int16)v14; /*0x367ef*/
LOWORD(v14) = v14 + 1; /*0x367f2*/
v15 = v19; /*0x367f6*/
*((_BYTE *)p_Var15 + 2 * v16 + 1) = v19; /*0x367f9*/
*((_BYTE *)p_Var15 + 2 * v16) = BYTE1(v15); /*0x36801*/
if ( (unsigned __int16)v14 >= v17[0] ) /*0x36809*/
goto LABEL_25; /*0x36809*/
LOWORD(v15) = v18; /*0x3680b*/
}
}
return result; /*0x367b2*/
}
return 4294967278LL; /*0x3681e*/
}
}
}
return result; /*0x3682d*/
}
// Function: NiiSnpInitialize @ 0x36b44 (0xab bytes)
__int64 __fastcall NiiSnpInitialize(__int64 *a1)
{
unsigned int v2; // ebp
unsigned int v3; // eax
unsigned __int16 n2; // r8
unsigned int v5; // esi
unsigned __int16 n4; // ax
char *v7; // rdi
char v8; // cl
char *v9; // rdi
char v10; // cl
v2 = UtlRegisterWrite(a1, 0x5404u); /*0x36b6d*/
v3 = UtlRegisterWrite(a1, 0x5400u); /*0x36b6f*/
n2 = 0; /*0x36b74*/
v5 = v3; /*0x36b77*/
n4 = 0; /*0x36b79*/
v7 = (char *)a1 + 262; /*0x36b81*/
do /*0x36b9f*/
{
v8 = n4++; /*0x36b88*/
*v7++ = v5 >> (8 * v8); /*0x36b96*/
}
while ( n4 < 4u ); /*0x36b9f*/
v9 = (char *)a1 + 266; /*0x36ba1*/
do /*0x36bc1*/
{
v10 = n2++; /*0x36ba8*/
*v9++ = v2 >> (8 * v10); /*0x36bb7*/
}
while ( n2 < 2u ); /*0x36bc1*/
qmemcpy(a1 + 32, (char *)a1 + 262, 6u); /*0x36be2*/
return 0; /*0x36be9*/
}
// Function: NiiParseMacString @ 0x36bf0 (0x65 bytes)
__int64 __fastcall NiiParseMacString(__int64 a1)
{
__int16 v2; // bx
unsigned __int16 v3; // di
__int64 result; // rax
__int16 v5; // [rsp+48h] [rbp+10h] BYREF
v2 = 0; /*0x36c0b*/
v3 = 0; /*0x36c0e*/
while ( 1 ) /*0x36c1f*/
{
result = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, __int16 *))(a1 + 1160))(a1, v3, 1, &v5); /*0x36c1f*/
if ( (_DWORD)result ) /*0x36c27*/
break; /*0x36c27*/
v2 += v5; /*0x36c29*/
if ( ++v3 >= 0x40u ) /*0x36c36*/
return (unsigned int)-(v2 != -17734); /*0x36c40*/
}
return result; /*0x36c4c*/
}
// Function: NvmCalcProtocolChecksum @ 0x36c58 (0x8a bytes)
__int64 __fastcall NvmCalcProtocolChecksum(__int64 a1)
{
unsigned __int16 n0x3F; // bx
__int64 result; // rax
__int16 v4; // cx
__int16 v5; // [rsp+48h] [rbp+10h] BYREF
__int16 v6; // [rsp+50h] [rbp+18h] BYREF
v5 = 0; /*0x36c76*/
n0x3F = 0; /*0x36c7b*/
while ( 1 ) /*0x36c8c*/
{
result = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, __int16 *))(a1 + 1160))(a1, n0x3F, 1, &v6); /*0x36c8c*/
if ( (_DWORD)result ) /*0x36c94*/
break; /*0x36c94*/
++n0x3F; /*0x36c9b*/
v4 = v6 + v5; /*0x36c9e*/
v5 += v6; /*0x36ca3*/
if ( n0x3F >= 0x3Fu ) /*0x36cac*/
{
v5 = -17734 - v4; /*0x36cc4*/
return (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1208))(a1, 63, 1, &v5); /*0x36cc9*/
}
}
return result; /*0x36cd9*/
}
// Function: NiiArpInit @ 0x36ce4 (0x44 bytes)
char __fastcall NiiArpInit(__int64 *a1)
{
int v2; // eax
UtlRegisterRead(*a1, 10); /*0x36cf5*/
v2 = UtlRegisterWrite(a1, 0x18u); /*0x36d02*/
UtlRegisterAccess(a1, 0x18u, v2 | 0x2000); /*0x36d16*/
return UtlMicroStall(a1); /*0x36d1e*/
}
// Function: NiiDhcpCallback @ 0x36d28 (0x11b bytes)
__int64 __fastcall NiiDhcpCallback(
__int64 NicConfig,
unsigned int *DhcpData,
__int64 AddrBuffer,
unsigned int BufferSize)
{
__int64 IpAddress; // rdx
__int64 result; // rax
unsigned int Status; // edi
__int64 (__fastcall *ReadFunc)(__int64, _QWORD, __int64, __int16 *); // rax
unsigned __int16 AddressWord; // cx
__int64 (__fastcall *WriteFunc)(__int64, __int64, __int64, _WORD *); // rax
_WORD v14[28]; // [rsp+20h] [rbp-38h] BYREF
__int16 IpAddress_1; // [rsp+68h] [rbp+10h] BYREF
IpAddress = 0; /*0x36d47*/
IpAddress_1 = 0; /*0x36d51*/
if ( !DhcpData ) /*0x36d59*/
return 4294967280LL; /*0x36d59*/
if ( DhcpData[4] ) /*0x36d65*/
return 0; /*0x36d69*/
Status = -3; /*0x36d72*/
if ( !*((_BYTE *)DhcpData + 8) ) /*0x36d7f*/
{
LABEL_15:
if ( DhcpData[1] == 128 ) /*0x36dd2*/
{
LOWORD(IpAddress) = IpAddress + 1; /*0x36dd4*/
IpAddress_1 = IpAddress; /*0x36dd8*/
if ( !AddrBuffer ) /*0x36de0*/
{
WriteFunc = *(__int64 (__fastcall **)(__int64, __int64, __int64, _WORD *))(NicConfig + 1160); /*0x36dfd*/
if ( WriteFunc ) /*0x36e07*/
Status = WriteFunc(NicConfig, IpAddress, 1, v14); /*0x36e16*/
if ( Status ) /*0x36e1b*/
return Status; /*0x36e1b*/
AddressWord = v14[0]; /*0x36e1d*/
LABEL_23:
DhcpData[4] = AddressWord >> 1; /*0x36e22*/
return Status; /*0x36e2a*/
}
if ( (unsigned int)(unsigned __int16)IpAddress + 1 <= BufferSize ) /*0x36deb*/
{
Status = 0; /*0x36df4*/
AddressWord = *(_WORD *)(AddrBuffer + 2LL * (unsigned __int16)IpAddress); /*0x36df7*/
goto LABEL_23; /*0x36dfb*/
}
}
return 4294967280LL; /*0x36d60*/
}
if ( AddrBuffer ) /*0x36d84*/
{
if ( *DhcpData > BufferSize ) /*0x36d89*/
return 4294967280LL; /*0x36d89*/
LOWORD(IpAddress) = *(_WORD *)(AddrBuffer + 2LL * *DhcpData); /*0x36d8d*/
goto LABEL_13; /*0x36d92*/
}
ReadFunc = *(__int64 (__fastcall **)(__int64, _QWORD, __int64, __int16 *))(NicConfig + 1160); /*0x36d94*/
if ( ReadFunc ) /*0x36d9e*/
{
result = ReadFunc(NicConfig, *(unsigned __int16 *)DhcpData, 1, &IpAddress_1); /*0x36dab*/
LOWORD(IpAddress) = IpAddress_1; /*0x36dad*/
}
else
{
result = 4294967293LL; /*0x36db4*/
}
if ( !(_DWORD)result ) /*0x36db9*/
{
LABEL_13:
if ( (_WORD)IpAddress == 0xFFFF ) /*0x36dc3*/
{
DhcpData[4] = 0; /*0x36dc5*/
return 0; /*0x36d6d*/
}
goto LABEL_15; /*0x36dc3*/
}
return result; /*0x36e36*/
}
// Function: NiiMcastIpToMac @ 0x36e44 (0x1c6 bytes)
__int64 __fastcall NiiMcastIpToMac(__int64 a1, __int64 a2, unsigned __int16 a3, _WORD *a4, unsigned int a5)
{
_WORD *v5; // r10
__int64 result; // rax
unsigned __int16 v11; // cx
unsigned __int16 v12; // bp
unsigned int v13; // r15d
unsigned int *v14; // rdi
_WORD *v15; // r9
__int64 v16; // rdx
_WORD *v17; // rdx
__int64 v18; // r8
_BYTE *v19; // rcx
_WORD *v20; // rax
__int64 v21; // rdx
_WORD *v22; // rax
unsigned int v23; // eax
unsigned __int16 v24; // cx
int v25; // r8d
unsigned int v26; // edx
__int64 v27; // rax
unsigned __int16 v28; // [rsp+58h] [rbp+10h] BYREF
v5 = 0; /*0x36e5b*/
if ( !a2 ) /*0x36e6e*/
return 4294967280LL; /*0x36e75*/
v11 = 0; /*0x36e7a*/
if ( a3 ) /*0x36e88*/
{
while ( *(_QWORD *)(32LL * v11 + a2 + 24) ) /*0x36e96*/
{
if ( ++v11 >= a3 ) /*0x36e9f*/
goto LABEL_6; /*0x36e9f*/
}
return 4294967280LL; /*0x36e96*/
}
LABEL_6:
v12 = 0; /*0x36ea1*/
if ( a3 ) /*0x36ea9*/
{
v13 = a5; /*0x36eaf*/
while ( 1 ) /*0x36ebb*/
{
v14 = (unsigned int *)(a2 + 32LL * v12); /*0x36ebb*/
if ( !v14 || (v15 = (_WORD *)*((_QWORD *)v14 + 3), v15 == v5) ) /*0x36ecb*/
{
result = 4294967280LL; /*0x36fd9*/
goto LABEL_33; /*0x36fd9*/
}
if ( *((_BYTE *)v14 + 8) != (_BYTE)v5 ) /*0x36ed5*/
break; /*0x36ed5*/
v16 = *v14; /*0x36ed7*/
if ( a4 != v5 ) /*0x36ee2*/
{
if ( (unsigned int)v16 + v14[4] > v13 ) /*0x36ee7*/
return 4294967280LL; /*0x36ee7*/
v17 = &a4[v16]; /*0x36eeb*/
v18 = 2 * v14[4]; /*0x36eef*/
v19 = (_BYTE *)*((_QWORD *)v14 + 3); /*0x36ef3*/
LABEL_27:
UtlMemCpy(v19, v17, v18); /*0x36f9e*/
result = (unsigned int)v5; /*0x36fa3*/
goto LABEL_33; /*0x36fa6*/
}
v20 = *(_WORD **)(a1 + 1160); /*0x36efb*/
if ( v20 != v5 ) /*0x36f05*/
{
v21 = *(unsigned __int16 *)v14; /*0x36f07*/
LABEL_30:
result = ((__int64 (__fastcall *)(__int64, __int64, _QWORD, _WORD *))v20)( /*0x36fbd*/
a1,
v21,
*((unsigned __int16 *)v14 + 8),
v15);
v5 = 0; /*0x36fc7*/
goto LABEL_33; /*0x36fca*/
}
result = 4294967293LL; /*0x36f0f*/
LABEL_33:
if ( (_DWORD)result != (_DWORD)v5 ) /*0x36fe1*/
return result; /*0x36fe1*/
if ( ++v12 >= a3 ) /*0x36fea*/
return 0; /*0x36fea*/
}
if ( a4 == v5 ) /*0x36f1c*/
{
v22 = *(_WORD **)(a1 + 1160); /*0x36f35*/
if ( v22 == v5 ) /*0x36f3f*/
{
result = 4294967293LL; /*0x36f57*/
}
else
{
result = ((__int64 (__fastcall *)(__int64, _QWORD, __int64, unsigned __int16 *))v22)( /*0x36f4c*/
a1,
*(unsigned __int16 *)v14,
1,
&v28);
v5 = 0; /*0x36f4e*/
}
if ( (_DWORD)result != (_DWORD)v5 ) /*0x36f5f*/
return result; /*0x36f5f*/
}
else
{
if ( *v14 > v13 ) /*0x36f21*/
return 4294967280LL; /*0x36f21*/
v28 = a4[*v14]; /*0x36f2e*/
}
v23 = v14[4]; /*0x36f6a*/
v24 = *((_WORD *)v14 + 6) + v28; /*0x36f6d*/
v25 = v24; /*0x36f71*/
v28 = v24; /*0x36f75*/
v26 = v24 + v23; /*0x36f7a*/
if ( a4 == v5 ) /*0x36f81*/
{
v20 = *(_WORD **)(a1 + 1160); /*0x36fa8*/
if ( v20 == v5 ) /*0x36fb2*/
{
result = 4294967293LL; /*0x36fcc*/
goto LABEL_33; /*0x36fd7*/
}
v15 = (_WORD *)*((_QWORD *)v14 + 3); /*0x36fb4*/
v21 = v28; /*0x36fb8*/
goto LABEL_30; /*0x36fb8*/
}
if ( v26 > v13 ) /*0x36f86*/
return 4294967280LL; /*0x36f86*/
v27 = v24; /*0x36f8f*/
v19 = (_BYTE *)*((_QWORD *)v14 + 3); /*0x36f92*/
v18 = 2 * (v26 - v25); /*0x36f96*/
v17 = &a4[v27]; /*0x36f9a*/
goto LABEL_27; /*0x36f9a*/
}
return 0; /*0x36ffc*/
}
// Function: Nii_3700c @ 0x3700c (0x1b3 bytes)
__int64 __fastcall Nii_3700c(__int64 a1, unsigned __int16 *a2, __int64 a3, unsigned int a4)
{
unsigned int v4; // r10d
unsigned int v9; // edi
unsigned int v10; // ebp
bool v11; // cc
unsigned __int16 v12; // cx
__int64 (__fastcall *v13)(__int64, _QWORD, __int64, _DWORD *); // rax
unsigned int v15; // esi
__int16 v16; // r8
__int64 (__fastcall *v17)(__int64, _QWORD, __int64, __int16 *, _DWORD); // rax
unsigned int v18; // eax
__int64 v19; // rax
__int64 (__fastcall *v20)(__int64, _QWORD, __int64, __int16 *); // rax
unsigned int v21; // eax
_DWORD v22[10]; // [rsp+20h] [rbp-28h] BYREF
__int16 v23; // [rsp+58h] [rbp+10h] BYREF
v4 = 0; /*0x37024*/
if ( a2 && *((_QWORD *)a2 + 3) ) /*0x3703c*/
{
if ( !*((_BYTE *)a2 + 8) ) /*0x37046*/
{
v9 = *(_DWORD *)a2; /*0x3704c*/
v10 = *(_DWORD *)a2 + *((_DWORD *)a2 + 4); /*0x37051*/
if ( !a3 ) /*0x37057*/
goto LABEL_20; /*0x37057*/
v11 = v10 <= a4; /*0x3705d*/
LABEL_19:
if ( v11 ) /*0x370dc*/
{
LABEL_20:
v15 = v9; /*0x370e2*/
if ( v9 < v10 ) /*0x370e6*/
{
v16 = v23; /*0x370e8*/
while ( 1 ) /*0x370ee*/
{
v17 = *(__int64 (__fastcall **)(__int64, _QWORD, __int64, __int16 *, _DWORD))(a1 + 1160); /*0x370ee*/
if ( v17 ) /*0x370f8*/
{
v18 = v17(a1, (unsigned __int16)v15, 1, &v23, v22[0]); /*0x3710b*/
v16 = v23; /*0x3710d*/
v4 = v18; /*0x37113*/
}
else
{
v4 = -3; /*0x37118*/
}
if ( v4 ) /*0x37121*/
break; /*0x37121*/
v19 = *((_QWORD *)a2 + 3); /*0x37132*/
v23 = ~a2[10] & v16; /*0x37136*/
v16 = a2[10] & *(_WORD *)(v19 + 2LL * (v15 - v9)) | v23; /*0x37144*/
v23 = v16; /*0x37148*/
if ( a3 ) /*0x37151*/
{
*(_WORD *)(a3 + 2LL * v15) = v16; /*0x37155*/
}
else
{
v20 = *(__int64 (__fastcall **)(__int64, _QWORD, __int64, __int16 *))(a1 + 1208); /*0x3715c*/
if ( v20 ) /*0x37166*/
{
v21 = v20(a1, (unsigned __int16)v15, 1, &v23); /*0x37179*/
v16 = v23; /*0x3717b*/
v4 = v21; /*0x37181*/
}
else
{
v4 = 0; /*0x37186*/
}
if ( v4 ) /*0x3718c*/
return v4; /*0x3718c*/
}
if ( ++v15 >= v10 ) /*0x37196*/
return v4; /*0x37196*/
}
}
return v4; /*0x37121*/
}
return 4294967280LL; /*0x370dc*/
}
if ( !a3 ) /*0x37065*/
{
v13 = *(__int64 (__fastcall **)(__int64, _QWORD, __int64, _DWORD *))(a1 + 1160); /*0x3707e*/
if ( v13 ) /*0x37088*/
v4 = v13(a1, *a2, 1, v22); /*0x3709a*/
else
v4 = -3; /*0x3709f*/
if ( v4 ) /*0x370a8*/
return v4; /*0x370ad*/
v12 = v22[0]; /*0x370b2*/
goto LABEL_15; /*0x370b2*/
}
if ( *(_DWORD *)a2 <= a4 ) /*0x3706a*/
{
v12 = *(_WORD *)(a3 + 2LL * *(unsigned int *)a2); /*0x37072*/
LOWORD(v22[0]) = v12; /*0x37077*/
LABEL_15:
if ( v12 == 0xFFFF ) /*0x370bf*/
return 0xFFFFFFFFLL; /*0x370c4*/
v9 = *((_DWORD *)a2 + 3) + v12; /*0x370cf*/
v10 = v9 + *((_DWORD *)a2 + 4); /*0x370d2*/
if ( !a3 ) /*0x370d8*/
goto LABEL_20; /*0x370d8*/
v11 = v10 <= a4; /*0x370da*/
goto LABEL_19; /*0x370da*/
}
}
return 4294967280LL; /*0x371b5*/
}
// Function: Nii_371c0 @ 0x371c0 (0xa7 bytes)
__int64 __fastcall Nii_371c0(__int64 a1, __int64 a2, unsigned __int16 i, __int64 a4, unsigned int a5)
{
unsigned int v9; // r8d
unsigned __int16 v11; // cx
unsigned __int16 j; // di
v9 = 0; /*0x371e8*/
if ( !a2 ) /*0x371ee*/
return 4294967280LL; /*0x371f5*/
v11 = 0; /*0x371f7*/
if ( i ) /*0x371ff*/
{
while ( *(_QWORD *)(32LL * v11 + a2 + 24) ) /*0x3720d*/
{
if ( ++v11 >= i ) /*0x37215*/
goto LABEL_6; /*0x37215*/
}
return 4294967280LL; /*0x3720d*/
}
LABEL_6:
for ( j = 0; j < i; ++j ) /*0x3721f*/
{
v9 = Nii_3700c(a1, (unsigned __int16 *)(a2 + 32LL * j), a4, a5); /*0x3723b*/
if ( v9 ) /*0x37241*/
break; /*0x37241*/
}
return v9; /*0x3725d*/
}
// Function: Nii_37268 @ 0x37268 (0x14a bytes)
__int64 __fastcall Nii_37268(
__int64 a1,
__int64 a2,
unsigned __int16 n0xD,
__int64 a4,
unsigned __int16 *a5,
int a6,
__int64 a7,
unsigned int a8)
{
unsigned __int16 *v8; // r12
__int64 v12; // rax
unsigned int v13; // r10d
unsigned __int16 v14; // di
unsigned __int16 n0xD_1; // si
int v16; // r15d
unsigned __int16 *v17; // rbx
__int64 (__fastcall *v18)(__int64, _QWORD, __int64, __int16 *); // rax
void (__fastcall *v19)(__int64, unsigned __int16 *, __int64, _QWORD); // rax
__int16 v22; // [rsp+70h] [rbp+18h] BYREF
v8 = a5; /*0x37281*/
v12 = a2; /*0x37295*/
v13 = 0; /*0x37298*/
v14 = 0; /*0x3729b*/
n0xD_1 = 0; /*0x3729e*/
if ( n0xD ) /*0x372a5*/
{
v16 = a6; /*0x372ab*/
do /*0x372bd*/
{
v17 = (unsigned __int16 *)(v12 + 32LL * n0xD_1); /*0x372bd*/
if ( (v16 & *((_DWORD *)v17 + 1)) != 0 ) /*0x372c4*/
{
if ( !*((_BYTE *)v17 + 8) ) /*0x372ca*/
goto LABEL_10; /*0x372ca*/
v18 = *(__int64 (__fastcall **)(__int64, _QWORD, __int64, __int16 *))(a1 + 1160); /*0x372cf*/
if ( v18 ) /*0x372d9*/
v13 = v18(a1, *v17, 1, &v22); /*0x372ed*/
else
v13 = -3; /*0x372f5*/
if ( v13 ) /*0x372fe*/
return v13; /*0x372fe*/
if ( v22 != -1 ) /*0x3730e*/
{
LABEL_10:
if ( a4 ) /*0x37313*/
{
if ( v14 >= *v8 ) /*0x3731a*/
return 4294967279LL; /*0x373ab*/
v19 = *(void (__fastcall **)(__int64, unsigned __int16 *, __int64, _QWORD))(a1 + 1216); /*0x37320*/
if ( v19 ) /*0x3732a*/
v19(a1, v17, a7, a8); /*0x37342*/
UtlMemCpy((_BYTE *)(a4 + 32LL * v14), v17, 32); /*0x37362*/
if ( v13 ) /*0x3736c*/
return v13; /*0x3736c*/
}
++v14; /*0x37371*/
}
v12 = a2; /*0x37374*/
}
++n0xD_1; /*0x37379*/
}
while ( n0xD_1 < n0xD ); /*0x372bd*/
}
if ( !a4 ) /*0x37389*/
{
*v8 = v14; /*0x3738b*/
return 0; /*0x37390*/
}
return v13; /*0x3739b*/
}
// Function: Nii_373b4 @ 0x373b4 (0xbd bytes)
bool __fastcall Nii_373b4(__int64 Handle)
{
__int64 *i; // rax
__int16 v3; // cx
__int16 v4; // cx
__int16 v5; // cx
__int16 v6; // cx
int v7; // ecx
int n14; // ecx
for ( i = ::i; ; i = (__int64 *)((char *)i + 10) ) /*0x373c1*/
{
v3 = *(_WORD *)i; /*0x373cf*/
if ( !*(_WORD *)i && !*((_WORD *)i + 1) && !*((_WORD *)i + 2) && !*((_WORD *)i + 3) ) /*0x373e7*/
{
v7 = 0; /*0x37433*/
goto LABEL_17; /*0x37435*/
}
if ( *(_WORD *)(Handle + 9614) == v3 || v3 == -1 ) /*0x373f5*/
{
v4 = *((_WORD *)i + 1); /*0x373f7*/
if ( *(_WORD *)(Handle + 9608) == v4 || v4 == -1 ) /*0x37407*/
{
v5 = *((_WORD *)i + 2); /*0x37409*/
if ( *(_WORD *)(Handle + 9610) == v5 || v5 == -1 ) /*0x37419*/
{
v6 = *((_WORD *)i + 3); /*0x3741b*/
if ( *(_WORD *)(Handle + 9612) == v6 || v6 == -1 ) /*0x3742b*/
break; /*0x3742b*/
}
}
}
}
v7 = *((unsigned __int8 *)i + 8); /*0x37437*/
LABEL_17:
if ( v7 ) /*0x3743d*/
{
n14 = v7 - 1; /*0x3743f*/
if ( n14 ) /*0x37442*/
{
if ( n14 == 14 ) /*0x37447*/
return 1; /*0x3744b*/
}
else if ( UtlNvmCrcVerify(Handle, 0xFFFF) ) /*0x37450*/
{
return *(_BYTE *)(Handle + 10304) == 0; /*0x37462*/
}
}
return 0; /*0x3746b*/
}
// Function: Nii_37474 @ 0x37474 (0x4d bytes)
__int64 __fastcall Nii_37474(__int64 Handle, __int64 a2)
{
__int64 *v2; // rax
__int64 (**v3)[6]; // r9
v2 = qword_15968; /*0x37478*/
v3 = &off_15A10; /*0x37482*/
LABEL_6:
if ( !v2 ) /*0x374a7*/
return 0x8000000000000003uLL; /*0x374a9*/
while ( 1 ) /*0x37497*/
{
if ( !*(_DWORD *)v2 ) /*0x37497*/
{
v3 += 2; /*0x3749d*/
v2 = (__int64 *)*v3; /*0x374a1*/
goto LABEL_6; /*0x374a1*/
}
if ( *(_DWORD *)(Handle + 364) == *(_DWORD *)v2 ) /*0x37491*/
return ((__int64 (__fastcall *)(__int64, __int64))v3[1])(Handle, a2); /*0x374b3*/
v2 = (__int64 *)((char *)v2 + 4); /*0x37493*/
}
}
// Function: Nii_374c4 @ 0x374c4 (0x85 bytes)
__int64 __fastcall Nii_374c4(__int64 Handle, bool *a2)
{
__int64 result; // rax
__int64 v5[3]; // [rsp+20h] [rbp-18h] BYREF
__int64 v6; // [rsp+58h] [rbp+20h] BYREF
LOWORD(v6) = 0; /*0x374dc*/
if ( !Nii_373b4(Handle) ) /*0x374e4*/
return 0x8000000000000003uLL; /*0x374ee*/
result = Nii_37474(Handle, (__int64)v5); /*0x37507*/
if ( !result ) /*0x3750f*/
{
result = UtlNvmContextWrite(Handle, LOWORD(v5[0]), (__int64)&v6); /*0x3751e*/
if ( !result ) /*0x37526*/
{
*a2 = 0; /*0x37535*/
return 0; /*0x37537*/
}
}
return result; /*0x37543*/
}
// Function: Nii_3754c @ 0x3754c (0xb7 bytes)
unsigned __int64 __fastcall Nii_3754c(__int64 Handle, char a2)
{
int v4; // eax
__int64 *v5; // rcx
bool v6; // zf
unsigned __int64 result; // rax
__int16 v8; // r8
__int64 v9; // [rsp+30h] [rbp+8h] BYREF
v4 = 1; /*0x37561*/
v5 = qword_15A70; /*0x37566*/
while ( v4 != *(_DWORD *)(Handle + 364) ) /*0x37575*/
{
v5 = (__int64 *)((char *)v5 + 4); /*0x37577*/
v4 = *(_DWORD *)v5; /*0x3757b*/
if ( !*(_DWORD *)v5 ) /*0x3757b*/
return 0x8000000000000003uLL; /*0x3757f*/
}
v6 = *(_DWORD *)(Handle + 1212) == 2; /*0x37583*/
LOWORD(v9) = 0; /*0x3758a*/
if ( !v6 ) /*0x3758f*/
return 0x8000000000000003uLL; /*0x3759b*/
result = UtlNvmContextWrite(Handle, 32, (__int64)&v9); /*0x375aa*/
if ( !result ) /*0x375b2*/
{
if ( a2 ) /*0x375bd*/
v8 = v9 | 0x80; /*0x375c4*/
else
v8 = v9 & 0xFF7F; /*0x375cf*/
LOWORD(v9) = v8; /*0x375db*/
result = UtlNvmContextRead(Handle, 32, v8); /*0x375e1*/
if ( !result ) /*0x375e9*/
return UtlNvmContextRelease(Handle); /*0x375ee*/
}
return result; /*0x375fd*/
}
// Function: Nii_37604 @ 0x37604 (0x152 bytes)
unsigned __int64 __fastcall Nii_37604(__int64 Handle, char a2)
{
__int64 *v4; // rcx
int v5; // eax
unsigned __int64 result; // rax
__int16 v7; // r8
__int64 v8[5]; // [rsp+20h] [rbp-28h] BYREF
__int64 v9; // [rsp+60h] [rbp+18h] BYREF
__int16 v10; // [rsp+68h] [rbp+20h]
if ( !Nii_373b4(Handle) ) /*0x37616*/
return 0x8000000000000003uLL; /*0x3773f*/
if ( !a2 ) /*0x37633*/
goto LABEL_12; /*0x37633*/
v4 = qword_159D8; /*0x37635*/
v5 = 1; /*0x3763c*/
while ( v5 != *(_DWORD *)(Handle + 364) ) /*0x37645*/
{
v4 = (__int64 *)((char *)v4 + 4); /*0x37647*/
v5 = *(_DWORD *)v4; /*0x3764b*/
if ( !*(_DWORD *)v4 ) /*0x3764b*/
{
result = 0x8000000000000003uLL; /*0x37651*/
goto LABEL_10; /*0x37654*/
}
}
LOWORD(v9) = 0; /*0x37663*/
result = UtlNvmContextWrite(Handle, 15, (__int64)&v9); /*0x37668*/
if ( result ) /*0x37670*/
goto LABEL_11; /*0x37670*/
LOWORD(v9) = v9 | 0x8000; /*0x37689*/
result = UtlNvmContextRead(Handle, 15, v9); /*0x3768f*/
if ( result ) /*0x37697*/
goto LABEL_11; /*0x37697*/
result = UtlNvmContextRelease(Handle); /*0x3769c*/
LABEL_10:
if ( !result ) /*0x376a4*/
goto LABEL_12; /*0x376a4*/
LABEL_11:
if ( result == 0x8000000000000003uLL ) /*0x376a9*/
{
LABEL_12:
LOWORD(v9) = 0; /*0x376af*/
v10 = 0; /*0x376c1*/
result = Nii_37474(Handle, (__int64)v8); /*0x376c6*/
if ( !result ) /*0x376ce*/
{
result = UtlNvmContextWrite(Handle, LOWORD(v8[0]), (__int64)&v9); /*0x376dd*/
if ( !result ) /*0x376e5*/
{
if ( a2 ) /*0x376f0*/
v7 = v10 | v9; /*0x376f2*/
else
v7 = ~v10 & v9; /*0x37702*/
LOWORD(v9) = v7; /*0x3770e*/
result = UtlNvmContextRead(Handle, LOWORD(v8[0]), v7); /*0x37714*/
if ( !result ) /*0x3771c*/
{
result = UtlNvmContextRelease(Handle); /*0x37721*/
if ( !result ) /*0x37729*/
{
result = Nii_3754c(Handle, a2); /*0x37731*/
if ( result == 0x8000000000000003uLL ) /*0x37739*/
return 0; /*0x37739*/
}
}
}
}
}
return result; /*0x3774e*/
}
// Function: Nii_37758 @ 0x37758 (0x149 bytes)
__int64 __fastcall Nii_37758(__int64 a1)
{
__int64 result; // rax
if ( *(_DWORD *)(a1 + 1116) == 1 ) /*0x3776c*/
{
*(_DWORD *)(a1 + 1100) = 1; /*0x37782*/
*(_QWORD *)(a1 + 1040) = MngInitSession; /*0x3778b*/
*(_DWORD *)(a1 + 1108) = 100; /*0x37799*/
*(_QWORD *)(a1 + 1048) = NiiGetStatus; /*0x377a3*/
*(_DWORD *)(a1 + 1072) = 5; /*0x377af*/
*(_WORD *)(a1 + 1122) = 47; /*0x377b9*/
*(_QWORD *)(a1 + 880) = JUMPOUT_w; /*0x377c7*/
*(_QWORD *)(a1 + 896) = MngConfigGet; /*0x377d5*/
*(_QWORD *)(a1 + 904) = CompNameGuidToString; /*0x377e3*/
*(_QWORD *)(a1 + 912) = MngConfigSet; /*0x377f1*/
*(_QWORD *)(a1 + 928) = NiiReset; /*0x377ff*/
*(_QWORD *)(a1 + 944) = 255696; /*0x3780d*/
*(_QWORD *)(a1 + 984) = 228224; /*0x3781b*/
*(_QWORD *)(a1 + 992) = 256504; /*0x37829*/
*(_QWORD *)(a1 + 1008) = 253812; /*0x37837*/
*(_QWORD *)(a1 + 920) = 229172; /*0x37845*/
*(_QWORD *)(a1 + 936) = 229608; /*0x37853*/
*(_QWORD *)(a1 + 960) = 228492; /*0x37861*/
*(_QWORD *)(a1 + 1016) = 228768; /*0x3786f*/
*(_QWORD *)(a1 + 888) = 231584; /*0x3787d*/
result = CompNameInstall(a1); /*0x37884*/
if ( *(_DWORD *)(a1 + 1104) != 21040288 ) /*0x37898*/
return 4294967294LL; /*0x37898*/
}
else
{
*(_DWORD *)(a1 + 1072) = 1; /*0x3776e*/
return 0; /*0x37774*/
}
return result; /*0x3789b*/
}
// Function: NiiReceive @ 0x378a4 (0x143 bytes)
__int64 __fastcall NiiReceive(__int64 a1)
{
unsigned int v2; // r11d
int v3; // eax
int v4; // eax
unsigned __int16 n0xE; // r11
v2 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x378c5*/
v3 = *(_DWORD *)(a1 + 1252); /*0x378c8*/
*(_WORD *)(a1 + 1270) = 8; /*0x378ce*/
v4 = v3 - 1; /*0x378d6*/
*(_WORD *)(a1 + 1266) = 1; /*0x378d9*/
if ( v4 )
{
if ( v4 == 1 )
{
*(_WORD *)(a1 + 1268) = 16; /*0x37922*/
*(_WORD *)(a1 + 1272) = 32; /*0x37929*/
}
else
{
*(_WORD *)(a1 + 1272) = (v2 & 0x400) != 0 ? 32 : 8;
*(_WORD *)(a1 + 1268) = (v2 & 0x400) != 0 ? 16 : 8;
}
}
else
{
*(_WORD *)(a1 + 1272) = 8; /*0x37932*/
*(_WORD *)(a1 + 1268) = 8; /*0x3793a*/
}
*(_DWORD *)(a1 + 1248) = 2; /*0x3794b*/
n0xE = ((v2 >> 11) & 0xF) + 6; /*0x3795a*/
if ( n0xE > 0xEu ) /*0x37963*/
LOBYTE(n0xE) = 14; /*0x37965*/
*(_QWORD *)(a1 + 1152) = DxeRegister_39; /*0x37973*/
*(_QWORD *)(a1 + 1160) = NiiTransmit; /*0x37985*/
*(_WORD *)(a1 + 1264) = 1 << n0xE; /*0x37993*/
*(_QWORD *)(a1 + 1168) = DxeRegister_47; /*0x3799b*/
*(_QWORD *)(a1 + 1184) = NvmCalcProtocolChecksum; /*0x379a9*/
*(_QWORD *)(a1 + 1192) = NvmReadProtocolValue; /*0x379b7*/
*(_QWORD *)(a1 + 1200) = NiiParseMacString; /*0x379c5*/
*(_QWORD *)(a1 + 1208) = j_RegRegister_10; /*0x379d3*/
return 0; /*0x379e1*/
}
// Function: NiiShutdown @ 0x379e8 (0x17b bytes)
__int64 __fastcall NiiShutdown(__int64 a1)
{
void *Nii_3b364_1; // rax
char v3; // al
if ( *(_WORD *)(a1 + 9512) == 4248 ) /*0x379fd*/
{
*(_DWORD *)(a1 + 1116) = 3; /*0x37a24*/
*(_QWORD *)(a1 + 64) = Nii_3b0ac; /*0x37a2e*/
Nii_3b364_1 = Nii_3b364; /*0x37a32*/
}
else
{
*(_DWORD *)(a1 + 1116) = 1; /*0x37a06*/
*(_QWORD *)(a1 + 64) = NiiGetVlanState; /*0x37a10*/
Nii_3b364_1 = RegRegister_28; /*0x37a14*/
}
*(_QWORD *)(a1 + 184) = Nii_3b364_1; /*0x37a39*/
*(_WORD *)(a1 + 310) = 128; /*0x37a4a*/
*(_BYTE *)(a1 + 834) = 1; /*0x37a56*/
*(_WORD *)(a1 + 828) = 15; /*0x37a5d*/
*(_BYTE *)(a1 + 832) = 1; /*0x37a64*/
v3 = UtlRegisterWrite((__int64 *)a1, 0x5B54u); /*0x37a6b*/
*(_BYTE *)(a1 + 831) = 0; /*0x37a75*/
*(_BYTE *)(a1 + 833) = (v3 & 0xE) != 0; /*0x37a7f*/
*(_QWORD *)(a1 + 96) = NiiStationAddrSet; /*0x37a8c*/
*(_QWORD *)(a1 + 144) = RegRegister_19; /*0x37a97*/
*(_QWORD *)(a1 + 152) = RegRegister; /*0x37aa5*/
*(_QWORD *)(a1 + 176) = Nii_3b234; /*0x37ab3*/
*(_QWORD *)(a1 + 56) = Nii_3a6e8; /*0x37ac1*/
*(_QWORD *)(a1 + 136) = NiiStnAddrGet; /*0x37acc*/
*(_QWORD *)(a1 + 200) = RegRegister_57; /*0x37ada*/
*(_QWORD *)(a1 + 88) = RegRegister_54; /*0x37ae8*/
*(_QWORD *)(a1 + 224) = DxeInit_0; /*0x37af3*/
*(_QWORD *)(a1 + 40) = NiiStatistics; /*0x37b01*/
*(_QWORD *)(a1 + 48) = NiiInterruptSet; /*0x37b0c*/
*(_QWORD *)(a1 + 192) = NiiStatisticsReset; /*0x37b17*/
*(_QWORD *)(a1 + 72) = UtlRegisterAccessE00; /*0x37b25*/
*(_QWORD *)(a1 + 120) = RegRegister_50; /*0x37b30*/
*(_QWORD *)(a1 + 128) = RegRegister_52; /*0x37b3b*/
*(_QWORD *)(a1 + 80) = Nii_3a4d0; /*0x37b49*/
*(_QWORD *)(a1 + 112) = NiiSetLinkSpeed; /*0x37b54*/
(*(void (__fastcall **)(__int64))(a1 + 104))(a1); /*0x37b58*/
return 0; /*0x37b5d*/
}
// Function: JUMPOUT_w @ 0x37b64 (0x1a bytes)
void JUMPOUT_w()
{
JUMPOUT(0x37BE0); /*0x37be0*/
}
// Function: DxeRegister_39 @ 0x37b9c (0x43 bytes)
__int64 __fastcall DxeRegister_39(__int64 *a1)
{
__int64 result; // rax
unsigned int v3; // ebx
result = DxeRegister_19(a1, 1); /*0x37bae*/
if ( !(_DWORD)result ) /*0x37bb5*/
{
v3 = DxeRegister_26(a1); /*0x37bbf*/
if ( v3 ) /*0x37bc3*/
RegRegister_46(a1, 1u); /*0x37bcd*/
return v3; /*0x37bd2*/
}
return result; /*0x37bd9*/
}
// Function: DxeRegister_19 @ 0x37be0 (0xab bytes)
__int64 __fastcall DxeRegister_19(__int64 *a1, unsigned __int16 a2)
{
int v2; // ebp
int v4; // r12d
int n50; // edi
int v6; // esi
v2 = a2; /*0x37bf9*/
v4 = a2 << 16; /*0x37c02*/
n50 = 0; /*0x37c06*/
while ( !(unsigned int)DxeRegister_16((__int64)a1) ) /*0x37c12*/
{
v6 = UtlRegisterWrite(a1, 0x5B5Cu); /*0x37c26*/
if ( ((v2 | v4) & v6) != 0 ) /*0x37c2a*/
{
DxeRegister_46(a1); /*0x37c2f*/
UtlRegisterRead(*a1, 5000); /*0x37c3c*/
if ( ++n50 < 50 ) /*0x37c46*/
continue; /*0x37c46*/
}
if ( n50 != 50 ) /*0x37c4b*/
{
UtlRegisterAccess(a1, 0x5B5Cu, v2 | v6); /*0x37c5a*/
DxeRegister_46(a1); /*0x37c62*/
return 0; /*0x37c69*/
}
return 4294967283LL; /*0x37c4b*/
}
return 4294967283LL; /*0x37c84*/
}
// Function: j_RegRegister_10 @ 0x37eb8 (0x5 bytes)
// attributes: thunk
__int64 __fastcall j_RegRegister_10(__int64 a1, unsigned __int16 a2, unsigned __int16 a3, __int64 a4)
{
return RegRegister_10(a1, a2, a3, a4);
}
// Function: NiiReset @ 0x37ec0 (0x73 bytes)
__int64 __fastcall NiiReset(__int64 a1)
{
int n100; // ebx
char *v2; // rsi
n100 = 100; /*0x37ed4*/
v2 = (char *)&loc_3FFFF + 1; /*0x37ed9*/
if ( *(_WORD *)(a1 + 1292) == 1 ) /*0x37ef0*/
LODWORD(v2) = 0x80000; /*0x37ef0*/
do /*0x37f13*/
{
if ( ((unsigned int)UtlRegisterWrite((__int64 *)a1, 0x1010u) & (unsigned int)v2) != 0 ) /*0x37f02*/
break; /*0x37f02*/
UtlRegisterRead(*(_QWORD *)a1, 1000); /*0x37f0c*/
--n100; /*0x37f11*/
}
while ( n100 ); /*0x37f13*/
return n100 != 0 ? 0 : 0xFFFFFFF7;
}
// Function: NiiSetLinkSpeed @ 0x3815c (0x48 bytes)
__int64 __fastcall NiiSetLinkSpeed(__int64 a1, __int16 *a2, _WORD *a3)
{
if ( *(_DWORD *)(a1 + 1116) == 1 ) /*0x38170*/
NiiMcIpToMacSet((__int64 *)a1, a2, a3); /*0x38172*/
*a2 = 1000; /*0x3818b*/
*a3 = 2; /*0x38193*/
return 0; /*0x3819e*/
}
// Function: RegRegister_19 @ 0x381a4 (0x12a bytes)
__int64 __fastcall RegRegister_19(__int64 a1)
{
int v2; // edi
__int64 result; // rax
unsigned __int16 v4; // [rsp+30h] [rbp+8h] BYREF
RegRegister_41(a1); /*0x381b1*/
UtlRegisterAccess((__int64 *)a1, 0xD8u, -1); /*0x381c2*/
UtlRegisterAccess((__int64 *)a1, 0x100u, 0); /*0x381d2*/
UtlRegisterAccess((__int64 *)a1, 0x400u, 8); /*0x381e5*/
UtlMicroStall((__int64 *)a1); /*0x381ed*/
UtlRegisterRead(*(_QWORD *)a1, 10000); /*0x381fa*/
v2 = UtlRegisterWrite((__int64 *)a1, 0); /*0x38216*/
result = DxeRegister_19((__int64 *)a1, *(_WORD *)(a1 + 1292) != 0 ? 4 : 2);
if ( !(_DWORD)result )
{
UtlRegisterAccess((__int64 *)a1, 0, v2 | 0x4000000); /*0x3823c*/
RegRegister_46((__int64 *)a1, *(_WORD *)(a1 + 1292) != 0 ? 4 : 2);
if ( !(unsigned int)DxeRegister_30(a1, 9, &v4) ) /*0x3826f*/
DxeRegister_33(a1, 9, v4 | 0x200u); /*0x3828c*/
result = RegRegister_44((__int64 *)a1); /*0x38294*/
if ( !(_DWORD)result ) /*0x3829b*/
{
UtlRegisterAccess((__int64 *)a1, 0xD8u, -1); /*0x382a9*/
UtlRegisterWrite((__int64 *)a1, 0xC0u); /*0x382b6*/
return NiiMediaState(a1); /*0x382be*/
}
}
return result; /*0x382c8*/
}
// Function: RegRegister @ 0x382d0 (0x298 bytes)
__int64 __fastcall RegRegister(__int64 a1)
{
int v2; // eax
int v3; // eax
int v4; // eax
int v5; // edi
int v6; // edi
int v7; // eax
unsigned __int16 v8; // di
__int64 result; // rax
int v10; // eax
int v11; // eax
int v12; // eax
int v13; // eax
int v14; // eax
int v15; // eax
unsigned int v16; // edi
unsigned __int16 v17; // [rsp+40h] [rbp+8h] BYREF
__int16 v18; // [rsp+48h] [rbp+10h] BYREF
v2 = UtlRegisterWrite((__int64 *)a1, 0x3828u); /*0x382e5*/
UtlRegisterAccess((__int64 *)a1, 0x3828u, v2 | 0x400000); /*0x382f9*/
v3 = UtlRegisterWrite((__int64 *)a1, 0x3928u); /*0x38306*/
UtlRegisterAccess((__int64 *)a1, 0x3928u, v3 | 0x400000); /*0x3831a*/
v4 = UtlRegisterWrite((__int64 *)a1, 0x3840u) & 0x87FFFFFF; /*0x38334*/
if ( *(_DWORD *)(a1 + 1116) != 1 ) /*0x38340*/
v4 &= ~0x100000u; /*0x38342*/
UtlRegisterAccess((__int64 *)a1, 0x3840u, v4); /*0x3834e*/
v5 = UtlRegisterWrite((__int64 *)a1, 0x3940u); /*0x38368*/
if ( (UtlRegisterWrite((__int64 *)a1, 0x400u) & 0x10000000) != 0 ) /*0x38373*/
v6 = v5 & 0xEFFFFFFF; /*0x38375*/
else
v6 = v5 | 0x10000000; /*0x3837b*/
UtlRegisterAccess((__int64 *)a1, 0x3940u, v6); /*0x3838a*/
v7 = UtlRegisterWrite((__int64 *)a1, 0x5008u); /*0x38399*/
UtlRegisterAccess((__int64 *)a1, 0x5008u, v7 | 0x30000); /*0x383ab*/
(*(void (__fastcall **)(__int64))(a1 + 40))(a1); /*0x383b3*/
(*(void (__fastcall **)(__int64))(a1 + 88))(a1); /*0x383b9*/
NiiSetMacAddressList(a1, *(_WORD *)(a1 + 828)); /*0x383c6*/
v8 = 0; /*0x383cd*/
v17 = 0; /*0x383d0*/
if ( *(_WORD *)(a1 + 310) ) /*0x383d5*/
{
do /*0x383fe*/
UtlRegisterAccess((__int64 *)a1, 4 * v8++ + 20992, 0); /*0x383ee*/
while ( v8 < *(_WORD *)(a1 + 310) ); /*0x383fe*/
v17 = v8; /*0x38400*/
}
result = (*(__int64 (__fastcall **)(__int64))(a1 + 176))(a1); /*0x38408*/
if ( !(_DWORD)result ) /*0x38410*/
{
if ( !(unsigned int)DxeRegister_30((__int64 *)a1, 9, &v18) ) /*0x38425*/
DxeRegister_33((__int64 *)a1, 9, v18 | 0x200); /*0x38442*/
v10 = UtlRegisterWrite((__int64 *)a1, 0x3828u); /*0x3844f*/
UtlRegisterAccess((__int64 *)a1, 0x3828u, v10 & 0xFE80FFFF | 0x1410000); /*0x3846b*/
v11 = UtlRegisterWrite((__int64 *)a1, 0x3928u); /*0x38478*/
UtlRegisterAccess((__int64 *)a1, 0x3928u, v11 & 0xFE80FFFF | 0x1410000); /*0x3848f*/
v12 = UtlRegisterWrite((__int64 *)a1, 0x400u); /*0x3849c*/
UtlRegisterAccess((__int64 *)a1, 0x400u, v12 | 0x1000000); /*0x384b0*/
v13 = UtlRegisterWrite((__int64 *)a1, 0x404u); /*0x384bf*/
UtlRegisterAccess((__int64 *)a1, 0x404u, v13 & 0xFFF003FF | 0x10000); /*0x384d5*/
v14 = UtlRegisterWrite((__int64 *)a1, 0x410u); /*0x384e4*/
UtlRegisterAccess((__int64 *)a1, 0x410u, v14 & 0xFFFFFC00 | 8); /*0x384f9*/
v15 = UtlRegisterWrite((__int64 *)a1, 0x5F04u); /*0x38508*/
UtlRegisterAccess((__int64 *)a1, 0x5F04u, v15 & 0xFFEFFFFF); /*0x38519*/
*(_BYTE *)(a1 + 1312) = 1; /*0x3852b*/
v16 = DxeRegister_30((__int64 *)a1, 31, &v17); /*0x38537*/
if ( !v16 && (v17 & 0xC) == 4 ) /*0x38547*/
*(_BYTE *)(a1 + 1312) = 0; /*0x38549*/
Nii_3a4d0((__int64 *)a1); /*0x38553*/
return v16; /*0x38558*/
}
return result; /*0x3855f*/
}
// Function: DxeRegister @ 0x38568 (0x279 bytes)
__int64 __fastcall DxeRegister(__int64 a1)
{
__int64 result; // rax
__int16 v3; // r8
unsigned __int16 n2056_1; // r8
bool v5; // zf
int v6; // eax
unsigned __int16 n2056; // [rsp+30h] [rbp+8h] BYREF
if ( *(_BYTE *)(a1 + 1134) ) /*0x38577*/
goto LABEL_13; /*0x38577*/
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 85, &n2056); /*0x38597*/
if ( !(_DWORD)result ) /*0x3859f*/
{
n2056 |= 0x17u; /*0x385b6*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 85); /*0x385bc*/
if ( !(_DWORD)result ) /*0x385c4*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 16, &n2056); /*0x385d4*/
if ( !(_DWORD)result ) /*0x385dc*/
{
v3 = n2056 & 0xFF9F; /*0x385f4*/
if ( *(_BYTE *)(a1 + 1130) != 1 ) /*0x385fa*/
{
if ( *(_BYTE *)(a1 + 1130) == 2 ) /*0x385fe*/
v3 |= 0x20u; /*0x38607*/
else
v3 |= 0x60u; /*0x38600*/
}
n2056_1 = v3 & 0xFFFD; /*0x38611*/
v5 = *(_BYTE *)(a1 + 1131) == 0; /*0x38615*/
n2056 = n2056_1; /*0x3861c*/
if ( !v5 ) /*0x38622*/
n2056 = n2056_1 | 2; /*0x38629*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 16); /*0x38634*/
if ( !(_DWORD)result ) /*0x3863c*/
{
result = (*(__int64 (__fastcall **)(__int64))(a1 + 912))(a1); /*0x38645*/
if ( !(_DWORD)result ) /*0x3864d*/
{
LABEL_13:
n2056 = 2056; /*0x3865e*/
result = DxeRegister_33((__int64 *)a1, 0, 0x808u); /*0x38664*/
if ( !(_DWORD)result ) /*0x3866b*/
{
result = DxeRegister_30((__int64 *)a1, 31, &n2056); /*0x3867c*/
if ( !(_DWORD)result ) /*0x38683*/
{
n2056 |= 0x2000u; /*0x386a0*/
result = DxeRegister_33((__int64 *)a1, 31, n2056); /*0x386a6*/
if ( !(_DWORD)result ) /*0x386ad*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 26, &n2056); /*0x386be*/
if ( !(_DWORD)result ) /*0x386c6*/
{
n2056 &= ~0x2000u; /*0x386e3*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 26); /*0x386e9*/
if ( !(_DWORD)result ) /*0x386f1*/
{
v6 = UtlRegisterWrite((__int64 *)a1, 0x18u); /*0x386fd*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v6 & 0xFF3FFFFF); /*0x38712*/
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))( /*0x38724*/
a1,
6196,
&n2056);
if ( !(_DWORD)result ) /*0x3872c*/
{
if ( (*(unsigned __int8 (__fastcall **)(__int64))(a1 + 56))(a1) /*0x3879a*/
|| (n2056 |= 1u,
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 6196),
!(_DWORD)result)
&& (result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(
a1,
6192,
&n2056),
!(_DWORD)result)
&& (n2056 &= ~0x800u,
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 6192),
!(_DWORD)result) )
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))( /*0x387a9*/
a1,
6226,
&n2056);
if ( !(_DWORD)result ) /*0x387b1*/
{
n2056 |= 0x10u; /*0x387c5*/
return (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 6226); /*0x387cb*/
}
}
}
}
}
}
}
}
}
}
}
}
}
return result; /*0x387db*/
}
// Function: RegRegister_28 @ 0x387e4 (0xbc bytes)
__int64 __fastcall RegRegister_28(__int64 *a1)
{
int v2; // eax
__int64 result; // rax
unsigned __int16 v4; // [rsp+38h] [rbp+10h] BYREF
v2 = UtlRegisterWrite(a1, 0); /*0x387ef*/
UtlRegisterAccess(a1, 0, v2 & 0xFFFFE7BF | 0x40); /*0x38804*/
result = DxeRegister_33(a1, 132, 0xFFFFu); /*0x38817*/
if ( !(_DWORD)result ) /*0x3881e*/
{
result = DxeRegister_30(a1, 137, &v4); /*0x3882d*/
if ( !(_DWORD)result ) /*0x38834*/
{
v4 |= 0x3Fu; /*0x38849*/
result = DxeRegister_33(a1, 137, v4); /*0x3884f*/
if ( !(_DWORD)result ) /*0x38856*/
{
result = DxeRegister_30(a1, 2, &v4); /*0x38863*/
if ( !(_DWORD)result ) /*0x3886a*/
{
result = DxeRegister_33(a1, 2, v4 | 0x10u); /*0x3887d*/
if ( !(_DWORD)result ) /*0x38884*/
{
result = DxeRegister((__int64)a1); /*0x38889*/
if ( !(_DWORD)result ) /*0x38890*/
return DxeRegister_56((__int64)a1); /*0x38895*/
}
}
}
}
}
return result; /*0x3889a*/
}
// Function: DxeRegister_30 @ 0x38a94 (0x7b bytes)
__int64 __fastcall DxeRegister_30(__int64 *a1, char a2, _WORD *a3)
{
__int64 result; // rax
result = DxeRegister_19(a1, 8u); /*0x38ab0*/
if ( !(_DWORD)result ) /*0x38ab7*/
{
UtlRegisterAccess(a1, 0x34u, (a2 & 0x1F | 0x20) << 16); /*0x38acd*/
UtlMicroStall(a1); /*0x38ad5*/
UtlRegisterRead(*a1, 2); /*0x38ae0*/
*a3 = UtlRegisterWrite(a1, 0x34u); /*0x38af5*/
RegRegister_46(a1, 8u); /*0x38af8*/
return 0; /*0x38afd*/
}
return result; /*0x38b09*/
}
// Function: DxeRegister_33 @ 0x38b10 (0x72 bytes)
__int64 __fastcall DxeRegister_33(__int64 *a1, char a2, unsigned __int16 a3)
{
__int64 result; // rax
result = DxeRegister_19(a1, 8u); /*0x38b2d*/
if ( !(_DWORD)result ) /*0x38b34*/
{
UtlRegisterAccess(a1, 0x34u, ((a2 & 0x1F) << 16) | a3); /*0x38b49*/
UtlMicroStall(a1); /*0x38b51*/
UtlRegisterRead(*a1, 2); /*0x38b5e*/
RegRegister_46(a1, 8u); /*0x38b6b*/
return 0; /*0x38b70*/
}
return result; /*0x38b7c*/
}
// Function: DxeInit_0 @ 0x38b84 (0x20 bytes)
__int64 __fastcall DxeInit_0(__int64 *a1)
{
__int64 result; // rax
result = NiiMediaState((__int64)a1); /*0x38b8d*/
if ( !(_DWORD)result ) /*0x38b94*/
return NiiSnpInitialize(a1); /*0x38b99*/
return result; /*0x38b9e*/
}
// Function: NiiGetStatus @ 0x38ba4 (0x2b bytes)
__int64 __fastcall NiiGetStatus(__int64 a1)
{
__int64 result; // rax
result = (*(__int64 (**)(void))(a1 + 56))(); /*0x38bad*/
if ( !(_BYTE)result ) /*0x38bb2*/
{
result = (*(__int64 (__fastcall **)(__int64))(a1 + 904))(a1); /*0x38bb7*/
if ( !(_DWORD)result ) /*0x38bbf*/
return MngCloseSession(a1); /*0x38bc4*/
}
return result; /*0x38bc9*/
}
// Function: NiiStationsAddr @ 0x38bd0 (0x314 bytes)
__int64 __fastcall NiiStationsAddr(__int64 a1)
{
__int64 result; // rax
int n2; // eax
__int64 (*(__fastcall *UtlStrCaseCmp_1)(__int64, char, unsigned __int16))(void); // rax
unsigned int v5; // r11d
int n3; // eax
int n21040305; // eax
bool v8; // zf
if ( *(_DWORD *)(a1 + 1116) != 1 ) /*0x38be0*/
{
*(_DWORD *)(a1 + 1072) = 1; /*0x38be2*/
return 0; /*0x38bee*/
}
*(_DWORD *)(a1 + 1100) = 1; /*0x38bf8*/
*(_DWORD *)(a1 + 1108) = 100; /*0x38c02*/
*(_WORD *)(a1 + 1122) = 47; /*0x38c0c*/
*(_QWORD *)(a1 + 904) = CompNameGuidToString; /*0x38c1a*/
*(_QWORD *)(a1 + 992) = UtlParseKeyValue; /*0x38c28*/
*(_QWORD *)(a1 + 1000) = NiiIfInfoGet; /*0x38c36*/
*(_QWORD *)(a1 + 1008) = UtlHexToBin; /*0x38c44*/
*(_QWORD *)(a1 + 1040) = MngInitSession; /*0x38c52*/
*(_QWORD *)(a1 + 1048) = Nii_3a498; /*0x38c60*/
n2 = *(_DWORD *)(a1 + 268); /*0x38c67*/
if ( n2 <= 0 ) /*0x38c6f*/
return 4294967294LL; /*0x38c6f*/
if ( n2 <= 2 ) /*0x38c78*/
{
*(_DWORD *)(a1 + 1072) = 4; /*0x38df9*/
*(_QWORD *)(a1 + 928) = NiiIfInfoSet; /*0x38e03*/
*(_QWORD *)(a1 + 944) = UtlGetNumericArg; /*0x38e11*/
*(_QWORD *)(a1 + 896) = UtlStrToInt; /*0x38e1f*/
*(_QWORD *)(a1 + 920) = UtlGuidToString; /*0x38e2d*/
*(_QWORD *)(a1 + 936) = UtlParseCmdLine; /*0x38e3b*/
*(_QWORD *)(a1 + 960) = UtlStrToUpper; /*0x38e49*/
UtlStrCaseCmp_1 = (__int64 (*(__fastcall *)(__int64, char, unsigned __int16))(void))UtlStrCaseCmp; /*0x38e50*/
goto LABEL_11; /*0x38e50*/
}
if ( n2 == 3 ) /*0x38c81*/
{
*(_DWORD *)(a1 + 1072) = 2; /*0x38d84*/
*(_QWORD *)(a1 + 928) = UtlSkipToken; /*0x38d8e*/
*(_QWORD *)(a1 + 944) = UtlGetCmdToken; /*0x38d9c*/
*(_QWORD *)(a1 + 896) = MngConfigGet; /*0x38daa*/
*(_QWORD *)(a1 + 912) = MngConfigSet; /*0x38db8*/
*(_QWORD *)(a1 + 920) = UtlStringToGuid; /*0x38dc6*/
*(_QWORD *)(a1 + 936) = UtlHexStringToInt; /*0x38dd4*/
*(_QWORD *)(a1 + 960) = UtlSkipSpace; /*0x38de2*/
UtlStrCaseCmp_1 = UtlIsAlpha; /*0x38de9*/
LABEL_11:
*(_QWORD *)(a1 + 1016) = UtlStrCaseCmp_1; /*0x38e57*/
*(_QWORD *)(a1 + 880) = NiiMcIpToMacFree; /*0x38e65*/
*(_QWORD *)(a1 + 984) = NiiStnAddrAdd; /*0x38e73*/
goto LABEL_12; /*0x38e73*/
}
if ( (unsigned int)(n2 - 4) <= 1 ) /*0x38c8d*/
{
*(_DWORD *)(a1 + 1072) = 8; /*0x38c9a*/
*(_QWORD *)(a1 + 928) = UtlSkipToken; /*0x38ca4*/
*(_QWORD *)(a1 + 944) = UtlGetCmdToken; /*0x38cb2*/
*(_QWORD *)(a1 + 896) = MngConfigGet; /*0x38cc0*/
*(_QWORD *)(a1 + 912) = MngConfigSet; /*0x38cce*/
*(_QWORD *)(a1 + 920) = UtlStringToGuid; /*0x38cdc*/
*(_QWORD *)(a1 + 936) = UtlHexStringToInt; /*0x38cea*/
*(_QWORD *)(a1 + 960) = MngSendDataCmd; /*0x38cf8*/
*(_QWORD *)(a1 + 1016) = MngRecvDataCmd; /*0x38d06*/
*(_QWORD *)(a1 + 880) = NiiStnAddrDel; /*0x38d14*/
*(_QWORD *)(a1 + 984) = NiiStnAddrFlush; /*0x38d22*/
*(_QWORD *)(a1 + 1000) = NiiGroupsAddr; /*0x38d30*/
*(_QWORD *)(a1 + 1008) = NiiGroupsAddrDel; /*0x38d3e*/
if ( *(_BYTE *)(a1 + 846) ) /*0x38d45*/
{
*(_DWORD *)(a1 + 1072) = 2; /*0x38d59*/
*(_QWORD *)(a1 + 1016) = UtlIsAlpha; /*0x38d63*/
*(_QWORD *)(a1 + 960) = UtlSkipSpace; /*0x38d71*/
}
LABEL_12:
result = NiiMcIpToMacNew(a1); /*0x38e7a*/
v5 = result; /*0x38e7f*/
if ( (_DWORD)result ) /*0x38e84*/
return result; /*0x38e84*/
n3 = *(_DWORD *)(a1 + 268); /*0x38e86*/
if ( n3 <= 0 ) /*0x38e8e*/
return (unsigned int)-2; /*0x38e8e*/
if ( n3 <= 2 ) /*0x38e93*/
{
v8 = *(_DWORD *)(a1 + 1104) == 44565376; /*0x38ec2*/
}
else if ( n3 == 3 ) /*0x38e98*/
{
v8 = *(_DWORD *)(a1 + 1104) == 21040320; /*0x38eb6*/
}
else
{
if ( (unsigned int)(n3 - 4) > 1 ) /*0x38ea0*/
return (unsigned int)-2; /*0x38ece*/
n21040305 = *(_DWORD *)(a1 + 1104); /*0x38ea2*/
if ( n21040305 == 21040305 ) /*0x38ead*/
return v5; /*0x38ed7*/
v8 = n21040305 == 21040336; /*0x38eaf*/
}
if ( !v8 ) /*0x38ecc*/
return (unsigned int)-2; /*0x38ecc*/
return v5; /*0x38ecc*/
}
return 4294967294LL; /*0x38ede*/
}
// Function: NiiModeSet @ 0x38ee4 (0x1b3 bytes)
__int64 __fastcall NiiModeSet(__int64 a1)
{
unsigned int v2; // r11d
int v3; // eax
int v4; // eax
unsigned __int16 n0xE; // r11
char (__fastcall *DxeRegister_27Wrap_1)(__int64 *); // rax
v2 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x38f09*/
v3 = *(_DWORD *)(a1 + 1252); /*0x38f0c*/
*(_WORD *)(a1 + 1270) = 8; /*0x38f12*/
v4 = v3 - 1; /*0x38f1a*/
*(_WORD *)(a1 + 1266) = 1; /*0x38f1c*/
if ( v4 )
{
if ( v4 == 1 )
{
*(_WORD *)(a1 + 1268) = 16; /*0x38f63*/
*(_WORD *)(a1 + 1272) = 32; /*0x38f6a*/
}
else
{
*(_WORD *)(a1 + 1272) = (v2 & 0x400) != 0 ? 32 : 8;
*(_WORD *)(a1 + 1268) = (v2 & 0x400) != 0 ? 16 : 8;
}
}
else
{
*(_WORD *)(a1 + 1272) = 8; /*0x38f73*/
*(_WORD *)(a1 + 1268) = 8; /*0x38f7b*/
}
if ( (unsigned int)(*(_DWORD *)(a1 + 268) - 3) <= 2 && (v2 & 0x18000) == 0x18000 ) /*0x38f9d*/
{
*(_DWORD *)(a1 + 1248) = 4; /*0x38fb1*/
*(_WORD *)(a1 + 1264) = 2048; /*0x38fbb*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v2 & 0xFFEFFFFF); /*0x38fc2*/
}
else
{
*(_DWORD *)(a1 + 1248) = 2; /*0x38fd2*/
n0xE = ((v2 >> 11) & 0xF) + 6; /*0x38fe1*/
if ( n0xE > 0xEu ) /*0x38fea*/
LOBYTE(n0xE) = 14; /*0x38fec*/
*(_WORD *)(a1 + 1264) = 1 << n0xE; /*0x38ff8*/
}
if ( (unsigned int)(*(_DWORD *)(a1 + 268) - 4) > 1 ) /*0x3900a*/
{
*(_QWORD *)(a1 + 1152) = DxeRegister_58; /*0x3902a*/
DxeRegister_27Wrap_1 = DxeRegister_27Wrap; /*0x39031*/
}
else
{
*(_QWORD *)(a1 + 1152) = NiiStnAddrDel; /*0x39013*/
DxeRegister_27Wrap_1 = NiiStnAddrFlush; /*0x3901a*/
}
*(_QWORD *)(a1 + 1168) = DxeRegister_27Wrap_1; /*0x3903d*/
*(_QWORD *)(a1 + 1160) = NiiTransmit; /*0x3904b*/
*(_QWORD *)(a1 + 1184) = RegRegister_18; /*0x39059*/
*(_QWORD *)(a1 + 1200) = NvmCheckBootMode; /*0x39067*/
*(_QWORD *)(a1 + 1192) = Nii_3a400; /*0x39075*/
*(_QWORD *)(a1 + 1208) = DxeRegister_45; /*0x39083*/
return 0; /*0x39091*/
}
// Function: NiiModeGet @ 0x39098 (0x2a3 bytes)
__int64 __fastcall NiiModeGet(__int64 a1)
{
int n4191; // eax
void *NiiMcIpToMacSet_1; // rax
__int64 (__fastcall *RegRegister_16)(__int64); // rax
int n3; // eax
int v6; // eax
int v7; // eax
n4191 = *(unsigned __int16 *)(a1 + 9512); /*0x3909e*/
if ( n4191 == 4191 ) /*0x390ad*/
goto LABEL_12; /*0x390ad*/
if ( n4191 != 4192 ) /*0x390b8*/
{
if ( n4191 == 4222 ) /*0x390bf*/
goto LABEL_12; /*0x390bf*/
if ( n4191 != 4223 ) /*0x390c6*/
{
if ( n4191 != 4261 ) /*0x390cd*/
{
if ( *(unsigned __int16 *)(a1 + 9512) <= 0x10D8u ) /*0x390d4*/
{
LABEL_10:
*(_DWORD *)(a1 + 1116) = 1; /*0x390eb*/
*(_QWORD *)(a1 + 184) = Nii_3a188; /*0x390fc*/
*(_QWORD *)(a1 + 64) = NiiGetVlanState; /*0x3910a*/
NiiMcIpToMacSet_1 = NiiMcIpToMacSet; /*0x3910e*/
goto LABEL_14; /*0x39115*/
}
if ( *(unsigned __int16 *)(a1 + 9512) > 0x10DAu ) /*0x390db*/
{
if ( n4191 == 61683 ) /*0x390e2*/
*(_BYTE *)(a1 + 846) = 1; /*0x390e4*/
goto LABEL_10; /*0x390e4*/
}
goto LABEL_11; /*0x390db*/
}
LABEL_12:
*(_DWORD *)(a1 + 1116) = 2; /*0x39138*/
*(_QWORD *)(a1 + 184) = Nii_3a1f4; /*0x39149*/
RegRegister_16 = RegRegister_23; /*0x39150*/
goto LABEL_13; /*0x39150*/
}
}
LABEL_11:
*(_DWORD *)(a1 + 1116) = 3; /*0x39117*/
*(_QWORD *)(a1 + 184) = Nii_3a1f4; /*0x39128*/
RegRegister_16 = Nii_3a228; /*0x3912f*/
LABEL_13:
*(_QWORD *)(a1 + 64) = RegRegister_16; /*0x39157*/
NiiMcIpToMacSet_1 = SnpGetDefaultConfig; /*0x3915b*/
LABEL_14:
*(_QWORD *)(a1 + 112) = NiiMcIpToMacSet_1; /*0x39162*/
*(_BYTE *)(a1 + 834) = 1; /*0x3916b*/
*(_WORD *)(a1 + 310) = 128; /*0x39172*/
*(_BYTE *)(a1 + 831) = 1; /*0x3917e*/
*(_WORD *)(a1 + 828) = 15; /*0x39185*/
*(_QWORD *)(a1 + 96) = NiiStationAddrSet; /*0x39193*/
*(_QWORD *)(a1 + 144) = RegRegister_3; /*0x3919e*/
*(_QWORD *)(a1 + 152) = RegRegister_20; /*0x391ac*/
*(_QWORD *)(a1 + 176) = NiiGetMcIpToMac; /*0x391ba*/
*(_QWORD *)(a1 + 136) = NiiStnAddrGet; /*0x391c8*/
*(_QWORD *)(a1 + 200) = RegRegister_57; /*0x391d6*/
*(_QWORD *)(a1 + 88) = Nii_3a020; /*0x391e4*/
*(_QWORD *)(a1 + 224) = Nii_3a46c; /*0x391ef*/
*(_QWORD *)(a1 + 40) = NiiStatistics; /*0x391fd*/
*(_QWORD *)(a1 + 192) = NiiStatisticsReset; /*0x39208*/
*(_QWORD *)(a1 + 72) = UtlRegisterAccessE00; /*0x39216*/
*(_QWORD *)(a1 + 128) = RegRegister_52; /*0x39221*/
*(_QWORD *)(a1 + 80) = Nii_3a4d0; /*0x3922f*/
n3 = *(_DWORD *)(a1 + 268); /*0x39233*/
if ( n3 == 3 ) /*0x3923c*/
{
*(_BYTE *)(a1 + 832) = 1; /*0x3929f*/
*(_QWORD *)(a1 + 104) = NiiGetStatusVal; /*0x392a6*/
*(_QWORD *)(a1 + 56) = Nii_3a6e8; /*0x392b1*/
*(_QWORD *)(a1 + 120) = RegRegister_50; /*0x392bc*/
*(_QWORD *)(a1 + 48) = NiiInterruptSet; /*0x392c7*/
*(_BYTE *)(a1 + 833) = (UtlRegisterWrite((__int64 *)a1, 0x5B54u) & 0xE) != 0; /*0x392d5*/
}
else if ( (unsigned int)(n3 - 4) > 1 ) /*0x39244*/
{
*(_BYTE *)(a1 + 832) = 1; /*0x39270*/
*(_QWORD *)(a1 + 56) = Nii_3a6e8; /*0x39277*/
*(_QWORD *)(a1 + 120) = RegRegister_50; /*0x39282*/
*(_QWORD *)(a1 + 48) = NiiInterruptSet; /*0x3928d*/
}
else
{
*(_QWORD *)(a1 + 104) = NiiGetStatusVal; /*0x3924d*/
*(_QWORD *)(a1 + 56) = Nii_3a0c4; /*0x39258*/
*(_QWORD *)(a1 + 120) = Nii_3a0fc; /*0x39263*/
}
if ( (unsigned int)(*(_DWORD *)(a1 + 268) - 1) > 1 ) /*0x392e6*/
goto LABEL_22; /*0x392e6*/
v6 = UtlRegisterWrite((__int64 *)a1, 0x5B58u); /*0x392f0*/
if ( (v6 & 2) == 0 ) /*0x392f7*/
{
UtlRegisterAccess((__int64 *)a1, 0x5B58u, v6 | 2); /*0x39307*/
LABEL_22:
v7 = UtlRegisterWrite((__int64 *)a1, 0x5B50u); /*0x3930c*/
UtlRegisterAccess((__int64 *)a1, 0x5B50u, v7 & 0xFFFFFFFE); /*0x39327*/
}
*(_DWORD *)(a1 + 1316) = 0; /*0x3932c*/
return 0; /*0x39335*/
}
// Function: NiiMcIpToMacNew @ 0x3933c (0xaa bytes)
__int64 __fastcall NiiMcIpToMacNew(__int64 a1)
{
int n2; // eax
__int64 result; // rax
char v4; // al
unsigned __int16 v5; // [rsp+30h] [rbp+8h] BYREF
n2 = *(_DWORD *)(a1 + 268); /*0x39346*/
v5 = 0; /*0x39353*/
if ( n2 <= 0 ) /*0x39358*/
return 4294967294LL; /*0x39358*/
if ( n2 <= 2 ) /*0x3935f*/
{
*(_DWORD *)(a1 + 1104) = 44565376; /*0x393c8*/
return 0; /*0x393c8*/
}
if ( n2 == 3 ) /*0x39364*/
return CompNameInstall(a1); /*0x393c6*/
if ( (unsigned int)(n2 - 4) > 1 ) /*0x3936c*/
return 4294967294LL; /*0x393d6*/
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 2, &v5); /*0x39373*/
if ( !(_DWORD)result ) /*0x3937b*/
{
*(_DWORD *)(a1 + 1104) = v5 << 16; /*0x39388*/
UtlRegisterRead(*(_QWORD *)a1, 20); /*0x39391*/
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 3, &v5); /*0x393a1*/
if ( !(_DWORD)result ) /*0x393a9*/
{
v4 = v5; /*0x393ab*/
*(_DWORD *)(a1 + 1104) |= v5; /*0x393b0*/
*(_DWORD *)(a1 + 1112) = v4 & 0xF; /*0x393b9*/
return 0; /*0x393d2*/
}
}
return result; /*0x393e0*/
}
// Function: NiiMcIpToMacFree @ 0x393e8 (0xe7 bytes)
__int64 __fastcall NiiMcIpToMacFree(__int64 a1)
{
int v1; // edi
int v3; // esi
int v4; // r12d
int v5; // ebp
bool v6; // zf
int v7; // eax
v1 = 0; /*0x39407*/
v3 = *(unsigned __int16 *)(a1 + 1264) + 1; /*0x3940c*/
v4 = v3; /*0x39419*/
v5 = 0; /*0x3941c*/
if ( *(_DWORD *)(a1 + 1316) > 2u ) /*0x3941e*/
v4 = 1; /*0x3941e*/
if ( v4 > 0 ) /*0x39425*/
{
do /*0x3944c*/
{
if ( (UtlRegisterWrite((__int64 *)a1, 0x5B50u) & 1) == 0 ) /*0x39437*/
break; /*0x39437*/
UtlRegisterRead(*(_QWORD *)a1, 50); /*0x39441*/
++v5; /*0x39446*/
}
while ( v5 < v4 ); /*0x3944c*/
}
if ( v5 == v4 ) /*0x39451*/
++*(_DWORD *)(a1 + 1316); /*0x39453*/
v6 = v3 == 0; /*0x3945a*/
if ( v3 > 0 ) /*0x3945c*/
{
do /*0x394a1*/
{
v7 = UtlRegisterWrite((__int64 *)a1, 0x5B50u); /*0x39466*/
UtlRegisterAccess((__int64 *)a1, 0x5B50u, v7 | 2); /*0x39479*/
if ( (UtlRegisterWrite((__int64 *)a1, 0x5B50u) & 2) != 0 ) /*0x3948d*/
break; /*0x3948d*/
UtlRegisterRead(*(_QWORD *)a1, 50); /*0x39497*/
++v1; /*0x3949c*/
}
while ( v1 < v3 ); /*0x394a1*/
v6 = v1 == v3; /*0x394a3*/
}
if ( !v6 ) /*0x394a5*/
return 0; /*0x394b4*/
NiiStnAddrAdd(a1); /*0x394aa*/
return 0xFFFFFFFFLL; /*0x394c5*/
}
// Function: NiiStnAddrAdd @ 0x394d0 (0x2b bytes)
char __fastcall NiiStnAddrAdd(__int64 *a1)
{
int v2; // eax
v2 = UtlRegisterWrite(a1, 0x5B50u); /*0x394de*/
return UtlRegisterAccess(a1, 0x5B50u, v2 & 0xFFFFFFFC); /*0x394f1*/
}
// Function: DxeRegister_22 @ 0x394fc (0x96 bytes)
__int64 __fastcall DxeRegister_22(__int64 *a1)
{
int n10; // ebx
int v3; // esi
int v4; // eax
n10 = 0; /*0x39518*/
v3 = UtlRegisterWrite(a1, 0xF00u); /*0x39521*/
do /*0x39555*/
{
UtlRegisterAccess(a1, 0xF00u, v3 | 0x20); /*0x3952e*/
v3 = UtlRegisterWrite(a1, 0xF00u); /*0x3953d*/
if ( (v3 & 0x20) != 0 ) /*0x39541*/
break; /*0x39541*/
UtlRegisterRead(*a1, 2000); /*0x3954b*/
++n10; /*0x39550*/
}
while ( n10 < 10 ); /*0x39555*/
if ( n10 != 10 ) /*0x3955a*/
return 0; /*0x3957b*/
v4 = UtlRegisterWrite(a1, 0xF00u); /*0x39561*/
UtlRegisterAccess(a1, 0xF00u, v4 & 0xFFFFFFDF); /*0x39571*/
return 4294967294LL; /*0x3958c*/
}
// Function: NiiStnAddrDel @ 0x39594 (0x5 bytes)
// attributes: thunk
void __fastcall NiiStnAddrDel(__int64 *a1)
{
DxeRegister_22(a1); /*0x39594*/
}
// Function: NiiStnAddrFlush @ 0x3959c (0x2b bytes)
char __fastcall NiiStnAddrFlush(__int64 *a1)
{
int v2; // eax
v2 = UtlRegisterWrite(a1, 0xF00u); /*0x395aa*/
return UtlRegisterAccess(a1, 0xF00u, v2 & 0xFFFFFFDF); /*0x395bd*/
}
// Function: NiiGroupsAddr @ 0x395c8 (0x42 bytes)
__int64 __fastcall NiiGroupsAddr(__int64 *a1, char a2)
{
int v4; // eax
int v5; // eax
v4 = UtlRegisterWrite(a1, 0xF10u); /*0x395dc*/
if ( a2 ) /*0x395e3*/
v5 = v4 | 2; /*0x395e5*/
else
v5 = v4 & 0xFFFFFFFD; /*0x395ea*/
UtlRegisterAccess(a1, 0xF10u, v5); /*0x395f8*/
return 0; /*0x39604*/
}
// Function: NiiGroupsAddrDel @ 0x3960c (0x5b bytes)
__int64 __fastcall NiiGroupsAddrDel(__int64 a1, char a2)
{
int v4; // eax
__int16 n47; // cx
v4 = UtlRegisterWrite((__int64 *)a1, 0xF10u); /*0x39620*/
if ( a2 ) /*0x39627*/
{
n47 = *(_WORD *)(a1 + 1120); /*0x3962e*/
if ( n47 == 47 || n47 == 15 || n47 == 3 ) /*0x39645*/
v4 |= 4u; /*0x39647*/
}
else
{
v4 &= ~4u; /*0x39629*/
}
UtlRegisterAccess((__int64 *)a1, 0xF10u, v4); /*0x39655*/
return 0; /*0x39661*/
}
// Function: DxeRegister_58 @ 0x39668 (0x44 bytes)
__int64 __fastcall DxeRegister_58(__int64 a1)
{
__int64 result; // rax
unsigned int v3; // ebx
result = NiiMcIpToMacFree(a1); /*0x39675*/
v3 = result; /*0x3967a*/
if ( !(_DWORD)result ) /*0x3967e*/
{
if ( *(_DWORD *)(a1 + 268) != 3 ) /*0x39687*/
{
v3 = DxeRegister_26((__int64 *)a1); /*0x39691*/
if ( v3 ) /*0x39695*/
NiiStnAddrAdd((__int64 *)a1); /*0x3969a*/
}
return v3; /*0x3969f*/
}
return result; /*0x396a6*/
}
// Function: DxeRegister_27Wrap @ 0x396ac (0x1b bytes)
char __fastcall DxeRegister_27Wrap(__int64 *a1)
{
DxeRegister_27((__int64)a1); /*0x396b5*/
return NiiStnAddrAdd(a1); /*0x396bd*/
}
// Function: DxeRegister_45 @ 0x396c8 (0x2e bytes)
__int64 __fastcall DxeRegister_45(__int64 a1, unsigned __int16 a2, unsigned __int16 a3, unsigned __int16 *a4)
{
int n2; // eax
n2 = *(_DWORD *)(a1 + 268); /*0x396cc*/
if ( n2 > 0 ) /*0x396d4*/
{
if ( n2 <= 2 ) /*0x396d9*/
return RegRegister_10(a1, a2, a3, (__int64)a4); /*0x396ec*/
if ( n2 <= 5 ) /*0x396de*/
return DxeRegister_15(a1, a2, a3, a4); /*0x396e5*/
}
return 0xFFFFFFFFLL; /*0x396f1*/
}
// Function: RegRegister_18 @ 0x396f8 (0x139 bytes)
__int64 __fastcall RegRegister_18(__int64 a1)
{
__int64 result; // rax
int v3; // edi
unsigned __int16 i; // si
int v5; // eax
unsigned __int16 j; // si
result = NvmCalcProtocolChecksum(a1); /*0x39714*/
v3 = 0; /*0x39719*/
if ( !(_DWORD)result ) /*0x3971d*/
{
if ( *(_DWORD *)(a1 + 1248) == 4 ) /*0x3972a*/
{
for ( i = 0; i < 0x7D0u; ++i ) /*0x39733*/
{
UtlRegisterRead(*(_QWORD *)a1, 1000); /*0x39749*/
if ( (UtlRegisterWrite((__int64 *)a1, 0x10u) & 0x80000) == 0 ) /*0x3975f*/
break; /*0x3975f*/
}
if ( i == 2000 ) /*0x3976d*/
{
return 0xFFFFFFFFLL; /*0x3976f*/
}
else
{
if ( (UtlRegisterWrite((__int64 *)a1, 0x103Cu) & 0xFF00) == 0xDB00 ) /*0x3978e*/
{
UtlRegisterAccess((__int64 *)a1, 0x8F00u, 64); /*0x397a0*/
UtlMicroStall((__int64 *)a1); /*0x397a8*/
UtlRegisterAccess((__int64 *)a1, 0x8F00u, 128); /*0x397b8*/
}
v5 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x397c5*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v5 | 0x80000); /*0x397d9*/
for ( j = 0; j < 0x7D0u; ++j ) /*0x397de*/
{
UtlRegisterRead(*(_QWORD *)a1, 1000); /*0x397e9*/
if ( (UtlRegisterWrite((__int64 *)a1, 0x10u) & 0x80000) == 0 ) /*0x397ff*/
break; /*0x397ff*/
}
LOBYTE(v3) = j != 2000; /*0x3980d*/
return (unsigned int)(v3 - 1); /*0x39814*/
}
}
else
{
return 0; /*0x3972c*/
}
}
return result; /*0x3982a*/
}
// Function: NvmCheckBootMode @ 0x39834 (0x92 bytes)
__int64 __fastcall NvmCheckBootMode(__int64 a1)
{
__int16 v3; // [rsp+30h] [rbp+8h] BYREF
if ( *(_DWORD *)(a1 + 1248) == 4 /*0x3988b*/
&& !(*(unsigned int (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1160))(a1, 16, 1, &v3)
&& (v3 & 0x10) == 0
&& !(*(unsigned int (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1160))(a1, 35, 1, &v3)
&& v3 >= 0 )
{
v3 |= 0x8000u; /*0x398a1*/
if ( !(*(unsigned int (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1208))(a1, 35, 1, &v3) ) /*0x398a6*/
(*(void (__fastcall **)(__int64))(a1 + 1184))(a1); /*0x398b3*/
}
return NiiParseMacString(a1); /*0x398bc*/
}
// Function: DxeRegister_15 @ 0x398c8 (0xd4 bytes)
__int64 __fastcall DxeRegister_15(__int64 a1, unsigned __int16 a2, unsigned __int16 a3, unsigned __int16 *a4)
{
unsigned __int16 v4; // ax
unsigned int v7; // edi
unsigned int v8; // ebx
int v9; // esi
int v10; // r12d
unsigned int v11; // r10d
v4 = *(_WORD *)(a1 + 1264); /*0x398e5*/
if ( a2 >= v4 ) /*0x398fb*/
return 0xFFFFFFFFLL; /*0x398fb*/
v7 = a3; /*0x39903*/
if ( a3 > v4 - a2 || !a3 ) /*0x39911*/
return 0xFFFFFFFFLL; /*0x3997a*/
v8 = 0; /*0x39913*/
v9 = 4 * a2; /*0x3991b*/
do /*0x39973*/
{
v10 = v9 | (*a4 << 16) | 1; /*0x39933*/
v11 = RegRegister_42((__int64 *)a1, 1); /*0x3993b*/
if ( v11 ) /*0x39941*/
break; /*0x39941*/
UtlRegisterAccess((__int64 *)a1, 0x102Cu, v10); /*0x3994e*/
v11 = RegRegister_42((__int64 *)a1, 1); /*0x39960*/
if ( v11 ) /*0x39966*/
break; /*0x39966*/
++v8; /*0x39968*/
v9 += 4; /*0x3996a*/
++a4; /*0x3996d*/
}
while ( v8 < v7 ); /*0x39973*/
return v11; /*0x39991*/
}
// Function: NiiIfInfoSet @ 0x3999c (0x4b bytes)
__int64 __fastcall NiiIfInfoSet(__int64 *a1)
{
int n100; // ebx
n100 = 100; /*0x399a9*/
do /*0x399d1*/
{
if ( (UtlRegisterWrite(a1, 0x1010u) & 0x40000) != 0 ) /*0x399bf*/
break; /*0x399bf*/
UtlRegisterRead(*a1, 1000); /*0x399c9*/
--n100; /*0x399ce*/
}
while ( n100 ); /*0x399d1*/
return n100 != 0 ? 0 : 0xFFFFFFF7;
}
// Function: NiiIfInfoGet @ 0x399e8 (0x101 bytes)
__int64 __fastcall NiiIfInfoGet(__int64 a1, char a2)
{
__int64 (__fastcall *v2)(__int64, __int64, __int16 *); // rax
__int64 result; // rax
__int16 v6; // r8
int n2; // r11d
__int16 v8; // [rsp+30h] [rbp+8h] BYREF
v2 = *(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960); /*0x399f2*/
if ( !v2 ) /*0x39a02*/
return 0; /*0x39a02*/
result = v2(a1, 25, &v8); /*0x39a12*/
if ( (_DWORD)result ) /*0x39a16*/
return result; /*0x39a16*/
if ( a2 ) /*0x39a2b*/
{
v8 |= 2u; /*0x39a32*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 25); /*0x39a38*/
if ( (_DWORD)result ) /*0x39a40*/
return result; /*0x39a40*/
LABEL_5:
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v8); /*0x39a46*/
if ( (_DWORD)result ) /*0x39a5d*/
return result; /*0x39a5d*/
v6 = v8 & 0xFF7F; /*0x39a6a*/
goto LABEL_7; /*0x39a6a*/
}
v8 &= ~2u; /*0x39a8e*/
(*(void (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 25); /*0x39a94*/
n2 = *(_DWORD *)(a1 + 1096); /*0x39a9a*/
if ( n2 != 1 ) /*0x39aa5*/
{
if ( n2 != 2 ) /*0x39ad6*/
return 0; /*0x39ad6*/
goto LABEL_5; /*0x39ad6*/
}
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v8); /*0x39ab5*/
if ( (_DWORD)result ) /*0x39abd*/
return result; /*0x39abd*/
v6 = v8 | 0x80; /*0x39ac8*/
LABEL_7:
v8 = v6; /*0x39a6e*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 16); /*0x39a79*/
if ( !(_DWORD)result ) /*0x39a81*/
return 0; /*0x39adc*/
return result; /*0x39ae3*/
}
// Function: RegRegister_3 @ 0x39aec (0x1f3 bytes)
__int64 __fastcall RegRegister_3(__int64 a1)
{
int v2; // edi
int v3; // eax
int n3; // eax
int v5; // eax
int n3_1; // eax
int v7; // eax
int v8; // eax
__int64 result; // rax
int n5; // eax
int v11; // eax
__int64 v12; // r8
v2 = RegRegister_41(a1); /*0x39b0a*/
UtlRegisterAccess((__int64 *)a1, 0xD8u, -1); /*0x39b0c*/
UtlRegisterAccess((__int64 *)a1, 0x100u, 0); /*0x39b1c*/
v3 = UtlRegisterWrite((__int64 *)a1, 0x400u); /*0x39b29*/
UtlRegisterAccess((__int64 *)a1, 0x400u, v3 & 0xFFFFFFFD); /*0x39b3c*/
UtlMicroStall((__int64 *)a1); /*0x39b44*/
UtlRegisterRead(*(_QWORD *)a1, 10000); /*0x39b51*/
n3 = *(_DWORD *)(a1 + 268); /*0x39b56*/
if ( n3 == 3 || (unsigned int)(n3 - 4) <= 1 ) /*0x39b67*/
v2 = DxeRegister_22((__int64 *)a1); /*0x39b71*/
v5 = UtlRegisterWrite((__int64 *)a1, 0); /*0x39b78*/
UtlRegisterAccess((__int64 *)a1, 0, v5 | 0x4000000); /*0x39b89*/
n3_1 = *(_DWORD *)(a1 + 268); /*0x39b8e*/
if ( n3_1 == 3 ) /*0x39b97*/
{
if ( !v2 ) /*0x39bb1*/
{
v7 = UtlRegisterWrite((__int64 *)a1, 0xF00u); /*0x39bbd*/
UtlRegisterAccess((__int64 *)a1, 0xF00u, v7 & 0xFFFFFFDF); /*0x39bcd*/
}
}
else if ( (unsigned int)(n3_1 - 4) <= 1 && !v2 ) /*0x39ba3*/
{
NiiStnAddrFlush((__int64 *)a1); /*0x39ba8*/
}
if ( *(_DWORD *)(a1 + 1248) == 4 ) /*0x39bd9*/
{
UtlRegisterRead(*(_QWORD *)a1, 10); /*0x39be3*/
v8 = UtlRegisterWrite((__int64 *)a1, 0x18u); /*0x39bf2*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v8 | 0x2000); /*0x39c03*/
UtlMicroStall((__int64 *)a1); /*0x39c0b*/
}
result = RegRegister_44((__int64 *)a1); /*0x39c13*/
if ( !(_DWORD)result ) /*0x39c1a*/
{
n5 = *(_DWORD *)(a1 + 268); /*0x39c20*/
if ( n5 > 0 ) /*0x39c28*/
{
if ( n5 <= 2 ) /*0x39c2d*/
{
v11 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x39c4d*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v11 & 0xFFFFFF3F); /*0x39c5f*/
}
else if ( n5 <= 5 ) /*0x39c32*/
{
UtlRegisterRead(*(_QWORD *)a1, 25000); /*0x39c3c*/
}
}
UtlRegisterAccess((__int64 *)a1, 0xD8u, -1); /*0x39c70*/
UtlRegisterWrite((__int64 *)a1, 0xC0u); /*0x39c7d*/
if ( *(_DWORD *)(a1 + 268) == 1 ) /*0x39c89*/
{
result = NiiMediaState(a1); /*0x39c8e*/
if ( (_DWORD)result ) /*0x39c95*/
return result; /*0x39c95*/
if ( *(_DWORD *)(a1 + 268) == 1 ) /*0x39c9e*/
{
v12 = (unsigned int)*(unsigned __int16 *)(a1 + 828) - 1; /*0x39cb2*/
*(_BYTE *)(a1 + 1312) = 1; /*0x39cb5*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 216))(a1, a1 + 256, v12); /*0x39cbc*/
}
}
if ( *(_DWORD *)(a1 + 1116) == 3 ) /*0x39cc9*/
*(_DWORD *)(a1 + 840) = 0; /*0x39ccb*/
return 0; /*0x39cd2*/
}
return result; /*0x39cd9*/
}
// Function: RegRegister_20 @ 0x39ce0 (0x11f bytes)
__int64 __fastcall RegRegister_20(__int64 a1)
{
unsigned __int16 i; // si
unsigned __int16 v3; // di
unsigned int v4; // edi
int v5; // eax
int n3; // r11d
unsigned int n23296; // esi
int v8; // eax
i = *(_WORD *)(a1 + 828); /*0x39cf4*/
DxeRegister_2(a1); /*0x39cfe*/
(*(void (__fastcall **)(__int64))(a1 + 40))(a1); /*0x39d06*/
(*(void (__fastcall **)(__int64))(a1 + 88))(a1); /*0x39d0c*/
v3 = 0; /*0x39d0f*/
if ( *(_DWORD *)(a1 + 268) == 1 && *(_BYTE *)(a1 + 1312) ) /*0x39d1c*/
--i; /*0x39d2a*/
NiiSetMacAddressList(a1, i); /*0x39d33*/
while ( v3 < *(_WORD *)(a1 + 310) ) /*0x39d59*/
UtlRegisterAccess((__int64 *)a1, 4 * v3++ + 20992, 0); /*0x39d47*/
v4 = (*(__int64 (__fastcall **)(__int64))(a1 + 176))(a1); /*0x39d6b*/
v5 = UtlRegisterWrite((__int64 *)a1, 0x3828u); /*0x39d6d*/
UtlRegisterAccess((__int64 *)a1, 0x3828u, v5 & 0xFE80FFFF | 0x1410000); /*0x39d86*/
n3 = *(_DWORD *)(a1 + 268); /*0x39d8b*/
if ( n3 == 3 ) /*0x39d96*/
{
Nii_3a704(a1); /*0x39dbb*/
LABEL_12:
n23296 = 23296; /*0x39dc0*/
v8 = UtlRegisterWrite((__int64 *)a1, 0x5B00u) | 0x8000000; /*0x39dcf*/
goto LABEL_13; /*0x39dcf*/
}
if ( n3 > 3 && n3 <= 5 ) /*0x39d9e*/
goto LABEL_12; /*0x39d9e*/
n23296 = 14632; /*0x39da0*/
v8 = UtlRegisterWrite((__int64 *)a1, 0x3928u) & 0xFE80FFFF | 0x1410000; /*0x39db1*/
LABEL_13:
UtlRegisterAccess((__int64 *)a1, n23296, v8); /*0x39dd3*/
Nii_3a4d0((__int64 *)a1); /*0x39de3*/
return v4; /*0x39df9*/
}
// Function: DxeRegister_2 @ 0x39e00 (0x21e bytes)
char __fastcall DxeRegister_2(__int64 a1)
{
int v2; // eax
int v3; // eax
int v4; // r8d
int n2; // eax
unsigned int v6; // r8d
int v7; // edi
unsigned int v8; // edi
int v9; // edi
int v10; // eax
int v11; // eax
int v12; // eax
int n2_1; // eax
int v14; // eax
int v15; // eax
unsigned int v16; // eax
int v17; // eax
int v18; // eax
v2 = UtlRegisterWrite((__int64 *)a1, 0x3828u); /*0x39e14*/
UtlRegisterAccess((__int64 *)a1, 0x3828u, v2 | 0x400000); /*0x39e25*/
v3 = UtlRegisterWrite((__int64 *)a1, 0x3928u); /*0x39e34*/
UtlRegisterAccess((__int64 *)a1, 0x3928u, v3 | 0x400000); /*0x39e45*/
v4 = UtlRegisterWrite((__int64 *)a1, 0x3840u); /*0x39e59*/
n2 = *(_DWORD *)(a1 + 268); /*0x39e5c*/
v6 = v4 & 0x87FFFFFF; /*0x39e62*/
if ( n2 > 0 ) /*0x39e6b*/
{
if ( n2 <= 2 ) /*0x39e70*/
{
v6 |= 0x7800000u; /*0x39e81*/
}
else if ( (unsigned int)(n2 - 4) <= 1 ) /*0x39e78*/
{
v6 |= 0x4000000u; /*0x39e7a*/
}
}
UtlRegisterAccess((__int64 *)a1, 0x3840u, v6); /*0x39e8d*/
v7 = UtlRegisterWrite((__int64 *)a1, 0x3940u); /*0x39e9f*/
if ( (unsigned int)(*(_DWORD *)(a1 + 268) - 1) <= 1 ) /*0x39eac*/
{
v8 = v7 & 0x98BFFFFF | 0x7400000; /*0x39ebc*/
if ( (UtlRegisterWrite((__int64 *)a1, 0x400u) & 0x10000000) != 0 ) /*0x39ecb*/
v9 = v8 & 0xEFFFFFFF; /*0x39ecd*/
else
v9 = v8 | 0x10000000; /*0x39ed3*/
UtlRegisterAccess((__int64 *)a1, 0x3940u, v9); /*0x39ee2*/
}
if ( (unsigned int)(*(_DWORD *)(a1 + 268) - 3) <= 2 ) /*0x39ef3*/
{
v10 = UtlRegisterWrite((__int64 *)a1, 0); /*0x39efa*/
UtlRegisterAccess((__int64 *)a1, 0, v10 & 0xDFFFFFFF); /*0x39f0b*/
}
if ( (unsigned int)(*(_DWORD *)(a1 + 268) - 3) <= 2 ) /*0x39f1c*/
{
v11 = UtlRegisterWrite((__int64 *)a1, 0x18u); /*0x39f26*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v11 & 0xFF3FFFFF | 0x400000); /*0x39f3e*/
}
if ( *(_DWORD *)(a1 + 268) == 1 ) /*0x39f4a*/
{
v12 = UtlRegisterWrite((__int64 *)a1, 0x1100u); /*0x39f56*/
UtlRegisterAccess((__int64 *)a1, 0x1100u, v12 | 1); /*0x39f66*/
}
n2_1 = *(_DWORD *)(a1 + 268); /*0x39f6b*/
if ( n2_1 == 1 || n2_1 == 2 ) /*0x39f79*/
{
v14 = UtlRegisterWrite((__int64 *)a1, 0x18u); /*0x39f83*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v14 & 0xFFF7FFFF); /*0x39f97*/
}
if ( *(int *)(a1 + 268) <= 3 ) /*0x39fa3*/
{
v15 = UtlRegisterWrite((__int64 *)a1, 0x5008u); /*0x39faf*/
UtlRegisterAccess((__int64 *)a1, 0x5008u, v15 | 0x30000); /*0x39fc1*/
}
v16 = *(_DWORD *)(a1 + 268) - 4; /*0x39fcc*/
if ( v16 <= 1 ) /*0x39fd2*/
{
v17 = UtlRegisterWrite((__int64 *)a1, 0x5B00u); /*0x39fde*/
UtlRegisterAccess((__int64 *)a1, 0x5B00u, v17 | 0x400000); /*0x39fef*/
v18 = UtlRegisterWrite((__int64 *)a1, 0x5B64u); /*0x39ffe*/
LOBYTE(v16) = UtlRegisterAccess((__int64 *)a1, 0x5B64u, v18 | 1); /*0x3a00e*/
}
return v16; /*0x3a018*/
}
// Function: Nii_3a020 @ 0x3a020 (0xa1 bytes)
__int64 __fastcall Nii_3a020(__int64 a1)
{
int v2; // edi
unsigned int v3; // esi
unsigned int v4; // edi
char v5; // cl
int v6; // r12d
unsigned int i; // ebp
__int64 v8; // r8
__int64 result; // rax
v2 = 0; /*0x3a047*/
v3 = 0; /*0x3a04a*/
if ( (unsigned int)(*(_DWORD *)(a1 + 268) - 3) <= 2 && *(_WORD *)(a1 + 1302) ) /*0x3a052*/
{
v4 = *(unsigned __int16 *)(a1 + 1302); /*0x3a067*/
v5 = v4 & 0x1F; /*0x3a06f*/
v2 = (v4 >> 5) & 0x7F; /*0x3a071*/
v3 = 1 << v5; /*0x3a074*/
}
v6 = 0; /*0x3a076*/
for ( i = 22016; i < 0x5800; i += 4 ) /*0x3a079*/
{
v8 = 0; /*0x3a07e*/
if ( v6 == v2 ) /*0x3a086*/
v8 = v3; /*0x3a086*/
UtlRegisterAccess(a1, i, v8); /*0x3a08d*/
result = UtlMicroStall(a1); /*0x3a095*/
++v6; /*0x3a09d*/
}
return result; /*0x3a0b7*/
}
// Function: Nii_3a0c4 @ 0x3a0c4 (0x37 bytes)
bool __fastcall Nii_3a0c4(__int64 a1)
{
__int16 v2; // [rsp+30h] [rbp+8h] BYREF
return !(*(unsigned int (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1160))(a1, 15, 1, &v2) /*0x3a0e5*/
&& (v2 & 0x6000) != 0;
}
// Function: Nii_3a0fc @ 0x3a0fc (0x5d bytes)
__int64 __fastcall Nii_3a0fc(__int64 a1)
{
int v1; // ebx
unsigned int i; // ecx
v1 = *(_DWORD *)(a1 + 284); /*0x3a106*/
if ( (UtlRegisterWrite((__int64 *)a1, 8u) & 2) == 0 ) /*0x3a11b*/
{
for ( i = 0; i < 0x20; i += 8 ) /*0x3a11d*/
{
if ( (unsigned __int8)(*(_DWORD *)(a1 + 284) >> i) == 14 ) /*0x3a129*/
v1 |= 64 << i; /*0x3a132*/
}
}
UtlRegisterAccess((__int64 *)a1, 0xE00u, v1); /*0x3a147*/
return 0; /*0x3a153*/
}
// Function: NiiGetMcIpToMac @ 0x3a15c (0x29 bytes)
__int64 __fastcall NiiGetMcIpToMac(__int64 a1)
{
if ( (unsigned int)(*(_DWORD *)(a1 + 268) - 3) <= 2 && *(_DWORD *)(a1 + 868) == 255 ) /*0x3a174*/
*(_DWORD *)(a1 + 868) = 3; /*0x3a176*/
return Nii_3b234(a1);
}
// Function: Nii_3a188 @ 0x3a188 (0x69 bytes)
__int64 __fastcall Nii_3a188(__int64 a1)
{
int v2; // eax
int n4; // r11d
__int64 result; // rax
v2 = UtlRegisterWrite((__int64 *)a1, 0); /*0x3a193*/
UtlRegisterAccess((__int64 *)a1, 0, v2 & 0xFFFFE7BF | 0x40); /*0x3a1a8*/
n4 = *(_DWORD *)(a1 + 1072); /*0x3a1ad*/
if ( n4 != 2 ) /*0x3a1b8*/
{
if ( n4 == 4 ) /*0x3a1be*/
{
result = RegRegister_15(a1); /*0x3a1d0*/
goto LABEL_7; /*0x3a1d5*/
}
if ( n4 != 8 ) /*0x3a1c4*/
return 4294967294LL; /*0x3a1cb*/
}
result = MacInitConfigFlags(a1); /*0x3a1da*/
LABEL_7:
if ( !(_DWORD)result ) /*0x3a1e1*/
return DxeRegister_56(a1); /*0x3a1e6*/
return result; /*0x3a1eb*/
}
// Function: Nii_3a1f4 @ 0x3a1f4 (0x33 bytes)
__int64 __fastcall Nii_3a1f4(__int64 a1)
{
if ( (unsigned int)(*(_DWORD *)(a1 + 268) - 1) <= 1 ) /*0x3a208*/
UtlRegisterAccess(a1, 36, 1024); /*0x3a215*/
return Nii_3b364(a1); /*0x3a21d*/
}
// Function: Nii_3a228 @ 0x3a228 (0x1d7 bytes)
__int64 __fastcall Nii_3a228(__int64 a1)
{
unsigned int v2; // r12d
int v3; // esi
char v4; // bp
int v5; // r11d
unsigned int n376; // edx
unsigned int v7; // r8d
int n5; // esi
int v9; // eax
int v10; // eax
v2 = 0; /*0x3a242*/
v3 = UtlRegisterWrite((__int64 *)a1, 0); /*0x3a252*/
v4 = UtlRegisterWrite((__int64 *)a1, 8u); /*0x3a261*/
UtlRegisterWrite((__int64 *)a1, 0x180u); /*0x3a263*/
UtlRegisterRead(*(_QWORD *)a1, 10); /*0x3a270*/
v5 = UtlRegisterWrite((__int64 *)a1, 0x180u); /*0x3a282*/
if ( (v5 & 0x40000000) == 0 || (v5 & 0x8000000) != 0 ) /*0x3a295*/
{
if ( (v5 & 0x40000000) == 0 ) /*0x3a35f*/
{
*(_DWORD *)(a1 + 840) = 0; /*0x3a361*/
LABEL_31:
*(_BYTE *)(a1 + 844) = 0; /*0x3a3df*/
return v2; /*0x3a3df*/
}
n5 = 0; /*0x3a36a*/
while ( 1 ) /*0x3a374*/
{
UtlRegisterRead(*(_QWORD *)a1, 10); /*0x3a374*/
v9 = UtlRegisterWrite((__int64 *)a1, 0x180u); /*0x3a381*/
if ( ((v9 & 0x40000000) == 0 || (v9 & 0x20000000) == 0) && (v9 & 0x8000000) != 0 ) /*0x3a396*/
break; /*0x3a396*/
if ( (unsigned int)++n5 >= 5 ) /*0x3a39d*/
goto LABEL_27; /*0x3a39d*/
}
*(_DWORD *)(a1 + 840) = 0; /*0x3a3a1*/
*(_BYTE *)(a1 + 844) = 0; /*0x3a3a8*/
LABEL_27:
if ( n5 == 5 ) /*0x3a3b2*/
{
v10 = UtlRegisterWrite((__int64 *)a1, 0x178u); /*0x3a3bc*/
n376 = 376; /*0x3a3c1*/
v7 = v10 | 0x80000000; /*0x3a3ca*/
goto LABEL_29; /*0x3a3ca*/
}
}
else
{
if ( *(_DWORD *)(a1 + 840) != 1 ) /*0x3a2a4*/
{
if ( *(_DWORD *)(a1 + 840) == 2 ) /*0x3a2a9*/
{
if ( (v4 & 2) == 0 ) /*0x3a2de*/
{
LABEL_30:
*(_DWORD *)(a1 + 840) = 1; /*0x3a3d5*/
goto LABEL_31; /*0x3a3d5*/
}
}
else if ( *(_DWORD *)(a1 + 840) != 3 || (v5 & 0x20000000) != 0 ) /*0x3a2d6*/
{
UtlRegisterAccess((__int64 *)a1, 0x178u, *(_DWORD *)(a1 + 296)); /*0x3a2bf*/
n376 = 0; /*0x3a2c7*/
v7 = v3 & 0xFFFFFFBF; /*0x3a2c9*/
LABEL_29:
UtlRegisterAccess((__int64 *)a1, n376, v7); /*0x3a3cd*/
goto LABEL_30; /*0x3a3d0*/
}
goto LABEL_17; /*0x3a2d6*/
}
if ( (v5 & 0x20000000) != 0 ) /*0x3a2eb*/
{
if ( (v4 & 2) != 0 ) /*0x3a2f1*/
{
*(_DWORD *)(a1 + 840) = 2; /*0x3a2f3*/
LABEL_17:
*(_BYTE *)(a1 + 844) = 1; /*0x3a351*/
return v2; /*0x3a358*/
}
*(_DWORD *)(a1 + 840) = 0; /*0x3a2ff*/
}
else
{
UtlRegisterAccess((__int64 *)a1, 0x178u, *(_DWORD *)(a1 + 296) & 0x7FFFFFFF); /*0x3a31f*/
UtlRegisterAccess((__int64 *)a1, 0, v3 | 0x41); /*0x3a32f*/
v2 = NiiReceiveFilterReset(a1); /*0x3a33c*/
if ( !v2 ) /*0x3a341*/
{
*(_DWORD *)(a1 + 840) = 3; /*0x3a347*/
goto LABEL_17; /*0x3a347*/
}
}
}
return v2; /*0x3a3f8*/
}
// Function: Nii_3a400 @ 0x3a400 (0x6b bytes)
__int64 __fastcall Nii_3a400(__int64 a1, __int16 *a2)
{
__int64 result; // rax
__int16 n6161; // ax
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1160))(a1, 4, 1, a2); /*0x3a41c*/
if ( !(_DWORD)result ) /*0x3a426*/
{
if ( (unsigned int)(*(_DWORD *)(a1 + 268) - 3) > 2 ) /*0x3a434*/
{
if ( *a2 && *a2 != -1 ) /*0x3a454*/
return 0; /*0x3a454*/
n6161 = -30447; /*0x3a456*/
}
else
{
if ( *a2 != -2234 ) /*0x3a43e*/
return 0; /*0x3a45e*/
n6161 = 6161; /*0x3a440*/
}
*a2 = n6161; /*0x3a45b*/
return 0; /*0x3a45b*/
}
return result; /*0x3a465*/
}
// Function: Nii_3a46c @ 0x3a46c (0x29 bytes)
__int64 __fastcall Nii_3a46c(__int64 a1)
{
__int64 result; // rax
if ( *(_DWORD *)(a1 + 268) != 1 ) /*0x3a47c*/
return NiiSnpInitialize(a1); /*0x3a47c*/
result = NiiMediaState(); /*0x3a47e*/
if ( !(_DWORD)result ) /*0x3a485*/
return NiiSnpInitialize(a1); /*0x3a48a*/
return result; /*0x3a48f*/
}
// Function: Nii_3a498 @ 0x3a498 (0x35 bytes)
void __fastcall Nii_3a498(__int64 a1)
{
if ( *(_QWORD *)(a1 + 904) /*0x3a4b5*/
&& !(*(unsigned __int8 (**)(void))(a1 + 56))()
&& !(*(unsigned int (__fastcall **)(__int64))(a1 + 904))(a1) )
{
MngCloseSession(a1); /*0x3a4c2*/
}
}
// Function: Nii_3a4d0 @ 0x3a4d0 (0x199 bytes)
__int64 __fastcall Nii_3a4d0(__int64 *a1)
{
RegRegister_5(); /*0x3a4d9*/
UtlRegisterWrite(a1, 0x405Cu); /*0x3a4e6*/
UtlRegisterWrite(a1, 0x4060u); /*0x3a4f3*/
UtlRegisterWrite(a1, 0x4064u); /*0x3a500*/
UtlRegisterWrite(a1, 0x4068u); /*0x3a50d*/
UtlRegisterWrite(a1, 0x406Cu); /*0x3a51a*/
UtlRegisterWrite(a1, 0x4070u); /*0x3a527*/
UtlRegisterWrite(a1, 0x40D8u); /*0x3a534*/
UtlRegisterWrite(a1, 0x40DCu); /*0x3a541*/
UtlRegisterWrite(a1, 0x40E0u); /*0x3a54e*/
UtlRegisterWrite(a1, 0x40E4u); /*0x3a55b*/
UtlRegisterWrite(a1, 0x40E8u); /*0x3a568*/
UtlRegisterWrite(a1, 0x40ECu); /*0x3a575*/
UtlRegisterWrite(a1, 0x4004u); /*0x3a582*/
UtlRegisterWrite(a1, 0x400Cu); /*0x3a58f*/
UtlRegisterWrite(a1, 0x4034u); /*0x3a59c*/
UtlRegisterWrite(a1, 0x403Cu); /*0x3a5a9*/
UtlRegisterWrite(a1, 0x40F8u); /*0x3a5b6*/
UtlRegisterWrite(a1, 0x40FCu); /*0x3a5c3*/
UtlRegisterWrite(a1, 0x40B4u); /*0x3a5d0*/
UtlRegisterWrite(a1, 0x40B8u); /*0x3a5dd*/
UtlRegisterWrite(a1, 0x40BCu); /*0x3a5ea*/
UtlRegisterWrite(a1, 0x4100u); /*0x3a5f7*/
UtlRegisterWrite(a1, 0x4124u); /*0x3a604*/
UtlRegisterWrite(a1, 0x4104u); /*0x3a611*/
UtlRegisterWrite(a1, 0x4108u); /*0x3a61e*/
UtlRegisterWrite(a1, 0x410Cu); /*0x3a62b*/
UtlRegisterWrite(a1, 0x4110u); /*0x3a638*/
UtlRegisterWrite(a1, 0x4118u); /*0x3a645*/
UtlRegisterWrite(a1, 0x411Cu); /*0x3a652*/
return UtlRegisterWrite(a1, 0x4120u); /*0x3a65f*/
}
// Function: Nii_3a66c @ 0x3a66c (0x79 bytes)
__int64 __fastcall Nii_3a66c(__int64 a1)
{
unsigned int v1; // ebx
unsigned __int8 i; // si
v1 = 0; /*0x3a67b*/
if ( !*(_BYTE *)(a1 + 833) || (UtlRegisterWrite((__int64 *)a1, 0x8F00u) & 1) == 0 ) /*0x3a69b*/
return 4294967285LL; /*0x3a688*/
for ( i = 0; i < 0xAu; ++i ) /*0x3a69d*/
{
if ( (UtlRegisterWrite((__int64 *)a1, 0x8F00u) & 2) == 0 ) /*0x3a6af*/
break; /*0x3a6af*/
UtlRegisterRead(*(_QWORD *)a1, 1000); /*0x3a6b9*/
}
if ( i == 10 ) /*0x3a6d0*/
return (unsigned int)-11; /*0x3a6d0*/
return v1; /*0x3a6df*/
}
// Function: Nii_3a6e8 @ 0x3a6e8 (0x1b bytes)
bool __fastcall Nii_3a6e8(__int64 *a1)
{
return (UtlRegisterWrite(a1, 0x5B54u) & 0xE) == 6; /*0x3a6fe*/
}
// Function: Nii_3a704 @ 0x3a704 (0xdf bytes)
char __fastcall Nii_3a704(__int64 a1)
{
unsigned __int8 n4; // si
_DWORD *v4; // rbp
int v5; // eax
int v6; // r8d
char v7; // al
_BYTE *v8; // rcx
__int64 n16; // rdx
*(_BYTE *)(a1 + 845) = 1; /*0x3a71b*/
if ( !(*(unsigned __int8 (**)(void))(a1 + 56))() || (unsigned int)Nii_3a66c(a1) ) /*0x3a73a*/
{
*(_BYTE *)(a1 + 845) = 0; /*0x3a729*/
return 0; /*0x3a730*/
}
else
{
n4 = 0; /*0x3a743*/
v4 = (_DWORD *)(a1 + 1296); /*0x3a746*/
do /*0x3a76e*/
{
v5 = UtlRegisterWrite((__int64 *)a1, 4 * (unsigned int)n4++ + 36592); /*0x3a75b*/
*v4++ = v5; /*0x3a763*/
}
while ( n4 < 4u ); /*0x3a76e*/
v6 = *(unsigned __int8 *)(a1 + 1311); /*0x3a770*/
v7 = 0; /*0x3a778*/
v8 = (_BYTE *)(a1 + 1296); /*0x3a77a*/
*(_BYTE *)(a1 + 1311) = 0; /*0x3a781*/
n16 = 16; /*0x3a788*/
do /*0x3a796*/
{
v7 += *v8++; /*0x3a78d*/
--n16; /*0x3a792*/
}
while ( n16 ); /*0x3a796*/
if ( v6 == (unsigned __int8)-v7 && *(_DWORD *)(a1 + 1296) == 1414349129 ) /*0x3a7ac*/
{
if ( (*(_BYTE *)(a1 + 1300) & 1) == 0 ) /*0x3a7b5*/
*(_BYTE *)(a1 + 845) = 0; /*0x3a7b7*/
return *(_BYTE *)(a1 + 845); /*0x3a7bd*/
}
else
{
*(_BYTE *)(a1 + 845) = 1; /*0x3a7c5*/
return 1; /*0x3a7cc*/
}
}
}
// Function: Nii_3a7e4 @ 0x3a7e4 (0xe2 bytes)
bool __fastcall Nii_3a7e4(__int64 a1)
{
__int64 v2; // rax
char v3; // di
int n4; // ecx
int v7; // edi
__int64 (__fastcall *v8)(__int64, __int64, __int64, __int16 *); // rax
int v9; // eax
__int16 v10; // [rsp+30h] [rbp+8h] BYREF
if ( !*(_BYTE *)(a1 + 834) ) /*0x3a7ee*/
return 0; /*0x3a7ee*/
v2 = UtlRegisterWrite((__int64 *)a1, 0x5820u); /*0x3a803*/
if ( (v2 & 0x20000) == 0 ) /*0x3a80c*/
return 0; /*0x3a80c*/
if ( *(_BYTE *)(a1 + 832) ) /*0x3a812*/
{
v3 = UtlRegisterWrite((__int64 *)a1, 0x5B54u); /*0x3a830*/
if ( (UtlRegisterWrite((__int64 *)a1, 0x5B30u) & 0x20000000) != 0 ) /*0x3a83b*/
return 0; /*0x3a83b*/
return (v3 & 0xE) == 4; /*0x3a841*/
}
else
{
n4 = *(_DWORD *)(a1 + 268); /*0x3a84b*/
if ( n4 == 4 || n4 == 5 ) /*0x3a859*/
{
v7 = UtlRegisterWrite((__int64 *)a1, 0x5B30u); /*0x3a870*/
v8 = *(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1160); /*0x3a872*/
if ( v8 ) /*0x3a87c*/
v9 = v8(a1, 15, 1, &v10); /*0x3a88f*/
else
v9 = -3; /*0x3a893*/
if ( v9 || (v7 & 0x20000000) != 0 ) /*0x3a8a0*/
return 0; /*0x3a8a0*/
return (v10 & 0x6000) == 0x4000; /*0x3a8b4*/
}
else
{
if ( (v2 & 1) == 0 ) /*0x3a85d*/
return 0; /*0x3a85d*/
return (v2 & 2) == 0; /*0x3a85f*/
}
}
}
// Function: NiiNullStub @ 0x3a8c8 (0x3 bytes)
char NiiNullStub()
{
return 0; /*0x3a8ca*/
}
// Function: NiiStationAddrSet @ 0x3a8cc (0x87 bytes)
__int64 __fastcall NiiStationAddrSet(__int64 a1)
{
unsigned int v2; // ecx
unsigned __int16 v4; // [rsp+30h] [rbp+8h] BYREF
*(_DWORD *)(a1 + 1280) = 3; /*0x3a8df*/
if ( (unsigned int)UndiCommandEntry((__int64 *)a1, 18, &v4) ) /*0x3a8e9*/
{
*(_DWORD *)(a1 + 1288) = 0; /*0x3a8f6*/
*(_DWORD *)(a1 + 1284) = 0; /*0x3a8fd*/
}
else
{
v2 = v4; /*0x3a906*/
if ( (v4 & 0xF) == 1 ) /*0x3a913*/
{
*(_DWORD *)(a1 + 1284) = 6; /*0x3a92f*/
}
else if ( (v4 & 0xF) == 2 ) /*0x3a918*/
{
*(_DWORD *)(a1 + 1284) = 7; /*0x3a923*/
}
else
{
*(_DWORD *)(a1 + 1284) = 0; /*0x3a91a*/
}
*(_DWORD *)(a1 + 1288) = (v2 >> 4) & 0x3F; /*0x3a93f*/
}
(*(void (__fastcall **)(__int64))(a1 + 104))(a1); /*0x3a948*/
return 0; /*0x3a94d*/
}
// Function: NiiGetProtoType @ 0x3a954 (0x27 bytes)
__int16 __fastcall NiiGetProtoType(__int64 a1)
{
__int16 result; // ax
result = ((unsigned int)UtlRegisterWrite((__int64 *)a1, 8u) >> 2) & 3; /*0x3a96a*/
*(_WORD *)(a1 + 1292) = result; /*0x3a96e*/
return result; /*0x3a975*/
}
// Function: NiiGetStatusVal @ 0x3a97c (0xa bytes)
__int64 __fastcall NiiGetStatusVal(__int64 a1)
{
*(_WORD *)(a1 + 1292) = 0; /*0x3a97e*/
return 0; /*0x3a985*/
}
// Function: RegRegister_54 @ 0x3a988 (0x3d bytes)
char __fastcall RegRegister_54(__int64 *a1)
{
unsigned int i; // ebx
char result; // al
for ( i = 22016; i < 0x5800; i += 4 ) /*0x3a995*/
{
UtlRegisterAccess(a1, i, 0); /*0x3a9a2*/
result = UtlMicroStall(a1); /*0x3a9aa*/
}
return result; /*0x3a9bf*/
}
// Function: RegRegister_57 @ 0x3a9c8 (0x22 bytes)
char __fastcall RegRegister_57(__int64 *a1, int a2, int a3)
{
UtlRegisterAccess(a1, 4 * a2 + 22016, a3); /*0x3a9d8*/
return UtlMicroStall(a1); /*0x3a9e0*/
}
// Function: NiiSetMacAddressList @ 0x3a9ec (0x64 bytes)
__int64 __fastcall NiiSetMacAddressList(__int64 a1, unsigned __int16 i)
{
unsigned int i_1; // ebx
__int64 result; // rax
unsigned int j; // edi
char v6; // [rsp+30h] [rbp+8h] BYREF
int v7; // [rsp+31h] [rbp+9h]
char v8; // [rsp+35h] [rbp+Dh]
i_1 = i; /*0x3a9fd*/
v6 = 0; /*0x3aa0d*/
v7 = 0; /*0x3aa12*/
v8 = 0; /*0x3aa16*/
result = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 216))(a1, a1 + 256, 0); /*0x3aa1a*/
for ( j = 1; j < i_1; ++j ) /*0x3aa27*/
result = (*(__int64 (__fastcall **)(__int64, char *, _QWORD))(a1 + 216))(a1, &v6, j); /*0x3aa34*/
return result; /*0x3aa4a*/
}
// Function: NiiMediaState @ 0x3aa50 (0x12f bytes)
__int64 __fastcall NiiMediaState(__int64 a1)
{
__int64 result; // rax
int n3; // eax
__int16 v4; // cx
__int16 n2; // ax
unsigned int n6; // esi
__int64 i; // rdi
__int64 v8; // rdx
char v9; // ah
__int16 v10; // [rsp+60h] [rbp+8h] BYREF
char v11; // [rsp+68h] [rbp+10h] BYREF
char v12; // [rsp+69h] [rbp+11h]
char v13; // [rsp+70h] [rbp+18h] BYREF
_BYTE v14[7]; // [rsp+71h] [rbp+19h]
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, char *))(a1 + 1160))(a1, 3, 1, &v11); /*0x3aa77*/
if ( !(_DWORD)result ) /*0x3aa81*/
{
n3 = *(_DWORD *)(a1 + 268); /*0x3aa87*/
if ( n3 == 3 || n3 >= 16 ) /*0x3aa98*/
return 0; /*0x3aa98*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1160))(a1, 55, 1, &v10); /*0x3aaac*/
if ( (_DWORD)result ) /*0x3aab4*/
return result; /*0x3aab4*/
v4 = v10; /*0x3aaba*/
if ( v10 == -1 || !v10 ) /*0x3aad0*/
{
return 0; /*0x3ab6e*/
}
else
{
n2 = *(_WORD *)(a1 + 1292); /*0x3aad6*/
if ( n2 == 1 ) /*0x3aae1*/
{
v4 = v10 + 3; /*0x3aae3*/
v10 += 3; /*0x3aae6*/
}
if ( n2 == 2 ) /*0x3aaf9*/
{
v4 += 6; /*0x3aafb*/
v10 = v4; /*0x3aaff*/
}
if ( n2 == 3 ) /*0x3ab07*/
{
v4 += 9; /*0x3ab09*/
v10 = v4; /*0x3ab0d*/
}
n6 = 0; /*0x3ab12*/
for ( i = 0; ; i += 2 ) /*0x3ab14*/
{
v8 = n6 >> 1; /*0x3ab21*/
LOWORD(v8) = v4 + v8; /*0x3ab23*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, char *))(a1 + 1160))(a1, v8, 1, &v11); /*0x3ab29*/
if ( (_DWORD)result ) /*0x3ab31*/
break; /*0x3ab31*/
v9 = v12; /*0x3ab33*/
n6 += 2; /*0x3ab38*/
v14[i - 1] = v11; /*0x3ab3b*/
v14[i] = v9; /*0x3ab43*/
if ( n6 >= 6 ) /*0x3ab4d*/
{
if ( (v13 & 1) == 0 ) /*0x3ab5b*/
(*(void (__fastcall **)(__int64, char *, _QWORD))(a1 + 216))(a1, &v13, 0); /*0x3ab68*/
return 0; /*0x3ab68*/
}
v4 = v10; /*0x3ab4f*/
}
}
}
return result; /*0x3ab70*/
}
// Function: NiiStnAddrSet @ 0x3ab80 (0xae bytes)
__int64 __fastcall NiiStnAddrSet(__int64 *a1, unsigned __int8 *a2, unsigned int n0xF)
{
int v5; // r8d
int v6; // ebx
unsigned int v7; // edx
unsigned int v8; // edx
v5 = *a2 | ((a2[1] | (*((unsigned __int16 *)a2 + 1) << 8)) << 8); /*0x3abbe*/
v6 = *((unsigned __int16 *)a2 + 2); /*0x3abc5*/
if ( v5 || *((_WORD *)a2 + 2) ) /*0x3abc1*/
v6 |= 0x80000000; /*0x3abd0*/
v7 = 8 * n0xF + 21600; /*0x3abdb*/
if ( n0xF <= 0xF ) /*0x3abe5*/
v7 = 8 * n0xF + 21504; /*0x3abe5*/
UtlRegisterAccess(a1, v7, v5); /*0x3abe8*/
UtlMicroStall(a1); /*0x3abf0*/
v8 = 8 * n0xF + 21604; /*0x3abfc*/
if ( n0xF <= 0xF ) /*0x3ac0c*/
v8 = 8 * n0xF + 21508; /*0x3ac0c*/
UtlRegisterAccess(a1, v8, v6); /*0x3ac0f*/
UtlMicroStall(a1); /*0x3ac17*/
return 0; /*0x3ac28*/
}
// Function: NiiSetFilterEntry @ 0x3ac30 (0x78 bytes)
__int64 __fastcall NiiSetFilterEntry(__int64 a1, __int64 a2)
{
char v2; // r8
unsigned int v3; // r9d
v2 = 0; /*0x3ac3e*/
v3 = 32 * *(unsigned __int16 *)(a1 + 310) - 1; /*0x3ac48*/
if ( 32 * *(unsigned __int16 *)(a1 + 310) != 256 ) /*0x3ac52*/
{
do /*0x3ac64*/
++v2; /*0x3ac54*/
while ( v3 >> v2 != 255 ); /*0x3ac64*/
}
switch ( *(_DWORD *)(a1 + 288) ) /*0x3ac70*/
{
case 1: /*0x3ac70*/
++v2; /*0x3ac88*/
break;
case 2: /*0x3ac70*/
v2 += 2; /*0x3ac82*/
break;
case 3: /*0x3ac70*/
v2 += 4; /*0x3ac7c*/
break;
}
return v3 & ((*(unsigned __int8 *)(a2 + 5) << v2) | (*(unsigned __int8 *)(a2 + 4) >> (8 - v2))); /*0x3aca7*/
}
// Function: NiiStnAddrGet @ 0x3aca8 (0xba bytes)
char __fastcall NiiStnAddrGet(__int64 a1, __int64 a2, unsigned int a3)
{
__int64 n512; // rax
_BYTE *v6; // rcx
__int64 v7; // rbx
unsigned int v8; // eax
__int64 v9; // r8
int v10; // ebx
int *v11; // rsi
n512 = 512; /*0x3acbd*/
v6 = (_BYTE *)(a1 + 316); /*0x3acc2*/
do /*0x3acd3*/
{
*v6++ = 0; /*0x3acc9*/
--n512; /*0x3accf*/
}
while ( n512 ); /*0x3acd3*/
if ( a3 ) /*0x3acd8*/
{
v7 = a3; /*0x3acda*/
do /*0x3ad17*/
{
v8 = NiiSetFilterEntry(a1, a2); /*0x3ace3*/
a2 += 6; /*0x3ad00*/
v9 = (v8 >> 5) & (*(unsigned __int16 *)(a1 + 310) - 1); /*0x3ad04*/
*(_DWORD *)(a1 + 4 * v9 + 316) |= 1 << (v8 & 0x1F); /*0x3ad0b*/
--v7; /*0x3ad13*/
}
while ( v7 ); /*0x3ad17*/
}
v10 = *(unsigned __int16 *)(a1 + 310) - 1; /*0x3ad20*/
if ( v10 >= 0 ) /*0x3ad26*/
{
v11 = (int *)(a1 + 4LL * v10 + 316); /*0x3ad28*/
do /*0x3ad49*/
UtlRegisterAccess((__int64 *)a1, 4 * v10-- + 20992, *v11--); /*0x3ad3d*/
while ( v10 >= 0 ); /*0x3ad49*/
}
return UtlMicroStall((__int64 *)a1); /*0x3ad58*/
}
// Function: RegRegister_5 @ 0x3ad64 (0x1ec bytes)
__int64 __fastcall RegRegister_5(__int64 *a1)
{
UtlRegisterWrite(a1, 0x4000u); /*0x3ad72*/
UtlRegisterWrite(a1, 0x4008u); /*0x3ad7f*/
UtlRegisterWrite(a1, 0x4010u); /*0x3ad8c*/
UtlRegisterWrite(a1, 0x4014u); /*0x3ad99*/
UtlRegisterWrite(a1, 0x4018u); /*0x3ada6*/
UtlRegisterWrite(a1, 0x401Cu); /*0x3adb3*/
UtlRegisterWrite(a1, 0x4020u); /*0x3adc0*/
UtlRegisterWrite(a1, 0x4028u); /*0x3adcd*/
UtlRegisterWrite(a1, 0x4030u); /*0x3adda*/
UtlRegisterWrite(a1, 0x4038u); /*0x3ade7*/
UtlRegisterWrite(a1, 0x4040u); /*0x3adf4*/
UtlRegisterWrite(a1, 0x4048u); /*0x3ae01*/
UtlRegisterWrite(a1, 0x404Cu); /*0x3ae0e*/
UtlRegisterWrite(a1, 0x4050u); /*0x3ae1b*/
UtlRegisterWrite(a1, 0x4054u); /*0x3ae28*/
UtlRegisterWrite(a1, 0x4058u); /*0x3ae35*/
UtlRegisterWrite(a1, 0x4074u); /*0x3ae42*/
UtlRegisterWrite(a1, 0x4078u); /*0x3ae4f*/
UtlRegisterWrite(a1, 0x407Cu); /*0x3ae5c*/
UtlRegisterWrite(a1, 0x4080u); /*0x3ae69*/
UtlRegisterWrite(a1, 0x4088u); /*0x3ae76*/
UtlRegisterWrite(a1, 0x408Cu); /*0x3ae83*/
UtlRegisterWrite(a1, 0x4090u); /*0x3ae90*/
UtlRegisterWrite(a1, 0x4094u); /*0x3ae9d*/
UtlRegisterWrite(a1, 0x40A0u); /*0x3aeaa*/
UtlRegisterWrite(a1, 0x40A4u); /*0x3aeb7*/
UtlRegisterWrite(a1, 0x40A8u); /*0x3aec4*/
UtlRegisterWrite(a1, 0x40ACu); /*0x3aed1*/
UtlRegisterWrite(a1, 0x40B0u); /*0x3aede*/
UtlRegisterWrite(a1, 0x40C0u); /*0x3aeeb*/
UtlRegisterWrite(a1, 0x40C4u); /*0x3aef8*/
UtlRegisterWrite(a1, 0x40C8u); /*0x3af05*/
UtlRegisterWrite(a1, 0x40CCu); /*0x3af12*/
UtlRegisterWrite(a1, 0x40D0u); /*0x3af1f*/
UtlRegisterWrite(a1, 0x40D4u); /*0x3af2c*/
UtlRegisterWrite(a1, 0x40F0u); /*0x3af39*/
return UtlRegisterWrite(a1, 0x40F4u); /*0x3af46*/
}
// Function: NiiGetVlanState @ 0x3af50 (0x72 bytes)
__int64 __fastcall NiiGetVlanState(__int64 a1)
{
__int64 result; // rax
bool v3; // [rsp+30h] [rbp+8h] BYREF
if ( !*(_BYTE *)(a1 + 837) ) /*0x3af56*/
return 0; /*0x3af60*/
if ( !*(_QWORD *)(a1 + 960) || (result = UtlParseTokenStrLong(a1, 1u, 0, &v3), !(_DWORD)result) ) /*0x3af83*/
{
if ( !v3 ) /*0x3af8a*/
return 0; /*0x3af64*/
*(_BYTE *)(a1 + 837) = 0; /*0x3af8f*/
PhyCheckLinkSpeedCap(a1); /*0x3af96*/
if ( *(_BYTE *)(a1 + 835) ) /*0x3af9b*/
{
(*(void (__fastcall **)(__int64))(a1 + 208))(a1); /*0x3afae*/
return NiiReceiveFilterReset(a1); /*0x3afb7*/
}
else
{
return 4294967293LL; /*0x3afa4*/
}
}
return result; /*0x3afbc*/
}
// Function: RegRegister_23 @ 0x3afc4 (0xe5 bytes)
__int64 __fastcall RegRegister_23(__int64 a1)
{
int v2; // edi
char v3; // si
int v4; // eax
int v5; // eax
__int64 result; // rax
v2 = UtlRegisterWrite((__int64 *)a1, 0); /*0x3afe5*/
v3 = UtlRegisterWrite((__int64 *)a1, 8u); /*0x3aff4*/
v4 = UtlRegisterWrite((__int64 *)a1, 0x180u); /*0x3aff6*/
if ( (v2 & 0x80000) == 0 || (v3 & 2) != 0 || (v4 & 0x20000000) != 0 ) /*0x3b00b*/
{
if ( (v2 & 0x40) != 0 && (v4 & 0x20000000) != 0 ) /*0x3b06a*/
{
UtlRegisterAccess((__int64 *)a1, 0x178u, *(_DWORD *)(a1 + 296)); /*0x3b07b*/
UtlRegisterAccess((__int64 *)a1, 0, v2 & 0xFFFFFFBF); /*0x3b08b*/
*(_BYTE *)(a1 + 844) = 1; /*0x3b090*/
}
return 0; /*0x3b090*/
}
if ( !*(_BYTE *)(a1 + 836) ) /*0x3b00d*/
{
*(_BYTE *)(a1 + 836) = 1; /*0x3b016*/
return 0; /*0x3b097*/
}
UtlRegisterAccess((__int64 *)a1, 0x178u, *(_DWORD *)(a1 + 296) & 0x7FFFFFFF); /*0x3b033*/
v5 = UtlRegisterWrite((__int64 *)a1, 0); /*0x3b03d*/
UtlRegisterAccess((__int64 *)a1, 0, v5 | 0x41); /*0x3b04d*/
result = NiiReceiveFilterReset(a1); /*0x3b055*/
if ( !(_DWORD)result ) /*0x3b05c*/
return 0; /*0x3b05c*/
return result; /*0x3b0a3*/
}
// Function: Nii_3b0ac @ 0x3b0ac (0x186 bytes)
__int64 __fastcall Nii_3b0ac(__int64 a1)
{
int v2; // esi
char v3; // bl
int v4; // eax
int v5; // eax
__int64 v6; // rdx
__int64 v7; // r8
__int64 v8; // r9
__int64 result; // rax
int v10; // eax
int v11; // eax
v2 = UtlRegisterWrite((__int64 *)a1, 0); /*0x3b0cd*/
v3 = UtlRegisterWrite((__int64 *)a1, 8u); /*0x3b0dc*/
v4 = UtlRegisterWrite((__int64 *)a1, 0x180u); /*0x3b0de*/
if ( (v3 & 2) != 0 || (v4 & 0x20000000) != 0 ) /*0x3b0ec*/
{
if ( (v2 & 0x40) != 0 && (v4 & 0x20000000) != 0 ) /*0x3b155*/
{
UtlRegisterAccess((__int64 *)a1, 0x178u, *(_DWORD *)(a1 + 296)); /*0x3b166*/
UtlRegisterAccess((__int64 *)a1, 0, v2 & 0xFFFFFFBF); /*0x3b176*/
}
else
{
if ( (int)UtlRegisterWrite((__int64 *)a1, 0x178u) < 0 ) /*0x3b18e*/
goto LABEL_15; /*0x3b18e*/
UtlRegisterRead(*(_QWORD *)a1, 10); /*0x3b198*/
v10 = UtlRegisterWrite((__int64 *)a1, 0x180u); /*0x3b1a5*/
if ( (v10 & 0x40000000) == 0 ) /*0x3b1ae*/
{
*(_BYTE *)(a1 + 844) = 0; /*0x3b1bf*/
goto LABEL_15; /*0x3b1bf*/
}
if ( (v10 & 0x8000000) != 0 ) /*0x3b1b4*/
goto LABEL_15; /*0x3b1b4*/
}
*(_BYTE *)(a1 + 844) = 1; /*0x3b1b6*/
goto LABEL_15; /*0x3b1bd*/
}
if ( !*(_BYTE *)(a1 + 836) ) /*0x3b0ee*/
{
*(_BYTE *)(a1 + 836) = 1; /*0x3b0f7*/
return 0; /*0x3b220*/
}
UtlRegisterAccess((__int64 *)a1, 0x178u, *(_DWORD *)(a1 + 296) & 0x7FFFFFFF); /*0x3b117*/
v5 = UtlRegisterWrite((__int64 *)a1, 0); /*0x3b121*/
UtlRegisterAccess((__int64 *)a1, 0, v5 | 0x41); /*0x3b131*/
result = NiiReceiveFilterReset(a1, v6, v7, v8); /*0x3b139*/
if ( !(_DWORD)result ) /*0x3b140*/
{
LABEL_15:
if ( (int)UtlRegisterWrite((__int64 *)a1, 0x178u) < 0 ) /*0x3b1d7*/
*(_BYTE *)(a1 + 844) = (UtlRegisterWrite((__int64 *)a1, 8u) & 2) != 0 /*0x3b210*/
&& (UtlRegisterRead(*(_QWORD *)a1, 10),
v11 = UtlRegisterWrite((__int64 *)a1, 0x180u),
(v11 & 0x40000000) != 0)
&& (v11 & 0x8000000) == 0;
return 0; /*0x3b217*/
}
return result; /*0x3b22c*/
}
// Function: Nii_3b234 @ 0x3b234 (0x12d bytes)
__int64 __fastcall Nii_3b234(__int64 a1)
{
unsigned int (*v1)(void); // rax
__int64 result; // rax
__int16 v4; // ax
__int16 v5; // ax
__int64 n15; // rdx
__int16 v7; // [rsp+30h] [rbp+8h] BYREF
v1 = *(unsigned int (**)(void))(a1 + 904); /*0x3b23e*/
if ( v1 && v1() ) /*0x3b24f*/
return 0; /*0x3b257*/
if ( *(_DWORD *)(a1 + 868) != 255 ) /*0x3b266*/
goto LABEL_15; /*0x3b266*/
if ( *(_DWORD *)(a1 + 268) == 17 ) /*0x3b275*/
{
v4 = *(_WORD *)(a1 + 1292); /*0x3b277*/
if ( v4 ) /*0x3b281*/
v5 = (v4 + 1) << 6; /*0x3b287*/
else
v5 = 0; /*0x3b28d*/
n15 = 15; /*0x3b28f*/
LOWORD(n15) = v5 + 15; /*0x3b294*/
}
else
{
n15 = 15; /*0x3b299*/
}
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1160))(a1, n15, 1, &v7); /*0x3b2a6*/
if ( !(_DWORD)result ) /*0x3b2ae*/
{
if ( (v7 & 0x3000) != 0 ) /*0x3b2c1*/
*(_DWORD *)(a1 + 868) = ((v7 & 0x3000) != 0x2000) + 2; /*0x3b2db*/
else
*(_DWORD *)(a1 + 868) = 0; /*0x3b2c3*/
LABEL_15:
*(_DWORD *)(a1 + 864) = *(_DWORD *)(a1 + 868); /*0x3b2e7*/
result = (*(__int64 (__fastcall **)(__int64))(a1 + 184))(a1); /*0x3b2f6*/
if ( !(_DWORD)result ) /*0x3b2fe*/
{
UtlRegisterAccess((__int64 *)a1, 0x30u, 34824); /*0x3b30e*/
UtlRegisterAccess((__int64 *)a1, 0x2Cu, 256); /*0x3b321*/
UtlRegisterAccess((__int64 *)a1, 0x28u, 12746753); /*0x3b334*/
UtlRegisterAccess((__int64 *)a1, 0x170u, *(unsigned __int16 *)(a1 + 856)); /*0x3b349*/
return NiiReceiveFilterSet(a1); /*0x3b351*/
}
}
return result; /*0x3b35b*/
}
// Function: Nii_3b364 @ 0x3b364 (0x111 bytes)
__int64 __fastcall Nii_3b364(__int64 a1)
{
__int64 v2; // rbp
int v3; // ecx
unsigned int v4; // ebx
int v5; // ecx
int v6; // ecx
int v8; // esi
unsigned int i; // esi
unsigned int v10; // eax
v2 = UtlRegisterWrite((__int64 *)a1, 0) & 0xFFFFFFF7LL; /*0x3b387*/
(*(void (__fastcall **)(__int64))(a1 + 208))(a1); /*0x3b38a*/
v3 = *(_DWORD *)(a1 + 864); /*0x3b390*/
v4 = 0; /*0x3b396*/
if ( v3 ) /*0x3b39a*/
{
v5 = v3 - 1; /*0x3b39c*/
if ( v5 ) /*0x3b39f*/
{
v6 = v5 - 1; /*0x3b3a1*/
if ( !v6 ) /*0x3b3a4*/
{
v8 = -2147483360; /*0x3b3b3*/
goto LABEL_9; /*0x3b3b8*/
}
if ( v6 != 1 ) /*0x3b3a9*/
return 4294967293LL; /*0x3b3ae*/
}
v8 = -2147483232; /*0x3b3ba*/
}
else
{
v8 = -2147483616; /*0x3b3c1*/
}
LABEL_9:
UtlRegisterAccess((__int64 *)a1, 0x178u, v8); /*0x3b3c6*/
*(_DWORD *)(a1 + 296) = v8; /*0x3b3de*/
UtlRegisterAccess((__int64 *)a1, 0, v2); /*0x3b3e4*/
UtlMicroStall((__int64 *)a1); /*0x3b3ec*/
UtlRegisterRead(*(_QWORD *)a1, 1000); /*0x3b3f9*/
if ( *(_DWORD *)(a1 + 1116) == 3 || (UtlRegisterWrite((__int64 *)a1, 0) & 0x80000) != 0 ) /*0x3b415*/
{
for ( i = 0; i < 0x32; ++i ) /*0x3b417*/
{
UtlRegisterRead(*(_QWORD *)a1, 10000); /*0x3b421*/
if ( (UtlRegisterWrite((__int64 *)a1, 8u) & 2) != 0 ) /*0x3b435*/
break; /*0x3b435*/
}
if ( i == 50 && (*(_BYTE *)(a1 + 836) = 1, (v10 = (*(__int64 (__fastcall **)(__int64))(a1 + 64))(a1)) != 0) ) /*0x3b452*/
return v10; /*0x3b454*/
else
*(_BYTE *)(a1 + 836) = 0; /*0x3b458*/
}
return v4; /*0x3b46f*/
}
// Function: Nii_3b478 @ 0x3b478 (0x3a bytes)
char __fastcall Nii_3b478(__int64 *a1)
{
int v2; // eax
v2 = UtlRegisterWrite(a1, 0x400u); /*0x3b486*/
UtlRegisterAccess(a1, 0x400u, v2 & 0xFFC00FFF | 0x3F000); /*0x3b4a0*/
return UtlMicroStall(a1); /*0x3b4a8*/
}
// Function: NiiReceiveFilterSet @ 0x3b4b4 (0x5d bytes)
__int64 __fastcall Nii_3b4b4(__int64 a1)
{
unsigned int v1; // edi
__int64 v3; // r8
v1 = 0; /*0x3b4be*/
v3 = 0; /*0x3b4ca*/
if ( (*(_BYTE *)(a1 + 864) & 2) != 0 ) /*0x3b4cd*/
{
v3 = *(unsigned int *)(a1 + 852); /*0x3b4cf*/
if ( *(_BYTE *)(a1 + 860) ) /*0x3b4d6*/
LODWORD(v3) = v3 | 0x80000000; /*0x3b4df*/
v1 = *(_DWORD *)(a1 + 848); /*0x3b4e4*/
}
UtlRegisterAccess(a1, 8544, v3); /*0x3b4ef*/
UtlRegisterAccess(a1, 8552, v1); /*0x3b4ff*/
return 0; /*0x3b50b*/
}
// Function: NiiReceiveFilterGet @ 0x3b514 (0x6a bytes)
__int64 __fastcall NiiReceiveFilterGet(__int64 a1)
{
int v2; // eax
int v3; // r8d
int v4; // r8d
int v5; // r8d
int v7; // eax
v2 = UtlRegisterWrite((__int64 *)a1, 0); /*0x3b51f*/
v3 = *(_DWORD *)(a1 + 864); /*0x3b524*/
if ( v3 ) /*0x3b52e*/
{
v4 = v3 - 1; /*0x3b530*/
if ( v4 ) /*0x3b534*/
{
v5 = v4 - 1; /*0x3b536*/
if ( v5 ) /*0x3b53a*/
{
if ( v5 != 1 ) /*0x3b540*/
return 4294967293LL; /*0x3b547*/
v7 = v2 | 0x18000000; /*0x3b549*/
}
else
{
v7 = v2 & 0xE7FFFFFF | 0x10000000; /*0x3b554*/
}
}
else
{
v7 = v2 & 0xE7FFFFFF | 0x8000000; /*0x3b55e*/
}
}
else
{
v7 = v2 & 0xE7FFFFFF; /*0x3b564*/
}
UtlRegisterAccess((__int64 *)a1, 0, v7); /*0x3b571*/
return 0; /*0x3b578*/
}
// Function: NiiReceiveFilterReset @ 0x3b580 (0x273 bytes)
__int64 __fastcall NiiReceiveFilterReset(__int64 a1)
{
unsigned int v2; // edi
int n3; // eax
bool v4; // zf
__int64 result; // rax
__int16 v6; // di
__int16 v7; // ax
int v8; // eax
__int64 v9; // [rsp+20h] [rbp-38h] BYREF
char v10; // [rsp+60h] [rbp+8h] BYREF
__int16 v11; // [rsp+68h] [rbp+10h] BYREF
__int16 v12; // [rsp+70h] [rbp+18h] BYREF
__int16 v13; // [rsp+78h] [rbp+20h] BYREF
v2 = 0; /*0x3b591*/
if ( !*(_BYTE *)(a1 + 836) ) /*0x3b59a*/
{
v4 = *(_DWORD *)(a1 + 1116) == 1; /*0x3b5ac*/
LABEL_5:
if ( !v4 ) /*0x3b5b2*/
goto LABEL_8; /*0x3b5b2*/
goto LABEL_6; /*0x3b5b2*/
}
n3 = *(_DWORD *)(a1 + 1116); /*0x3b59c*/
if ( n3 != 2 ) /*0x3b5a5*/
{
v4 = n3 == 3; /*0x3b5a7*/
goto LABEL_5; /*0x3b5aa*/
}
LABEL_6:
v2 = NiiReceiveFilterGet(a1); /*0x3b5b4*/
if ( v2 ) /*0x3b5bd*/
return v2; /*0x3b5c1*/
LABEL_8:
if ( *(_DWORD *)(a1 + 1116) != 1 || !*(_BYTE *)(a1 + 835) ) /*0x3b5d2*/
goto LABEL_33; /*0x3b5d9*/
result = (*(__int64 (__fastcall **)(__int64, __int64, char *))(a1 + 960))(a1, 1, &v10); /*0x3b5e9*/
if ( !(_DWORD)result ) /*0x3b5f1*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, char *))(a1 + 960))(a1, 1, &v10); /*0x3b601*/
if ( !(_DWORD)result && (v10 & 0x20) != 0 ) /*0x3b614*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 4, &v11); /*0x3b627*/
if ( !(_DWORD)result ) /*0x3b62f*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 5, &v12); /*0x3b642*/
if ( !(_DWORD)result ) /*0x3b64a*/
{
if ( (v11 & 0x400) != 0 && (v12 & 0x400) != 0 ) /*0x3b66d*/
{
if ( *(_DWORD *)(a1 + 868) == 3 ) /*0x3b676*/
{
*(_DWORD *)(a1 + 864) = 3; /*0x3b678*/
LABEL_29:
result = (*(__int64 (__fastcall **)(__int64, __int64 *, __int16 *))(a1 + 112))(a1, &v9, &v13); /*0x3b6d2*/
if ( !(_DWORD)result ) /*0x3b6e4*/
{
if ( v13 == 1 ) /*0x3b6ef*/
*(_DWORD *)(a1 + 864) = 0; /*0x3b6f1*/
result = NiiReceiveFilterGet(a1); /*0x3b6fa*/
v2 = result; /*0x3b6ff*/
if ( !(_DWORD)result ) /*0x3b703*/
{
LABEL_33:
if ( *(_DWORD *)(a1 + 1116) != 3 || !*(_BYTE *)(a1 + 835) ) /*0x3b716*/
return 0; /*0x3b7e8*/
if ( (UtlRegisterWrite((__int64 *)a1, 0x420Cu) & 0x10000) == 0 ) /*0x3b734*/
return v2; /*0x3b734*/
v6 = UtlRegisterWrite((__int64 *)a1, 0x4218u); /*0x3b74f*/
v7 = UtlRegisterWrite((__int64 *)a1, 0x421Cu); /*0x3b751*/
if ( (v6 & 0x80) != 0 && (v7 & 0x80) != 0 ) /*0x3b763*/
{
if ( *(_DWORD *)(a1 + 868) == 3 ) /*0x3b76c*/
{
*(_DWORD *)(a1 + 864) = 3; /*0x3b76e*/
goto LABEL_50; /*0x3b778*/
}
goto LABEL_48; /*0x3b76c*/
}
if ( (v6 & 0x80) != 0 ) /*0x3b77c*/
{
if ( (v6 & 0x100) != 0 && (v7 & 0x80) == 0 && (v7 & 0x100) != 0 ) /*0x3b7ac*/
{
LABEL_48:
*(_DWORD *)(a1 + 864) = 1; /*0x3b7ae*/
goto LABEL_50; /*0x3b7b4*/
}
}
else if ( (v6 & 0x100) != 0 && (v7 & 0x80) != 0 && (v7 & 0x100) != 0 ) /*0x3b78c*/
{
*(_DWORD *)(a1 + 864) = 2; /*0x3b78e*/
goto LABEL_50; /*0x3b798*/
}
*(_DWORD *)(a1 + 864) = 0; /*0x3b7b6*/
LABEL_50:
v8 = UtlRegisterWrite((__int64 *)a1, 0x4208u); /*0x3b7bc*/
UtlRegisterAccess((__int64 *)a1, 0x4208u, v8 | 0x80); /*0x3b7d7*/
result = NiiReceiveFilterGet(a1); /*0x3b7df*/
if ( (_DWORD)result ) /*0x3b7e6*/
return result; /*0x3b7e6*/
return 0; /*0x3b7e6*/
}
}
return result; /*0x3b703*/
}
LABEL_27:
*(_DWORD *)(a1 + 864) = 1; /*0x3b6c4*/
goto LABEL_29; /*0x3b6ca*/
}
if ( (v11 & 0x400) != 0 ) /*0x3b68d*/
{
if ( (v11 & 0x800) != 0 && (v12 & 0x400) == 0 && (v12 & 0x800) != 0 ) /*0x3b6c2*/
goto LABEL_27; /*0x3b6c2*/
}
else if ( (v11 & 0x800) != 0 && (v12 & 0x400) != 0 && (v12 & 0x800) != 0 ) /*0x3b69f*/
{
*(_DWORD *)(a1 + 864) = 2; /*0x3b6a1*/
goto LABEL_29; /*0x3b6ab*/
}
*(_DWORD *)(a1 + 864) = 0; /*0x3b6cc*/
goto LABEL_29; /*0x3b6cc*/
}
}
}
}
return result; /*0x3b7ea*/
}
// Function: NiiMcIpToMacSet @ 0x3b7f4 (0x57 bytes)
void __fastcall __noreturn NiiMcIpToMacSet(__int64 *a1, __int16 *a2, _WORD *a3)
{
char v5; // al
__int16 n100; // cx
v5 = UtlRegisterWrite(a1, 8u); /*0x3b809*/
if ( v5 >= 0 ) /*0x3b810*/
{
n100 = 100; /*0x3b819*/
if ( (v5 & 0x40) == 0 ) /*0x3b820*/
n100 = 10; /*0x3b822*/
}
else
{
n100 = 1000; /*0x3b812*/
}
*a2 = n100; /*0x3b827*/
if ( (v5 & 1) != 0 ) /*0x3b831*/
*a3 = 2; /*0x3b836*/
else
*a3 = 1; /*0x3b83b*/
}
// Function: SnpGetDefaultConfig @ 0x3b84c (0x14 bytes)
__int64 __fastcall SnpGetDefaultConfig(__int64 a1, _WORD *a2, _WORD *a3)
{
*a2 = 1000; /*0x3b851*/
*a3 = 2; /*0x3b859*/
return 0; /*0x3b85f*/
}
// Function: DxeRegister_16 @ 0x3b860 (0xc2 bytes)
__int64 __fastcall DxeRegister_16(__int64 a1)
{
int i_2; // edi
int i_1; // ebx
int i; // ebp
bool v6; // zf
int v7; // eax
i_2 = 0; /*0x3b87b*/
i_1 = *(unsigned __int16 *)(a1 + 1264) + 1; /*0x3b880*/
for ( i = 0; i < i_1; ++i ) /*0x3b886*/
{
if ( (UtlRegisterWrite((__int64 *)a1, 0x5B50u) & 1) == 0 ) /*0x3b897*/
break; /*0x3b897*/
UtlRegisterRead(*(_QWORD *)a1, 50); /*0x3b8a1*/
}
if ( i == i_1 ) /*0x3b8ae*/
return 0xFFFFFFFFLL; /*0x3b8ae*/
v6 = i_1 == 0; /*0x3b8b5*/
if ( i_1 > 0 ) /*0x3b8b7*/
{
do /*0x3b8fb*/
{
v7 = UtlRegisterWrite((__int64 *)a1, 0x5B50u); /*0x3b8c1*/
UtlRegisterAccess((__int64 *)a1, 0x5B50u, v7 | 2); /*0x3b8d4*/
if ( (UtlRegisterWrite((__int64 *)a1, 0x5B50u) & 2) != 0 ) /*0x3b8e8*/
break; /*0x3b8e8*/
UtlRegisterRead(*(_QWORD *)a1, 50); /*0x3b8f2*/
++i_2; /*0x3b8f7*/
}
while ( i_2 < i_1 ); /*0x3b8fb*/
v6 = i_2 == i_1; /*0x3b8fd*/
}
if ( v6 ) /*0x3b8ff*/
{
DxeRegister_46((__int64 *)a1); /*0x3b904*/
return 0xFFFFFFFFLL; /*0x3b8b3*/
}
return 0; /*0x3b91c*/
}
// Function: DxeRegister_46 @ 0x3b924 (0x2b bytes)
char __fastcall DxeRegister_46(__int64 *a1)
{
int v2; // eax
v2 = UtlRegisterWrite(a1, 0x5B50u); /*0x3b932*/
return UtlRegisterAccess(a1, 0x5B50u, v2 & 0xFFFFFFFC); /*0x3b945*/
}
// Function: RegRegister_44 @ 0x3b950 (0x5a bytes)
__int64 __fastcall RegRegister_44(__int64 *a1)
{
unsigned int v1; // ebx
int i; // edi
v1 = 0; /*0x3b95f*/
for ( i = 0; i < 10; ++i ) /*0x3b964*/
{
if ( (UtlRegisterWrite(a1, 0x10u) & 0x200) != 0 ) /*0x3b977*/
break; /*0x3b977*/
UtlRegisterRead(*a1, 1000); /*0x3b981*/
}
if ( i == 10 ) /*0x3b99a*/
return (unsigned int)-9; /*0x3b99a*/
return v1; /*0x3b9a4*/
}
// Function: NvmReadProtocolValue @ 0x3b9ac (0x43 bytes)
__int64 __fastcall NvmReadProtocolValue(__int64 a1, _WORD *a2)
{
__int64 result; // rax
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, _WORD *))(a1 + 1160))(a1, 4, 1, a2); /*0x3b9c4*/
if ( !(_DWORD)result ) /*0x3b9ce*/
{
if ( !*a2 || *a2 == 0xFFFF ) /*0x3b9dd*/
*a2 = -30447; /*0x3b9e4*/
return 0; /*0x3b9e7*/
}
return result; /*0x3b9e9*/
}
// Function: NiiStatistics @ 0x3b9f0 (0x10c bytes)
__int64 __fastcall NiiStatistics(__int64 a1)
{
__int64 result; // rax
__int16 v3; // di
int v4; // eax
unsigned int n4; // r8d
int n14; // eax
unsigned int v7; // r8d
unsigned int v8; // r8d
unsigned int v9; // r8d
unsigned int v10; // r8d
unsigned int v11; // r8d
int n15; // eax
unsigned __int16 v13; // [rsp+30h] [rbp+8h] BYREF
result = (*(__int64 (__fastcall **)(__int64, unsigned __int16 *))(a1 + 1192))(a1, &v13); /*0x3ba07*/
v3 = 0; /*0x3ba0d*/
if ( !(_DWORD)result ) /*0x3ba11*/
{
v4 = UtlRegisterWrite((__int64 *)a1, 0xE00u); /*0x3ba1f*/
*(_DWORD *)(a1 + 276) = v4; /*0x3ba2b*/
*(_DWORD *)(a1 + 280) = v4; /*0x3ba31*/
*(_DWORD *)(a1 + 284) = v4; /*0x3ba37*/
while ( 1 ) /*0x3ba56*/
{
n4 = (v13 >> (4 * v3)) & 0xF; /*0x3ba56*/
if ( n4 >= 4 ) /*0x3ba5d*/
{
if ( ((v13 >> (4 * v3)) & 0xFu) <= 6 ) /*0x3ba63*/
{
n14 = 14; /*0x3ba6f*/
goto LABEL_8; /*0x3ba6f*/
}
if ( ((v13 >> (4 * v3)) & 0xFu) <= 9 ) /*0x3ba69*/
{
n14 = 15; /*0x3ba6b*/
LABEL_8:
*(_DWORD *)(a1 + 280) = (n14 << (8 * v3)) | *(_DWORD *)(a1 + 280) & ~(255 << (8 * v3)); /*0x3ba74*/
}
}
v7 = n4 - 2; /*0x3ba93*/
if ( !v7 ) /*0x3ba97*/
goto LABEL_16; /*0x3ba97*/
v8 = v7 - 1; /*0x3ba99*/
if ( !v8 ) /*0x3ba9c*/
goto LABEL_15; /*0x3ba9c*/
v9 = v8 - 2; /*0x3ba9e*/
if ( !v9 ) /*0x3baa2*/
goto LABEL_16; /*0x3baa2*/
v10 = v9 - 1; /*0x3baa4*/
if ( !v10 ) /*0x3baa7*/
{
LABEL_15:
n15 = 15; /*0x3bab4*/
LABEL_17:
*(_DWORD *)(a1 + 284) = (n15 << (8 * v3)) | *(_DWORD *)(a1 + 284) & ~(255 << (8 * v3)); /*0x3babd*/
goto LABEL_18; /*0x3bad6*/
}
v11 = v10 - 2; /*0x3baa9*/
if ( !v11 ) /*0x3baad*/
{
LABEL_16:
n15 = 14; /*0x3bab8*/
goto LABEL_17; /*0x3bab8*/
}
if ( v11 == 1 ) /*0x3bab2*/
goto LABEL_15; /*0x3bab2*/
LABEL_18:
if ( (unsigned __int16)++v3 >= 4u ) /*0x3bae4*/
return 0; /*0x3baea*/
}
}
return result; /*0x3baf6*/
}
// Function: NiiStatisticsReset @ 0x3bafc (0x69 bytes)
__int64 __fastcall NiiStatisticsReset(__int64 a1)
{
__int64 v1; // rbx
int n2; // eax
int v4; // eax
unsigned int v5; // r8d
v1 = a1; /*0x3bb09*/
if ( *(__int64 (__fastcall **)(__int64))(a1 + 192) != NiiStatisticsReset ) /*0x3bb13*/
return 4294967293LL; /*0x3bb1a*/
n2 = *(_DWORD *)(a1 + 1116); /*0x3bb1c*/
if ( n2 == 2 ) /*0x3bb25*/
{
v4 = UtlRegisterWrite((__int64 *)a1, 0xE00u); /*0x3bb2c*/
a1 = v1; /*0x3bb31*/
*(_DWORD *)(v1 + 276) = v4; /*0x3bb34*/
v5 = v4 & 0xFFFFFF30 | 0xF; /*0x3bb42*/
LABEL_7:
UtlRegisterAccess((__int64 *)a1, 0xE00u, v5); /*0x3bb53*/
return 0; /*0x3bb58*/
}
if ( n2 == 1 ) /*0x3bb4a*/
{
v5 = *(_DWORD *)(a1 + 280); /*0x3bb4c*/
goto LABEL_7; /*0x3bb4c*/
}
return 0; /*0x3bb5f*/
}
// Function: UtlRegisterAccessE00 @ 0x3bb68 (0x1c bytes)
__int64 __fastcall UtlRegisterAccessE00(__int64 a1)
{
UtlRegisterAccess((__int64 *)a1, 0xE00u, *(_DWORD *)(a1 + 276)); /*0x3bb78*/
return 0; /*0x3bb7f*/
}
// Function: NiiInterruptSet @ 0x3bb84 (0x7a bytes)
__int64 __fastcall NiiInterruptSet(__int64 a1)
{
int n142; // r8d
unsigned int n142_1; // r10d
unsigned int n0x20; // ecx
int n14; // eax
if ( *(_DWORD *)(a1 + 1116) == 2 ) /*0x3bb92*/
{
n142 = 142; /*0x3bb94*/
}
else
{
n142_1 = *(_DWORD *)(a1 + 284); /*0x3bb9c*/
n0x20 = 0; /*0x3bba3*/
n142 = n142_1; /*0x3bba5*/
do /*0x3bbe8*/
{
n14 = (n142_1 >> n0x20) & 0xF; /*0x3bbb6*/
if ( ((*(_DWORD *)(a1 + 276) >> n0x20) & 0x40) == 0 && n14 == 14 /*0x3bbca*/
|| ((*(_DWORD *)(a1 + 276) >> n0x20) & 0x40) != 0 && n14 == 15 )
{
n142 = (142 << n0x20) | ~(15 << n0x20) & n142; /*0x3bbdf*/
}
n0x20 += 8; /*0x3bbe2*/
}
while ( n0x20 < 0x20 ); /*0x3bbe8*/
}
UtlRegisterAccess((__int64 *)a1, 0xE00u, n142); /*0x3bbf2*/
return 0; /*0x3bbf9*/
}
// Function: RegRegister_50 @ 0x3bc00 (0x4b bytes)
__int64 __fastcall RegRegister_50(__int64 a1)
{
__int64 v1; // rbx
int v2; // eax
unsigned int n3584; // edx
unsigned int v4; // r8d
v1 = a1; /*0x3bc0c*/
if ( *(_DWORD *)(a1 + 1116) == 1 ) /*0x3bc12*/
{
v4 = *(_DWORD *)(a1 + 284); /*0x3bc32*/
n3584 = 3584; /*0x3bc39*/
goto LABEL_5; /*0x3bc39*/
}
if ( *(_DWORD *)(a1 + 1116) == 2 ) /*0x3bc17*/
{
v2 = UtlRegisterWrite((__int64 *)a1, 0); /*0x3bc1b*/
a1 = v1; /*0x3bc20*/
n3584 = 0; /*0x3bc2b*/
v4 = v2 & 0xFFBBFFFF | 0x400000; /*0x3bc2d*/
LABEL_5:
UtlRegisterAccess((__int64 *)a1, n3584, v4); /*0x3bc3e*/
}
return 0; /*0x3bc45*/
}
// Function: RegRegister_52 @ 0x3bc4c (0x48 bytes)
__int64 __fastcall RegRegister_52(__int64 a1)
{
__int64 v1; // rbx
int v2; // eax
unsigned int n3584; // edx
int v4; // r8d
v1 = a1; /*0x3bc58*/
if ( *(_DWORD *)(a1 + 1116) == 1 ) /*0x3bc5e*/
{
v4 = *(_DWORD *)(a1 + 280); /*0x3bc7b*/
n3584 = 3584; /*0x3bc82*/
goto LABEL_5; /*0x3bc82*/
}
if ( *(_DWORD *)(a1 + 1116) == 2 ) /*0x3bc63*/
{
v2 = UtlRegisterWrite((__int64 *)a1, 0); /*0x3bc67*/
a1 = v1; /*0x3bc6c*/
n3584 = 0; /*0x3bc74*/
v4 = v2 | 0x440000; /*0x3bc76*/
LABEL_5:
UtlRegisterAccess((__int64 *)a1, n3584, v4); /*0x3bc87*/
}
return 0; /*0x3bc8e*/
}
// Function: RegRegister_41 @ 0x3bc94 (0x6f bytes)
__int64 __fastcall RegRegister_41(__int64 a1)
{
int n800; // ebx
int v4; // eax
n800 = 800; /*0x3bca8*/
if ( *(_DWORD *)(a1 + 1280) != 3 ) /*0x3bcad*/
return 0; /*0x3bcaf*/
v4 = UtlRegisterWrite((__int64 *)a1, 0); /*0x3bcb5*/
UtlRegisterAccess((__int64 *)a1, 0, v4 | 4); /*0x3bcc5*/
do /*0x3bced*/
{
if ( (UtlRegisterWrite((__int64 *)a1, 8u) & 0x80000) == 0 ) /*0x3bcdb*/
break; /*0x3bcdb*/
UtlRegisterRead(*(_QWORD *)a1, 100); /*0x3bce5*/
--n800; /*0x3bcea*/
}
while ( n800 ); /*0x3bced*/
return n800 == 0 ? 0xFFFFFFF6 : 0;
}
// Function: CompNameGetDriverName @ 0x3bd04 (0x27 bytes)
__int64 __fastcall CompNameGetDriverName(__int64 a1)
{
char n3; // al
if ( *(_BYTE *)(a1 + 835) ) /*0x3bd04*/
return 0; /*0x3bd04*/
n3 = *(_BYTE *)(a1 + 1130); /*0x3bd0d*/
if ( n3 ) /*0x3bd15*/
{
if ( n3 != 3 ) /*0x3bd19*/
return 0; /*0x3bd28*/
}
*(_BYTE *)(a1 + 1130) = 1; /*0x3bd1b*/
return 4294967293LL; /*0x3bd27*/
}
// Function: DxeRegister_34 @ 0x3bd2c (0x6b bytes)
__int64 __fastcall DxeRegister_34(__int64 *a1, unsigned int a2, int a3, unsigned __int8 a4)
{
unsigned int i; // ebx
int v7; // eax
UtlRegisterAccess(a1, a2, a4 | (a3 << 8)); /*0x3bd4b*/
for ( i = 0; i < 0x280; ++i ) /*0x3bd50*/
{
UtlRegisterRead(*a1, 5); /*0x3bd5a*/
v7 = UtlRegisterWrite(a1, a2); /*0x3bd64*/
if ( v7 < 0 ) /*0x3bd6d*/
break; /*0x3bd6d*/
}
return v7 >= 0 ? 0xFFFFFFFE : 0;
}
// Function: DxeRegWrapReg30 @ 0x3bd98 (0xa bytes)
__int64 __fastcall DxeRegWrapReg30(__int64 *a1)
{
return RegRegister_30(a1, 1u);
}
// Function: DxeRegWrapReg47 @ 0x3bda4 (0xa bytes)
char __fastcall DxeRegWrapReg47(__int64 *a1)
{
return RegRegister_47(a1, 1u);
}
// Function: RegRegister_30 @ 0x3bdb0 (0xb3 bytes)
__int64 __fastcall RegRegister_30(__int64 *a1, unsigned __int16 a2)
{
int v2; // r12d
int v4; // r13d
unsigned int v5; // ebx
int n200; // esi
int v7; // ebp
v2 = a2; /*0x3bdc8*/
v4 = a2 << 16; /*0x3bdd2*/
v5 = 0; /*0x3bdd6*/
n200 = 0; /*0x3bdd8*/
while ( !(unsigned int)DxeRegister_11((__int64)a1) ) /*0x3bde4*/
{
v7 = UtlRegisterWrite(a1, 0x5B5Cu); /*0x3bdf9*/
if ( ((v2 | v4) & v7) != 0 ) /*0x3bdfd*/
{
DxeRegister_46(a1); /*0x3be02*/
UtlRegisterRead(*a1, 5000); /*0x3be0f*/
if ( ++n200 < 200 ) /*0x3be1c*/
continue; /*0x3be1c*/
}
if ( n200 != 200 ) /*0x3be24*/
{
UtlRegisterAccess(a1, 0x5B5Cu, v2 | v7); /*0x3be34*/
DxeRegister_46(a1); /*0x3be3c*/
return v5; /*0x3be41*/
}
return (unsigned int)-13; /*0x3be24*/
}
return (unsigned int)-13; /*0x3be59*/
}
// Function: RegRegister_47 @ 0x3be64 (0x53 bytes)
char __fastcall RegRegister_47(__int64 *a1, unsigned __int16 a2)
{
int v4; // eax
while ( (unsigned int)DxeRegister_11(a1) ) /*0x3be77*/
; /*0x3be74*/
v4 = UtlRegisterWrite(a1, 0x5B5Cu); /*0x3be88*/
UtlRegisterAccess(a1, 0x5B5Cu, ~a2 & v4); /*0x3bea0*/
return DxeRegister_46(a1); /*0x3bead*/
}
// Function: DxeRegister_11 @ 0x3beb8 (0x10a bytes)
__int64 __fastcall DxeRegister_11(__int64 a1)
{
int i_2; // edi
int i_1; // ebx
int i; // ebp
bool v6; // zf
int v7; // eax
i_2 = 0; /*0x3bed7*/
i_1 = *(unsigned __int16 *)(a1 + 1264) + 1; /*0x3bedc*/
for ( i = 0; i < i_1; ++i ) /*0x3beec*/
{
if ( (UtlRegisterWrite((__int64 *)a1, 0x5B50u) & 1) == 0 ) /*0x3befb*/
break; /*0x3befb*/
UtlRegisterRead(*(_QWORD *)a1, 50); /*0x3bf03*/
}
if ( i == i_1 ) /*0x3bf10*/
{
if ( *(_BYTE *)(a1 + 1316) ) /*0x3bf12*/
{
*(_BYTE *)(a1 + 1316) = 0; /*0x3bf1e*/
DxeRegister_46((__int64 *)a1); /*0x3bf25*/
for ( i = 0; i < i_1; ++i ) /*0x3bf2e*/
{
if ( (UtlRegisterWrite((__int64 *)a1, 0x5B50u) & 1) == 0 ) /*0x3bf3d*/
break; /*0x3bf3d*/
UtlRegisterRead(*(_QWORD *)a1, 50); /*0x3bf45*/
}
}
if ( i == i_1 ) /*0x3bf52*/
return 0xFFFFFFFFLL; /*0x3bf52*/
}
v6 = i_1 == 0; /*0x3bf59*/
if ( i_1 > 0 ) /*0x3bf5b*/
{
do /*0x3bf97*/
{
v7 = UtlRegisterWrite((__int64 *)a1, 0x5B50u); /*0x3bf63*/
UtlRegisterAccess((__int64 *)a1, 0x5B50u, v7 | 2); /*0x3bf74*/
if ( (UtlRegisterWrite((__int64 *)a1, 0x5B50u) & 2) != 0 ) /*0x3bf86*/
break; /*0x3bf86*/
UtlRegisterRead(*(_QWORD *)a1, 50); /*0x3bf8e*/
++i_2; /*0x3bf93*/
}
while ( i_2 < i_1 ); /*0x3bf97*/
v6 = i_2 == i_1; /*0x3bf99*/
}
if ( v6 ) /*0x3bf9b*/
{
DxeRegister_46((__int64 *)a1); /*0x3bfa0*/
return 0xFFFFFFFFLL; /*0x3bf57*/
}
return 0; /*0x3bfb8*/
}
// Function: NiiChunkedTransmit @ 0x3bfc4 (0xc4 bytes)
__int64 __fastcall NiiChunkedTransmit(__int64 a1, unsigned __int16 i, unsigned __int16 j_1, __int64 a4)
{
unsigned int n13; // ebx
unsigned __int16 j; // di
unsigned __int16 n512; // r8
n13 = 0; /*0x3bff1*/
for ( j = 0; j < j_1; j += 512 ) /*0x3bffc*/
{
if ( (*(unsigned int (__fastcall **)(__int64))(a1 + 1152))(a1) ) /*0x3c007*/
{
n13 = 13; /*0x3c056*/
}
else
{
n512 = j_1 - j; /*0x3c020*/
if ( (j_1 - j) / 512 > 0 ) /*0x3c03f*/
n512 = 512; /*0x3c03f*/
n13 = NiiTransmit(a1, i, n512, (_WORD *)(a4 + 2LL * j)); /*0x3c04c*/
(*(void (__fastcall **)(__int64))(a1 + 1168))(a1); /*0x3c04e*/
}
if ( n13 ) /*0x3c05e*/
break; /*0x3c05e*/
}
return n13; /*0x3c07a*/
}
// Function: CompNameGetControllerName @ 0x3c088 (0xc4 bytes)
__int64 __fastcall CompNameGetControllerName(__int64 a1, unsigned __int16 n0x3F, unsigned __int16 i, __int64 a4)
{
unsigned int n13; // ebx
unsigned __int16 j; // di
__int64 i_1; // r8
n13 = 0; /*0x3c0b5*/
for ( j = 0; j < i; j += 512 ) /*0x3c0c0*/
{
if ( (*(unsigned int (__fastcall **)(__int64))(a1 + 1152))(a1) ) /*0x3c0cb*/
{
n13 = 13; /*0x3c11a*/
}
else
{
i_1 = i; /*0x3c0dc*/
LOWORD(i_1) = i - j; /*0x3c0e4*/
if ( (i - j) / 512 > 0 ) /*0x3c103*/
LOWORD(i_1) = 512; /*0x3c103*/
n13 = CompNameLookupControllerName((_QWORD *)a1, n0x3F, i_1, (unsigned __int16 *)(a4 + 2LL * j)); /*0x3c110*/
(*(void (__fastcall **)(__int64))(a1 + 1168))(a1); /*0x3c112*/
}
if ( n13 ) /*0x3c122*/
break; /*0x3c122*/
}
return n13; /*0x3c13e*/
}
// Function: CompNameLookupControllerName @ 0x3c14c (0xdb bytes)
__int64 __fastcall CompNameLookupControllerName(_QWORD *a1, unsigned __int16 n0x3F, __int64 i, unsigned __int16 *a4)
{
unsigned __int16 n0x3F_1; // ax
unsigned int v7; // ebx
unsigned int i_1; // esi
unsigned int i_2; // edi
int v10; // ebp
int v11; // r12d
n0x3F_1 = *((_WORD *)a1 + 632); /*0x3c168*/
v7 = 0; /*0x3c178*/
if ( n0x3F < n0x3F_1 && (i_1 = (unsigned __int16)i, (unsigned __int16)i <= n0x3F_1 - n0x3F) && (_WORD)i ) /*0x3c198*/
{
i_2 = 0; /*0x3c19a*/
v10 = 4 * n0x3F; /*0x3c1a4*/
do /*0x3c201*/
{
UtlRegisterAccess(a1, (unsigned int)&qword_12018, v10 | (*a4 << 16) | 1); /*0x3c1be*/
v11 = 0; /*0x3c1c3*/
while ( (UtlRegisterWrite(a1, (unsigned int)&qword_12018) & 2) == 0 ) /*0x3c1d5*/
{
UtlRegisterRead(*a1, 5); /*0x3c1e0*/
if ( ++v11 >= (unsigned int)L"tion I218-V" ) /*0x3c1ef*/
goto LABEL_11; /*0x3c1ef*/
}
v7 = 0; /*0x3c1f3*/
LABEL_11:
++i_2; /*0x3c1f6*/
v10 += 4; /*0x3c1f8*/
++a4; /*0x3c1fb*/
}
while ( i_2 < i_1 ); /*0x3c201*/
}
else
{
return (unsigned int)-1; /*0x3c205*/
}
return v7; /*0x3c219*/
}
// Function: PciFindFunctionByIrq @ 0x3c228 (0x97 bytes)
__int64 __fastcall PciFindFunctionByIrq(__int64 *a1, char a2, _WORD *a3)
{
unsigned int v6; // edi
unsigned __int16 i; // bx
unsigned int v8; // r11d
char n2; // al
v6 = -20; /*0x3c24c*/
for ( i = 0; i < 0x40u; ++i ) /*0x3c251*/
{
v8 = UtlRegisterWrite(a1, 4 * (unsigned int)i + 74016); /*0x3c267*/
n2 = v8 & 7; /*0x3c26a*/
if ( (v8 & 7) == 0 ) /*0x3c26c*/
break; /*0x3c26c*/
if ( n2 == 2 ) /*0x3c270*/
++i; /*0x3c272*/
if ( n2 == 4 ) /*0x3c277*/
i += 8; /*0x3c279*/
if ( n2 == 1 && ((v8 >> 9) & 0x7F) == a2 ) /*0x3c28c*/
{
v6 = 0; /*0x3c29d*/
*a3 = HIWORD(v8); /*0x3c2a0*/
return v6; /*0x3c2a0*/
}
}
return v6; /*0x3c2b5*/
}
// Function: CompNameGetLang @ 0x3c2c0 (0x16e bytes)
__int64 __fastcall CompNameGetLang(__int64 *a1, __int64 n0xE, __int64 a3, __int16 *a4)
{
unsigned int FunctionByIrq; // edi
__int16 v7; // ax
__int16 n29251; // ax
int v9; // edi
int v10; // edi
FunctionByIrq = 0; /*0x3c2d7*/
if ( (unsigned __int16)n0xE > 0xEu ) /*0x3c2e5*/
{
switch ( (unsigned __int16)n0xE ) /*0x3c396*/
{
case 0xFu: /*0x3c396*/
FunctionByIrq = PciFindFunctionByIrq(a1, n0xE, a4); /*0x3c407*/
if ( !FunctionByIrq ) /*0x3c40b*/
return FunctionByIrq; /*0x3c40b*/
n29251 = 29251; /*0x3c40d*/
break;
case 0x13u: /*0x3c396*/
FunctionByIrq = PciFindFunctionByIrq(a1, n0xE, a4); /*0x3c3ef*/
if ( !FunctionByIrq ) /*0x3c3f3*/
return FunctionByIrq; /*0x3c3f3*/
n29251 = 193; /*0x3c3f5*/
break;
case 0x1Cu: /*0x3c396*/
FunctionByIrq = PciFindFunctionByIrq(a1, n0xE, a4); /*0x3c3d7*/
if ( !FunctionByIrq ) /*0x3c3db*/
return FunctionByIrq; /*0x3c3db*/
n29251 = 388; /*0x3c3dd*/
break;
case 0x1Fu: /*0x3c396*/
FunctionByIrq = PciFindFunctionByIrq(a1, n0xE, a4); /*0x3c3bf*/
if ( !FunctionByIrq ) /*0x3c3c3*/
return FunctionByIrq; /*0x3c3c3*/
n29251 = 8204; /*0x3c3c5*/
break;
default:
goto LABEL_20; /*0x3c3a8*/
}
LABEL_29:
*a4 = n29251; /*0x3c412*/
return 0; /*0x3c415*/
}
if ( (unsigned __int16)n0xE == 14 ) /*0x3c2ee*/
{
v7 = *((_WORD *)a1 + 4759); /*0x3c389*/
goto LABEL_11; /*0x3c390*/
}
if ( !(_WORD)n0xE ) /*0x3c2f6*/
{
v9 = PciFindFunctionByIrq(a1, 0, a4); /*0x3c36a*/
v10 = PciFindFunctionByIrq(a1, 1, a4 + 1) | v9; /*0x3c37b*/
return (unsigned int)PciFindFunctionByIrq(a1, 2, a4 + 2) | v10; /*0x3c384*/
}
switch ( (unsigned __int16)n0xE ) /*0x3c2fc*/
{
case 4u: /*0x3c2fc*/
FunctionByIrq = PciFindFunctionByIrq(a1, n0xE, a4); /*0x3c341*/
if ( !FunctionByIrq ) /*0x3c345*/
return FunctionByIrq; /*0x3c345*/
n29251 = -1; /*0x3c34b*/
goto LABEL_29; /*0x3c350*/
case 0xBu: /*0x3c2fc*/
v7 = *((_WORD *)a1 + 4758); /*0x3c326*/
goto LABEL_11; /*0x3c326*/
case 0xCu: /*0x3c2fc*/
v7 = *((_WORD *)a1 + 4757); /*0x3c31d*/
goto LABEL_11; /*0x3c324*/
}
if ( (unsigned __int16)n0xE != 13 ) /*0x3c30e*/
{
LABEL_20:
v7 = -1; /*0x3c3aa*/
goto LABEL_11; /*0x3c3af*/
}
v7 = *((_WORD *)a1 + 4756); /*0x3c314*/
LABEL_11:
*a4 = v7; /*0x3c32d*/
return FunctionByIrq; /*0x3c428*/
}
// Function: CompNameInitSupportedLang @ 0x3c430 (0x64 bytes)
__int64 __fastcall Sub_3c430(__int64 a1)
{
__int64 v2; // rbx
unsigned int v3; // esi
if ( (*(unsigned int (**)(void))(a1 + 1152))() ) /*0x3c442*/
{
return 13; /*0x3c47d*/
}
else
{
v2 = *(_QWORD *)(a1 + 1160); /*0x3c44c*/
*(_QWORD *)(a1 + 1160) = NiiTransmit; /*0x3c45d*/
v3 = NiiParseMacString(a1); /*0x3c46c*/
*(_QWORD *)(a1 + 1160) = v2; /*0x3c46e*/
(*(void (__fastcall **)(__int64))(a1 + 1168))(a1); /*0x3c475*/
}
return v3; /*0x3c48e*/
}
// Function: CompNameGetSupportedLang @ 0x3c494 (0x117 bytes)
__int64 __fastcall CompNameGetSupportedLang(__int64 a1)
{
__int16 v2; // bp
unsigned int v3; // edi
unsigned __int16 i; // si
unsigned int v5; // eax
__int64 v6; // rcx
int v7; // eax
unsigned __int16 v9; // [rsp+58h] [rbp+10h] BYREF
v2 = 0; /*0x3c4bc*/
v3 = NiiTransmit(a1, 0, 1u, &v9); /*0x3c4c8*/
if ( v3 ) /*0x3c4cd*/
return v3; /*0x3c4cd*/
if ( (*(unsigned int (__fastcall **)(__int64))(a1 + 1152))(a1) ) /*0x3c4d6*/
return 13; /*0x3c58d*/
for ( i = 0; i < 0x3Fu; ++i ) /*0x3c4e5*/
{
v3 = NiiTransmit(a1, i, 1u, &v9); /*0x3c501*/
if ( v3 ) /*0x3c506*/
{
v6 = a1; /*0x3c582*/
goto LABEL_10; /*0x3c582*/
}
v2 += v9; /*0x3c508*/
}
v9 = -17734 - v2; /*0x3c52d*/
v5 = CompNameLookupControllerName((_QWORD *)a1, 0x3Fu, 1, &v9); /*0x3c532*/
v6 = a1; /*0x3c537*/
v3 = v5; /*0x3c53a*/
if ( v5 ) /*0x3c53f*/
{
LABEL_10:
(*(void (__fastcall **)(__int64))(a1 + 1168))(v6); /*0x3c585*/
return v3; /*0x3c58b*/
}
(*(void (__fastcall **)(__int64))(a1 + 1168))(a1); /*0x3c541*/
v3 = NiiPollDeviceReady((__int64 *)a1); /*0x3c54f*/
if ( v3 != -1 ) /*0x3c554*/
{
v7 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x3c560*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v7 | 0x800000); /*0x3c571*/
return (unsigned int)NiiPollDeviceReady((__int64 *)a1); /*0x3c57e*/
}
return v3; /*0x3c59e*/
}
// Function: NiiPollDeviceReady @ 0x3c5ac (0x57 bytes)
__int64 __fastcall NiiPollDeviceReady(__int64 *a1)
{
unsigned int v1; // ebx
int v3; // edi
v1 = -1; /*0x3c5bb*/
v3 = 0; /*0x3c5c1*/
while ( (UtlRegisterWrite(a1, 0x10u) & 0x4000000) == 0 ) /*0x3c5d4*/
{
UtlRegisterRead(*a1, 5); /*0x3c5de*/
if ( (unsigned int)++v3 >= 0x4E20 ) /*0x3c5eb*/
return v1; /*0x3c5eb*/
}
return 0; /*0x3c5fd*/
}
// Function: IscsiBootInit @ 0x3c604 (0xd6 bytes)
__int64 __fastcall IscsiBootInit(__int64 a1)
{
unsigned int v2; // edi
__int64 (__fastcall *CompNameGetSupportedLang_1)(__int64); // rax
v2 = IscsiSetup(a1); /*0x3c61b*/
*(_QWORD *)(a1 + 1152) = DxeRegWrapReg30; /*0x3c627*/
*(_QWORD *)(a1 + 1168) = DxeRegWrapReg47; /*0x3c635*/
*(_QWORD *)(a1 + 1192) = CompNameGetChildHandle; /*0x3c643*/
if ( (UtlRegisterWrite((__int64 *)a1, 0x10u) & 0x80000) != 0 ) /*0x3c653*/
{
*(_DWORD *)(a1 + 1248) = 4; /*0x3c655*/
*(_QWORD *)(a1 + 1160) = NiiChunkedTransmit; /*0x3c666*/
*(_QWORD *)(a1 + 1208) = CompNameGetControllerName; /*0x3c674*/
*(_QWORD *)(a1 + 1200) = CompNameInitSupportedLang; /*0x3c682*/
CompNameGetSupportedLang_1 = CompNameGetSupportedLang; /*0x3c689*/
}
else
{
*(_DWORD *)(a1 + 1248) = 5; /*0x3c692*/
*(_QWORD *)(a1 + 1160) = CompNameGetLang; /*0x3c6a3*/
*(_QWORD *)(a1 + 1208) = CompNameNullThunk; /*0x3c6b1*/
CompNameGetSupportedLang_1 = (__int64 (__fastcall *)(__int64))CompNameNullThunk; /*0x3c6b8*/
*(_QWORD *)(a1 + 1200) = CompNameNullThunk; /*0x3c6bf*/
}
*(_QWORD *)(a1 + 1184) = CompNameGetSupportedLang_1; /*0x3c6c6*/
return v2; /*0x3c6d4*/
}
// Function: CompNameGetChildHandle @ 0x3c6dc (0x58 bytes)
__int64 __fastcall CompNameGetChildHandle(__int64 a1, __int16 *a2)
{
__int64 result; // rax
__int16 n2073; // cx
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(a1 + 1160))(a1, 4, 1, a2); /*0x3c6f8*/
if ( !(_DWORD)result && (!*a2 || *a2 == -1) ) /*0x3c711*/
{
n2073 = 2073; /*0x3c71a*/
if ( *(_DWORD *)(a1 + 1116) == 3 ) /*0x3c71f*/
n2073 = 280; /*0x3c721*/
*a2 = n2073; /*0x3c726*/
}
return result; /*0x3c72e*/
}
// Function: CompNameBestLang @ 0x3c734 (0x1ba bytes)
__int64 __fastcall CompNameBestLang(__int64 *a1, __int64 a2, __int64 a3, __int64 a4)
{
__int64 v5; // r8
__int64 v6; // r9
__int64 v7; // rdx
int v8; // r13d
__int64 v9; // r8
__int64 v10; // r9
unsigned int v11; // r12d
__int64 v12; // r8
__int64 v13; // r9
__int64 v15; // [rsp+20h] [rbp-28h]
__int64 v16; // [rsp+20h] [rbp-28h]
__int64 v17; // [rsp+20h] [rbp-28h]
__int64 v18; // [rsp+20h] [rbp-28h]
__int64 v19; // [rsp+28h] [rbp-20h]
__int64 v20; // [rsp+28h] [rbp-20h]
__int64 v21; // [rsp+28h] [rbp-20h]
__int64 v22; // [rsp+28h] [rbp-20h]
__int64 v23; // [rsp+30h] [rbp-18h]
__int64 v24; // [rsp+30h] [rbp-18h]
__int64 v25; // [rsp+30h] [rbp-18h]
__int64 v26; // [rsp+30h] [rbp-18h]
unsigned int v27; // [rsp+38h] [rbp-10h]
unsigned int v28; // [rsp+38h] [rbp-10h]
unsigned int v29; // [rsp+38h] [rbp-10h]
unsigned int v30; // [rsp+38h] [rbp-10h]
__int64 v31; // [rsp+58h] [rbp+10h] BYREF
unsigned __int16 p_n8239; // [rsp+60h] [rbp+18h] BYREF
UtlRegisterWrite(a1, 0x5800u, a3, a4, v15, v19, v23, v27); /*0x3c752*/
UtlRegisterWrite(a1, 0xE04u, v5, v6, v16, v20, v24, v28); /*0x3c762*/
UtlRegisterAccess(a1, 0xE04u); /*0x3c779*/
LOBYTE(v7) = 10; /*0x3c783*/
PciFindFunctionByIrq(a1, v7, &p_n8239); /*0x3c788*/
v8 = 0; /*0x3c7a4*/
while ( 1 ) /*0x3c7b4*/
{
MngProcessCommand(a1, 16515086, &p_n8239); /*0x3c7b4*/
if ( (_BYTE)p_n8239 != 0xFF ) /*0x3c7be*/
break; /*0x3c7be*/
v11 = -2; /*0x3c7c9*/
UtlRegisterWrite(a1, 0, v9, v10, v17, v21, v25, v29); /*0x3c7cd*/
UtlRegisterAccess(a1, 0); /*0x3c7de*/
UtlRegisterWrite(a1, 0x18u, v12, v13, v18, v22, v26, v30); /*0x3c7eb*/
UtlRegisterAccess(a1, 0x18u); /*0x3c800*/
UtlRegisterAccess(a1, 0x5800u); /*0x3c810*/
UtlRegisterAccess(a1, (unsigned int)&byte_12024); /*0x3c82c*/
UndiTransmit(a1, 0x44u, (__int64)&v31); /*0x3c83e*/
LOWORD(v31) = v31 | 3; /*0x3c843*/
UndiReceive(a1, 0x44u, (__int64)&v31); /*0x3c856*/
UtlRegisterRead(*a1, 1000); /*0x3c863*/
LOWORD(v31) = v31 & 0xFFFC; /*0x3c873*/
UndiReceive(a1, 0x44u, (__int64)&v31); /*0x3c881*/
UtlRegisterAccess(a1, (unsigned int)&byte_12024); /*0x3c89d*/
UtlRegisterAccess(a1, 0x5800u); /*0x3c8ad*/
if ( ++v8 >= 5 ) /*0x3c8b9*/
goto LABEL_6; /*0x3c8b9*/
}
v11 = 0; /*0x3c8c1*/
LABEL_6:
UtlRegisterAccess(a1, 0xE04u); /*0x3c8c4*/
return v11; /*0x3c8e1*/
}
// Function: DxeRegister_38 @ 0x3c8f0 (0x44 bytes)
__int64 __fastcall DxeRegister_38(__int64 *a1)
{
int n100; // ebx
n100 = 100; /*0x3c8fd*/
do /*0x3c925*/
{
if ( (UtlRegisterWrite(a1, 0x1010u) & 0x40000) != 0 ) /*0x3c913*/
break; /*0x3c913*/
UtlRegisterRead(*a1, 1000); /*0x3c91d*/
--n100; /*0x3c922*/
}
while ( n100 ); /*0x3c925*/
return 0; /*0x3c92e*/
}
// Function: RegRegister_51 @ 0x3c934 (0x4a bytes)
__int64 __fastcall RegRegister_51(__int64 a1)
{
__int64 v2; // rdx
__int64 v3; // r8
__int64 v4; // r9
__int64 result; // rax
if ( *(int *)(a1 + 268) < 19 /*0x3c960*/
|| (UtlRegisterWrite((__int64 *)a1, 0x10u) & 0x80000) != 0
|| (result = CompNameBestLang((__int64 *)a1, v2, v3, v4), !(_DWORD)result) )
{
*(_QWORD *)(a1 + 928) = DxeRegister_38; /*0x3c96c*/
return RegRegister_32(a1); /*0x3c973*/
}
return result; /*0x3c978*/
}
// Function: CompNameInstallTable @ 0x3c980 (0xe8 bytes)
__int64 (__fastcall *__fastcall CompNameInstallTable(_QWORD *IfrnTable))()
{
IfrnTable[119] = CompNameNullThunk; /*0x3c995*/
IfrnTable[109] = CompNameNullThunk; /*0x3c9a3*/
IfrnTable[120] = CompNameNullThunk; /*0x3c9aa*/
IfrnTable[121] = CompNameNullThunk; /*0x3c9b1*/
IfrnTable[122] = CompNameNullThunk; /*0x3c9b8*/
IfrnTable[110] = CompNameNullThunk; /*0x3c9c6*/
IfrnTable[112] = CompNameNullThunk; /*0x3c9cd*/
IfrnTable[125] = CompNameNullThunk; /*0x3c9d4*/
IfrnTable[126] = CompNameNullThunk; /*0x3c9db*/
IfrnTable[127] = CompNameNullThunk; /*0x3c9e9*/
IfrnTable[128] = CompNameNullThunk; /*0x3c9f0*/
IfrnTable[129] = CompNameNullThunk; /*0x3c9f7*/
IfrnTable[113] = CompNameNullThunk; /*0x3ca05*/
IfrnTable[114] = CompNameNullThunk; /*0x3ca0c*/
IfrnTable[132] = CompNameNullThunk; /*0x3ca13*/
IfrnTable[115] = CompNameNullThunk; /*0x3ca21*/
IfrnTable[116] = CompNameNullThunk; /*0x3ca28*/
IfrnTable[117] = CompNameNullThunk; /*0x3ca2f*/
IfrnTable[118] = CompNameNullThunk; /*0x3ca36*/
IfrnTable[133] = CompNameNullThunk; /*0x3ca3d*/
IfrnTable[123] = UbaNoOp; /*0x3ca44*/
IfrnTable[124] = CompNameNullThunk; /*0x3ca4b*/
IfrnTable[130] = UbaNoOp; /*0x3ca52*/
IfrnTable[131] = UbaNoOp; /*0x3ca59*/
IfrnTable[111] = CompNameNullThunk; /*0x3ca60*/
return CompNameNullThunk; /*0x3ca67*/
}
// Function: CompNameNullThunk @ 0x3ca68 (0x3 bytes)
__int64 CompNameNullThunk()
{
return 0; /*0x3ca6a*/
}
// Function: CompNameGuidToString @ 0x3ca6c (0x1f bytes)
__int64 __fastcall CompNameGuidToString(__int64 *a1)
{
return (((unsigned int)&loc_3FFFF + 1) & (unsigned int)UtlRegisterWrite(a1, 0x5820u)) != 0 ? 0xC : 0;
}
// Function: CompNameInstall @ 0x3ca8c (0xb5 bytes)
__int64 __fastcall CompNameInstall(__int64 NicConfig)
{
__int16 RetryCount; // di
__int64 result; // rax
int LinkStatusReg; // eax
int PhyStatusReg; // eax
unsigned __int16 RegValue; // [rsp+30h] [rbp+8h] BYREF
RetryCount = 0; /*0x3caa5*/
if ( !*(_QWORD *)(NicConfig + 960) ) /*0x3caa8*/
return 0; /*0x3cb2a*/
while ( 1 ) /*0x3cabe*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(NicConfig + 960))( /*0x3cabe*/
NicConfig,
2,
&RegValue);
if ( (_DWORD)result ) /*0x3cac6*/
break; /*0x3cac6*/
*(_DWORD *)(NicConfig + 1104) = RegValue << 16; /*0x3cad5*/
UtlRegisterRead(*(_QWORD *)NicConfig, 20); /*0x3cade*/
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(NicConfig + 960))( /*0x3caf0*/
NicConfig,
3,
&RegValue);
if ( (_DWORD)result ) /*0x3caf8*/
break; /*0x3caf8*/
LinkStatusReg = RegValue & 0xFFF0; /*0x3cb04*/
*(_DWORD *)(NicConfig + 1112) = RegValue & 0xF; /*0x3cb07*/
*(_DWORD *)(NicConfig + 1104) |= LinkStatusReg; /*0x3cb0d*/
PhyStatusReg = *(_DWORD *)(NicConfig + 1104); /*0x3cb13*/
if ( (!PhyStatusReg || PhyStatusReg == -16) && (unsigned __int16)++RetryCount < 2u ) /*0x3cb28*/
continue; /*0x3cb28*/
return 0; /*0x3cb28*/
}
return result; /*0x3cb3b*/
}
// Function: UtlStrToBin @ 0x3cb44 (0xc9 bytes)
__int64 __fastcall UtlStrToBin(__int64 a1, unsigned int n0x1F, _WORD *a3)
{
unsigned int i; // edi
unsigned int v8; // eax
if ( n0x1F > 0x1F ) /*0x3cb63*/
return 4294967292LL; /*0x3cb65*/
UtlRegisterAccess((__int64 *)a1, 0x20u, (n0x1F | (32 * (*(_DWORD *)(a1 + 1100) | 0x40))) << 16); /*0x3cb8a*/
for ( i = 0; i < 0x780; ++i ) /*0x3cb8f*/
{
UtlRegisterRead(*(_QWORD *)a1, 50); /*0x3cb99*/
v8 = UtlRegisterWrite((__int64 *)a1, 0x20u); /*0x3cba6*/
if ( (v8 & 0x10000000) != 0 ) /*0x3cbb2*/
break; /*0x3cbb2*/
}
if ( (v8 & 0x10000000) == 0 || (v8 & 0x40000000) != 0 || (HIWORD(v8) & 0x1F) != n0x1F ) /*0x3cbd9*/
return 4294967294LL; /*0x3cbc4*/
*a3 = v8; /*0x3cbdb*/
if ( *(_DWORD *)(a1 + 268) == 11 ) /*0x3cbe7*/
UtlRegisterRead(*(_QWORD *)a1, 100); /*0x3cbf1*/
return 0; /*0x3cc07*/
}
// Function: UtlTokenize @ 0x3cc10 (0xbe bytes)
__int64 __fastcall UtlTokenize(__int64 a1, unsigned int n0x1F, unsigned __int16 a3)
{
unsigned int i; // edi
unsigned int v7; // eax
if ( n0x1F > 0x1F ) /*0x3cc2b*/
return 4294967292LL; /*0x3cc2d*/
UtlRegisterAccess((__int64 *)a1, 0x20u, a3 | ((n0x1F | (32 * (*(_DWORD *)(a1 + 1100) | 0x20))) << 16)); /*0x3cc58*/
for ( i = 0; i < 0x780; ++i ) /*0x3cc5d*/
{
UtlRegisterRead(*(_QWORD *)a1, 50); /*0x3cc67*/
v7 = UtlRegisterWrite((__int64 *)a1, 0x20u); /*0x3cc74*/
if ( (v7 & 0x10000000) != 0 ) /*0x3cc7d*/
break; /*0x3cc7d*/
}
if ( (v7 & 0x10000000) == 0 || (v7 & 0x40000000) != 0 || (HIWORD(v7) & 0x1F) != n0x1F ) /*0x3cca4*/
return 4294967294LL; /*0x3cc8f*/
if ( *(_DWORD *)(a1 + 268) == 11 ) /*0x3ccad*/
UtlRegisterRead(*(_QWORD *)a1, 100); /*0x3ccb7*/
return 0; /*0x3ccc8*/
}
// Function: DxeRegister_28 @ 0x3ccd0 (0x7f bytes)
__int64 __fastcall DxeRegister_28(__int64 *a1, unsigned __int16 n6, char *p_n3)
{
unsigned int i; // ebx
int v6; // eax
UtlRegisterAccess(a1, 0x1028u, (n6 | 0x800) << 16); /*0x3ccf7*/
for ( i = 0; i < 0xC8; ++i ) /*0x3ccfc*/
{
UtlRegisterRead(*a1, 50); /*0x3cd06*/
v6 = UtlRegisterWrite(a1, 0x1028u); /*0x3cd13*/
if ( (v6 & 0x20000000) != 0 ) /*0x3cd1c*/
break; /*0x3cd1c*/
}
if ( (v6 & 0x20000000) == 0 || v6 < 0 ) /*0x3cd39*/
return 4294967294LL; /*0x3cd2e*/
*p_n3 = v6; /*0x3cd3b*/
return 0; /*0x3cd49*/
}
// Function: UtlSkipSpace @ 0x3cd50 (0x56 bytes)
__int64 (*__fastcall UtlSkipSpace(__int64 a1, char a2, _WORD *a3))(void)
{
__int64 (*result)(void); // rax
unsigned int v7; // ebx
result = *(__int64 (**)(void))(a1 + 880); /*0x3cd5f*/
if ( result ) /*0x3cd71*/
{
result = (__int64 (*)(void))result(); /*0x3cd73*/
if ( !(_DWORD)result ) /*0x3cd77*/
{
v7 = UtlStrToBin(a1, a2 & 0x1F, a3); /*0x3cd8c*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3cd8e*/
return (__int64 (*)(void))v7; /*0x3cd94*/
}
}
return result; /*0x3cda0*/
}
// Function: UtlIsAlpha @ 0x3cda8 (0x58 bytes)
__int64 (*__fastcall UtlIsAlpha(__int64 a1, char a2, unsigned __int16 a3))(void)
{
__int64 (*result)(void); // rax
unsigned int v7; // ebx
result = *(__int64 (**)(void))(a1 + 880); /*0x3cdb7*/
if ( result ) /*0x3cdca*/
{
result = (__int64 (*)(void))result(); /*0x3cdcc*/
if ( !(_DWORD)result ) /*0x3cdd0*/
{
v7 = UtlTokenize(a1, a2 & 0x1F, a3); /*0x3cde6*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3cde8*/
return (__int64 (*)(void))v7; /*0x3cdee*/
}
}
return result; /*0x3cdfa*/
}
// Function: UtlIsDigit @ 0x3ce00 (0x18 bytes)
__int64 __fastcall UtlIsDigit(__int64 a1, unsigned __int16 a2)
{
*(_DWORD *)(a1 + 1100) = 1; /*0x3ce09*/
return UtlTokenize(a1, 0x1Fu, a2);
}
// Function: UtlStrToUpper @ 0x3ce18 (0x8f bytes)
__int64 __fastcall UtlStrToUpper(__int64 a1, unsigned int n0xF, _WORD *a3)
{
__int64 (*v3)(void); // rax
unsigned int v4; // ebx
unsigned int v8; // eax
unsigned int v9; // ebp
v3 = *(__int64 (**)(void))(a1 + 880); /*0x3ce31*/
v4 = 0; /*0x3ce38*/
if ( v3 ) /*0x3ce45*/
{
v8 = v3(); /*0x3ce47*/
if ( v8 ) /*0x3ce4b*/
{
return v8; /*0x3ce4d*/
}
else
{
if ( n0xF <= 0xF || (v9 = UtlTokenize(a1, 0x1Fu, n0xF)) == 0 ) /*0x3ce6b*/
v9 = UtlStrToBin(a1, n0xF & 0x1F, a3); /*0x3ce7d*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3ce82*/
return v9; /*0x3ce88*/
}
}
return v4; /*0x3cea0*/
}
// Function: UtlStrToLower @ 0x3cea8 (0x4e bytes)
__int64 __fastcall UtlStrToLower(__int64 a1, unsigned int n0xF, _WORD *a3)
{
char n0xF_1; // bl
__int64 result; // rax
n0xF_1 = n0xF; /*0x3ceba*/
if ( n0xF <= 0xF ) /*0x3cec2*/
return UtlStrToBin(a1, n0xF_1 & 0x1F, a3); /*0x3cec2*/
result = UtlTokenize(a1, 0x1Fu, n0xF); /*0x3cecd*/
if ( !(_DWORD)result ) /*0x3ced4*/
return UtlStrToBin(a1, n0xF_1 & 0x1F, a3); /*0x3cee1*/
return result; /*0x3cef0*/
}
// Function: UtlStrCaseCmp @ 0x3cef8 (0x91 bytes)
__int64 __fastcall UtlStrCaseCmp(__int64 a1, unsigned int n0xF, unsigned __int16 a3)
{
__int64 (*v3)(void); // rax
unsigned int v4; // ebx
unsigned int v8; // eax
unsigned int v9; // ebp
v3 = *(__int64 (**)(void))(a1 + 880); /*0x3cf11*/
v4 = 0; /*0x3cf18*/
if ( v3 ) /*0x3cf26*/
{
v8 = v3(); /*0x3cf28*/
if ( v8 ) /*0x3cf2c*/
{
return v8; /*0x3cf2e*/
}
else
{
if ( n0xF <= 0xF || (v9 = UtlTokenize(a1, 0x1Fu, n0xF)) == 0 ) /*0x3cf4c*/
v9 = UtlTokenize(a1, n0xF & 0x1F, a3); /*0x3cf5f*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3cf64*/
return v9; /*0x3cf6a*/
}
}
return v4; /*0x3cf82*/
}
// Function: UtlStrNCat @ 0x3cf8c (0x50 bytes)
__int64 __fastcall UtlStrNCat(__int64 a1, unsigned int n0xF, unsigned __int16 a3)
{
char n0xF_1; // bl
__int64 result; // rax
n0xF_1 = n0xF; /*0x3cf9f*/
if ( n0xF <= 0xF ) /*0x3cfa7*/
return UtlTokenize(a1, n0xF_1 & 0x1F, a3); /*0x3cfa7*/
result = UtlTokenize(a1, 0x1Fu, n0xF); /*0x3cfb2*/
if ( !(_DWORD)result ) /*0x3cfb9*/
return UtlTokenize(a1, n0xF_1 & 0x1F, a3); /*0x3cfc7*/
return result; /*0x3cfd6*/
}
// Function: RegRegister_36 @ 0x3cfdc (0x90 bytes)
__int64 __fastcall RegRegister_36(__int64 a1, char n9, unsigned __int16 *p_n0xFFFF)
{
__int64 (*v3)(void); // rax
unsigned int v4; // ebx
unsigned int v8; // eax
v3 = *(__int64 (**)(void))(a1 + 880); /*0x3cff0*/
v4 = 0; /*0x3cff7*/
if ( v3 ) /*0x3d004*/
{
v8 = v3(); /*0x3d006*/
if ( v8 ) /*0x3d00a*/
{
return v8; /*0x3d00c*/
}
else
{
UtlRegisterAccess((__int64 *)a1, 0x34u, (n9 & 0x1F | 0x20) << 16); /*0x3d026*/
UtlMicroStall((__int64 *)a1); /*0x3d02e*/
UtlRegisterRead(*(_QWORD *)a1, 2); /*0x3d039*/
*p_n0xFFFF = UtlRegisterWrite((__int64 *)a1, 0x34u); /*0x3d04b*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3d04f*/
}
}
return v4; /*0x3d066*/
}
// Function: DxeRegister_36 @ 0x3d06c (0x52 bytes)
__int64 __fastcall DxeRegister_36(__int64 *a1, int n7, _WORD *a3)
{
UtlRegisterAccess(a1, 0x34u, 2555904); /*0x3d087*/
UtlMicroStall(a1); /*0x3d08f*/
UtlRegisterRead(*a1, 2); /*0x3d09c*/
*a3 = UtlRegisterWrite(a1, 0x34u); /*0x3d0b3*/
return 0; /*0x3d0b8*/
}
// Function: RegRegister_37 @ 0x3d0c0 (0x84 bytes)
__int64 __fastcall RegRegister_37(__int64 a1, char n4, unsigned __int16 n0xFFFF)
{
__int64 (*v3)(void); // rax
unsigned int v4; // ebx
unsigned int v8; // eax
v3 = *(__int64 (**)(void))(a1 + 880); /*0x3d0d4*/
v4 = 0; /*0x3d0db*/
if ( v3 ) /*0x3d0e9*/
{
v8 = v3(); /*0x3d0eb*/
if ( v8 ) /*0x3d0ef*/
{
return v8; /*0x3d0f1*/
}
else
{
UtlRegisterAccess((__int64 *)a1, 0x34u, ((n4 & 0x1F) << 16) | n0xFFFF); /*0x3d10a*/
UtlMicroStall((__int64 *)a1); /*0x3d112*/
UtlRegisterRead(*(_QWORD *)a1, 2); /*0x3d11f*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3d127*/
}
}
return v4; /*0x3d13e*/
}
// Function: DxeRegister_41 @ 0x3d144 (0x3b bytes)
__int64 __fastcall DxeRegister_41(__int64 *a1, int n7, unsigned __int16 a3)
{
UtlRegisterAccess(a1, 0x34u, a3 | 0x70000); /*0x3d15d*/
UtlMicroStall(a1); /*0x3d165*/
UtlRegisterRead(*a1, 2); /*0x3d172*/
return 0; /*0x3d179*/
}
// Function: MacSetConfigFlags @ 0x3d180 (0xb0 bytes)
__int64 __fastcall MacSetConfigFlags(__int64 a1)
{
__int64 result; // rax
__int16 v3; // r8
int n3; // eax
int v5; // ecx
int v6; // ecx
__int16 v7; // r8
__int16 v8; // [rsp+30h] [rbp+8h] BYREF
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 9, &v8); /*0x3d193*/
if ( !(_DWORD)result ) /*0x3d19f*/
{
v3 = v8; /*0x3d1a5*/
n3 = 3; /*0x3d1c8*/
if ( (v8 & 0x1000) != 0 ) /*0x3d1d5*/
n3 = 2 - ((v8 & 0x800) != 0); /*0x3d1d5*/
v5 = *(_DWORD *)(a1 + 1084) - 1; /*0x3d1de*/
*(_DWORD *)(a1 + 1088) = n3; /*0x3d1e1*/
if ( v5 ) /*0x3d1e7*/
{
v6 = v5 - 1; /*0x3d1e9*/
if ( v6 ) /*0x3d1ec*/
{
if ( v6 != 1 ) /*0x3d1f1*/
return (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 9); /*0x3d224*/
v7 = v3 & 0xEFFF; /*0x3d1f8*/
}
else
{
v7 = v3 & 0xE7FF | 0x1000; /*0x3d207*/
}
}
else
{
v7 = v3 | 0x1800; /*0x3d212*/
}
v8 = v7; /*0x3d216*/
return (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 9); /*0x3d216*/
}
return result; /*0x3d22a*/
}
// Function: MacCheckBootMode @ 0x3d230 (0xe1 bytes)
__int64 __fastcall MacCheckBootMode(__int64 a1)
{
__int64 result; // rax
__int16 v3; // r8
int v4; // ecx
__int16 n1024; // ax
__int16 v6; // [rsp+30h] [rbp+8h] BYREF
if ( *(_BYTE *)(a1 + 1134) ) /*0x3d236*/
return 0; /*0x3d242*/
if ( *(_DWORD *)(a1 + 1072) != 13 || (result = (*(__int64 (**)(void))(a1 + 992))(), !(_DWORD)result) ) /*0x3d25a*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 22, &v6); /*0x3d26d*/
if ( !(_DWORD)result ) /*0x3d275*/
{
v6 |= 0x8C00u; /*0x3d292*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 22); /*0x3d298*/
if ( !(_DWORD)result ) /*0x3d2a0*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 18, &v6); /*0x3d2ad*/
if ( !(_DWORD)result ) /*0x3d2b5*/
{
v3 = v6 & 0xF9FF; /*0x3d2c9*/
v4 = *(unsigned __int8 *)(a1 + 1130) - 1; /*0x3d2cd*/
v6 &= 0xF9FFu; /*0x3d2d0*/
if ( v4 ) /*0x3d2d6*/
{
n1024 = 1024; /*0x3d2d8*/
if ( v4 == 1 ) /*0x3d2e0*/
n1024 = 512; /*0x3d2e2*/
v6 = n1024 | v3; /*0x3d2eb*/
}
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 18); /*0x3d2f9*/
if ( !(_DWORD)result ) /*0x3d301*/
return MacSetConfigFlags(a1); /*0x3d306*/
}
}
}
}
return result; /*0x3d30b*/
}
// Function: MacInitConfigFlags @ 0x3d314 (0x257 bytes)
__int64 __fastcall MacInitConfigFlags(__int64 a1)
{
__int64 result; // rax
int n8; // edx
__int16 v4; // r8
__int16 v5; // r8
__int16 v6; // r8
bool v7; // zf
__int16 v8; // r8
__int16 v9; // [rsp+30h] [rbp+8h] BYREF
if ( *(_BYTE *)(a1 + 1134) ) /*0x3d329*/
return 0; /*0x3d553*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v9); /*0x3d344*/
if ( (_DWORD)result ) /*0x3d34c*/
return result; /*0x3d34c*/
n8 = *(_DWORD *)(a1 + 1072); /*0x3d352*/
v4 = v9; /*0x3d358*/
if ( n8 != 8 ) /*0x3d367*/
v4 = v9 | 0x800; /*0x3d369*/
v5 = v4 & 0xFF9F; /*0x3d379*/
if ( *(_BYTE *)(a1 + 1130) != 1 ) /*0x3d380*/
{
if ( *(_BYTE *)(a1 + 1130) == 2 ) /*0x3d385*/
{
v5 |= 0x20u; /*0x3d39a*/
}
else if ( *(_BYTE *)(a1 + 1130) == 3 ) /*0x3d38a*/
{
v5 |= 0x40u; /*0x3d393*/
}
else
{
v5 |= 0x60u; /*0x3d38c*/
}
}
v6 = v5 & 0xFFFD; /*0x3d3a9*/
v7 = *(_BYTE *)(a1 + 1131) == 0; /*0x3d3ad*/
v9 = v6; /*0x3d3b4*/
if ( !v7 ) /*0x3d3ba*/
{
v6 |= 2u; /*0x3d3bc*/
v9 = v6; /*0x3d3c0*/
}
if ( n8 == 8 ) /*0x3d3c9*/
{
if ( *(_DWORD *)(a1 + 1104) == 21040305 ) /*0x3d3d5*/
{
v9 = v6 & 0xF7FF; /*0x3d3e5*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 16); /*0x3d3eb*/
if ( (_DWORD)result ) /*0x3d3f3*/
return result; /*0x3d3f3*/
result = (*(__int64 (__fastcall **)(__int64))(a1 + 912))(a1); /*0x3d3fc*/
if ( (_DWORD)result ) /*0x3d404*/
return result; /*0x3d404*/
v6 = v9; /*0x3d40a*/
}
v9 = v6 | 0x800; /*0x3d414*/
}
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 16); /*0x3d41f*/
if ( !(_DWORD)result )
{
if ( *(_DWORD *)(a1 + 1072) != 2
|| *(_DWORD *)(a1 + 1112) >= 4u
|| *(_DWORD *)(a1 + 1104) == 21040305
|| (result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 20, &v9), !(_DWORD)result)
&& (*(_DWORD *)(a1 + 1112) != 2 || *(_DWORD *)(a1 + 1104) != 21040320
? (v8 = v9 & 0xF08F | 0x170)
: (v8 = v9 & 0xF18F | 0x870),
v9 = v8,
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 20),
!(_DWORD)result) )
{
if ( *(_DWORD *)(a1 + 1072) != 8 /*0x3d4fe*/
|| *(_DWORD *)(a1 + 1104) != 21040305
|| (result = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 29, 3), !(_DWORD)result)
&& (result = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1016))(a1, 30, 0), !(_DWORD)result) )
{
result = (*(__int64 (__fastcall **)(__int64))(a1 + 912))(a1); /*0x3d503*/
if ( !(_DWORD)result ) /*0x3d50b*/
{
if ( *(_DWORD *)(a1 + 1072) != 9 ) /*0x3d514*/
return 0; /*0x3d514*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 20, &v9); /*0x3d520*/
if ( !(_DWORD)result ) /*0x3d528*/
{
v9 = v9 & 0xFFC3 | 0x20; /*0x3d543*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 20); /*0x3d549*/
if ( !(_DWORD)result ) /*0x3d551*/
return 0; /*0x3d551*/
}
}
}
}
}
return result; /*0x3d564*/
}
// Function: MacUpdateConfigFlags @ 0x3d56c (0x111 bytes)
__int64 __fastcall MacUpdateConfigFlags(__int64 a1)
{
__int64 result; // rax
__int16 v3; // r8
__int16 v4; // r8
__int16 v5; // [rsp+30h] [rbp+8h] BYREF
if ( *(_BYTE *)(a1 + 1134) ) /*0x3d572*/
return 0; /*0x3d580*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v5); /*0x3d58f*/
if ( !(_DWORD)result ) /*0x3d597*/
{
v3 = v5 & 0xFF9F; /*0x3d5af*/
if ( *(_BYTE *)(a1 + 1130) != 1 ) /*0x3d5b6*/
{
if ( *(_BYTE *)(a1 + 1130) == 2 ) /*0x3d5bb*/
{
v3 |= 0x20u; /*0x3d5dc*/
}
else if ( *(_BYTE *)(a1 + 1130) != 3 || *(_DWORD *)(a1 + 1104) == 21040272 ) /*0x3d5cc*/
{
v3 |= 0x60u; /*0x3d5d5*/
}
else
{
v3 |= 0x40u; /*0x3d5ce*/
}
}
v4 = v3 & 0xFFFD; /*0x3d5e6*/
if ( *(_BYTE *)(a1 + 1131) ) /*0x3d5ea*/
v4 |= 2u; /*0x3d5f3*/
if ( *(_DWORD *)(a1 + 1104) == 21040800 ) /*0x3d602*/
{
v5 = v4 & 0xF7FF; /*0x3d615*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 16); /*0x3d61b*/
if ( (_DWORD)result ) /*0x3d623*/
return result; /*0x3d623*/
result = (*(__int64 (__fastcall **)(__int64))(a1 + 912))(a1); /*0x3d628*/
if ( (_DWORD)result ) /*0x3d630*/
return result; /*0x3d630*/
v4 = v5; /*0x3d632*/
}
v5 = v4 & 0x87FF | 0x5800; /*0x3d652*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 16); /*0x3d658*/
if ( !(_DWORD)result ) /*0x3d660*/
{
result = (*(__int64 (__fastcall **)(__int64))(a1 + 912))(a1); /*0x3d665*/
if ( !(_DWORD)result ) /*0x3d66d*/
return MacSetConfigFlags(a1); /*0x3d672*/
}
}
return result; /*0x3d677*/
}
// Function: RegRegister_15 @ 0x3d680 (0x160 bytes)
__int64 __fastcall RegRegister_15(__int64 a1)
{
__int64 result; // rax
__int64 (__fastcall *v3)(__int64, _QWORD); // r11
__int16 n0x2000; // ax
__int16 v5; // r8
__int16 v6; // [rsp+30h] [rbp+8h] BYREF
if ( *(_BYTE *)(a1 + 1134) ) /*0x3d68a*/
return 0; /*0x3d696*/
result = (*(__int64 (**)(void))(a1 + 992))(); /*0x3d69d*/
if ( !(_DWORD)result ) /*0x3d6a5*/
{
UtlRegisterRead(*(_QWORD *)a1, (__int64)L"tion I218-V"); /*0x3d6b3*/
v3 = *(__int64 (__fastcall **)(__int64, _QWORD))(a1 + 1000); /*0x3d6b8*/
if ( !v3 || (result = v3(a1, 0), !(_DWORD)result) ) /*0x3d6ce*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 18, &v6); /*0x3d6e1*/
if ( !(_DWORD)result ) /*0x3d6e9*/
{
if ( *(_BYTE *)(a1 + 1130) == 1 ) /*0x3d708*/
{
v5 = v6 & 0xCFFF; /*0x3d726*/
}
else
{
if ( *(_BYTE *)(a1 + 1130) == 2 ) /*0x3d70d*/
n0x2000 = 0x2000; /*0x3d71a*/
else
n0x2000 = 4096; /*0x3d70f*/
v5 = n0x2000 | v6 & 0xEFFF; /*0x3d714*/
}
v6 = v5; /*0x3d732*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 18); /*0x3d738*/
if ( !(_DWORD)result ) /*0x3d740*/
{
if ( *(_BYTE *)(a1 + 835) ) /*0x3d746*/
{
if ( *(_WORD *)(a1 + 1120) != 32 ) /*0x3d75a*/
return MacSetConfigFlags(a1); /*0x3d75a*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v6); /*0x3d767*/
if ( !(_DWORD)result ) /*0x3d76f*/
{
v6 &= ~0x80u; /*0x3d788*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 16); /*0x3d78e*/
if ( !(_DWORD)result ) /*0x3d796*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 9, &v6); /*0x3d7a3*/
if ( !(_DWORD)result ) /*0x3d7ab*/
{
v6 &= ~0x1000u; /*0x3d7bd*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 9); /*0x3d7c3*/
if ( !(_DWORD)result ) /*0x3d7cb*/
return MacSetConfigFlags(a1); /*0x3d7d0*/
}
}
}
}
}
}
}
}
return result; /*0x3d7da*/
}
// Function: DxeRegister_1 @ 0x3d7e0 (0x230 bytes)
__int64 __fastcall DxeRegister_1(__int64 a1)
{
unsigned __int16 v1; // ax
bool v3; // zf
__int64 result; // rax
unsigned int v5; // r11d
__int16 v6; // r8
__int16 v7; // cx
__int16 v8; // ax
int v9; // ecx
int v10; // ecx
int v11; // ecx
__int16 n2048; // ax
__int16 v13; // r8
unsigned int v14; // edi
__int16 n45; // si
__int16 v16; // [rsp+40h] [rbp+8h] BYREF
unsigned __int16 v17; // [rsp+48h] [rbp+10h] BYREF
__int16 v18; // [rsp+50h] [rbp+18h] BYREF
v1 = *(_WORD *)(a1 + 1122); /*0x3d7ec*/
v3 = (v1 & *(_WORD *)(a1 + 1120)) == 0; /*0x3d7f6*/
*(_WORD *)(a1 + 1120) &= v1; /*0x3d7f6*/
if ( v3 ) /*0x3d7fd*/
*(_WORD *)(a1 + 1120) = v1; /*0x3d7ff*/
*(_WORD *)(a1 + 1120) &= *(_WORD *)(a1 + 1122); /*0x3d814*/
v17 = 0; /*0x3d81e*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 4, &v16); /*0x3d825*/
v5 = result; /*0x3d82b*/
if ( !(_DWORD)result ) /*0x3d830*/
{
if ( (*(_BYTE *)(a1 + 1122) & 0x20) == 0 /*0x3d857*/
|| (result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 9, &v17),
(v5 = result) == 0) )
{
v6 = v16 & 0xFE1F; /*0x3d86d*/
v7 = v17 & 0xFCFF; /*0x3d876*/
v8 = *(_WORD *)(a1 + 1120); /*0x3d879*/
v17 &= 0xFCFFu; /*0x3d880*/
if ( (v8 & 1) != 0 ) /*0x3d887*/
v6 |= 0x20u; /*0x3d889*/
if ( (v8 & 2) != 0 ) /*0x3d890*/
v6 |= 0x40u; /*0x3d892*/
if ( (v8 & 4) != 0 ) /*0x3d89a*/
v6 |= 0x80u; /*0x3d8a1*/
if ( (v8 & 8) != 0 ) /*0x3d8a7*/
v6 |= 0x100u; /*0x3d8ae*/
if ( (v8 & 0x20) != 0 ) /*0x3d8b4*/
v17 = v7 | 0x200; /*0x3d8be*/
v9 = *(_DWORD *)(a1 + 864); /*0x3d8c3*/
if ( !v9 ) /*0x3d8cb*/
{
v13 = v6 & 0xF3FF; /*0x3d906*/
LABEL_25:
v16 = v13; /*0x3d90a*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 4); /*0x3d915*/
v5 = result; /*0x3d91b*/
if ( !(_DWORD)result ) /*0x3d920*/
{
if ( (*(_BYTE *)(a1 + 1122) & 0x20) != 0 ) /*0x3d929*/
v5 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1016))(a1, 9, v17); /*0x3d93c*/
result = v5; /*0x3d93f*/
}
goto LABEL_29; /*0x3d93f*/
}
v10 = v9 - 1; /*0x3d8cd*/
if ( v10 ) /*0x3d8d0*/
{
v11 = v10 - 1; /*0x3d8d2*/
if ( !v11 ) /*0x3d8d5*/
{
v6 &= ~0x400u; /*0x3d8f6*/
n2048 = 2048; /*0x3d8fa*/
goto LABEL_22; /*0x3d8ff*/
}
if ( v11 != 1 ) /*0x3d8da*/
return 4294967293LL; /*0x3d8e1*/
}
n2048 = 3072; /*0x3d8e6*/
LABEL_22:
v13 = n2048 | v6; /*0x3d8eb*/
goto LABEL_25; /*0x3d8ef*/
}
}
LABEL_29:
if ( !v5 ) /*0x3d945*/
{
result = (*(__int64 (__fastcall **)(__int64, _QWORD, __int16 *))(a1 + 960))(a1, 0, &v18); /*0x3d955*/
if ( !(_DWORD)result ) /*0x3d95d*/
{
v18 |= 0x1200u; /*0x3d977*/
result = (*(__int64 (__fastcall **)(__int64, _QWORD))(a1 + 1016))(a1, 0); /*0x3d97d*/
v14 = result; /*0x3d983*/
if ( !(_DWORD)result ) /*0x3d987*/
{
if ( *(_BYTE *)(a1 + 1136) ) /*0x3d989*/
{
if ( *(_QWORD *)(a1 + 960) ) /*0x3d992*/
{
n45 = 45; /*0x3d99f*/
do /*0x3d9f4*/
{
v14 = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 1, &v16); /*0x3d9b7*/
if ( v14 ) /*0x3d9bb*/
break; /*0x3d9bb*/
v14 = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 1, &v16); /*0x3d9d0*/
if ( v14 ) /*0x3d9d4*/
break; /*0x3d9d4*/
if ( (v16 & 0x20) != 0 ) /*0x3d9db*/
break; /*0x3d9db*/
UtlRegisterRead(*(_QWORD *)a1, (__int64)L"tion I218-V"); /*0x3d9e5*/
--n45; /*0x3d9f0*/
}
while ( n45 ); /*0x3d9f4*/
if ( v14 ) /*0x3d9f8*/
return v14; /*0x3d9f8*/
}
else
{
v14 = 0; /*0x3d99b*/
}
}
*(_BYTE *)(a1 + 837) = 1; /*0x3d9fa*/
return v14; /*0x3da01*/
}
}
}
return result; /*0x3da08*/
}
// Function: DxeRegister_56 @ 0x3da10 (0x66 bytes)
__int64 __fastcall DxeRegister_56(__int64 a1)
{
__int64 result; // rax
bool v3; // [rsp+30h] [rbp+8h] BYREF
if ( *(_BYTE *)(a1 + 835) ) /*0x3da16*/
result = DxeRegister_1(a1); /*0x3da22*/
else
result = (*(__int64 (**)(void))(a1 + 920))(); /*0x3da37*/
if ( !(_DWORD)result ) /*0x3da29*/
{
if ( !*(_QWORD *)(a1 + 960) || (result = UtlParseTokenStrLong(a1, 0xAu, 0xAu, &v3), !(_DWORD)result) ) /*0x3da56*/
{
if ( v3 ) /*0x3da5d*/
{
(*(void (__fastcall **)(__int64))(a1 + 208))(a1); /*0x3da62*/
return NiiReceiveFilterReset(a1); /*0x3da6b*/
}
}
}
return result; /*0x3da70*/
}
// Function: UtlGuidToString @ 0x3da78 (0xf7 bytes)
__int64 __fastcall UtlGuidToString(__int64 a1)
{
__int64 result; // rax
unsigned int v3; // edi
bool v4; // [rsp+30h] [rbp+8h] BYREF
unsigned __int16 v5; // [rsp+38h] [rbp+10h] BYREF
result = (*(__int64 (__fastcall **)(__int64, _QWORD, unsigned __int16 *))(a1 + 960))(a1, 0, &v5); /*0x3da8c*/
if ( !(_DWORD)result ) /*0x3da94*/
{
UtlStrToLowercase(a1, (__int16 *)&v5); /*0x3daa2*/
result = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(a1 + 1016))(a1, 0, v5); /*0x3dab2*/
if ( !(_DWORD)result ) /*0x3daba*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 18, &v5); /*0x3dacd*/
if ( !(_DWORD)result ) /*0x3dad5*/
{
v5 &= 0xCFFFu; /*0x3daef*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 18); /*0x3daf5*/
v3 = result; /*0x3dafb*/
if ( !(_DWORD)result ) /*0x3daff*/
{
UtlRegisterRead(*(_QWORD *)a1, 1); /*0x3db07*/
if ( *(_BYTE *)(a1 + 1136) ) /*0x3db0c*/
{
if ( !*(_QWORD *)(a1 + 960) ) /*0x3db15*/
return 0; /*0x3db15*/
result = UtlParseTokenStrLong(a1, 0x14u, (unsigned int)L"tion I218-V", &v4); /*0x3db34*/
if ( (_DWORD)result ) /*0x3db3b*/
return result; /*0x3db3b*/
if ( *(_QWORD *)(a1 + 960) ) /*0x3db3d*/
return (unsigned int)UtlParseTokenStrLong(a1, 0x14u, (unsigned int)L"tion I218-V", &v4); /*0x3db60*/
else
return 0; /*0x3db47*/
}
return v3; /*0x3db62*/
}
}
}
}
return result; /*0x3db69*/
}
// Function: UtlStringToGuid @ 0x3db70 (0x25d bytes)
__int64 __fastcall UtlStringToGuid(__int64 a1)
{
__int64 result; // rax
__int64 (__fastcall *v3)(__int64, __int64, __int64); // rax
int n21040576; // eax
bool v5; // [rsp+30h] [rbp+8h] BYREF
unsigned __int16 v6; // [rsp+38h] [rbp+10h] BYREF
if ( *(_DWORD *)(a1 + 1072) == 15 /*0x3dbbf*/
|| (result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 16, &v6),
!(_DWORD)result)
&& (v6 &= 0xFF9Fu, result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 16), !(_DWORD)result) )
{
result = (*(__int64 (__fastcall **)(__int64, _QWORD, unsigned __int16 *))(a1 + 960))(a1, 0, &v6); /*0x3dbcf*/
if ( !(_DWORD)result ) /*0x3dbd7*/
{
UtlStrToLowercase(a1, (__int16 *)&v6); /*0x3dbe5*/
result = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(a1 + 1016))(a1, 0, v6); /*0x3dbf5*/
if ( !(_DWORD)result ) /*0x3dbfd*/
{
result = (*(__int64 (__fastcall **)(__int64))(a1 + 912))(a1); /*0x3dc06*/
if ( !(_DWORD)result ) /*0x3dc0e*/
{
if ( !*(_BYTE *)(a1 + 1136) /*0x3dd00*/
|| (!*(_QWORD *)(a1 + 960)
|| (result = UtlParseTokenStrLong(a1, 0x14u, (unsigned int)L"tion I218-V", &v5), !(_DWORD)result))
&& (v5
|| *(_DWORD *)(a1 + 1104) == 21040128
|| *(_DWORD *)(a1 + 1104) == 21040272
|| *(_DWORD *)(a1 + 1104) == 21040576
|| *(_DWORD *)(a1 + 1104) == 21040592
|| *(_DWORD *)(a1 + 1104) == 21040624
|| *(_DWORD *)(a1 + 1104) == 21040800
|| *(_DWORD *)(a1 + 1072) != 2
|| (result = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 29, 29), !(_DWORD)result)
&& ((v3 = *(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016)) == 0
|| (result = v3(a1, 30, 193), !(_DWORD)result)
&& (result = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1016))(a1, 30, 0), !(_DWORD)result)))
&& (!*(_QWORD *)(a1 + 960)
|| (result = UtlParseTokenStrLong(a1, 0x14u, (unsigned int)L"tion I218-V", &v5), !(_DWORD)result)) )
{
if ( *(_DWORD *)(a1 + 1072) != 2 ) /*0x3dd0d*/
return 0; /*0x3dd0d*/
n21040576 = *(_DWORD *)(a1 + 1104); /*0x3dd13*/
if ( n21040576 == 21040576 /*0x3dd51*/
|| n21040576 == 21040624
|| n21040576 == 21040272
|| n21040576 == 21040128
|| n21040576 == 21040800
|| n21040576 == 21040592 )
{
return 0; /*0x3ddc5*/
}
else
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 20, &v6); /*0x3dd60*/
if ( !(_DWORD)result ) /*0x3dd68*/
{
v6 |= 0x70u; /*0x3dd7b*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 20); /*0x3dd81*/
if ( !(_DWORD)result ) /*0x3dd89*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 16, &v6); /*0x3dd96*/
if ( !(_DWORD)result ) /*0x3dd9e*/
{
v6 |= 0x800u; /*0x3ddb7*/
return (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 16); /*0x3ddbd*/
}
}
}
}
}
}
}
}
}
return result; /*0x3ddc7*/
}
// Function: UtlBinToHex @ 0x3ddd0 (0xea bytes)
__int64 __fastcall UtlBinToHex(__int64 a1)
{
__int64 result; // rax
bool v3; // [rsp+30h] [rbp+8h] BYREF
unsigned __int16 v4; // [rsp+38h] [rbp+10h] BYREF
result = (*(__int64 (__fastcall **)(__int64, _QWORD, unsigned __int16 *))(a1 + 960))(a1, 0, &v4); /*0x3dde0*/
if ( !(_DWORD)result ) /*0x3dde8*/
{
UtlStrToLowercase(a1, (__int16 *)&v4); /*0x3ddf6*/
result = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(a1 + 1016))(a1, 0, v4); /*0x3de06*/
if ( !(_DWORD)result ) /*0x3de0e*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 28, &v4); /*0x3de1f*/
if ( !(_DWORD)result ) /*0x3de27*/
{
v4 &= 0xFF3Fu; /*0x3de44*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 28); /*0x3de4a*/
if ( !(_DWORD)result ) /*0x3de52*/
{
UtlRegisterRead(*(_QWORD *)a1, 1); /*0x3de5a*/
if ( !*(_BYTE *)(a1 + 1136) ) /*0x3de5f*/
return 0; /*0x3de5f*/
if ( !*(_QWORD *)(a1 + 960) ) /*0x3de68*/
return 0; /*0x3de68*/
result = UtlParseTokenStrLong(a1, 0x14u, 0x186A0u, &v3); /*0x3de85*/
if ( !(_DWORD)result ) /*0x3de8c*/
{
if ( !*(_QWORD *)(a1 + 960) ) /*0x3de8e*/
return 0; /*0x3de8e*/
result = UtlParseTokenStrLong(a1, 0x14u, 0x186A0u, &v3); /*0x3dea9*/
if ( !(_DWORD)result ) /*0x3deb0*/
return 0; /*0x3deb2*/
}
}
}
}
}
return result; /*0x3deb4*/
}
// Function: UtlStrToLowercase @ 0x3debc (0xb5 bytes)
char __fastcall UtlStrToLowercase(__int64 a1, __int16 *a2)
{
int v4; // ebx
__int16 v5; // ax
unsigned int v6; // ebx
unsigned int v7; // ebx
__int16 v8; // ax
int v9; // ebx
*(_DWORD *)(a1 + 864) = 0; /*0x3decb*/
v4 = UtlRegisterWrite((__int64 *)a1, 0); /*0x3dedf*/
*a2 &= ~0x1000u; /*0x3dee6*/
v5 = *a2; /*0x3dee9*/
v6 = v4 & 0xFFFFE4DF | 0x1800; /*0x3def2*/
if ( (*(_BYTE *)(a1 + 830) & 5) != 0 ) /*0x3deff*/
{
v7 = v6 & 0xFFFFFFFE; /*0x3df06*/
v8 = v5 & 0xFEFF; /*0x3df09*/
}
else
{
v7 = v6 | 1; /*0x3df13*/
v8 = v5 | 0x100; /*0x3df16*/
}
*a2 = v8; /*0x3df19*/
if ( (*(_BYTE *)(a1 + 830) & 0xC) != 0 ) /*0x3df23*/
{
v9 = v7 | 0x100; /*0x3df2a*/
*a2 = v8 & 0xDFBF | 0x2000; /*0x3df39*/
}
else
{
v9 = v7 & 0xFFFFFCFF; /*0x3df43*/
*a2 &= 0xDFBFu; /*0x3df49*/
}
(*(void (__fastcall **)(__int64))(a1 + 208))(a1); /*0x3df4f*/
return UtlRegisterAccess((__int64 *)a1, 0, v9); /*0x3df67*/
}
// Function: UtlHexToBin @ 0x3df74 (0x123 bytes)
__int64 __fastcall UtlHexToBin(__int64 a1, char a2)
{
__int64 result; // rax
int n2; // ecx
__int16 v6; // r8
bool v7; // zf
__int16 n47; // cx
__int16 v9; // [rsp+30h] [rbp+8h] BYREF
if ( !*(_QWORD *)(a1 + 960) ) /*0x3df7e*/
return 0; /*0x3df90*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 25, &v9); /*0x3df9f*/
if ( !(_DWORD)result ) /*0x3dfa7*/
{
if ( a2 ) /*0x3dfb0*/
{
n47 = *(_WORD *)(a1 + 1120); /*0x3e017*/
if ( n47 != 47 && n47 != 15 && n47 != 3 ) /*0x3e02e*/
return result; /*0x3e02e*/
v9 |= 4u; /*0x3e043*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 25); /*0x3e049*/
v7 = (_DWORD)result == 0; /*0x3e04f*/
}
else
{
v9 &= ~4u; /*0x3dfc9*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 25); /*0x3dfcf*/
if ( (_DWORD)result ) /*0x3dfd7*/
return result; /*0x3dfd7*/
n2 = *(_DWORD *)(a1 + 1096); /*0x3dfdd*/
if ( n2 == 1 ) /*0x3dfe6*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v9); /*0x3dff5*/
if ( (_DWORD)result ) /*0x3dffd*/
return result; /*0x3dffd*/
v6 = v9 | 0x80; /*0x3e00c*/
goto LABEL_17; /*0x3e010*/
}
v7 = n2 == 2; /*0x3e012*/
}
if ( v7 ) /*0x3e051*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v9); /*0x3e062*/
if ( !(_DWORD)result ) /*0x3e06a*/
{
v6 = v9 & 0xFF7F; /*0x3e077*/
LABEL_17:
v9 = v6; /*0x3e07b*/
return (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 16); /*0x3e086*/
}
}
}
return result; /*0x3e091*/
}
// Function: PhyCheckLinkSpeedCap @ 0x3e098 (0x80 bytes)
__int64 __fastcall PhyCheckLinkSpeedCap(__int64 a1)
{
int n4; // eax
__int64 result; // rax
unsigned __int16 n19; // ax
__int16 n32; // di
unsigned __int16 v6; // [rsp+30h] [rbp+8h] BYREF
n4 = *(_DWORD *)(a1 + 1072); /*0x3e0a2*/
if ( n4 != 2 ) /*0x3e0ae*/
{
if ( n4 == 4 ) /*0x3e0b3*/
goto LABEL_9; /*0x3e0b3*/
if ( n4 != 5 ) /*0x3e0b8*/
{
if ( n4 != 6 ) /*0x3e0bd*/
{
if ( n4 <= 7 || n4 > 9 && n4 != 15 ) /*0x3e0cc*/
{
*(_BYTE *)(a1 + 1135) = 0; /*0x3e0ce*/
return 0; /*0x3e0d7*/
}
goto LABEL_10; /*0x3e0cc*/
}
LABEL_9:
n19 = 19; /*0x3e0d9*/
n32 = 0x8000; /*0x3e0de*/
goto LABEL_11; /*0x3e0e3*/
}
}
LABEL_10:
n19 = 17; /*0x3e0e5*/
n32 = 32; /*0x3e0ea*/
LABEL_11:
result = (*(__int64 (__fastcall **)(__int64, _QWORD, unsigned __int16 *))(a1 + 960))(a1, n19, &v6); /*0x3e0ed*/
if ( !(_DWORD)result ) /*0x3e0fd*/
*(_BYTE *)(a1 + 1135) = ((unsigned __int16)n32 & v6) != 0; /*0x3e107*/
return result; /*0x3e112*/
}
// Function: MngConfigGet @ 0x3e118 (0x33 bytes)
__int64 __fastcall MngConfigGet(__int64 a1)
{
__int64 result; // rax
unsigned __int16 v3; // [rsp+30h] [rbp+8h] BYREF
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 17, &v3); /*0x3e12b*/
if ( !(_DWORD)result ) /*0x3e133*/
*(_DWORD *)(a1 + 1092) = (v3 >> 1) & 1; /*0x3e13f*/
return result; /*0x3e145*/
}
// Function: UtlStrToInt @ 0x3e14c (0x81 bytes)
__int64 __fastcall UtlStrToInt(__int64 a1)
{
__int64 result; // rax
int v3; // ebx
unsigned __int16 n180; // ax
__int16 n120; // di
unsigned __int16 v6; // [rsp+30h] [rbp+8h] BYREF
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 17, &v6); /*0x3e16a*/
v3 = 0; /*0x3e170*/
if ( !(_DWORD)result ) /*0x3e174*/
{
if ( (v6 & 0xC000) == 0xC000 ) /*0x3e186*/
{
n180 = 180; /*0x3e188*/
n120 = 120; /*0x3e18d*/
}
else
{
n180 = 17; /*0x3e192*/
n120 = 2; /*0x3e195*/
}
result = (*(__int64 (__fastcall **)(__int64, _QWORD, unsigned __int16 *))(a1 + 960))(a1, n180, &v6); /*0x3e1a5*/
if ( !(_DWORD)result ) /*0x3e1ad*/
{
LOBYTE(v3) = ((unsigned __int16)n120 & v6) != 0; /*0x3e1b4*/
*(_DWORD *)(a1 + 1092) = v3; /*0x3e1b7*/
}
}
return result; /*0x3e1c7*/
}
// Function: UtlStrToUint @ 0x3e1d0 (0x5e bytes)
__int64 __fastcall UtlStrToUint(__int64 a1)
{
int v1; // ebx
unsigned __int16 n16; // ax
__int16 n256; // si
__int64 result; // rax
unsigned __int16 v6; // [rsp+30h] [rbp+8h] BYREF
v1 = 0; /*0x3e1df*/
if ( *(_BYTE *)(a1 + 1133) ) /*0x3e1e4*/
{
n16 = 16; /*0x3e1ec*/
n256 = 256; /*0x3e1ef*/
}
else
{
n16 = 17; /*0x3e1f6*/
n256 = 32; /*0x3e1fb*/
}
result = (*(__int64 (__fastcall **)(__int64, _QWORD, unsigned __int16 *))(a1 + 960))(a1, n16, &v6); /*0x3e206*/
if ( !(_DWORD)result ) /*0x3e20e*/
{
LOBYTE(v1) = ((unsigned __int16)n256 & v6) != 0; /*0x3e215*/
*(_DWORD *)(a1 + 1092) = v1; /*0x3e218*/
}
return result; /*0x3e228*/
}
// Function: UtlParseTokenStrLong @ 0x3e230 (0xf8 bytes)
__int64 __fastcall UtlParseTokenStrLong(__int64 a1, unsigned int a2, unsigned int n0x3E8, bool *a4)
{
bool *v4; // r13
__int64 n0x3E8_1; // rbx
unsigned int v8; // ebp
unsigned __int16 v9; // si
__int64 n0x3E8_2; // rdx
__int64 v11; // rdx
char v13; // [rsp+58h] [rbp+10h] BYREF
bool *v14; // [rsp+68h] [rbp+20h]
v14 = a4; /*0x3e23a*/
v4 = a4; /*0x3e24e*/
n0x3E8_1 = n0x3E8; /*0x3e251*/
v8 = 0; /*0x3e25a*/
v9 = 0; /*0x3e25d*/
if ( a2 )
{
do
{
if ( (*(unsigned int (__fastcall **)(__int64, __int64, char *))(a1 + 960))(a1, 1, &v13) ) /*0x3e279*/
{
if ( (unsigned int)n0x3E8_1 < 0x3E8 ) /*0x3e28d*/
n0x3E8_2 = n0x3E8_1; /*0x3e2a1*/
else
n0x3E8_2 = 1000 * ((unsigned int)n0x3E8_1 / 0x3E8); /*0x3e299*/
UtlRegisterRead(*(_QWORD *)a1, n0x3E8_2); /*0x3e2a4*/
}
v8 = (*(__int64 (__fastcall **)(__int64, __int64, char *))(a1 + 960))(a1, 1, &v13); /*0x3e2ba*/
if ( v8 || (v13 & 4) != 0 ) /*0x3e2c6*/
break; /*0x3e2c6*/
v11 = (unsigned int)n0x3E8_1 < 0x3E8 ? n0x3E8_1 : 1000 * ((unsigned int)n0x3E8_1 / 0x3E8);
UtlRegisterRead(*(_QWORD *)a1, v11); /*0x3e2e8*/
++v9; /*0x3e2ed*/
}
while ( v9 < a2 );
v4 = v14; /*0x3e2fd*/
}
*v4 = v9 < a2; /*0x3e310*/
return v8; /*0x3e31b*/
}
// Function: UtlHexStringToInt @ 0x3e328 (0x6e bytes)
__int64 __fastcall UtlHexStringToInt(__int64 a1)
{
__int64 result; // rax
unsigned __int16 n6; // ax
__int64 n6_1; // rcx
int v5; // eax
unsigned __int16 v6; // [rsp+30h] [rbp+8h] BYREF
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 17, &v6); /*0x3e33b*/
if ( !(_DWORD)result ) /*0x3e343*/
{
n6 = (v6 >> 7) & 7; /*0x3e34e*/
if ( n6 < 6u ) /*0x3e356*/
{
n6_1 = n6; /*0x3e35f*/
v5 = *((unsigned __int16 *)qword_15A90 + n6); /*0x3e369*/
*(_WORD *)(a1 + 1128) = v5; /*0x3e36d*/
LODWORD(n6_1) = *((unsigned __int16 *)qword_15A90 + n6_1 + 1); /*0x3e374*/
*(_WORD *)(a1 + 1126) = n6_1; /*0x3e37b*/
*(_WORD *)(a1 + 1124) = ((int)n6_1 + v5) / 2; /*0x3e387*/
return 0; /*0x3e38e*/
}
else
{
return 4294967294LL; /*0x3e358*/
}
}
return result; /*0x3e390*/
}
// Function: PhyCalcLinkSpeed @ 0x3e398 (0x20d bytes)
__int64 __fastcall PhyCalcLinkSpeed(__int64 a1)
{
__int64 result; // rax
int v3; // eax
__int64 v4; // r8
unsigned __int16 n6; // ax
int v6; // ecx
int v7; // eax
int v8; // eax
unsigned __int16 v9; // [rsp+30h] [rbp+8h] BYREF
unsigned __int16 v10; // [rsp+38h] [rbp+10h] BYREF
unsigned __int16 v11; // [rsp+40h] [rbp+18h] BYREF
if ( *(_DWORD *)(a1 + 1104) == 21040128 )
{
result = (*(__int64 (__fastcall **)(__int64, _QWORD, unsigned __int16 *))(a1 + 960))( /*0x3e541*/
a1,
(unsigned int)(*(_DWORD *)(a1 + 1100) + 458768),
&v9);
if ( !(_DWORD)result )
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 458773, &v11); /*0x3e558*/
if ( !(_DWORD)result )
{
v8 = v9 / (((v11 >> 10) & 1) == 0 ? 100 : 1);
*(_WORD *)(a1 + 1128) = v8; /*0x3e588*/
*(_WORD *)(a1 + 1126) = v8; /*0x3e58f*/
*(_WORD *)(a1 + 1124) = v8; /*0x3e596*/
return 0; /*0x3e596*/
}
}
return result; /*0x3e560*/
}
if ( *(_DWORD *)(a1 + 1104) == 21040272 ) /*0x3e3b7*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 22, &v10); /*0x3e4a7*/
if ( (_DWORD)result ) /*0x3e4af*/
return result; /*0x3e4af*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 22, 5); /*0x3e4bf*/
if ( (_DWORD)result ) /*0x3e4c7*/
return result; /*0x3e4c7*/
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 26, &v9); /*0x3e4d8*/
if ( (_DWORD)result ) /*0x3e4e0*/
return result; /*0x3e4e0*/
n6 = (v9 >> 7) & 7; /*0x3e4ef*/
if ( n6 < 6u ) /*0x3e4f7*/
{
v6 = *((unsigned __int16 *)qword_15A90 + n6); /*0x3e50d*/
*(_WORD *)(a1 + 1128) = v6; /*0x3e511*/
v7 = *((unsigned __int16 *)qword_15A90 + n6 + 1); /*0x3e518*/
*(_WORD *)(a1 + 1126) = v7; /*0x3e51d*/
v3 = (v6 + v7) / 2; /*0x3e529*/
LABEL_12:
v4 = v10; /*0x3e475*/
*(_WORD *)(a1 + 1124) = v3; /*0x3e483*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 22, v4); /*0x3e48a*/
if ( (_DWORD)result ) /*0x3e492*/
return result; /*0x3e492*/
return 0; /*0x3e59d*/
}
return 4294967294LL; /*0x3e4fe*/
}
if ( *(_DWORD *)(a1 + 1104) != 21040576 /*0x3e3d3*/
&& *(_DWORD *)(a1 + 1104) != 21040592
&& *(_DWORD *)(a1 + 1104) != 21040624
&& *(_DWORD *)(a1 + 1104) != 21040800 )
{
return 4294967294LL; /*0x3e3d3*/
}
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 22, &v10); /*0x3e3e3*/
if ( !(_DWORD)result )
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 22, 7); /*0x3e3fb*/
if ( !(_DWORD)result )
{
result = (*(__int64 (__fastcall **)(__int64, _QWORD, unsigned __int16 *))(a1 + 960))( /*0x3e41a*/
a1,
(unsigned int)(*(_DWORD *)(a1 + 1100) + 16),
&v9);
if ( !(_DWORD)result )
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 21, &v11); /*0x3e433*/
if ( !(_DWORD)result )
{
v3 = v9 / (((v11 >> 10) & 1) == 0 ? 100 : 1);
*(_WORD *)(a1 + 1128) = v3; /*0x3e467*/
*(_WORD *)(a1 + 1126) = v3; /*0x3e46e*/
goto LABEL_12; /*0x3e46e*/
}
}
}
}
return result; /*0x3e59f*/
}
// Function: UtlParseCmdLine @ 0x3e5a8 (0x125 bytes)
__int64 __fastcall UtlParseCmdLine(__int64 a1)
{
unsigned __int16 v1; // bx
unsigned __int16 n112; // r12
__int16 v4; // r13
unsigned __int16 v5; // bp
unsigned __int16 n4; // si
__int64 result; // rax
unsigned __int16 v8; // dx
unsigned __int16 v9; // cx
unsigned __int16 v10; // r13
unsigned __int16 v11; // r13
unsigned __int16 v12; // [rsp+50h] [rbp+8h] BYREF
v1 = 0; /*0x3e5be*/
n112 = 112; /*0x3e5ca*/
v4 = 0; /*0x3e5ce*/
v5 = 0; /*0x3e5d2*/
n4 = 0; /*0x3e5d5*/
while ( 1 ) /*0x3e5ec*/
{
result = (*(__int64 (__fastcall **)(__int64, _QWORD, unsigned __int16 *))(a1 + 960))( /*0x3e5ec*/
a1,
*(unsigned __int16 *)((char *)&word_15B88 + (_QWORD)&_ImageBase + 2 * n4),
&v12);
if ( (_DWORD)result ) /*0x3e5f4*/
break; /*0x3e5f4*/
v8 = v12 >> 9; /*0x3e5ff*/
if ( (unsigned __int16)(v12 >> 9) >= 0x71u || !v8 ) /*0x3e610*/
return 4294967294LL; /*0x3e6b1*/
v9 = *(__int16 *)((char *)&word_15AA0 + (_QWORD)&_ImageBase + 2 * v8); /*0x3e619*/
if ( (unsigned int)*(__int16 *)((char *)&word_15AA0 + (_QWORD)&_ImageBase + 2 * n112) > v9 ) /*0x3e632*/
n112 = v12 >> 9; /*0x3e632*/
if ( (unsigned int)*(__int16 *)((char *)&word_15AA0 + (_QWORD)&_ImageBase + 2 * v5) < v9 ) /*0x3e640*/
v5 = v12 >> 9; /*0x3e640*/
++n4; /*0x3e644*/
v4 += v9; /*0x3e647*/
if ( n4 >= 4u ) /*0x3e64f*/
{
v10 = (unsigned __int16)(v4 /*0x3e66f*/
- *(__int16 *)((char *)&word_15AA0 + (_QWORD)&_ImageBase + 2 * n112)
- *(__int16 *)((char *)&word_15AA0 + (_QWORD)&_ImageBase + 2 * v5)) >> 1;
if ( v10 - 15 > 0 ) /*0x3e682*/
v1 = v10 - 15; /*0x3e682*/
v11 = v10 + 15; /*0x3e686*/
*(_WORD *)(a1 + 1126) = v11; /*0x3e691*/
*(_WORD *)(a1 + 1128) = v1; /*0x3e69a*/
*(_WORD *)(a1 + 1124) = (v1 + v11) / 2; /*0x3e6a6*/
return 0; /*0x3e6af*/
}
}
return result; /*0x3e6c0*/
}
// Function: UtlGetCmdToken @ 0x3e6d0 (0x115 bytes)
__int64 __fastcall UtlGetCmdToken(__int64 a1)
{
__int64 result; // rax
unsigned __int16 v3; // cx
int n255; // eax
bool v5; // [rsp+30h] [rbp+8h] BYREF
unsigned __int16 v6; // [rsp+38h] [rbp+10h] BYREF
if ( *(_DWORD *)(a1 + 1116) != 1 ) /*0x3e6e0*/
return 4294967293LL; /*0x3e6e0*/
if ( !*(_QWORD *)(a1 + 960) || (result = UtlParseTokenStrLong(a1, 1u, 0, &v5), !(_DWORD)result) ) /*0x3e709*/
{
if ( !v5 ) /*0x3e714*/
return 4294967293LL; /*0x3e6e7*/
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 16, &v6); /*0x3e723*/
if ( !(_DWORD)result ) /*0x3e72b*/
{
*(_BYTE *)(a1 + 1133) = (v6 & 2) != 0; /*0x3e73c*/
result = MngConfigGet(a1); /*0x3e742*/
if ( !(_DWORD)result ) /*0x3e749*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 17, &v6); /*0x3e75a*/
if ( !(_DWORD)result ) /*0x3e762*/
{
v3 = v6; /*0x3e764*/
*(_BYTE *)(a1 + 1132) = (v6 & 0x40) != 0; /*0x3e770*/
if ( (v3 & 0xC000) != 0x8000 ) /*0x3e786*/
{
n255 = 255; /*0x3e7c5*/
*(_WORD *)(a1 + 1124) = 255; /*0x3e7ca*/
*(_DWORD *)(a1 + 1080) = 255; /*0x3e7d1*/
goto LABEL_14; /*0x3e7d1*/
}
result = (*(__int64 (__fastcall **)(__int64))(a1 + 936))(a1); /*0x3e78b*/
if ( !(_DWORD)result ) /*0x3e793*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 10, &v6); /*0x3e7a0*/
if ( !(_DWORD)result ) /*0x3e7a8*/
{
n255 = (v6 >> 13) & 1; /*0x3e7b7*/
*(_DWORD *)(a1 + 1080) = (v6 >> 12) & 1; /*0x3e7bd*/
LABEL_14:
*(_DWORD *)(a1 + 1076) = n255; /*0x3e7d7*/
return 0; /*0x3e7dd*/
}
}
}
}
}
}
return result; /*0x3e7df*/
}
// Function: UtlGetNumericArg @ 0x3e7e8 (0xe7 bytes)
__int64 __fastcall UtlGetNumericArg(__int64 a1)
{
__int64 result; // rax
unsigned __int16 v3; // cx
int n255; // eax
bool v5; // [rsp+30h] [rbp+8h] BYREF
unsigned __int16 v6; // [rsp+38h] [rbp+10h] BYREF
if ( !*(_QWORD *)(a1 + 960) || (result = UtlParseTokenStrLong(a1, 1u, 0, &v5), !(_DWORD)result) ) /*0x3e80e*/
{
if ( !v5 ) /*0x3e819*/
return 4294967293LL; /*0x3e820*/
*(_BYTE *)(a1 + 1133) = 1; /*0x3e828*/
result = UtlStrToInt(a1); /*0x3e82f*/
if ( !(_DWORD)result ) /*0x3e836*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 17, &v6); /*0x3e847*/
if ( !(_DWORD)result ) /*0x3e84f*/
{
v3 = v6; /*0x3e851*/
*(_BYTE *)(a1 + 1132) = (v6 & 0x800) != 0; /*0x3e85f*/
if ( (v3 & 0xC000) != 0xC000 ) /*0x3e870*/
{
n255 = 255; /*0x3e8af*/
*(_WORD *)(a1 + 1124) = 255; /*0x3e8b4*/
*(_DWORD *)(a1 + 1080) = 255; /*0x3e8bb*/
goto LABEL_12; /*0x3e8bb*/
}
result = (*(__int64 (__fastcall **)(__int64))(a1 + 936))(a1); /*0x3e875*/
if ( !(_DWORD)result ) /*0x3e87d*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 10, &v6); /*0x3e88a*/
if ( !(_DWORD)result ) /*0x3e892*/
{
n255 = (v6 >> 13) & 1; /*0x3e8a1*/
*(_DWORD *)(a1 + 1080) = (v6 >> 12) & 1; /*0x3e8a7*/
LABEL_12:
*(_DWORD *)(a1 + 1076) = n255; /*0x3e8c1*/
return 0; /*0x3e8c7*/
}
}
}
}
}
return result; /*0x3e8c9*/
}
// Function: UtlGetStringArg @ 0x3e8d0 (0xcc bytes)
__int64 __fastcall UtlGetStringArg(__int64 a1)
{
__int64 result; // rax
bool v3; // zf
bool v4; // [rsp+30h] [rbp+8h] BYREF
unsigned __int16 v5; // [rsp+38h] [rbp+10h] BYREF
if ( !*(_QWORD *)(a1 + 960) || (result = UtlParseTokenStrLong(a1, 1u, 0, &v4), !(_DWORD)result) ) /*0x3e8f6*/
{
if ( !v4 ) /*0x3e901*/
return 4294967293LL; /*0x3e908*/
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 17, &v5); /*0x3e91a*/
if ( !(_DWORD)result ) /*0x3e922*/
{
v3 = (v5 & 0x10) != 0; /*0x3e92d*/
*(_BYTE *)(a1 + 1133) = (v5 & 0x10) == 0; /*0x3e92f*/
if ( v3 ) /*0x3e935*/
{
*(_DWORD *)(a1 + 1092) = (v5 >> 5) & 1; /*0x3e950*/
}
else
{
result = UtlStrToUint(a1); /*0x3e93a*/
if ( (_DWORD)result ) /*0x3e941*/
return result; /*0x3e941*/
}
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 28, &v5); /*0x3e963*/
if ( !(_DWORD)result ) /*0x3e96b*/
{
*(_BYTE *)(a1 + 1132) = (v5 & 0x20) != 0; /*0x3e976*/
*(_WORD *)(a1 + 1124) = 255; /*0x3e981*/
*(_DWORD *)(a1 + 1076) = 255; /*0x3e988*/
*(_DWORD *)(a1 + 1080) = 255; /*0x3e98e*/
return 0; /*0x3e994*/
}
}
}
return result; /*0x3e996*/
}
// Function: MngConfigSet @ 0x3e99c (0x59 bytes)
__int64 __fastcall MngConfigSet(__int64 a1)
{
__int64 (__fastcall *v1)(__int64, _QWORD, __int16 *); // rax
__int64 result; // rax
__int16 v4; // [rsp+30h] [rbp+8h] BYREF
v1 = *(__int64 (__fastcall **)(__int64, _QWORD, __int16 *))(a1 + 960); /*0x3e9a2*/
if ( !v1 ) /*0x3e9af*/
return 0; /*0x3e9af*/
result = v1(a1, 0, &v4); /*0x3e9b8*/
if ( !(_DWORD)result ) /*0x3e9bc*/
{
v4 |= 0x8000u; /*0x3e9d2*/
result = (*(__int64 (__fastcall **)(__int64, _QWORD))(a1 + 1016))(a1, 0); /*0x3e9d8*/
if ( !(_DWORD)result ) /*0x3e9e0*/
{
UtlRegisterRead(*(_QWORD *)a1, 1); /*0x3e9e8*/
return 0; /*0x3e9ed*/
}
}
return result; /*0x3e9ef*/
}
// Function: UtlParseKeyValue @ 0x3e9f8 (0xd7 bytes)
__int64 __fastcall UtlParseKeyValue(__int64 a1)
{
unsigned int (*v1)(void); // rax
__int64 result; // rax
int v4; // ebx
unsigned int v5; // ebx
v1 = *(unsigned int (**)(void))(a1 + 904); /*0x3ea02*/
if ( v1 && v1() ) /*0x3ea11*/
return 0; /*0x3ea17*/
result = (*(__int64 (__fastcall **)(__int64))(a1 + 880))(a1); /*0x3ea21*/
if ( !(_DWORD)result ) /*0x3ea29*/
{
v4 = UtlRegisterWrite((__int64 *)a1, 0); /*0x3ea41*/
UtlRegisterAccess((__int64 *)a1, 0, v4 | 0x80000000); /*0x3ea48*/
UtlMicroStall((__int64 *)a1); /*0x3ea50*/
UtlRegisterRead(*(_QWORD *)a1, *(unsigned int *)(a1 + 1108)); /*0x3ea5e*/
UtlRegisterAccess((__int64 *)a1, 0, v4); /*0x3ea6b*/
UtlMicroStall((__int64 *)a1); /*0x3ea73*/
UtlRegisterRead(*(_QWORD *)a1, 150); /*0x3ea80*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3ea88*/
v5 = (*(__int64 (__fastcall **)(__int64))(a1 + 928))(a1); /*0x3ea9e*/
if ( *(_BYTE *)(a1 + 846) ) /*0x3ea97*/
{
if ( *(_DWORD *)(a1 + 1104) == 21040336 ) /*0x3eaac*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 24, 16644); /*0x3eabc*/
}
return v5; /*0x3eac2*/
}
return result; /*0x3eac9*/
}
// Function: UtlSkipToken @ 0x3ead0 (0x18 bytes)
__int64 __fastcall UtlSkipToken(__int64 *a1)
{
UtlRegisterRead(*a1, 10000); /*0x3eadc*/
return 0; /*0x3eae3*/
}
// Function: MngSetDefaultConfig @ 0x3eae8 (0x27e bytes)
__int64 __fastcall MngSetDefaultConfig(__int64 a1)
{
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 12123, 36888); /*0x3eafc*/
(*(void (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1016))(a1, 12114, 0); /*0x3eb0d*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 12209, 35620); /*0x3eb21*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 12210, 63728); /*0x3eb35*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 8208, 4272); /*0x3eb49*/
(*(void (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1016))(a1, 8209, 0); /*0x3eb5a*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 8413, 9370); /*0x3eb6e*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 8414, 211); /*0x3eb82*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 10420, 1230); /*0x3eb96*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 12144, 10724); /*0x3ebaa*/
(*(void (__fastcall **)(__int64, _QWORD, __int64))(a1 + 1016))(a1, 0, 320); /*0x3ebbb*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 7984, 5638); /*0x3ebcf*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 7985, 47124); /*0x3ebe3*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 7989, 42); /*0x3ebf7*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 7998, 103); /*0x3ec0b*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 8020, 101); /*0x3ec1f*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 8021, 42); /*0x3ec33*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 8022, 42); /*0x3ec47*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 8050, 16304); /*0x3ec5b*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 8054, 49407); /*0x3ec6f*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 8055, 7660); /*0x3ec83*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 8056, 63983); /*0x3ec97*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 8057, 528); /*0x3ecab*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 6293, 3); /*0x3ecbf*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 6038, 8); /*0x3ecd3*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 6040, 53256); /*0x3ece7*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 6296, 55576); /*0x3ecfb*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 6266, 2048); /*0x3ed0f*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 25, 141); /*0x3ed21*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 27, 8320); /*0x3ed35*/
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 20, 69); /*0x3ed47*/
(*(void (__fastcall **)(__int64, _QWORD, __int64))(a1 + 1016))(a1, 0, 4928); /*0x3ed58*/
return 0; /*0x3ed60*/
}
// Function: MngSendCommand @ 0x3ed68 (0x10b bytes)
__int64 __fastcall MngSendCommand(__int64 i)
{
int v1; // ecx
int v2; // ecx
int v3; // ecx
int v4; // ecx
int n32; // ecx
bool v6; // zf
int v8; // ecx
int v9; // ecx
int v10; // ecx
int n16; // ecx
int v12; // ecx
int v13; // ecx
int v14; // ecx
int n16_1; // ecx
if ( (unsigned int)i <= 0x1410DD0 ) /*0x3ed6f*/
{
if ( (_DWORD)i == 21040592 ) /*0x3ed75*/
return 2; /*0x3ed75*/
if ( (unsigned int)i > 0x1410C90 ) /*0x3ed7e*/
{
if ( (_DWORD)i == 21040288 ) /*0x3edbf*/
return 5; /*0x3edfe*/
if ( (unsigned int)i <= 0x1410CAF ) /*0x3edc7*/
return 0; /*0x3edc7*/
if ( (unsigned int)i <= 0x1410CB1 ) /*0x3edd3*/
return 8; /*0x3edf8*/
if ( (_DWORD)i == 21040320 || (_DWORD)i == 21040336 ) /*0x3ede3*/
return 2; /*0x3ede3*/
v6 = (_DWORD)i == 21040576; /*0x3ede5*/
goto LABEL_19; /*0x3ede5*/
}
if ( (_DWORD)i == 21040272 ) /*0x3ed80*/
return 2; /*0x3edf2*/
v1 = i - 1276128; /*0x3ed82*/
if ( v1 ) /*0x3ed88*/
{
v2 = v1 - 3823456; /*0x3ed8e*/
if ( !v2 ) /*0x3ed94*/
return 9; /*0x3edb8*/
v3 = v2 - 15940544; /*0x3ed96*/
if ( !v3 ) /*0x3ed9c*/
return 15; /*0x3edb2*/
v4 = v3 - 32; /*0x3ed9e*/
if ( !v4 ) /*0x3eda1*/
return 2; /*0x3eda1*/
n32 = v4 - 16; /*0x3eda3*/
if ( !n32 ) /*0x3eda6*/
return 2; /*0x3eda6*/
v6 = n32 == 32; /*0x3eda8*/
LABEL_19:
if ( v6 ) /*0x3edeb*/
return 2; /*0x3edeb*/
return 0; /*0x3edeb*/
}
return 7; /*0x3ed88*/
}
if ( (unsigned int)i <= 0x15403A0 ) /*0x3ee06*/
{
if ( (_DWORD)i == 22283168 ) /*0x3ee08*/
return 13; /*0x3ee41*/
v8 = i - 21040624; /*0x3ee0a*/
if ( !v8 ) /*0x3ee10*/
return 2; /*0x3ee10*/
v9 = v8 - 176; /*0x3ee12*/
if ( !v9 ) /*0x3ee18*/
return 2; /*0x3ee18*/
v10 = v9 - 1241520; /*0x3ee1a*/
if ( !v10 ) /*0x3ee20*/
return 10; /*0x3ee3b*/
n16 = v10 - 64; /*0x3ee22*/
if ( !n16 ) /*0x3ee25*/
return 11; /*0x3ee35*/
if ( n16 == 16 ) /*0x3ee2a*/
return 12; /*0x3ee2f*/
return 0; /*0x3ee2a*/
}
v12 = i - 44565264; /*0x3ee42*/
if ( !v12 ) /*0x3ee48*/
return 7; /*0x3ee48*/
v13 = v12 - 16; /*0x3ee4a*/
if ( !v13 ) /*0x3ee4d*/
return 7; /*0x3ee4d*/
v14 = v13 - 16; /*0x3ee4f*/
if ( !v14 ) /*0x3ee52*/
return 7; /*0x3ee6d*/
n16_1 = v14 - 80; /*0x3ee54*/
if ( !n16_1 ) /*0x3ee57*/
return 4; /*0x3ee67*/
if ( n16_1 != 16 ) /*0x3ee5c*/
return 0; /*0x3ee60*/
return 6; /*0x3edb2*/
}
// Function: MngReadResponse @ 0x3ee74 (0x6e bytes)
__int64 __fastcall MngReadResponse(__int64 a1)
{
int v2; // ebx
unsigned int i; // esi
*(_DWORD *)(a1 + 1104) = 0; /*0x3ee83*/
v2 = 0; /*0x3ee8d*/
while ( 2 ) /*0x3ee8f*/
{
*(_DWORD *)(a1 + 1100) = v2; /*0x3ee8f*/
for ( i = 0; i < 0xA; ++i ) /*0x3ee95*/
{
CompNameInstall(a1); /*0x3ee9a*/
if ( (unsigned int)MngSendCommand(*(unsigned int *)(a1 + 1104)) ) /*0x3eea5*/
return 0; /*0x3eed0*/
UtlRegisterRead(*(_QWORD *)a1, 1000); /*0x3eeb6*/
}
if ( (unsigned int)++v2 < 8 ) /*0x3eec7*/
continue; /*0x3eec7*/
break;
}
return 4294967290LL; /*0x3eedc*/
}
// Function: MngProcessResponse @ 0x3eee4 (0xda bytes)
__int64 MngProcessResponse(
__int64 a1,
unsigned int n25,
unsigned __int16 a3,
__int64 a4,
__int64 a5,
__int64 a6,
__int64 a7,
__int64 a8,
__int64 a9,
...)
{
unsigned int n0x300; // esi
__int64 result; // rax
unsigned int v14; // eax
int n2; // eax
char n5; // cl
unsigned int n31; // edx
unsigned int v18; // esi
unsigned __int16 v19; // [rsp+50h] [rbp+18h] BYREF
v19 = a3; /*0x3eef3*/
n0x300 = n25 >> 5; /*0x3ef06*/
result = (*(__int64 (**)(void))(a1 + 880))(); /*0x3ef0b*/
if ( !(_DWORD)result ) /*0x3ef13*/
{
if ( n0x300 == 800 ) /*0x3ef1f*/
{
v14 = MngExecHwCmd(a1, n25, &v19, 0, 0); /*0x3ef32*/
}
else
{
n2 = 2; /*0x3ef39*/
if ( n0x300 >= 0x300 || !n0x300 && n25 == 25 || n25 == 31 ) /*0x3ef52*/
n2 = 1; /*0x3ef54*/
*(_DWORD *)(a1 + 1100) = n2; /*0x3ef59*/
if ( n25 > 0xF ) /*0x3ef62*/
{
if ( n2 == 1 ) /*0x3ef67*/
{
n5 = 5; /*0x3ef69*/
n31 = 31; /*0x3ef6c*/
}
else
{
n5 = 0; /*0x3ef71*/
n31 = 22; /*0x3ef73*/
}
v18 = UtlTokenize(a1, n31, (_WORD)n0x300 << n5); /*0x3ef85*/
if ( v18 ) /*0x3ef89*/
goto LABEL_16; /*0x3ef89*/
}
v14 = UtlTokenize(a1, n25 & 0x1F, a3); /*0x3ef97*/
}
v18 = v14; /*0x3ef9c*/
LABEL_16:
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3ef9e*/
return v18; /*0x3efa7*/
}
return result; /*0x3efb8*/
}
// Function: MngCheckCmdStatus @ 0x3efc0 (0xd1 bytes)
__int64 __fastcall MngCheckCmdStatus(__int64 a1, unsigned int n25, unsigned __int16 *a3)
{
unsigned int n0x300; // esi
__int64 result; // rax
unsigned int v8; // eax
int n2; // eax
char n5; // cl
unsigned int n31; // edx
unsigned int v12; // esi
n0x300 = n25 >> 5; /*0x3efdc*/
result = (*(__int64 (**)(void))(a1 + 880))(); /*0x3efe1*/
if ( !(_DWORD)result ) /*0x3efe9*/
{
if ( n0x300 == 800 ) /*0x3eff5*/
{
v8 = MngExecHwCmd(a1, n25, a3, 1, 0); /*0x3f006*/
}
else
{
n2 = 2; /*0x3f00d*/
if ( n0x300 >= 0x300 || !n0x300 && n25 == 25 || n25 == 31 ) /*0x3f026*/
n2 = 1; /*0x3f028*/
*(_DWORD *)(a1 + 1100) = n2; /*0x3f02d*/
if ( n25 > 0xF ) /*0x3f036*/
{
if ( n2 == 1 ) /*0x3f03b*/
{
n5 = 5; /*0x3f03d*/
n31 = 31; /*0x3f040*/
}
else
{
n5 = 0; /*0x3f045*/
n31 = 22; /*0x3f047*/
}
v12 = UtlTokenize(a1, n31, (_WORD)n0x300 << n5); /*0x3f059*/
if ( v12 ) /*0x3f05d*/
goto LABEL_16; /*0x3f05d*/
}
v8 = UtlStrToBin(a1, n25 & 0x1F, a3); /*0x3f06a*/
}
v12 = v8; /*0x3f06f*/
LABEL_16:
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3f071*/
return v12; /*0x3f07a*/
}
return result; /*0x3f08b*/
}
// Function: MngSendDataCmd @ 0x3f094 (0xa4 bytes)
__int64 __fastcall MngSendDataCmd(__int64 a1, unsigned int n0xF, unsigned __int16 *a3)
{
unsigned int n800; // edi
__int64 result; // rax
unsigned int v8; // eax
unsigned int v9; // edi
n800 = n0xF >> 5; /*0x3f0b0*/
result = (*(__int64 (**)(void))(a1 + 880))(); /*0x3f0b5*/
if ( !(_DWORD)result ) /*0x3f0bd*/
{
if ( (_WORD)n800 == 800 ) /*0x3f0c7*/
{
v8 = MngExecHwCmd(a1, n0xF, a3, 1, 0); /*0x3f0d9*/
}
else
{
*(_DWORD *)(a1 + 1100) = 1; /*0x3f0e0*/
if ( n0xF > 0xF ) /*0x3f0ed*/
{
v9 = UtlTokenize(a1, 0x16u, n800); /*0x3f100*/
if ( v9 ) /*0x3f104*/
goto LABEL_8; /*0x3f104*/
}
v8 = UtlStrToBin(a1, n0xF & 0x1F, a3); /*0x3f111*/
}
v9 = v8; /*0x3f116*/
LABEL_8:
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3f118*/
return v9; /*0x3f121*/
}
return result; /*0x3f132*/
}
// Function: MngRecvDataCmd @ 0x3f138 (0xad bytes)
__int64 MngRecvDataCmd(
__int64 a1,
unsigned int n0xF,
unsigned __int16 a3,
__int64 a4,
__int64 a5,
__int64 a6,
__int64 a7,
__int64 a8,
__int64 a9,
...)
{
unsigned int n800; // esi
__int64 result; // rax
unsigned int v14; // eax
unsigned int v15; // esi
unsigned __int16 v16; // [rsp+50h] [rbp+18h] BYREF
v16 = a3; /*0x3f147*/
n800 = n0xF >> 5; /*0x3f15a*/
result = (*(__int64 (**)(void))(a1 + 880))(); /*0x3f15f*/
if ( !(_DWORD)result ) /*0x3f167*/
{
if ( (_WORD)n800 == 800 ) /*0x3f171*/
{
v14 = MngExecHwCmd(a1, n0xF, &v16, 0, 0); /*0x3f185*/
}
else
{
*(_DWORD *)(a1 + 1100) = 1; /*0x3f18c*/
if ( n0xF > 0xF ) /*0x3f199*/
{
v15 = UtlTokenize(a1, 0x16u, n800); /*0x3f1ac*/
if ( v15 ) /*0x3f1b0*/
goto LABEL_8; /*0x3f1b0*/
}
v14 = UtlTokenize(a1, n0xF & 0x1F, a3); /*0x3f1be*/
}
v15 = v14; /*0x3f1c3*/
LABEL_8:
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3f1c5*/
return v15; /*0x3f1ce*/
}
return result; /*0x3f1df*/
}
// Function: MngReadWord @ 0x3f1e8 (0x89 bytes)
__int64 __fastcall MngReadWord(__int64 a1, _WORD *va)
{
__int64 result; // rax
*(_DWORD *)(a1 + 1100) = 1; /*0x3f203*/
result = UtlTokenize(a1, 0x1Fu, 0x6020u); /*0x3f20d*/
if ( !(_DWORD)result ) /*0x3f214*/
{
result = UtlStrToBin(a1, 0x11u, va); /*0x3f21f*/
if ( !(_DWORD)result ) /*0x3f226*/
{
result = UtlTokenize(a1, 0x11u, *va & 0xFFCB | 4u); /*0x3f242*/
if ( !(_DWORD)result ) /*0x3f249*/
{
*(_DWORD *)(a1 + 1100) = 1; /*0x3f257*/
return UtlTokenize(a1, 0x1Fu, 0x6400u); /*0x3f261*/
}
}
}
return result; /*0x3f26b*/
}
// Function: MngWriteWord @ 0x3f274 (0x48 bytes)
__int64 __fastcall MngWriteWord(__int64 a1, unsigned __int16 *va)
{
__int64 result; // rax
*(_DWORD *)(a1 + 1100) = 1; /*0x3f28f*/
result = UtlTokenize(a1, 0x1Fu, 0x6020u); /*0x3f299*/
if ( !(_DWORD)result ) /*0x3f2a0*/
return UtlTokenize(a1, 0x11u, *va); /*0x3f2ac*/
return result; /*0x3f2b6*/
}
// Function: MngExecHwCmd @ 0x3f2bc (0xc7 bytes)
__int64 __fastcall MngExecHwCmd(__int64 a1, int a2, unsigned __int16 *a3, char a4, char a5)
{
unsigned __int16 v8; // si
__int64 result; // rax
unsigned __int16 va_; // [rsp+48h] [rbp+10h] BYREF
va_ = 0; /*0x3f2e6*/
v8 = HIWORD(a2) ^ ((unsigned __int8)a2 ^ BYTE2(a2)) & 0x1F; /*0x3f2f0*/
if ( *(_DWORD *)(a1 + 268) == 10 ) /*0x3f2fa*/
UtlRegisterWrite((__int64 *)a1, 0xF10u); /*0x3f301*/
if ( a5 || (result = MngReadWord(a1, &va_), !(_DWORD)result) ) /*0x3f31d*/
{
result = UtlTokenize(a1, 0x11u, v8); /*0x3f32b*/
if ( !(_DWORD)result ) /*0x3f333*/
{
if ( a4 ) /*0x3f340*/
result = UtlStrToBin(a1, 0x12u, a3); /*0x3f345*/
else
result = UtlTokenize(a1, 0x12u, *a3); /*0x3f351*/
if ( !(_DWORD)result && !a5 ) /*0x3f360*/
return MngWriteWord(a1, &va_); /*0x3f36a*/
}
}
return result; /*0x3f379*/
}
// Function: MngInitSession @ 0x3f384 (0x44 bytes)
__int64 __fastcall MngInitSession(__int64 a1)
{
__int16 v3; // [rsp+30h] [rbp+8h] BYREF
v3 = 0; /*0x3f396*/
(*(void (__fastcall **)(__int64, _QWORD, __int16 *))(a1 + 960))(a1, 0, &v3); /*0x3f39b*/
v3 &= ~0x800u; /*0x3f3b6*/
return (*(__int64 (__fastcall **)(__int64, _QWORD))(a1 + 1016))(a1, 0); /*0x3f3c2*/
}
// Function: MngCloseSession @ 0x3f3c8 (0x51 bytes)
__int64 __fastcall MngCloseSession(__int64 a1)
{
__int16 v3; // [rsp+30h] [rbp+8h] BYREF
v3 = 0; /*0x3f3da*/
(*(void (__fastcall **)(__int64, _QWORD, __int16 *))(a1 + 960))(a1, 0, &v3); /*0x3f3df*/
v3 |= 0x800u; /*0x3f3fa*/
(*(void (__fastcall **)(__int64, _QWORD))(a1 + 1016))(a1, 0); /*0x3f400*/
return UtlRegisterRead(*(_QWORD *)a1, 1000); /*0x3f413*/
}
// Function: MngExecHwCmdSeq @ 0x3f41c (0x155 bytes)
__int64 __fastcall MngExecHwCmdSeq(__int64 a1, unsigned int n67, unsigned __int16 *p_n32511, char a4, __int64 a5)
{
__int64 n31; // r9
unsigned int n768; // edi
unsigned __int16 n0xF; // bp
int n2; // r14d
__int64 result; // rax
unsigned int v14; // eax
unsigned int v15; // eax
unsigned int v16; // edi
n31 = 31; /*0x3f43d*/
n768 = n67 >> 5; /*0x3f450*/
n0xF = HIWORD(n67) ^ (n67 ^ HIWORD(n67)) & 0x1F; /*0x3f45d*/
n2 = 2; /*0x3f466*/
if ( (unsigned __int16)(n67 >> 5) >= 0x300u ) /*0x3f475*/
n2 = 1; /*0x3f475*/
*(_DWORD *)(a1 + 1100) = n2; /*0x3f47c*/
if ( !a4 ) /*0x3f486*/
{
result = (*(__int64 (**)(void))(a1 + 880))(); /*0x3f488*/
if ( (_DWORD)result ) /*0x3f491*/
return result; /*0x3f491*/
n31 = 31; /*0x3f49b*/
}
if ( (_WORD)n768 == 800 ) /*0x3f4ad*/
{
v14 = MngExecHwCmd(a1, n67, p_n32511, 1, a5); /*0x3f4c6*/
}
else if ( (unsigned __int16)(n768 - 1) > 0x2FEu ) /*0x3f4db*/
{
if ( !(_BYTE)a5 ) /*0x3f4f8*/
{
if ( (_WORD)n768 == 768 ) /*0x3f4fe*/
LOWORD(n768) = 0; /*0x3f500*/
if ( n0xF > 0xFu ) /*0x3f508*/
{
*(_DWORD *)(a1 + 1100) = 1; /*0x3f50a*/
v15 = UtlTokenize(a1, 0x1Fu, 32 * (unsigned __int16)n768); /*0x3f51e*/
*(_DWORD *)(a1 + 1100) = n2; /*0x3f523*/
v16 = v15; /*0x3f52a*/
if ( v15 ) /*0x3f52f*/
goto LABEL_17; /*0x3f52f*/
}
}
v14 = UtlStrToBin(a1, n0xF & 0x1F, p_n32511); /*0x3f53d*/
}
else
{
LOBYTE(n31) = 1; /*0x3f4dd*/
v14 = MngSendHwCmd(a1, n67, p_n32511, n31); /*0x3f4e9*/
}
v16 = v14; /*0x3f542*/
LABEL_17:
if ( !a4 ) /*0x3f547*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3f54c*/
return v16; /*0x3f563*/
}
// Function: UtlTimer1Ms @ 0x3f574 (0x16 bytes)
__int64 __fastcall UtlTimer1Ms(__int64 a1, unsigned int n67, unsigned __int16 *p_n32511)
{
__int64 v4; // [rsp+20h] [rbp-18h]
LOBYTE(v4) = 0; /*0x3f57b*/
return MngExecHwCmdSeq(a1, n67, p_n32511, 0, v4); /*0x3f585*/
}
// Function: UtlTimer10Ms @ 0x3f58c (0x16 bytes)
__int64 __fastcall UtlTimer10Ms(__int64 a1, unsigned int n67, unsigned __int16 *p_n32511)
{
__int64 v4; // [rsp+20h] [rbp-18h]
LOBYTE(v4) = 0; /*0x3f593*/
return MngExecHwCmdSeq(a1, n67, p_n32511, 1, v4); /*0x3f59d*/
}
// Function: UtlTimer100Ms @ 0x3f5a4 (0x16 bytes)
__int64 __fastcall UtlTimer100Ms(__int64 a1, unsigned int n67, unsigned __int16 *p_n32511)
{
__int64 v4; // [rsp+20h] [rbp-18h]
LOBYTE(v4) = 1; /*0x3f5ab*/
return MngExecHwCmdSeq(a1, n67, p_n32511, 1, v4); /*0x3f5b5*/
}
// Function: MngInitHwCmd @ 0x3f5bc (0x1bc bytes)
__int64 __fastcall MngInitHwCmd(__int64 a1, unsigned int n67, unsigned __int16 n32511, char a4, __int64 a5)
{
unsigned int n768; // esi
unsigned __int16 n0xF; // bp
int n2; // r14d
__int64 result; // rax
unsigned int v13; // eax
unsigned int v14; // edi
unsigned int v15; // eax
unsigned __int16 n32511_1; // [rsp+80h] [rbp+18h] BYREF
unsigned __int16 n32511_2; // [rsp+88h] [rbp+20h] BYREF
n32511_1 = n32511; /*0x3f5c1*/
n768 = n67 >> 5; /*0x3f5e2*/
n0xF = HIWORD(n67) ^ ((unsigned __int8)n67 ^ BYTE2(n67)) & 0x1F; /*0x3f5f9*/
n2 = 2; /*0x3f602*/
if ( (unsigned __int16)(n67 >> 5) >= 0x300u ) /*0x3f611*/
n2 = 1; /*0x3f611*/
*(_DWORD *)(a1 + 1100) = n2; /*0x3f618*/
if ( a4 || (result = (*(__int64 (**)(void))(a1 + 880))(), !(_DWORD)result) ) /*0x3f62d*/
{
if ( (_WORD)n768 == 800 ) /*0x3f649*/
{
v13 = MngExecHwCmd(a1, n67, &n32511_1, 0, a5); /*0x3f666*/
}
else if ( (unsigned __int16)(n768 - 1) > 0x2FEu ) /*0x3f67f*/
{
if ( !(_BYTE)a5 ) /*0x3f6a3*/
{
if ( (_WORD)n768 == 768 ) /*0x3f6ad*/
LOWORD(n768) = 0; /*0x3f6af*/
if ( *(_DWORD *)(a1 + 1072) == 9 ) /*0x3f6ba*/
{
if ( *(_DWORD *)(a1 + 1112) ) /*0x3f6bc*/
{
if ( *(_DWORD *)(a1 + 1100) == 2 && (n0xF & 0x1F) == 0 && (n32511 & 0x800) != 0 ) /*0x3f6dc*/
{
n32511_2 = 32511; /*0x3f6f5*/
v14 = MngSendHwCmd(a1, 67, &n32511_2, 0); /*0x3f702*/
if ( v14 ) /*0x3f707*/
goto LABEL_22; /*0x3f707*/
}
}
}
if ( n0xF > 0xFu ) /*0x3f713*/
{
*(_DWORD *)(a1 + 1100) = 1; /*0x3f715*/
v15 = UtlTokenize(a1, 0x1Fu, 32 * (unsigned __int16)n768); /*0x3f72c*/
*(_DWORD *)(a1 + 1100) = n2; /*0x3f731*/
v14 = v15; /*0x3f738*/
if ( v15 ) /*0x3f73d*/
goto LABEL_22; /*0x3f73d*/
}
}
v13 = UtlTokenize(a1, n0xF & 0x1F, n32511); /*0x3f74c*/
}
else
{
v13 = MngSendHwCmd(a1, n67, &n32511_1, 0); /*0x3f691*/
}
v14 = v13; /*0x3f751*/
LABEL_22:
if ( !a4 ) /*0x3f756*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3f75b*/
return v14; /*0x3f761*/
}
return result; /*0x3f768*/
}
// Function: UtlTimer1Sec @ 0x3f778 (0x16 bytes)
__int64 __fastcall UtlTimer1Sec(__int64 a1, unsigned int n67, unsigned __int16 n32511)
{
__int64 v4; // [rsp+20h] [rbp-18h]
LOBYTE(v4) = 0; /*0x3f77f*/
return MngInitHwCmd(a1, n67, n32511, 0, v4); /*0x3f789*/
}
// Function: UtlTimer2Sec @ 0x3f790 (0x16 bytes)
__int64 __fastcall UtlTimer2Sec(__int64 a1, unsigned int n67, unsigned __int16 n32511)
{
__int64 v4; // [rsp+20h] [rbp-18h]
LOBYTE(v4) = 0; /*0x3f797*/
return MngInitHwCmd(a1, n67, n32511, 1, v4); /*0x3f7a1*/
}
// Function: UtlTimer3Sec @ 0x3f7a8 (0x16 bytes)
__int64 __fastcall UtlTimer3Sec(__int64 a1, unsigned int n67, unsigned __int16 n32511)
{
__int64 v4; // [rsp+20h] [rbp-18h]
LOBYTE(v4) = 1; /*0x3f7af*/
return MngInitHwCmd(a1, n67, n32511, 1, v4); /*0x3f7b9*/
}
// Function: MngSendHwCmd @ 0x3f7c0 (0x82 bytes)
__int64 __fastcall MngSendHwCmd(__int64 a1, char n67, unsigned __int16 *p_n32511, __int64 n31)
{
bool v7; // zf
unsigned int n16; // edx
char n31_1; // bp
unsigned int n0x1F; // esi
__int64 result; // rax
v7 = *(_DWORD *)(a1 + 1072) == 9; /*0x3f7dd*/
n16 = 16; /*0x3f7e4*/
n31_1 = n31; /*0x3f7e9*/
*(_DWORD *)(a1 + 1100) = 2; /*0x3f7ef*/
if ( v7 ) /*0x3f7f9*/
n16 = 29; /*0x3f7f9*/
n0x1F = n16 + 1; /*0x3f804*/
result = UtlTokenize(a1, n16, n67 & 0x3F); /*0x3f807*/
if ( !(_DWORD)result ) /*0x3f80e*/
{
if ( n31_1 ) /*0x3f818*/
return UtlStrToBin(a1, n0x1F, p_n32511); /*0x3f81d*/
else
return UtlTokenize(a1, n0x1F, *p_n32511); /*0x3f828*/
}
return result; /*0x3f83c*/
}
// Function: RegRegister_33 @ 0x3f844 (0xa4 bytes)
__int64 __fastcall RegRegister_33(__int64 a1)
{
__int64 result; // rax
__int16 v3; // [rsp+30h] [rbp+8h] BYREF
if ( *(_DWORD *)(a1 + 1072) != 9 ) /*0x3f854*/
return 0; /*0x3f854*/
(*(void (__fastcall **)(__int64, _QWORD, __int16 *))(a1 + 960))(a1, 0, &v3); /*0x3f864*/
if ( (v3 & 0x4000) != 0 ) /*0x3f874*/
return 0; /*0x3f874*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 17, &v3); /*0x3f883*/
if ( (_DWORD)result ) /*0x3f88b*/
return result; /*0x3f88b*/
v3 &= 0xCC00u; /*0x3f89f*/
if ( v3 != -29696 ) /*0x3f8a7*/
return 0; /*0x3f858*/
UtlRegisterRead(*(_QWORD *)a1, 200000); /*0x3f8b1*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 24848, 1028); /*0x3f8c4*/
if ( !(_DWORD)result ) /*0x3f8cc*/
return (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 24848, 1024); /*0x3f8dc*/
return result; /*0x3f8e2*/
}
// Function: UtlTimerGetCurrent @ 0x3f8e8 (0x34 bytes)
__int64 __fastcall UtlTimerGetCurrent(__int64 a1)
{
__int64 result; // rax
unsigned __int16 v3; // [rsp+30h] [rbp+8h] BYREF
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 26, &v3); /*0x3f8fb*/
if ( !(_DWORD)result ) /*0x3f903*/
*(_DWORD *)(a1 + 1092) = (v3 >> 10) & 1; /*0x3f910*/
return result; /*0x3f916*/
}
// Function: UtlTimerSetEvent @ 0x3f91c (0xb4 bytes)
__int64 __fastcall UtlTimerSetEvent(__int64 a1)
{
__int64 result; // rax
unsigned int v3; // edi
bool v4; // [rsp+30h] [rbp+8h] BYREF
unsigned __int16 v5; // [rsp+38h] [rbp+10h] BYREF
result = (*(__int64 (__fastcall **)(__int64, _QWORD, unsigned __int16 *))(a1 + 960))(a1, 0, &v5); /*0x3f930*/
if ( !(_DWORD)result ) /*0x3f938*/
{
UtlStrToLowercase(a1, (__int16 *)&v5); /*0x3f946*/
result = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(a1 + 1016))(a1, 0, v5); /*0x3f956*/
v3 = result; /*0x3f95c*/
if ( !(_DWORD)result ) /*0x3f960*/
{
UtlRegisterRead(*(_QWORD *)a1, 1); /*0x3f968*/
if ( *(_BYTE *)(a1 + 1136) ) /*0x3f96d*/
{
if ( !*(_QWORD *)(a1 + 960) ) /*0x3f976*/
return 0; /*0x3f976*/
result = UtlParseTokenStrLong(a1, 0x14u, (unsigned int)L"tion I218-V", &v4); /*0x3f995*/
if ( (_DWORD)result ) /*0x3f99c*/
return result; /*0x3f99c*/
if ( *(_QWORD *)(a1 + 960) ) /*0x3f99e*/
return (unsigned int)UtlParseTokenStrLong(a1, 0x14u, (unsigned int)L"tion I218-V", &v4); /*0x3f9c1*/
else
return 0; /*0x3f9a8*/
}
return v3; /*0x3f9c3*/
}
}
return result; /*0x3f9ca*/
}
// Function: UtlTimerCheckExpire @ 0x3f9d0 (0xec bytes)
__int64 __fastcall UtlTimerCheckExpire(__int64 a1)
{
__int64 result; // rax
unsigned __int16 v3; // cx
int n255; // eax
bool v5; // [rsp+30h] [rbp+8h] BYREF
unsigned __int16 v6; // [rsp+38h] [rbp+10h] BYREF
if ( !*(_QWORD *)(a1 + 960) || (result = UtlParseTokenStrLong(a1, 1u, 0, &v5), !(_DWORD)result) ) /*0x3f9f6*/
{
if ( !v5 ) /*0x3fa01*/
return 4294967293LL; /*0x3fa08*/
*(_BYTE *)(a1 + 1133) = 1; /*0x3fa10*/
result = UtlTimerGetCurrent(a1); /*0x3fa17*/
if ( !(_DWORD)result ) /*0x3fa1e*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 26, &v6); /*0x3fa2f*/
if ( !(_DWORD)result ) /*0x3fa37*/
{
v3 = v6; /*0x3fa39*/
*(_BYTE *)(a1 + 1132) = (v6 & 0x800) != 0; /*0x3fa47*/
if ( (v3 & 0x300) != 0x200 ) /*0x3fa5d*/
{
n255 = 255; /*0x3fa9c*/
*(_WORD *)(a1 + 1124) = 255; /*0x3faa1*/
*(_DWORD *)(a1 + 1080) = 255; /*0x3faa8*/
goto LABEL_12; /*0x3faa8*/
}
result = (*(__int64 (__fastcall **)(__int64))(a1 + 936))(a1); /*0x3fa62*/
if ( !(_DWORD)result ) /*0x3fa6a*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 10, &v6); /*0x3fa77*/
if ( !(_DWORD)result ) /*0x3fa7f*/
{
n255 = (v6 >> 13) & 1; /*0x3fa8e*/
*(_DWORD *)(a1 + 1080) = (v6 >> 12) & 1; /*0x3fa94*/
LABEL_12:
*(_DWORD *)(a1 + 1076) = n255; /*0x3faae*/
return 0; /*0x3fab4*/
}
}
}
}
}
return result; /*0x3fab6*/
}
// Function: UtlTimerCancel @ 0x3fabc (0x49 bytes)
__int64 __fastcall UtlTimerCancel(__int64 a1)
{
__int64 result; // rax
__int16 n255; // ax
unsigned __int16 v4; // [rsp+30h] [rbp+8h] BYREF
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 31, &v4); /*0x3facf*/
if ( !(_DWORD)result ) /*0x3fad7*/
{
n255 = (unsigned __int8)(v4 >> 2); /*0x3fae7*/
if ( n255 == 255 ) /*0x3faed*/
{
return 4294967294LL; /*0x3faef*/
}
else
{
*(_WORD *)(a1 + 1124) = n255; /*0x3faf6*/
return 0; /*0x3fafd*/
}
}
return result; /*0x3faff*/
}
// Function: IscsiTokenize2 @ 0x3fb08 (0x70 bytes)
__int64 __fastcall IscsiTokenize2(__int64 a1, int n0x1F, unsigned __int16 a3)
{
__int64 result; // rax
unsigned int v7; // edi
result = (*(__int64 (**)(void))(a1 + 880))(); /*0x3fb25*/
if ( !(_DWORD)result ) /*0x3fb2d*/
{
v7 = UtlTokenize(a1, 0x16u, HIWORD(n0x1F)); /*0x3fb41*/
if ( !v7 ) /*0x3fb45*/
v7 = UtlTokenize(a1, (unsigned __int16)n0x1F, a3); /*0x3fb56*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3fb5b*/
return v7; /*0x3fb61*/
}
return result; /*0x3fb72*/
}
// Function: MngProcessCommand @ 0x3fb78 (0x6e bytes)
__int64 __fastcall MngProcessCommand(__int64 a1, unsigned int n16515086, unsigned __int16 *p_n8239)
{
__int64 result; // rax
unsigned int v7; // edi
result = (*(__int64 (**)(void))(a1 + 880))(); /*0x3fb94*/
if ( !(_DWORD)result ) /*0x3fb9c*/
{
v7 = UtlTokenize(a1, 0x16u, HIWORD(n16515086)); /*0x3fbb0*/
if ( !v7 ) /*0x3fbb4*/
v7 = UtlStrToBin(a1, (unsigned __int16)n16515086, p_n8239); /*0x3fbc4*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3fbc9*/
return v7; /*0x3fbcf*/
}
return result; /*0x3fbe0*/
}
// Function: RegRegister_9 @ 0x3fbe8 (0x190 bytes)
char __fastcall RegRegister_9(__int64 a1)
{
int v2; // edi
__int16 v3; // bp
int v4; // eax
char v5; // cl
int v6; // esi
int v7; // edi
int v8; // eax
int v9; // eax
int n12; // eax
int v12; // eax
unsigned __int16 v13; // [rsp+50h] [rbp+8h] BYREF
v13 = 0; /*0x3fc0f*/
v2 = 0; /*0x3fc15*/
v3 = 0; /*0x3fc18*/
while ( 1 ) /*0x3fc27*/
{
v4 = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 968))(a1, 2, &v13); /*0x3fc27*/
v5 = v13; /*0x3fc2d*/
v6 = v4; /*0x3fc32*/
if ( v4 || v13 == 0xFFFF ) /*0x3fc3d*/
goto LABEL_7; /*0x3fc3d*/
v7 = v13 << 16; /*0x3fc4f*/
v8 = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 968))(a1, 3, &v13); /*0x3fc52*/
v5 = v13; /*0x3fc58*/
v6 = v8; /*0x3fc5d*/
if ( !v8 && v13 != 0xFFFF ) /*0x3fc68*/
break; /*0x3fc68*/
v2 = 0; /*0x3fc6a*/
LABEL_7:
if ( (unsigned __int16)++v3 >= 2u ) /*0x3fc74*/
goto LABEL_10; /*0x3fc74*/
}
v2 = v13 & 0xFFF0 | v7; /*0x3fc7e*/
LABEL_10:
v9 = *(_DWORD *)(a1 + 1104); /*0x3fc80*/
if ( v9 ) /*0x3fc89*/
{
if ( v9 != v2 ) /*0x3fc8d*/
goto LABEL_12; /*0x3fc8d*/
goto LABEL_20; /*0x3fc8d*/
}
if ( v2 ) /*0x3fcd2*/
{
*(_DWORD *)(a1 + 1104) = v2; /*0x3fcd7*/
*(_DWORD *)(a1 + 1112) = v5 & 0xF; /*0x3fce0*/
goto LABEL_20; /*0x3fce0*/
}
LABEL_12:
if ( *(int *)(a1 + 268) < 12 ) /*0x3fc96*/
{
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3fc9b*/
v6 = MngSetLedState(a1); /*0x3fca9*/
if ( !v6 ) /*0x3fcae*/
v6 = CompNameInstall(a1); /*0x3fcb8*/
(*(void (__fastcall **)(__int64))(a1 + 880))(a1); /*0x3fcbd*/
}
if ( v6 ) /*0x3fcc6*/
return 0; /*0x3fcc8*/
LABEL_20:
n12 = *(_DWORD *)(a1 + 268); /*0x3fce6*/
if ( (n12 == 12 || n12 == 13) && (UtlRegisterWrite((__int64 *)a1, 0x5B54u) & 0x8000) == 0 ) /*0x3fd07*/
{
(*(void (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 968))(a1, 24631, &v13); /*0x3fd18*/
v13 &= ~1u; /*0x3fd33*/
(*(void (__fastcall **)(__int64, __int64))(a1 + 1024))(a1, 24631); /*0x3fd39*/
v12 = UtlRegisterWrite((__int64 *)a1, 0x18u); /*0x3fd49*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v12 & 0xFFFFF7FF); /*0x3fd5a*/
}
return 1; /*0x3fd6b*/
}
// Function: RegRegister_26 @ 0x3fd78 (0xd7 bytes)
__int64 __fastcall RegRegister_26(__int64 a1)
{
int v2; // eax
int v3; // ebx
__int64 n30000; // rdx
__int16 n20; // bx
v2 = UtlRegisterWrite((__int64 *)a1, 0x3Cu); /*0x3fd8c*/
UtlRegisterAccess((__int64 *)a1, 0x3Cu, v2 & 0xF3FFFFFF | 0x8000000); /*0x3fda1*/
v3 = UtlRegisterWrite((__int64 *)a1, 0) & 0xFFFCFFFF | 0x10000; /*0x3fdbb*/
UtlRegisterAccess((__int64 *)a1, 0, v3); /*0x3fdc2*/
UtlMicroStall((__int64 *)a1); /*0x3fdca*/
UtlRegisterRead(*(_QWORD *)a1, 10); /*0x3fdd7*/
UtlRegisterAccess((__int64 *)a1, 0, v3 & 0xFFFEFFFF); /*0x3fde8*/
UtlMicroStall((__int64 *)a1); /*0x3fdf0*/
if ( *(int *)(a1 + 268) >= 12 ) /*0x3fdfc*/
{
n20 = 20; /*0x3fe05*/
do /*0x3fe36*/
{
UtlRegisterRead(*(_QWORD *)a1, 5000); /*0x3fe12*/
if ( (UtlRegisterWrite((__int64 *)a1, 0x18u) & 4) != 0 ) /*0x3fe26*/
break; /*0x3fe26*/
}
while ( n20-- ); /*0x3fe36*/
n30000 = 30000; /*0x3fe38*/
}
else
{
n30000 = 50000; /*0x3fdfe*/
}
return UtlRegisterRead(*(_QWORD *)a1, n30000); /*0x3fe45*/
}
// Function: UtlTimerPollExpired @ 0x3fe50 (0x17f bytes)
__int64 __fastcall UtlTimerPollExpired(__int64 a1)
{
__int16 v2; // si
unsigned int v3; // edi
int n10; // eax
int v5; // eax
int v6; // eax
char v7; // al
int v8; // ecx
v2 = UtlRegisterWrite((__int64 *)a1, 0x5B54u); /*0x3fe71*/
RegRegister_49(a1, 1); /*0x3fe73*/
v3 = (*(__int64 (__fastcall **)(__int64))(a1 + 880))(a1); /*0x3fe81*/
if ( v3 ) /*0x3fe85*/
goto LABEL_21; /*0x3fe85*/
n10 = *(_DWORD *)(a1 + 268); /*0x3fe8b*/
if ( n10 == 10 ) /*0x3fe94*/
goto LABEL_8; /*0x3fe94*/
if ( n10 != 11 ) /*0x3fe99*/
{
if ( (unsigned int)(n10 - 12) > 1 || RegRegister_9(a1) ) /*0x3feaa*/
goto LABEL_17; /*0x3feb1*/
v5 = UtlRegisterWrite((__int64 *)a1, v3 + 24); /*0x3febd*/
UtlRegisterAccess((__int64 *)a1, v3 + 24, v5 | 0x800); /*0x3fecf*/
UtlRegisterRead(*(_QWORD *)a1, 50000); /*0x3fedc*/
}
if ( !RegRegister_9(a1) ) /*0x3fee4*/
{
LABEL_8:
if ( *(_DWORD *)(a1 + 268) != 10 || (v2 & 0x8000) == 0 ) /*0x3fefa*/
{
if ( (*(unsigned int (__fastcall **)(__int64))(a1 + 904))(a1) ) /*0x3feff*/
{
v3 = -2; /*0x3ff09*/
}
else
{
RegRegister_26(a1); /*0x3ff13*/
if ( *(int *)(a1 + 268) >= 12 && !RegRegister_9(a1) ) /*0x3ff24*/
{
v6 = UtlRegisterWrite((__int64 *)a1, 0x18u); /*0x3ff35*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v6 & 0xFFFFF7FF); /*0x3ff49*/
v7 = RegRegister_9(a1); /*0x3ff51*/
v8 = v3; /*0x3ff56*/
if ( !v7 ) /*0x3ff5f*/
v8 = -2; /*0x3ff5f*/
v3 = v8; /*0x3ff62*/
}
}
}
}
LABEL_17:
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x3ff64*/
if ( !v3 && !(*(unsigned int (__fastcall **)(__int64))(a1 + 904))(a1) ) /*0x3ff74*/
{
v3 = UtlParseKeyValue(a1); /*0x3ff86*/
if ( !v3 ) /*0x3ff8a*/
v3 = (*(__int64 (__fastcall **)(__int64))(a1 + 904))(a1); /*0x3ff95*/
}
LABEL_21:
if ( *(_DWORD *)(a1 + 268) == 11 && (v2 & 0x8000) == 0 ) /*0x3ffa4*/
{
UtlRegisterRead(*(_QWORD *)a1, 10000); /*0x3ffae*/
RegRegister_49(a1, 0); /*0x3ffb8*/
}
return v3; /*0x3ffc9*/
}
// Function: MngGetVersion @ 0x3ffd0 (0x225 bytes)
__int64 __fastcall MngGetVersion(__int64 a1)
{
__int64 result; // rax
int n11; // eax
int v4; // eax
int n9; // eax
unsigned int v6; // r11d
*(_DWORD *)(a1 + 1104) = 0; /*0x3ffd6*/
*(_QWORD *)(a1 + 880) = MngInitSessionHw; /*0x3ffe7*/
*(_DWORD *)(a1 + 1100) = 1; /*0x3fff5*/
*(_QWORD *)(a1 + 904) = MngValidateResponse; /*0x3ffff*/
*(_DWORD *)(a1 + 1108) = 100; /*0x4000d*/
*(_QWORD *)(a1 + 928) = Utl_441f8; /*0x40017*/
*(_QWORD *)(a1 + 952) = UtlIsDigit; /*0x40025*/
*(_QWORD *)(a1 + 960) = UtlTimer1Ms; /*0x40033*/
*(_QWORD *)(a1 + 968) = UtlTimer10Ms; /*0x40041*/
*(_QWORD *)(a1 + 976) = UtlTimer100Ms; /*0x4004f*/
*(_QWORD *)(a1 + 984) = MngGetHwState; /*0x4005d*/
*(_QWORD *)(a1 + 992) = MngSetPowerState; /*0x4006b*/
*(_QWORD *)(a1 + 1000) = MngSetPhyPower; /*0x40079*/
*(_QWORD *)(a1 + 1008) = MngSetPhyPower; /*0x40080*/
*(_QWORD *)(a1 + 1016) = UtlTimer1Sec; /*0x4008e*/
*(_QWORD *)(a1 + 1024) = UtlTimer2Sec; /*0x4009c*/
*(_QWORD *)(a1 + 1032) = UtlTimer3Sec; /*0x400aa*/
*(_QWORD *)(a1 + 1040) = MngInitSession; /*0x400b8*/
*(_QWORD *)(a1 + 1048) = NiiGetStatus; /*0x400c6*/
*(_WORD *)(a1 + 1122) = 47; /*0x400d2*/
result = UtlTimerPollExpired(a1); /*0x400d9*/
if ( !(_DWORD)result ) /*0x400e3*/
{
if ( *(_DWORD *)(a1 + 1104) ) /*0x400e9*/
goto LABEL_10; /*0x400e9*/
n11 = *(_DWORD *)(a1 + 268); /*0x400f1*/
if ( n11 < 11 || n11 > 13 ) /*0x400ff*/
{
result = CompNameInstall(a1); /*0x40104*/
if ( (_DWORD)result ) /*0x4010e*/
return result; /*0x4010e*/
v4 = *(_DWORD *)(a1 + 1104); /*0x40114*/
if ( v4 ) /*0x4011c*/
{
if ( v4 != -16 ) /*0x40121*/
goto LABEL_10; /*0x40121*/
}
}
result = MngSetLedState(a1); /*0x40126*/
if ( !(_DWORD)result ) /*0x4012d*/
{
result = CompNameInstall(a1); /*0x40136*/
if ( !(_DWORD)result ) /*0x40140*/
{
LABEL_10:
n9 = MngSendCommand(*(unsigned int *)(a1 + 1104)); /*0x4014c*/
*(_DWORD *)(a1 + 1072) = n9; /*0x40151*/
if ( n9 == 9 ) /*0x4015a*/
{
*(_QWORD *)(a1 + 896) = MngConfigGet; /*0x401bb*/
*(_QWORD *)(a1 + 920) = UtlStringToGuid; /*0x401c9*/
*(_QWORD *)(a1 + 936) = UtlHexStringToInt; /*0x401d7*/
*(_QWORD *)(a1 + 944) = UtlGetCmdToken; /*0x401e5*/
}
else if ( (unsigned int)(n9 - 10) > 2 ) /*0x40162*/
{
return (unsigned int)-2; /*0x401ac*/
}
else
{
*(_QWORD *)(a1 + 896) = UtlTimerGetCurrent; /*0x4016b*/
*(_QWORD *)(a1 + 920) = UtlTimerSetEvent; /*0x40179*/
*(_QWORD *)(a1 + 936) = UtlTimerCancel; /*0x40187*/
*(_QWORD *)(a1 + 944) = UtlTimerCheckExpire; /*0x40195*/
*(_QWORD *)(a1 + 912) = MngConfigSet; /*0x401a3*/
}
return v6; /*0x401ec*/
}
}
}
return result; /*0x401ef*/
}
// Function: MngApplySettings @ 0x401f8 (0x2b5 bytes)
__int64 __fastcall MngApplySettings(__int64 a1)
{
unsigned __int16 v2; // di
__int64 result; // rax
__int64 i; // rcx
unsigned __int16 n0x64; // ax
__int64 (__fastcall *UtlStringToGuid_1)(__int64); // rax
*(_QWORD *)(a1 + 880) = MngInitSessionHw; /*0x40221*/
*(_QWORD *)(a1 + 904) = MngValidateResponse; /*0x40233*/
*(_QWORD *)(a1 + 936) = UtlParseCmdLine; /*0x40245*/
v2 = 0; /*0x40253*/
*(_QWORD *)(a1 + 928) = Utl_441f8; /*0x40256*/
*(_DWORD *)(a1 + 1100) = 1; /*0x40264*/
*(_QWORD *)(a1 + 960) = UtlStrToUpper; /*0x4026b*/
*(_DWORD *)(a1 + 1108) = 100; /*0x40279*/
*(_QWORD *)(a1 + 984) = MngGetHwState; /*0x40280*/
*(_QWORD *)(a1 + 992) = MngSetPowerState; /*0x4028e*/
*(_QWORD *)(a1 + 1000) = MngSetWolConfig; /*0x4029c*/
*(_QWORD *)(a1 + 1008) = MngGetWolConfig; /*0x402aa*/
*(_QWORD *)(a1 + 1016) = UtlStrCaseCmp; /*0x402b8*/
*(_QWORD *)(a1 + 1040) = MngInitSession; /*0x402c6*/
*(_QWORD *)(a1 + 1048) = NiiGetStatus; /*0x402d4*/
if ( !(unsigned int)MngReadResponse(a1) /*0x4030a*/
|| (*(_QWORD *)(a1 + 1016) = MngProcessResponse,
*(_QWORD *)(a1 + 960) = MngCheckCmdStatus,
result = MngReadResponse(a1),
!(_DWORD)result) )
{
*(_DWORD *)(a1 + 1104) = 0; /*0x40310*/
for ( i = 0; !(unsigned int)MngSendCommand(i); i = *(unsigned int *)(a1 + 1104) ) /*0x40316*/
{
n0x64 = v2++; /*0x4031a*/
if ( n0x64 >= 0x64u ) /*0x40325*/
break; /*0x40325*/
UtlRegisterRead(*(_QWORD *)a1, 1000); /*0x4032f*/
result = CompNameInstall(a1); /*0x40337*/
if ( (_DWORD)result ) /*0x4033e*/
return result; /*0x4033e*/
}
if ( *(_DWORD *)(a1 + 1104) != 1276128 ) /*0x4035e*/
{
if ( *(_DWORD *)(a1 + 1104) == 21040304 ) /*0x40369*/
{
*(_DWORD *)(a1 + 1072) = 8; /*0x403fa*/
*(_QWORD *)(a1 + 960) = MngCheckCmdStatus; /*0x40404*/
*(_WORD *)(a1 + 1122) = 47; /*0x4040b*/
*(_QWORD *)(a1 + 1016) = MngProcessResponse; /*0x40419*/
*(_QWORD *)(a1 + 912) = MngConfigSet; /*0x40420*/
*(_QWORD *)(a1 + 944) = UtlGetCmdToken; /*0x4042e*/
*(_QWORD *)(a1 + 896) = MngConfigGet; /*0x4043c*/
UtlStringToGuid_1 = UtlStringToGuid; /*0x40443*/
LABEL_18:
*(_QWORD *)(a1 + 920) = UtlStringToGuid_1; /*0x40485*/
return 0; /*0x4048c*/
}
if ( *(_DWORD *)(a1 + 1104) != 44565264 /*0x40386*/
&& *(_DWORD *)(a1 + 1104) != 44565280
&& *(_DWORD *)(a1 + 1104) != 44565296 )
{
if ( *(_DWORD *)(a1 + 1104) != 44565392 ) /*0x4038f*/
return 4294967294LL; /*0x40396*/
*(_DWORD *)(a1 + 1072) = 6; /*0x403a0*/
*(_WORD *)(a1 + 1122) = 47; /*0x403aa*/
*(_QWORD *)(a1 + 968) = UtlStrToLower; /*0x403b8*/
*(_QWORD *)(a1 + 1024) = UtlStrNCat; /*0x403c6*/
*(_QWORD *)(a1 + 944) = UtlGetNumericArg; /*0x403d4*/
*(_QWORD *)(a1 + 896) = UtlStrToInt; /*0x403e2*/
UtlStringToGuid_1 = UtlGuidToString; /*0x403e9*/
goto LABEL_18; /*0x403f0*/
}
}
*(_DWORD *)(a1 + 1072) = 7; /*0x40451*/
*(_WORD *)(a1 + 1122) = 15; /*0x4045b*/
*(_QWORD *)(a1 + 944) = UtlGetStringArg; /*0x40469*/
*(_QWORD *)(a1 + 896) = UtlStrToUint; /*0x40477*/
UtlStringToGuid_1 = UtlBinToHex; /*0x4047e*/
goto LABEL_18; /*0x4047e*/
}
return result; /*0x404a2*/
}
// Function: MngFlashWriteBlock @ 0x404b0 (0x162 bytes)
__int64 __fastcall MngFlashWriteBlock(__int64 a1)
{
unsigned int ByteConfig; // eax
int v4; // edx
unsigned __int16 v5; // cx
__int64 v6; // rax
__int64 (__fastcall *RegRegister_16)(__int64); // rax
*(_DWORD *)(a1 + 1248) = 6; /*0x404ba*/
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x404d0*/
{
*(_DWORD *)(a1 + 1260) = 0; /*0x404d5*/
*(_DWORD *)(a1 + 1256) = ((((unsigned int)UtlRegisterWrite((__int64 *)a1, 0xCu) >> 1) & 0x1F) + 1) << 12 >> 2; /*0x404f0*/
*(_QWORD *)(a1 + 16) = *(_QWORD *)(a1 + 8) + 57344LL; /*0x40500*/
}
else
{
if ( !*(_QWORD *)(a1 + 16) ) /*0x40506*/
return 4294967293LL; /*0x40511*/
ByteConfig = NvmReadByteConfig(a1, 0); /*0x40518*/
v4 = ByteConfig & 0x1FFF; /*0x4052b*/
*(_DWORD *)(a1 + 1260) = v4 << 12; /*0x4053f*/
*(_DWORD *)(a1 + 1256) = (unsigned int)(((HIWORD(ByteConfig) & 0x1FFF) - v4 + 1) << 12) >> 2; /*0x40548*/
}
v5 = 0; /*0x40553*/
*(_WORD *)(a1 + 1264) = 2048; /*0x40556*/
do /*0x40581*/
{
v6 = v5++; /*0x4055d*/
*(_BYTE *)(a1 + 4 * v6 + 1316) = 0; /*0x40569*/
*(_WORD *)(a1 + 4 * v6 + 1314) = -1; /*0x40571*/
}
while ( v5 < *(_WORD *)(a1 + 1264) ); /*0x40581*/
*(_QWORD *)(a1 + 1152) = CompNameNullThunk; /*0x4058a*/
*(_QWORD *)(a1 + 1168) = UbaNoOp; /*0x40598*/
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x405a6*/
{
*(_QWORD *)(a1 + 1160) = DxeRegister_3; /*0x405af*/
RegRegister_16 = RegRegister_2; /*0x405b6*/
}
else
{
*(_QWORD *)(a1 + 1160) = DxeRegister_7; /*0x405c6*/
RegRegister_16 = RegRegister_1; /*0x405cd*/
}
*(_QWORD *)(a1 + 1184) = RegRegister_16; /*0x405d4*/
*(_QWORD *)(a1 + 1192) = NvmReadDefaultWord; /*0x405e2*/
*(_QWORD *)(a1 + 1200) = NvmInitMacAddress; /*0x405f0*/
*(_QWORD *)(a1 + 1208) = RegRegisterWriteBlock; /*0x405fe*/
return 0; /*0x4060c*/
}
// Function: MngFlashUpdate @ 0x40614 (0x270 bytes)
__int64 __fastcall MngFlashUpdate(__int64 a1)
{
int n7; // eax
char v3; // al
__int64 (__fastcall *UtlRegWriteCtrlAlt_1)(__int64); // rax
int n12; // eax
char v7; // [rsp+30h] [rbp+8h] BYREF
*(_DWORD *)(a1 + 1116) = 1; /*0x40623*/
*(_WORD *)(a1 + 310) = 32; /*0x40633*/
n7 = *(_DWORD *)(a1 + 268); /*0x4063a*/
*(_WORD *)(a1 + 828) = 7; /*0x40640*/
if ( n7 == 7 ) /*0x40649*/
*(_WORD *)(a1 + 828) = 6; /*0x4064e*/
*(_BYTE *)(a1 + 834) = 1; /*0x4065e*/
*(_QWORD *)(a1 + 96) = MngCalcFwCrc; /*0x40665*/
*(_BYTE *)(a1 + 832) = 1; /*0x40670*/
*(_QWORD *)(a1 + 104) = NiiGetStatusVal; /*0x40677*/
*(_BYTE *)(a1 + 833) = 0; /*0x40682*/
*(_QWORD *)(a1 + 144) = MngFwUpdateBlock; /*0x40689*/
*(_BYTE *)(a1 + 831) = 1; /*0x40697*/
*(_QWORD *)(a1 + 152) = MngFwFullUpdate; /*0x4069e*/
*(_QWORD *)(a1 + 176) = MngGetFwVersion; /*0x406ac*/
*(_QWORD *)(a1 + 184) = MngParseFwVersion; /*0x406ba*/
*(_QWORD *)(a1 + 64) = MngHandleCommand; /*0x406c8*/
*(_QWORD *)(a1 + 112) = MngGetCapability; /*0x406d3*/
*(_QWORD *)(a1 + 136) = NiiStnAddrGet; /*0x406de*/
*(_QWORD *)(a1 + 80) = Utl_442fc; /*0x406ec*/
if ( n7 >= 7 ) /*0x406f0*/
{
if ( n7 <= 9 ) /*0x406f9*/
{
*(_QWORD *)(a1 + 56) = MngCheckHwReady; /*0x407bf*/
*(_QWORD *)(a1 + 40) = NiiStatistics; /*0x407ca*/
*(_QWORD *)(a1 + 48) = NiiInterruptSet; /*0x407d5*/
*(_QWORD *)(a1 + 192) = NiiStatisticsReset; /*0x407e0*/
*(_QWORD *)(a1 + 72) = UtlRegWriteCtrl; /*0x407ee*/
*(_QWORD *)(a1 + 120) = UtlRegWriteStatus; /*0x407f9*/
UtlRegWriteCtrlAlt_1 = UtlRegWriteCtrlAlt; /*0x407fd*/
}
else
{
if ( n7 != 10 ) /*0x40702*/
{
if ( n7 == 11 ) /*0x40707*/
{
*(_WORD *)(a1 + 828) = 5; /*0x4071e*/
*(_QWORD *)(a1 + 216) = MngExecCommand; /*0x4072c*/
}
else if ( n7 > 13 ) /*0x40712*/
{
goto LABEL_16; /*0x40712*/
}
*(_QWORD *)(a1 + 136) = MngParseResponse; /*0x4073a*/
}
UndiTransmit((__int64 *)a1, 8u, (__int64)&v7); /*0x4074e*/
v3 = v7; /*0x4075a*/
if ( *(int *)(a1 + 268) < 13 ) /*0x4075f*/
v3 = v7 & 0xF; /*0x4076b*/
*(_BYTE *)(a1 + 9520) = v3; /*0x4076f*/
*(_QWORD *)(a1 + 56) = MngCheckHwDone; /*0x4077c*/
*(_QWORD *)(a1 + 40) = MngUpdateFwImage; /*0x40787*/
*(_QWORD *)(a1 + 192) = UtlNvmVtableWrite; /*0x40792*/
*(_QWORD *)(a1 + 72) = UtlNvmVtableRead; /*0x407a0*/
*(_QWORD *)(a1 + 120) = Utl_44110; /*0x407ab*/
UtlRegWriteCtrlAlt_1 = Utl_44184; /*0x407af*/
}
*(_QWORD *)(a1 + 128) = UtlRegWriteCtrlAlt_1; /*0x40804*/
}
LABEL_16:
n12 = *(_DWORD *)(a1 + 268); /*0x4080b*/
if ( n12 == 12 || n12 == 13 ) /*0x4081d*/
{
*(_WORD *)(a1 + 828) = 12; /*0x4081f*/
*(_QWORD *)(a1 + 216) = MngWaitResponse; /*0x4082d*/
*(_QWORD *)(a1 + 184) = MngGetFwMode; /*0x4083b*/
}
if ( n12 == 7 ) /*0x40844*/
*(_BYTE *)(a1 + 1312) = 1; /*0x40846*/
if ( *(_WORD *)(a1 + 9512) == 0xF0FC ) /*0x40859*/
*(_BYTE *)(a1 + 846) = 1; /*0x4085b*/
if ( *(_WORD *)(a1 + 9512) == 0xF0FD ) /*0x4086e*/
*(_BYTE *)(a1 + 846) = 1; /*0x40870*/
return 0; /*0x4087e*/
}
// Function: MngWriteStrField @ 0x40884 (0x3d bytes)
__int64 __fastcall MngWriteStrField(__int64 a1, unsigned __int16 n1039, __int64 a3)
{
__int64 result; // rax
result = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1024))(a1, 16, n1039); /*0x4089d*/
if ( !(_DWORD)result ) /*0x408a5*/
return (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 968))(a1, 17, a3); /*0x408b0*/
return result; /*0x408bb*/
}
// Function: MngWriteWordField @ 0x408c4 (0x39 bytes)
__int64 __fastcall MngWriteWordField(__int64 a1, unsigned __int16 a2, unsigned __int16 a3)
{
__int64 result; // rax
result = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1024))(a1, 16, a2); /*0x408db*/
if ( !(_DWORD)result ) /*0x408e3*/
return (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1024))(a1, 17, a3); /*0x408f1*/
return result; /*0x408f7*/
}
// Function: MngHandleVlanConfig @ 0x40900 (0x1a6 bytes)
__int64 __fastcall MngHandleVlanConfig(__int64 a1)
{
int v2; // ecx
__int64 result; // rax
unsigned __int16 n1039; // bp
unsigned __int16 n6190; // r13
unsigned __int16 n1038; // r12
unsigned int v7; // edi
__int16 v8; // ax
unsigned __int16 v9; // [rsp+50h] [rbp+8h] BYREF
unsigned __int16 v10; // [rsp+58h] [rbp+10h] BYREF
__int16 v11; // [rsp+60h] [rbp+18h] BYREF
v2 = *(_DWORD *)(a1 + 1072) - 11; /*0x40919*/
if ( v2 ) /*0x4091c*/
{
if ( v2 != 1 ) /*0x40921*/
return 0; /*0x40925*/
n1039 = -32766; /*0x4092a*/
n6190 = -27647; /*0x4092f*/
n1038 = -32767; /*0x40935*/
}
else
{
n1039 = 1039; /*0x4093b*/
n6190 = 6190; /*0x40940*/
n1038 = 1038; /*0x40946*/
}
result = (*(__int64 (__fastcall **)(__int64))(a1 + 880))(a1); /*0x4094d*/
if ( !(_DWORD)result ) /*0x40955*/
{
v7 = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 968))(a1, 24724, &v9); /*0x4096e*/
if ( !v7 ) /*0x40972*/
{
v9 &= 0x9FFFu; /*0x4097d*/
if ( !*(_BYTE *)(a1 + 9509) ) /*0x40982*/
{
v7 = MngWriteStrField(a1, n1039, a1 + 9510); /*0x409a1*/
if ( v7 ) /*0x409a5*/
goto LABEL_22; /*0x409a5*/
v7 = MngWriteStrField(a1, n1038, (__int64)&v11); /*0x409bc*/
if ( v7 ) /*0x409c0*/
goto LABEL_22; /*0x409c0*/
v8 = v11 & *(_WORD *)(a1 + 9510); /*0x409cd*/
if ( (v8 & 4) != 0 ) /*0x409d4*/
v9 |= 0x4000u; /*0x409db*/
if ( (v8 & 2) != 0 ) /*0x409e2*/
{
(*(void (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 968))(a1, 5, &v10); /*0x409f1*/
if ( (v10 & 0x100) != 0 ) /*0x40a01*/
v9 |= 0x2000u; /*0x40a08*/
else
*(_WORD *)(a1 + 9510) &= ~2u; /*0x40a14*/
}
}
if ( *(_DWORD *)(a1 + 1072) != 11 ) /*0x40a22*/
goto LABEL_20; /*0x40a22*/
v7 = MngWriteStrField(a1, 0x4412u, (__int64)&v10); /*0x40a38*/
if ( !v7 ) /*0x40a3c*/
{
v10 &= ~4u; /*0x40a52*/
MngWriteWordField(a1, 0x4412u, v10); /*0x40a58*/
LABEL_20:
v7 = MngWriteStrField(a1, n6190, (__int64)&v10); /*0x40a5d*/
if ( !v7 ) /*0x40a72*/
v7 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1024))(a1, 24724, v9); /*0x40a88*/
}
}
LABEL_22:
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x40a8a*/
return v7; /*0x40a93*/
}
return result; /*0x40a9a*/
}
// Function: RegRegister_13 @ 0x40aa8 (0x16e bytes)
__int64 __fastcall RegRegister_13(__int64 a1, char a2)
{
int v4; // esi
char v5; // al
unsigned int v6; // edi
__int64 result; // rax
unsigned int v8; // esi
int v9; // ebp
__int16 v10; // r8
unsigned __int16 v11; // r8
unsigned __int16 v12; // [rsp+38h] [rbp+10h] BYREF
v4 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x40ad4*/
v5 = UtlRegisterWrite((__int64 *)a1, 8u); /*0x40ad6*/
v6 = 0; /*0x40adb*/
if ( a2 && v5 < 0 ) /*0x40ae8*/
{
result = (*(__int64 (__fastcall **)(__int64))(a1 + 880))(a1); /*0x40af1*/
if ( (_DWORD)result ) /*0x40af9*/
return result; /*0x40af9*/
v6 = DxeRegister_36((__int64 *)a1, 7, &v12); /*0x40b11*/
if ( !v6 ) /*0x40b15*/
{
v6 = DxeRegister_41((__int64 *)a1, 7, v12 & 0xFFFD); /*0x40b30*/
if ( !v6 ) /*0x40b34*/
{
UtlRegisterRead(*(_QWORD *)a1, 10); /*0x40b3c*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v4 | 0x100); /*0x40b4e*/
v6 = DxeRegister_41((__int64 *)a1, 7, v12); /*0x40b63*/
}
}
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x40b68*/
return v6; /*0x40b6e*/
}
v8 = v4 & 0xFFFFFEFF; /*0x40b73*/
if ( *(_DWORD *)(a1 + 1112) > 5u ) /*0x40b7e*/
goto LABEL_17; /*0x40b7e*/
if ( !a2 ) /*0x40b83*/
goto LABEL_17; /*0x40b83*/
v9 = v5 & 0x40; /*0x40b87*/
if ( (v5 & 0x40) != 0 && (v5 & 1) != 0 ) /*0x40b8e*/
goto LABEL_17; /*0x40b8e*/
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 24658, &v12); /*0x40b9f*/
if ( !(_DWORD)result ) /*0x40ba7*/
{
v10 = v12 & 0xC0FF; /*0x40bb4*/
if ( v9 ) /*0x40bba*/
{
v11 = v10 | 0x500; /*0x40bc1*/
v8 &= ~0x200u; /*0x40bc5*/
}
else
{
v11 = v10 | 0x3200; /*0x40bd0*/
v8 |= 0x200u; /*0x40bd4*/
}
v12 = v11; /*0x40bdd*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 24658); /*0x40be3*/
v6 = result; /*0x40be9*/
if ( !(_DWORD)result ) /*0x40bed*/
{
LABEL_17:
UtlRegisterAccess((__int64 *)a1, 0x10u, v8); /*0x40bfa*/
return v6; /*0x40bff*/
}
}
return result; /*0x40c10*/
}
// Function: MngHandleCommand @ 0x40c18 (0x42a bytes)
__int64 __fastcall MngHandleCommand(__int64 a1)
{
__int64 result; // rax
int n11; // eax
int n12; // eax
int v5; // eax
__int16 n5466; // ax
bool v7; // zf
int v8; // ebx
int v9; // eax
int v10; // eax
char v11; // al
__int64 v12; // r8
bool v13; // [rsp+50h] [rbp+8h] BYREF
__int16 v14; // [rsp+58h] [rbp+10h] BYREF
unsigned __int16 v15; // [rsp+60h] [rbp+18h] BYREF
__int16 v16; // [rsp+68h] [rbp+20h] BYREF
if ( !*(_BYTE *)(a1 + 837) ) /*0x40c2b*/
return 0; /*0x40c36*/
if ( !*(_QWORD *)(a1 + 960) || (result = UtlParseTokenStrLong(a1, 1u, 0, &v13), !(_DWORD)result) ) /*0x40c5b*/
{
if ( *(_DWORD *)(a1 + 268) != 10 || (result = DxeRegister_49(a1, v13), !(_DWORD)result) ) /*0x40c7f*/
{
n11 = *(_DWORD *)(a1 + 268); /*0x40c85*/
if ( (n11 == 11 || n11 == 12 || n11 == 13) && v13 ) /*0x40ca3*/
NiiMcIpToMacSet((__int64 *)a1, &v14, &v16); /*0x40cb6*/
n12 = *(_DWORD *)(a1 + 268); /*0x40e7d*/
if ( n12 == 12 || n12 == 13 ) /*0x40e8b*/
{
v5 = UtlRegisterWrite((__int64 *)a1, 0x24u); /*0x40e97*/
UtlRegisterAccess((__int64 *)a1, 0x24u, v5 | 7); /*0x40ea7*/
}
if ( (n5466 = *(_WORD *)(a1 + 9512), n5466 != 5466) && n5466 != 5465 && n5466 != 5538 && n5466 != 5539 /*0x40eea*/
|| (result = RegRegister_13(a1, v13), !(_DWORD)result) )
{
v7 = *(_DWORD *)(a1 + 268) == 13; /*0x40ef0*/
*(_WORD *)(a1 + 9510) = 0; /*0x40ef7*/
if ( v7 ) /*0x40eff*/
{
v8 = UtlRegisterWrite((__int64 *)a1, 0xF18u); /*0x40f16*/
v9 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x40f18*/
if ( v8 >= 0 ) /*0x40f21*/
v10 = v9 & 0x7FFFFFFF; /*0x40f43*/
else
v10 = v9 | 0x80000000; /*0x40f23*/
UtlRegisterAccess((__int64 *)a1, 0x10u, v10); /*0x40f52*/
}
if ( !v13 ) /*0x40f5c*/
return 0; /*0x40f5c*/
*(_BYTE *)(a1 + 837) = 0; /*0x40f62*/
if ( *(_DWORD *)(a1 + 268) != 10 ) /*0x40f72*/
{
if ( *(_DWORD *)(a1 + 268) != 11 ) /*0x40f77*/
{
LABEL_34:
PhyCheckLinkSpeedCap(a1); /*0x40ff6*/
if ( *(int *)(a1 + 1072) <= 11 || (result = MngHandleVlanConfig(a1), !(_DWORD)result) ) /*0x41012*/
{
if ( *(_BYTE *)(a1 + 835) ) /*0x41014*/
{
(*(void (__fastcall **)(__int64))(a1 + 208))(a1); /*0x41027*/
return NiiReceiveFilterReset(a1); /*0x41030*/
}
else
{
return 4294967293LL; /*0x4101d*/
}
}
return result; /*0x41022*/
}
result = RegRegister_27(a1); /*0x40f7c*/
if ( (_DWORD)result ) /*0x40f84*/
return result; /*0x40f84*/
}
if ( *(_DWORD *)(a1 + 1072) == 9 ) /*0x40f91*/
{
result = RegRegister_33(a1); /*0x40f96*/
if ( (_DWORD)result ) /*0x40f9e*/
return result; /*0x40f9e*/
}
(*(void (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 24656, &v15); /*0x40fb3*/
v15 &= 0x8FFFu; /*0x40fc4*/
v11 = UtlRegisterWrite((__int64 *)a1, 8u); /*0x40fcd*/
v12 = v15; /*0x40fd2*/
if ( (v11 & 1) == 0 ) /*0x40fda*/
{
LOWORD(v12) = v15 | 0x1000; /*0x40fe1*/
v15 |= 0x1000u; /*0x40fe5*/
}
(*(void (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 24656, v12); /*0x40ff0*/
goto LABEL_34; /*0x40ff0*/
}
}
}
return result; /*0x41035*/
}
// Function: MngInitSessionHw @ 0x41044 (0xc4 bytes)
__int64 __fastcall MngInitSessionHw(__int64 *a1)
{
int n100; // esi
unsigned int v3; // ebx
int v4; // ebp
int n1000; // esi
int v6; // ebp
n100 = 100; /*0x4105b*/
v3 = 0; /*0x41060*/
do /*0x41085*/
{
v4 = UtlRegisterWrite(a1, 0xF00u); /*0x4106f*/
if ( (v4 & 0x20) == 0 ) /*0x41073*/
break; /*0x41073*/
UtlRegisterRead(*a1, 1000); /*0x4107d*/
--n100; /*0x41082*/
}
while ( n100 ); /*0x41085*/
if ( !n100 ) /*0x41089*/
return (unsigned int)-3; /*0x41089*/
n1000 = 1000; /*0x41099*/
UtlRegisterAccess(a1, 0xF00u, v4 | 0x20); /*0x4109e*/
do /*0x410c6*/
{
v6 = UtlRegisterWrite(a1, 0xF00u); /*0x410b0*/
if ( (v6 & 0x20) != 0 ) /*0x410b4*/
break; /*0x410b4*/
UtlRegisterRead(*a1, 1000); /*0x410be*/
--n1000; /*0x410c3*/
}
while ( n1000 ); /*0x410c6*/
if ( !n1000 ) /*0x410ca*/
{
UtlRegisterWrite(a1, 0x5B54u); /*0x410d4*/
UtlRegisterAccess(a1, 0xF00u, v6 & 0xFFFFFFDF); /*0x410e7*/
return (unsigned int)-3; /*0x410ec*/
}
return v3; /*0x41102*/
}
// Function: MngGetHwState @ 0x41108 (0x30 bytes)
char __fastcall MngGetHwState(__int64 *a1)
{
int v2; // eax
v2 = UtlRegisterWrite(a1, 0xF00u); /*0x41116*/
if ( (v2 & 0x20) != 0 ) /*0x4111d*/
LOBYTE(v2) = UtlRegisterAccess(a1, 0xF00u, v2 & 0xFFFFFFDF); /*0x4112d*/
return v2; /*0x41132*/
}
// Function: MngCheckHwReady @ 0x41138 (0x28 bytes)
_BOOL8 __fastcall MngCheckHwReady(__int64 *a1)
{
__int16 v1; // ax
v1 = UtlRegisterWrite(a1, 0x5B54u); /*0x41141*/
return v1 < 0 && (v1 & 0xE) == 4; /*0x4115b*/
}
// Function: MngCheckHwDone @ 0x41160 (0x26 bytes)
_BOOL8 __fastcall MngCheckHwDone(__int64 *a1)
{
__int16 v1; // ax
v1 = UtlRegisterWrite(a1, 0x5B54u); /*0x41169*/
return v1 < 0 && (v1 & 4) != 0; /*0x41181*/
}
// Function: MngExecCommand @ 0x41188 (0x136 bytes)
__int64 __fastcall MngExecCommand(__int64 a1, unsigned __int8 *a2, unsigned int a3)
{
int v5; // r12d
int v6; // esi
unsigned int v8; // ebx
unsigned int v9; // ebp
v5 = *a2 | ((a2[1] | (*((unsigned __int16 *)a2 + 1) << 8)) << 8); /*0x411d0*/
v6 = *((unsigned __int16 *)a2 + 2); /*0x411d7*/
if ( v5 || *((_WORD *)a2 + 2) ) /*0x411d3*/
v6 |= 0x80000000; /*0x411e2*/
if ( !a3 ) /*0x411e9*/
{
UtlRegisterAccess((__int64 *)a1, 0x5400u, v5); /*0x411f3*/
UtlMicroStall((__int64 *)a1); /*0x411fb*/
UtlRegisterAccess((__int64 *)a1, 0x5404u, v6); /*0x4120b*/
UtlMicroStall((__int64 *)a1); /*0x41213*/
return 0; /*0x4121a*/
}
if ( a3 < *(unsigned __int16 *)(a1 + 828) && !(unsigned int)MngInitSessionHw((__int64 *)a1) ) /*0x4122b*/
{
v8 = 8 * a3 + 21552; /*0x41234*/
UtlRegisterAccess((__int64 *)a1, v8, v5); /*0x41243*/
UtlMicroStall((__int64 *)a1); /*0x4124b*/
v9 = 8 * a3 + 21556; /*0x41250*/
UtlRegisterAccess((__int64 *)a1, v9, v6); /*0x4125f*/
UtlMicroStall((__int64 *)a1); /*0x41267*/
MngGetHwState((__int64 *)a1); /*0x4126f*/
if ( (unsigned int)UtlRegisterWrite((__int64 *)a1, v8) == v5 /*0x4128f*/
&& (unsigned int)UtlRegisterWrite((__int64 *)a1, v9) == v6 )
{
return 0; /*0x4128f*/
}
UtlRegisterWrite((__int64 *)a1, 0x5B54u); /*0x41299*/
}
return 4294967293LL; /*0x412b7*/
}
// Function: MngWaitResponse @ 0x412c0 (0x151 bytes)
__int64 __fastcall MngWaitResponse(__int64 a1, unsigned __int8 *a2, unsigned int a3)
{
int v5; // r12d
int v6; // esi
unsigned int v8; // eax
unsigned int v9; // ebx
unsigned int v10; // ebp
v5 = *a2 | ((a2[1] | (*((unsigned __int16 *)a2 + 1) << 8)) << 8); /*0x41308*/
v6 = *((unsigned __int16 *)a2 + 2); /*0x4130f*/
if ( v5 || *((_WORD *)a2 + 2) ) /*0x4130b*/
v6 |= 0x80000000; /*0x4131a*/
if ( !a3 ) /*0x41321*/
{
UtlRegisterAccess((__int64 *)a1, 0x5400u, v5); /*0x4132b*/
UtlMicroStall((__int64 *)a1); /*0x41333*/
UtlRegisterAccess((__int64 *)a1, 0x5404u, v6); /*0x41343*/
UtlMicroStall((__int64 *)a1); /*0x4134b*/
return 0; /*0x41352*/
}
if ( a3 < *(unsigned __int16 *)(a1 + 828) ) /*0x41361*/
{
v8 = ((unsigned int)UtlRegisterWrite((__int64 *)a1, 0x5B54u) >> 7) & 7; /*0x41374*/
if ( v8 != 1 && (!v8 || a3 <= v8) && !(unsigned int)MngInitSessionHw((__int64 *)a1) ) /*0x41387*/
{
v9 = 8 * a3 + 21504; /*0x41390*/
UtlRegisterAccess((__int64 *)a1, v9, v5); /*0x4139f*/
UtlMicroStall((__int64 *)a1); /*0x413a7*/
v10 = 8 * a3 + 21508; /*0x413ac*/
UtlRegisterAccess((__int64 *)a1, v10, v6); /*0x413bb*/
UtlMicroStall((__int64 *)a1); /*0x413c3*/
MngGetHwState((__int64 *)a1); /*0x413cb*/
if ( (unsigned int)UtlRegisterWrite((__int64 *)a1, v9) == v5 /*0x413eb*/
&& (unsigned int)UtlRegisterWrite((__int64 *)a1, v10) == v6 )
{
return 0; /*0x413eb*/
}
}
}
return 4294967293LL; /*0x4140a*/
}
// Function: MngParseResponse @ 0x41414 (0xcf bytes)
__int64 MngParseResponse(__int64 a1, __int64 a2, unsigned int a3, __int64 a4, __int64 a5, ...)
{
int v5; // esi
__int64 result; // rax
unsigned __int16 *v8; // rbp
unsigned __int16 va_; // [rsp+30h] [rbp+8h] BYREF
v5 = 0; /*0x41428*/
va_ = 0; /*0x4142d*/
NiiStnAddrGet(a1, a2, a3); /*0x41431*/
result = (*(__int64 (__fastcall **)(__int64))(a1 + 880))(a1); /*0x41439*/
if ( !(_DWORD)result ) /*0x41441*/
{
if ( !(unsigned int)MngReadWord(a1, &va_) ) /*0x4144f*/
{
if ( *(_WORD *)(a1 + 310) ) /*0x41458*/
{
v8 = (unsigned __int16 *)(a1 + 316); /*0x41461*/
do /*0x414b6*/
{
(*(void (__fastcall **)(__int64, _QWORD, _QWORD))(a1 + 1032))( /*0x41490*/
a1,
((v5 << 17) + 0x800000) & 0xFFE06400 | (2 * (v5 & 0xF | 0x3200)),
*v8);
(*(void (__fastcall **)(__int64, _QWORD, _QWORD))(a1 + 1032))( /*0x414a1*/
a1,
(((v5 << 17) + 0x800000) & 0xFFE06400 | (2 * (v5 & 0xF | 0x3200))) + 1,
v8[1]);
++v5; /*0x414ae*/
v8 += 2; /*0x414b0*/
}
while ( v5 < *(unsigned __int16 *)(a1 + 310) ); /*0x414b6*/
}
MngWriteWord(a1, &va_); /*0x414c0*/
}
return (*(__int64 (__fastcall **)(__int64))(a1 + 984))(a1); /*0x414c8*/
}
return result; /*0x414dd*/
}
// Function: MngValidateResponse @ 0x414e4 (0x6b bytes)
__int64 __fastcall MngValidateResponse(__int64 a1)
{
int v1; // esi
char v4; // bl
int n30; // r11d
v1 = 0; /*0x414f3*/
if ( *(_BYTE *)(a1 + 1134) ) /*0x414f8*/
return 12; /*0x41501*/
v4 = 1; /*0x41506*/
while ( (UtlRegisterWrite((__int64 *)a1, 0x5B54u) & 0x40) == 0 )
{
UtlRegisterRead(*(_QWORD *)a1, 10000); /*0x41524*/
n30 = v1++; /*0x41529*/
if ( n30 >= 30 )
return v4 != 0 ? 0xC : 0;
}
v4 = 0; /*0x41536*/
return v4 != 0 ? 0xC : 0;
}
// Function: DxeInit_1 @ 0x41550 (0xbe bytes)
__int64 __fastcall DxeInit_1(__int64 a1)
{
unsigned int v2; // ebx
int v3; // edi
__int64 result; // rax
unsigned __int16 n32511; // bx
int v6; // eax
char v7; // di
__int64 v8; // [rsp+20h] [rbp-18h]
__int64 v9; // [rsp+20h] [rbp-18h]
unsigned __int16 p_n32511; // [rsp+48h] [rbp+10h] BYREF
v2 = UtlRegisterWrite((__int64 *)a1, 0xCu); /*0x41581*/
LOBYTE(v8) = 0; /*0x41583*/
v3 = (v2 >> 12) & 3; /*0x41588*/
result = MngExecHwCmdSeq(a1, 0x601Au, &p_n32511, 1, v8); /*0x4158b*/
if ( !(_DWORD)result ) /*0x41592*/
{
n32511 = p_n32511 & 0xFF80 | (v2 >> 17) & 0x7F | 0x280; /*0x415b0*/
if ( *(_DWORD *)(a1 + 1072) == 12 ) /*0x415ba*/
{
v6 = v3; /*0x415bc*/
v7 = v3 - 1; /*0x415be*/
if ( v6 ) /*0x415c2*/
n32511 = ((v7 & 1 | (unsigned __int16)(8 * (v7 & 2))) << 8) | n32511 & 0xEEFF; /*0x415e2*/
}
LOBYTE(v9) = 0; /*0x415f4*/
return MngInitHwCmd(a1, 0x601Au, n32511, 1, v9); /*0x415f9*/
}
return result; /*0x41608*/
}
// Function: DxeInit @ 0x41610 (0x206 bytes)
__int64 __fastcall DxeInit(__int64 a1)
{
int n9; // eax
unsigned __int16 v3; // r14
__int64 result; // rax
__int16 n4170; // ax
int n0x8000000; // esi
unsigned int inited; // edi
int v8; // eax
int v9; // esi
unsigned int i_2; // eax
unsigned int i_1; // r13d
int n10; // eax
bool v13; // cc
unsigned __int16 n32511; // ax
__int16 v15; // bp
unsigned int i; // esi
unsigned __int16 v17; // r12
__int64 v18; // [rsp+20h] [rbp-48h]
unsigned __int16 n31; // [rsp+70h] [rbp+8h] BYREF
unsigned __int16 v20; // [rsp+78h] [rbp+10h] BYREF
n9 = *(_DWORD *)(a1 + 268); /*0x41624*/
v3 = 0; /*0x41630*/
if ( n9 != 7 ) /*0x4163b*/
{
if ( n9 <= 9 || n9 > 13 ) /*0x41645*/
return 0; /*0x41645*/
LABEL_9:
n0x8000000 = 0x8000000; /*0x41674*/
goto LABEL_11; /*0x41679*/
}
if ( *(_DWORD *)(a1 + 1072) != 6 ) /*0x41650*/
return 0; /*0x41654*/
n4170 = *(_WORD *)(a1 + 9512); /*0x41659*/
if ( n4170 != 4170 && n4170 != 4171 ) /*0x41672*/
goto LABEL_9; /*0x41672*/
n0x8000000 = 1; /*0x4167b*/
LABEL_11:
result = (*(__int64 (__fastcall **)(__int64))(a1 + 880))(a1); /*0x4167e*/
inited = result; /*0x41687*/
if ( (_DWORD)result ) /*0x4168c*/
return result; /*0x4168c*/
if ( ((unsigned int)UtlRegisterWrite((__int64 *)a1, 0x28u) & n0x8000000) == 0 ) /*0x416a1*/
goto LABEL_29; /*0x416a1*/
v8 = UtlRegisterWrite((__int64 *)a1, 0xF00u); /*0x416af*/
v9 = v8; /*0x416bb*/
if ( *(int *)(a1 + 268) < 11 && (v8 & 1) != 0 ) /*0x416c2*/
goto LABEL_29; /*0x416c2*/
i_2 = (unsigned int)UtlRegisterWrite((__int64 *)a1, 0xF08u) >> 16; /*0x416d5*/
i_1 = (unsigned __int8)i_2; /*0x416d8*/
if ( !(_BYTE)i_2 ) /*0x416df*/
goto LABEL_29; /*0x416df*/
n10 = *(_DWORD *)(a1 + 268); /*0x416e5*/
v13 = n10 <= 10; /*0x416f6*/
if ( n10 == 10 ) /*0x416f9*/
{
if ( (v9 & 8) == 0 ) /*0x416ff*/
goto LABEL_20; /*0x416ff*/
v13 = 1; /*0x41701*/
}
if ( v13 ) /*0x41703*/
goto LABEL_22; /*0x41703*/
LABEL_20:
inited = DxeInit_1(a1); /*0x41705*/
if ( !inited ) /*0x41712*/
{
n32511 = UtlRegisterWrite((__int64 *)a1, 0xE00u); /*0x41720*/
LOBYTE(v18) = 0; /*0x41734*/
inited = MngInitHwCmd(a1, 0x601Eu, n32511, 1, v18); /*0x4173e*/
if ( !inited ) /*0x41743*/
{
LABEL_22:
v15 = 2 * (HIWORD(v9) & 0xFFF); /*0x41749*/
for ( i = 0; i < i_1; ++i ) /*0x41752*/
{
v17 = v15 + 2 * i; /*0x41770*/
inited = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, unsigned __int16 *))(a1 + 1160))(a1, v17, 1, &v20); /*0x4177e*/
if ( inited ) /*0x41783*/
break; /*0x41783*/
inited = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, unsigned __int16 *))(a1 + 1160))( /*0x417a3*/
a1,
(unsigned __int16)(v17 + 1),
1,
&n31);
if ( inited ) /*0x417a8*/
break; /*0x417a8*/
if ( n31 == 31 ) /*0x417b3*/
{
v3 = v20; /*0x417b5*/
}
else
{
n31 = v3 | n31 & 0x1F; /*0x417d1*/
inited = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD))(a1 + 1024))(a1, n31, v20); /*0x417dc*/
if ( inited ) /*0x417e1*/
break; /*0x417e1*/
}
}
}
}
LABEL_29:
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x417f3*/
return inited; /*0x41806*/
}
// Function: DxeRegister_49 @ 0x41818 (0x127 bytes)
__int64 __fastcall DxeRegister_49(__int64 a1, char a2)
{
char v2; // si
bool v3; // zf
__int64 result; // rax
unsigned int v7; // edi
__int64 n16640; // r8
__int16 n4672; // [rsp+30h] [rbp+8h] BYREF
v2 = *(_BYTE *)(a1 + 9508); /*0x4182c*/
v3 = *(_DWORD *)(a1 + 268) == 10; /*0x41835*/
n4672 = 0; /*0x4183c*/
if ( !v3 ) /*0x41846*/
return 0; /*0x4184a*/
result = (*(__int64 (**)(void))(a1 + 880))(); /*0x4184f*/
if ( !(_DWORD)result ) /*0x41857*/
{
if ( !a2 ) /*0x41860*/
{
n16640 = 16640; /*0x418f8*/
LABEL_15:
v7 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1024))(a1, 24659, n16640); /*0x418fe*/
if ( !v7 ) /*0x41910*/
v7 = DxeRegister_8((__int64 *)a1, v2); /*0x4191d*/
goto LABEL_17; /*0x4191d*/
}
if ( *(_DWORD *)(a1 + 1072) == 9 ) /*0x4186d*/
{
v7 = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 968))(a1, 17, &n4672); /*0x41882*/
if ( v7 ) /*0x41886*/
goto LABEL_17; /*0x41886*/
n4672 &= 0xCC00u; /*0x418a5*/
if ( n4672 == -29696 ) /*0x418aa*/
v2 = 0; /*0x418aa*/
}
if ( *(_DWORD *)(a1 + 1072) != 10 ) /*0x418b4*/
{
LABEL_13:
n16640 = 256; /*0x418f0*/
goto LABEL_15; /*0x418f6*/
}
v7 = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 968))(a1, 26, &n4672); /*0x418c9*/
if ( !v7 ) /*0x418cd*/
{
n4672 &= 0x1340u; /*0x418e8*/
if ( n4672 == 4672 ) /*0x418ed*/
v2 = 0; /*0x418ed*/
goto LABEL_13; /*0x418ed*/
}
LABEL_17:
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x4191f*/
return v7; /*0x41928*/
}
return result; /*0x41939*/
}
// Function: DxeRegister_8 @ 0x41940 (0x119 bytes)
__int64 __fastcall DxeRegister_8(__int64 *a1, char a2)
{
__int64 result; // rax
unsigned __int16 v5; // r8
int v6; // edi
int v7; // ebx
__int16 v8; // [rsp+40h] [rbp+18h] BYREF
v8 = 0; /*0x41963*/
result = DxeRegister_36(a1, 7, &v8); /*0x41967*/
if ( !(_DWORD)result ) /*0x4196e*/
{
if ( a2 ) /*0x4197d*/
v5 = v8 | 2; /*0x4197f*/
else
v5 = v8 & 0xFFFD; /*0x4198b*/
result = DxeRegister_41(a1, 7, v5); /*0x41997*/
if ( !(_DWORD)result ) /*0x4199e*/
{
UtlRegisterRead(*a1, 20); /*0x419b0*/
v6 = UtlRegisterWrite(a1, 0x18u); /*0x419c7*/
v7 = UtlRegisterWrite(a1, 0); /*0x419d6*/
UtlRegisterAccess(a1, 0, v7 & 0xFFFFF4FF | 0x800); /*0x419e4*/
UtlRegisterAccess(a1, 0x18u, v6 | 0x8000); /*0x419f9*/
UtlMicroStall(a1); /*0x41a01*/
UtlRegisterRead(*a1, 20); /*0x41a0c*/
UtlRegisterAccess(a1, 0, v7); /*0x41a19*/
UtlRegisterAccess(a1, 0x18u, v6); /*0x41a29*/
UtlMicroStall(a1); /*0x41a31*/
UtlRegisterRead(*a1, 20); /*0x41a3c*/
return 0; /*0x41a41*/
}
}
return result; /*0x41a52*/
}
// Function: DxeRegister_10 @ 0x41a5c (0x10c bytes)
__int64 __fastcall DxeRegister_10(__int64 a1)
{
__int64 result; // rax
unsigned int v3; // edi
char v4; // si
unsigned __int16 v5; // cx
int v6; // eax
__int64 v7; // r8
unsigned __int16 v8; // [rsp+30h] [rbp+8h] BYREF
if ( *(int *)(a1 + 268) < 10 ) /*0x41a75*/
return 0; /*0x41a77*/
result = (*(__int64 (**)(void))(a1 + 880))(); /*0x41a7e*/
v3 = result; /*0x41a84*/
if ( !(_DWORD)result ) /*0x41a88*/
{
if ( (*(_DWORD *)(a1 + 268) != 10 || (UtlRegisterWrite((__int64 *)a1, 0xF00u) & 8) == 0) /*0x41abd*/
&& (UtlRegisterWrite((__int64 *)a1, 0x28u) & 0x8000000) != 0 )
{
v4 = UtlRegisterWrite((__int64 *)a1, 0xF10u); /*0x41add*/
v3 = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 968))(a1, 24601, &v8); /*0x41ae5*/
if ( !v3 ) /*0x41ae9*/
{
v5 = v8 & 0xFFBB; /*0x41af5*/
v8 &= 0xFFBBu; /*0x41af8*/
if ( (v4 & 0x40) != 0 ) /*0x41b01*/
{
v5 |= 0x40u; /*0x41b03*/
v8 = v5; /*0x41b07*/
}
if ( (v4 & 2) != 0 ) /*0x41b10*/
v8 = v5 | 4; /*0x41b16*/
v6 = (*(__int64 (__fastcall **)(__int64))(a1 + 904))(a1); /*0x41b1e*/
v7 = v8; /*0x41b24*/
if ( !v6 ) /*0x41b2c*/
{
LOWORD(v7) = v8 | 0x400; /*0x41b33*/
v8 |= 0x400u; /*0x41b37*/
}
v3 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1024))(a1, 24601, v7); /*0x41b4b*/
}
}
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x41b50*/
return v3; /*0x41b56*/
}
return result; /*0x41b62*/
}
// Function: MngSetLedState @ 0x41b68 (0x46 bytes)
__int64 __fastcall MngSetLedState(__int64 a1)
{
__int64 result; // rax
__int16 v3; // [rsp+30h] [rbp+8h] BYREF
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 24624, &v3); /*0x41b7b*/
if ( !(_DWORD)result ) /*0x41b83*/
{
v3 |= 0x400u; /*0x41b9c*/
return (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 24624); /*0x41ba2*/
}
return result; /*0x41ba8*/
}
// Function: MngSetDeviceState @ 0x41bb0 (0x177 bytes)
__int64 __fastcall MngSetDeviceState(__int64 a1)
{
__int64 result; // rax
int n10; // ecx
int n2; // eax
unsigned int v5; // edi
unsigned __int8 v6; // [rsp+30h] [rbp+8h] BYREF
if ( *(_DWORD *)(a1 + 268) != 10 ) /*0x41bc4*/
return 0; /*0x41bc8*/
if ( *(_DWORD *)(a1 + 1072) != 10 || (result = MngSetLedState(a1), !(_DWORD)result) ) /*0x41bdd*/
{
if ( ((n10 = *(_DWORD *)(a1 + 1072), n10 != 10) || (n2 = *(_DWORD *)(a1 + 1112), n2 != 1) && n2 != 2) /*0x41c3e*/
&& (n10 != 9 || *(_DWORD *)(a1 + 1112) != 1)
|| (result = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 24633, 17457), !(_DWORD)result)
&& (result = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 24656, 41476), !(_DWORD)result) )
{
if ( *(_DWORD *)(a1 + 1072) == 9 && *(_DWORD *)(a1 + 1112) < 2u ) /*0x41c54*/
{
MngConfigSet(a1); /*0x41c59*/
(*(void (__fastcall **)(__int64, _QWORD, __int64))(a1 + 1016))(a1, 0, 12608); /*0x41c69*/
}
result = (*(__int64 (__fastcall **)(__int64))(a1 + 880))(a1); /*0x41c72*/
if ( !(_DWORD)result ) /*0x41c7a*/
{
*(_DWORD *)(a1 + 1100) = 1; /*0x41c89*/
v5 = UtlTokenize(a1, 0x1Fu, 0); /*0x41c9b*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x41c9d*/
if ( v5 ) /*0x41ca5*/
return v5; /*0x41d1a*/
result = DxeRegister_49(a1, 1); /*0x41cac*/
if ( !(_DWORD)result ) /*0x41cb3*/
{
result = (*(__int64 (__fastcall **)(__int64))(a1 + 880))(a1); /*0x41cb8*/
if ( !(_DWORD)result ) /*0x41cc0*/
{
v5 = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int8 *))(a1 + 968))(a1, 24625, &v6); /*0x41cd5*/
if ( !v5 ) /*0x41cd9*/
{
v5 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1024))(a1, 24625, v6); /*0x41cf8*/
if ( !v5 ) /*0x41cfc*/
v5 = MngWriteWordField(a1, 0x887u, 0x34u); /*0x41d0f*/
}
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x41d14*/
return v5; /*0x41d14*/
}
}
}
}
}
return result; /*0x41d21*/
}
// Function: RegRegister_27 @ 0x41d28 (0xbd bytes)
__int64 __fastcall RegRegister_27(__int64 a1)
{
bool v1; // zf
__int64 result; // rax
int v4; // eax
__int16 v5; // [rsp+30h] [rbp+8h] BYREF
__int16 v6; // [rsp+38h] [rbp+10h] BYREF
v1 = *(_DWORD *)(a1 + 268) == 11; /*0x41d34*/
v5 = 0; /*0x41d3e*/
if ( !v1 ) /*0x41d43*/
return 0; /*0x41d43*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 26, &v5); /*0x41d51*/
if ( (_DWORD)result ) /*0x41d59*/
return result; /*0x41d59*/
if ( (v5 & 0x1040) != 0x1040 ) /*0x41d6b*/
return 0; /*0x41d6b*/
if ( (v5 & 0x300) == 0 ) /*0x41d7a*/
{
v4 = UtlRegisterWrite((__int64 *)a1, 0x24u); /*0x41dc0*/
UtlRegisterAccess((__int64 *)a1, 0x24u, v4 & 0xFFFFFFF8 | 3); /*0x41dd3*/
return 0; /*0x41dd8*/
}
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 24657, &v6); /*0x41d86*/
if ( !(_DWORD)result ) /*0x41d8e*/
{
v6 &= ~0x4000u; /*0x41da7*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 24657); /*0x41dad*/
if ( !(_DWORD)result ) /*0x41db5*/
return 0; /*0x41db5*/
}
return result; /*0x41ddf*/
}
// Function: RegRegister_49 @ 0x41de8 (0x4d bytes)
void __fastcall RegRegister_49(__int64 a1, char a2)
{
int v4; // eax
int v5; // eax
if ( *(int *)(a1 + 268) >= 11 ) /*0x41dff*/
{
v4 = UtlRegisterWrite((__int64 *)a1, 0xF00u); /*0x41e06*/
if ( a2 ) /*0x41e0e*/
v5 = v4 | 0x80; /*0x41e10*/
else
v5 = v4 & 0xFFFFFF7F; /*0x41e16*/
UtlRegisterAccess((__int64 *)a1, 0xF00u, v5); /*0x41e25*/
}
}
// Function: RegRegister_14 @ 0x41e38 (0x166 bytes)
__int64 __fastcall RegRegister_14(__int64 a1)
{
__int64 result; // rax
unsigned int v3; // edi
__int16 v4; // [rsp+30h] [rbp+8h] BYREF
if ( (*(unsigned int (**)(void))(a1 + 904))() ) /*0x41e45*/
return 0; /*0x41e51*/
UtlRegisterRead(*(_QWORD *)a1, 10000); /*0x41e5e*/
if ( *(_DWORD *)(a1 + 268) == 10 ) /*0x41e6c*/
{
result = MngSetDeviceState(a1); /*0x41ecf*/
if ( (_DWORD)result ) /*0x41ed6*/
return result; /*0x41ed6*/
}
else if ( *(_DWORD *)(a1 + 268) == 11 ) /*0x41e71*/
{
v3 = MngSetLedState(a1); /*0x41e7b*/
if ( !v3 ) /*0x41e7f*/
{
v3 = (*(__int64 (__fastcall **)(__int64))(a1 + 880))(a1); /*0x41e8a*/
if ( !v3 ) /*0x41e8e*/
{
v3 = MngWriteWordField(a1, 0x84Fu, 0x34u); /*0x41ea1*/
if ( !v3 ) /*0x41ea5*/
v3 = MngWriteWordField(a1, 0x2411u, 5u); /*0x41eb8*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x41ebd*/
}
}
if ( v3 ) /*0x41ec5*/
return v3; /*0x41ec5*/
}
if ( *(int *)(a1 + 268) >= 10 ) /*0x41ee3*/
{
(*(void (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 24625, &v4); /*0x41ef4*/
v4 &= ~0x10u; /*0x41f0f*/
(*(void (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 24625); /*0x41f15*/
}
result = DxeInit(a1); /*0x41f1e*/
if ( !(_DWORD)result ) /*0x41f25*/
{
v3 = DxeRegister_10(a1); /*0x41f38*/
if ( *(_DWORD *)(a1 + 268) != 11 ) /*0x41f3a*/
return v3; /*0x41f91*/
if ( (UtlRegisterWrite((__int64 *)a1, 0x5B54u) & 0x8000) == 0 ) /*0x41f4d*/
{
UtlRegisterRead(*(_QWORD *)a1, 10000); /*0x41f57*/
RegRegister_49(a1, 0); /*0x41f61*/
}
result = (*(__int64 (__fastcall **)(__int64))(a1 + 880))(a1); /*0x41f69*/
if ( !(_DWORD)result ) /*0x41f71*/
{
v3 = MngWriteWordField(a1, 0x4805u, 0x1387u); /*0x41f89*/
(*(void (__fastcall **)(__int64))(a1 + 984))(a1); /*0x41f8b*/
return v3; /*0x41f8b*/
}
}
return result; /*0x41f98*/
}
// Function: MngSetPowerState @ 0x41fa0 (0x46 bytes)
__int64 __fastcall MngSetPowerState(__int64 a1)
{
__int64 v2; // rdx
__int64 result; // rax
if ( *(_DWORD *)(a1 + 268) == 11 && (UtlRegisterWrite((__int64 *)a1, 0x5B54u) & 0x8000) == 0 ) /*0x41fc0*/
{
LOBYTE(v2) = 1; /*0x41fc2*/
RegRegister_49(a1, v2); /*0x41fc7*/
}
result = UtlParseKeyValue(a1); /*0x41fcf*/
if ( !(_DWORD)result ) /*0x41fd6*/
return RegRegister_14(a1); /*0x41fdb*/
return result; /*0x41fe0*/
}
// Function: MngSetPhyPower @ 0x41fe8 (0x76 bytes)
__int64 __fastcall MngSetPhyPower(__int64 a1, char a2)
{
__int64 result; // rax
int v5; // eax
__int64 v6; // r8
unsigned __int16 v7; // [rsp+30h] [rbp+8h] BYREF
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 24601, &v7); /*0x42002*/
if ( !(_DWORD)result ) /*0x4200a*/
{
if ( a2 ) /*0x4200f*/
v7 |= 4u; /*0x42011*/
else
v7 &= ~4u; /*0x4201e*/
v5 = (*(__int64 (__fastcall **)(__int64))(a1 + 904))(a1); /*0x42026*/
v6 = v7; /*0x4202c*/
if ( !v5 ) /*0x42034*/
{
LOWORD(v6) = v7 | 0x400; /*0x4203b*/
v7 |= 0x400u; /*0x4203f*/
}
return (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 24601, v6); /*0x4204d*/
}
return result; /*0x42058*/
}
// Function: MngSetWolConfig @ 0x42060 (0xf7 bytes)
__int64 __fastcall MngSetWolConfig(__int64 a1, char a2)
{
int v4; // eax
__int64 result; // rax
__int16 v6; // r8
int n2; // eax
__int16 v8; // [rsp+30h] [rbp+8h] BYREF
if ( *(_DWORD *)(a1 + 1072) == 7 ) /*0x42077*/
return 0; /*0x42077*/
v4 = UtlRegisterWrite((__int64 *)a1, 0xF10u); /*0x42082*/
if ( a2 ) /*0x42092*/
{
UtlRegisterAccess((__int64 *)a1, 0xF10u, v4 | 2); /*0x4209a*/
if ( *(_DWORD *)(a1 + 1072) != 6 ) /*0x420a6*/
return 0; /*0x4214a*/
if ( *(_DWORD *)(a1 + 268) == 7 ) /*0x420b3*/
DxeRegister_32(a1); /*0x420b8*/
goto LABEL_6; /*0x420b8*/
}
UtlRegisterAccess((__int64 *)a1, 0xF10u, v4 & 0xFFFFFFFD); /*0x42102*/
if ( *(_DWORD *)(a1 + 1072) != 6 ) /*0x4210e*/
return 0; /*0x4210e*/
n2 = *(_DWORD *)(a1 + 1096); /*0x42110*/
if ( n2 != 1 ) /*0x42119*/
{
if ( n2 != 2 ) /*0x42144*/
return 0; /*0x42144*/
LABEL_6:
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v8); /*0x420bd*/
if ( (_DWORD)result ) /*0x420d4*/
return result; /*0x420d4*/
v6 = v8 & 0xFF7F; /*0x420e1*/
goto LABEL_8; /*0x420e1*/
}
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v8); /*0x42128*/
if ( (_DWORD)result ) /*0x42130*/
return result; /*0x42130*/
v6 = v8 | 0x80; /*0x4213b*/
LABEL_8:
v8 = v6; /*0x420e5*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 16); /*0x420f0*/
if ( !(_DWORD)result ) /*0x420f8*/
return 0; /*0x420f8*/
return result; /*0x42151*/
}
// Function: MngGetWolConfig @ 0x42158 (0x169 bytes)
__int64 __fastcall MngGetWolConfig(__int64 a1, char a2)
{
unsigned int v4; // esi
int v5; // r8d
__int64 result; // rax
int n2; // eax
__int16 v8; // r8
__int16 n47; // ax
__int16 v10; // [rsp+38h] [rbp+10h] BYREF
v4 = 0; /*0x42171*/
v5 = UtlRegisterWrite((__int64 *)a1, 0xF10u); /*0x42178*/
if ( !a2 ) /*0x4217d*/
{
UtlRegisterAccess((__int64 *)a1, 0xF10u, v5 & 0xFFFFFFFB); /*0x4218f*/
if ( *(_DWORD *)(a1 + 1072) != 6 ) /*0x4219b*/
return 0; /*0x4219f*/
n2 = *(_DWORD *)(a1 + 1096); /*0x421a4*/
if ( n2 == 1 ) /*0x421ad*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v10); /*0x421bc*/
if ( (_DWORD)result ) /*0x421c4*/
return result; /*0x421c4*/
v8 = v10 | 0x80; /*0x421d3*/
}
else
{
if ( n2 != 2 ) /*0x421fa*/
return v4; /*0x421fa*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v10); /*0x4220d*/
if ( (_DWORD)result ) /*0x42215*/
return result; /*0x42215*/
v8 = v10 & 0xFF7F; /*0x42226*/
}
v10 = v8; /*0x421dc*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 16); /*0x421e2*/
v4 = result; /*0x421e8*/
if ( (_DWORD)result ) /*0x421ec*/
return result; /*0x421ec*/
return v4; /*0x422af*/
}
n47 = *(_WORD *)(a1 + 1120); /*0x4222c*/
if ( n47 != 47 && n47 != 15 && n47 != 3 ) /*0x42243*/
return v4; /*0x42243*/
UtlRegisterAccess((__int64 *)a1, 0xF10u, v5 | 4); /*0x42251*/
if ( *(_DWORD *)(a1 + 1072) != 6 ) /*0x4225d*/
return 0; /*0x4225d*/
if ( *(_DWORD *)(a1 + 268) == 7 ) /*0x4226a*/
DxeRegister_32(a1); /*0x4226f*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int16 *))(a1 + 960))(a1, 16, &v10); /*0x42283*/
if ( !(_DWORD)result ) /*0x4228b*/
{
v10 &= ~0x80u; /*0x422a1*/
return (*(unsigned int (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 16); /*0x422ad*/
}
return result; /*0x422bb*/
}
// Function: RegRegister_12 @ 0x422c4 (0x171 bytes)
__int64 __fastcall RegRegister_12(__int64 a1, unsigned int *a2)
{
int v2; // ebp
int n7; // eax
__int64 result; // rax
bool v7; // zf
unsigned int v8; // eax
int v9; // [rsp+40h] [rbp+8h] BYREF
v2 = *(_DWORD *)(a1 + 1256); /*0x422dc*/
n7 = *(_DWORD *)(a1 + 268); /*0x422e2*/
v9 = 0; /*0x422f9*/
if ( n7 < 7 ) /*0x42300*/
goto LABEL_12; /*0x42300*/
if ( n7 <= 8 ) /*0x42309*/
{
v8 = UtlRegisterWrite((__int64 *)a1, 0x10u); /*0x4236d*/
if ( (v8 & 0x300) == 0x300 ) /*0x4237d*/
{
*a2 = (v8 >> 22) & 1; /*0x42385*/
return 0; /*0x42387*/
}
LABEL_12:
v7 = *(_DWORD *)(a1 + 268) == 13; /*0x42389*/
*a2 = 0; /*0x42390*/
LOWORD(v9) = 0; /*0x42393*/
if ( v7 ) /*0x42399*/
return 0xFFFFFFFFLL; /*0x42399*/
result = DxeRegister_6(a1, 0x27u, 1, &v9); /*0x423ab*/
if ( (_DWORD)result ) /*0x423b3*/
return result; /*0x423b3*/
if ( (v9 & 0xC0) == 0x80 ) /*0x423c7*/
{
LABEL_6:
*a2 = 0; /*0x42335*/
return 0; /*0x4233a*/
}
v7 = *(_DWORD *)(a1 + 268) == 13; /*0x423cf*/
LOWORD(v9) = 0; /*0x423d6*/
if ( v7 ) /*0x423dc*/
return 0xFFFFFFFFLL; /*0x42419*/
result = DxeRegister_6(a1, 2 * v2 + 39, 1, &v9); /*0x423ee*/
if ( (_DWORD)result ) /*0x423f6*/
return result; /*0x423f6*/
v7 = (v9 & 0xC0) == 0x80; /*0x42409*/
LABEL_18:
if ( v7 ) /*0x4240d*/
{
*a2 = 1; /*0x42411*/
return 0; /*0x42417*/
}
return 0xFFFFFFFFLL; /*0x4240d*/
}
if ( n7 != 13 ) /*0x4230e*/
goto LABEL_12; /*0x4230e*/
*a2 = 0; /*0x42310*/
result = DxeRegister_9(a1, 19, &v9); /*0x4231a*/
if ( (_DWORD)result ) /*0x42322*/
return result; /*0x42322*/
if ( (BYTE1(v9) & 0xC0) == 0x80 ) /*0x42331*/
goto LABEL_6; /*0x42333*/
result = DxeRegister_9(a1, v2 + 19, &v9); /*0x4234a*/
if ( !(_DWORD)result ) /*0x42352*/
{
v7 = (BYTE1(v9) & 0xC0) == 0x80; /*0x42361*/
goto LABEL_18; /*0x42363*/
}
return result; /*0x4242b*/
}
// Function: DxeRegister_3 @ 0x42438 (0x1fa bytes)
__int64 __fastcall DxeRegister_3(__int64 a1, unsigned __int16 a2, unsigned __int16 a3, __int64 a4)
{
unsigned __int16 v5; // ax
unsigned int v7; // edi
__int64 v9; // r8
int v10; // eax
unsigned int v11; // ecx
int v12; // r15d
__int16 v13; // r15
unsigned int v14; // r14d
unsigned __int16 v15; // bp
unsigned __int64 v16; // rax
unsigned __int64 v17; // rsi
unsigned int v18; // eax
unsigned int v20; // [rsp+20h] [rbp-48h] BYREF
int v21; // [rsp+24h] [rbp-44h]
unsigned int v22; // [rsp+70h] [rbp+8h] BYREF
unsigned __int16 v23; // [rsp+78h] [rbp+10h]
unsigned __int16 v24; // [rsp+80h] [rbp+18h]
v24 = a3; /*0x4243f*/
v23 = a2; /*0x42444*/
v20 = 0; /*0x42461*/
v22 = 0; /*0x42465*/
v5 = *(_WORD *)(a1 + 1264); /*0x42469*/
v7 = 0; /*0x42473*/
if ( a2 >= v5 ) /*0x42479*/
return (unsigned int)-1; /*0x42479*/
v21 = a3; /*0x4248b*/
if ( a3 > v5 - a2 || !a3 ) /*0x4249b*/
return (unsigned int)-1; /*0x42613*/
(*(void (__fastcall **)(__int64))(a1 + 1152))(a1); /*0x424a4*/
v10 = RegRegister_12(a1, &v20, v9); /*0x424b2*/
v11 = v20; /*0x424b7*/
if ( v10 ) /*0x424bf*/
v11 = 0; /*0x424bf*/
if ( v11 ) /*0x424c4*/
v12 = *(_DWORD *)(a1 + 1256); /*0x424c6*/
else
LOWORD(v12) = 0; /*0x424cf*/
v13 = a2 + v12; /*0x424d2*/
v14 = 0; /*0x424d5*/
v15 = 0; /*0x424d8*/
do /*0x42602*/
{
if ( v21 - v15 == 1 ) /*0x424f9*/
{
v16 = v15 + (unsigned __int64)v23; /*0x42503*/
if ( *(_BYTE *)(a1 + 4 * v16 + 1316) ) /*0x42506*/
{
LOWORD(v16) = *(_WORD *)(a1 + 4 * v16 + 1314); /*0x4250f*/
}
else
{
v14 = DxeRegister_9(a1, (unsigned __int16)(v15 + v13 - ((v15 + v13) & 1)), &v22); /*0x4253e*/
if ( v14 ) /*0x42543*/
break; /*0x42543*/
v7 = v22; /*0x42549*/
if ( (((_BYTE)v15 + (_BYTE)v13) & 1) == 0 ) /*0x42558*/
{
*(_WORD *)(a4 + 2LL * v15) = v22; /*0x4255a*/
goto LABEL_29; /*0x42560*/
}
LODWORD(v16) = HIWORD(v22); /*0x42567*/
}
*(_WORD *)(a4 + 2LL * v15) = v16; /*0x4256a*/
}
else
{
v17 = v15 + (unsigned __int64)v23; /*0x4257e*/
if ( !*(_BYTE *)(a1 + 4 * v17 + 1316) || !*(_BYTE *)(a1 + 4 * v17 + 1320) ) /*0x4258a*/
{
v14 = DxeRegister_9(a1, (unsigned __int16)(v15 + v13), &v22); /*0x425aa*/
if ( v14 ) /*0x425af*/
break; /*0x425af*/
v7 = v22; /*0x425b1*/
}
if ( *(_BYTE *)(a1 + 4 * v17 + 1316) ) /*0x425b9*/
*(_WORD *)(a4 + 2LL * v15) = *(_WORD *)(a1 + 4 * v17 + 1314); /*0x425ca*/
else
*(_WORD *)(a4 + 2LL * v15) = v7; /*0x425d2*/
if ( *(_BYTE *)(a1 + 4 * v17 + 1316) ) /*0x425d8*/
LOWORD(v18) = *(_WORD *)(a1 + 4 * v17 + 1318); /*0x425e1*/
else
v18 = HIWORD(v7); /*0x425ed*/
*(_WORD *)(a4 + 2LL * v15 + 2) = v18; /*0x425f0*/
}
LABEL_29:
v15 += 2; /*0x425f6*/
}
while ( v15 < v24 ); /*0x42602*/
(*(void (__fastcall **)(__int64))(a1 + 1168))(a1); /*0x42608*/
return v14; /*0x42622*/
}
// Function: DxeRegister_7 @ 0x42634 (0x123 bytes)
__int64 __fastcall DxeRegister_7(__int64 a1, unsigned __int16 a2, unsigned __int16 a3, __int64 a4)
{
unsigned __int16 v6; // ax
int v9; // edi
__int64 v10; // r8
int v11; // eax
unsigned int v12; // ecx
int v13; // r12d
int v14; // r12d
unsigned __int16 v15; // si
unsigned int i; // edi
unsigned __int64 v17; // rax
unsigned int v19; // [rsp+58h] [rbp+10h] BYREF
v19 = 0; /*0x4265a*/
v6 = *(_WORD *)(a1 + 1264); /*0x4265e*/
if ( a2 < v6 && (v9 = a2, a3 <= v6 - a2) && a3 ) /*0x42690*/
{
(*(void (**)(void))(a1 + 1152))(); /*0x42696*/
v11 = RegRegister_12(a1, &v19, v10); /*0x426a4*/
v12 = v19; /*0x426a9*/
if ( v11 ) /*0x426b0*/
v12 = 0; /*0x426b0*/
if ( v12 ) /*0x426b7*/
v13 = *(_DWORD *)(a1 + 1256); /*0x426b9*/
else
v13 = 0; /*0x426c2*/
v14 = v9 + v13; /*0x426c5*/
v15 = 0; /*0x426c8*/
for ( i = 0; v15 < a3; ++v15 ) /*0x426d3*/
{
v17 = a2 + (unsigned __int64)v15; /*0x426dd*/
if ( *(_BYTE *)(a1 + 4 * v17 + 1316) ) /*0x426e1*/
{
*(_WORD *)(a4 + 2LL * v15) = *(_WORD *)(a1 + 4 * v17 + 1314); /*0x426f3*/
}
else
{
i = DxeRegister_6(a1, 2 * (v14 + (unsigned int)v15), 2, &v19); /*0x42712*/
if ( i ) /*0x42716*/
break; /*0x42716*/
*(_WORD *)(a4 + 2LL * v15) = v19; /*0x4271d*/
}
}
(*(void (__fastcall **)(__int64))(a1 + 1168))(a1); /*0x4272a*/
}
else
{
return (unsigned int)-1; /*0x42735*/
}
return i; /*0x42749*/
}
// Function: DxeRegister_13 @ 0x42758 (0x103 bytes)
__int64 __fastcall DxeRegister_13(__int64 a1)
{
unsigned int v1; // esi
__int16 v3; // bx
unsigned __int16 v4; // bx
unsigned __int16 v5; // bx
int v6; // ebx
__int16 v7; // ax
unsigned __int16 v8; // ax
v1 = -1; /*0x42771*/
v3 = NvmReadWordConfig(a1, 4u); /*0x42783*/
if ( (v3 & 0x4000) != 0 ) /*0x4278e*/
{
v4 = v3 | 6; /*0x42794*/
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x427a5*/
NvmWriteByteConfig(a1, 4u, v4); /*0x427ab*/
else
NvmWriteWordConfig(a1, 4u, v4); /*0x427b6*/
if ( (v4 & 0x20) != 0 ) /*0x427be*/
{
v6 = 0; /*0x427eb*/
while ( 1 ) /*0x427f6*/
{
v7 = NvmReadWordConfig(a1, 4u); /*0x427f6*/
if ( (v7 & 0x20) == 0 ) /*0x427fd*/
break; /*0x427fd*/
UtlRegisterRead(*(_QWORD *)a1, 1); /*0x42805*/
if ( ++v6 >= 10000000 ) /*0x42812*/
return v1; /*0x42812*/
}
v1 = 0; /*0x42816*/
v8 = v7 | 1; /*0x42818*/
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x42828*/
NvmWriteByteConfig(a1, 4u, v8); /*0x4282e*/
else
NvmWriteWordConfig(a1, 4u, v8); /*0x42839*/
}
else
{
v5 = v4 | 1; /*0x427c0*/
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x427d1*/
NvmWriteByteConfig(a1, 4u, v5); /*0x427d7*/
else
NvmWriteWordConfig(a1, 4u, v5); /*0x427e2*/
return 0; /*0x427e7*/
}
}
return v1; /*0x42854*/
}
// Function: DxeRegister_17 @ 0x4285c (0xbe bytes)
__int64 __fastcall DxeRegister_17(__int64 a1, int n10000000)
{
unsigned int v2; // esi
unsigned int v4; // eax
unsigned __int16 v5; // ax
char WordConfig; // bl
unsigned int n0x989680; // r11d
v2 = 0; /*0x42870*/
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x4287f*/
v4 = (unsigned int)NvmReadByteConfig(a1, 4u) >> 16; /*0x42889*/
else
LOWORD(v4) = NvmReadWordConfig(a1, 6u); /*0x42890*/
v5 = v4 | 1; /*0x4289d*/
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x428a7*/
NvmWriteByteConfig(a1, 4u, v5 << 16); /*0x428b4*/
else
NvmWriteWordConfig(a1, 6u, v5); /*0x428c1*/
do /*0x428f2*/
{
WordConfig = NvmReadWordConfig(a1, 4u); /*0x428d3*/
if ( (WordConfig & 1) != 0 ) /*0x428d9*/
break; /*0x428d9*/
UtlRegisterRead(*(_QWORD *)a1, 1); /*0x428e1*/
n0x989680 = v2++; /*0x428e6*/
}
while ( n0x989680 < 0x989680 ); /*0x428f2*/
if ( (WordConfig & 1) == 0 || (WordConfig & 2) != 0 ) /*0x428fc*/
return 0xFFFFFFFFLL; /*0x42902*/
else
return 0; /*0x428fe*/
}
// Function: DxeRegister_9 @ 0x4291c (0x10d bytes)
__int64 __fastcall DxeRegister_9(__int64 a1, int a2, _DWORD *a3)
{
unsigned __int8 v3; // bp
int v6; // ebx
unsigned int v7; // esi
__int64 ByteConfig; // rax
char WordConfig; // al
unsigned __int8 n0xA; // al
v3 = 0; /*0x4293c*/
if ( (unsigned int)(2 * a2) <= 0xFFFFFF && *(_DWORD *)(a1 + 268) == 13 ) /*0x42956*/
{
v6 = *(_DWORD *)(a1 + 1260) + ((2 * a2) & 0xFFFFFF); /*0x4295e*/
while ( 1 ) /*0x4296c*/
{
UtlRegisterRead(*(_QWORD *)a1, 1); /*0x4296c*/
v7 = DxeRegister_13(a1); /*0x42979*/
if ( v7 ) /*0x4297d*/
break; /*0x4297d*/
ByteConfig = NvmReadByteConfig(a1, 4u); /*0x42989*/
NvmWriteByteConfig(a1, 4u, (WORD1(ByteConfig) & 0xFCF9 | 0x300) << 16); /*0x429af*/
NvmWriteByteConfig(a1, 8u, v6); /*0x429bd*/
v7 = DxeRegister_17(a1, 10000000); /*0x429d2*/
if ( !v7 ) /*0x429d6*/
{
*a3 = NvmReadByteConfig(a1, 0x10u); /*0x42a03*/
return v7; /*0x42a07*/
}
WordConfig = NvmReadWordConfig(a1, 4u); /*0x429dd*/
if ( (WordConfig & 2) != 0 || (WordConfig & 1) != 0 ) /*0x429e8*/
{
n0xA = v3++; /*0x429ea*/
if ( n0xA < 0xAu ) /*0x429f2*/
continue; /*0x429f2*/
}
return v7; /*0x429f2*/
}
}
else
{
return (unsigned int)-1; /*0x42a09*/
}
return v7; /*0x42a22*/
}
// Function: DxeRegister_6 @ 0x42a2c (0x128 bytes)
__int64 __fastcall DxeRegister_6(__int64 a1, unsigned int n39, char n2, _WORD *a4)
{
unsigned __int8 v4; // si
int v8; // edi
unsigned int v9; // r12d
__int16 WordConfig; // ax
char v11; // al
unsigned __int8 n0xA; // al
__int16 ByteConfig; // ax
v4 = 0; /*0x42a4e*/
if ( n39 > 0xFFFFFF ) /*0x42a5e*/
return 0xFFFFFFFFLL; /*0x42b32*/
v8 = *(_DWORD *)(a1 + 1260) + (n39 & 0xFFFFFF); /*0x42a6c*/
while ( 1 ) /*0x42a78*/
{
UtlRegisterRead(*(_QWORD *)a1, 1); /*0x42a78*/
v9 = DxeRegister_13(a1); /*0x42a85*/
if ( v9 ) /*0x42a8a*/
break; /*0x42a8a*/
WordConfig = NvmReadWordConfig(a1, 6u); /*0x42a96*/
NvmWriteWordConfig(a1, 6u, (((n2 - 1) & 3) << 8) | WordConfig & 0xFCF9); /*0x42ac1*/
NvmWriteByteConfig(a1, 8u, v8); /*0x42ad1*/
v9 = DxeRegister_17(a1, 10000000); /*0x42ae6*/
if ( !v9 ) /*0x42aeb*/
{
ByteConfig = NvmReadByteConfig(a1, 0x10u); /*0x42b14*/
if ( n2 == 1 ) /*0x42b1c*/
{
ByteConfig = (unsigned __int8)ByteConfig; /*0x42b1e*/
}
else if ( n2 != 2 ) /*0x42b27*/
{
return v9; /*0x42b27*/
}
*a4 = ByteConfig; /*0x42b29*/
return v9; /*0x42b29*/
}
v11 = NvmReadWordConfig(a1, 4u); /*0x42af2*/
if ( (v11 & 2) != 0 || (v11 & 1) != 0 ) /*0x42afe*/
{
n0xA = v4++; /*0x42b00*/
if ( n0xA < 0xAu ) /*0x42b08*/
continue; /*0x42b08*/
}
return v9; /*0x42b08*/
}
return v9; /*0x42b49*/
}
// Function: RegRegisterWriteBlock @ 0x42b54 (0xa8 bytes)
__int64 __fastcall RegRegisterWriteBlock(__int64 a1, unsigned __int16 a2, unsigned __int16 a3, __int16 *a4)
{
unsigned __int16 v4; // ax
__int64 v9; // r12
__int64 v10; // rdx
__int64 v11; // rcx
__int16 v12; // ax
v4 = *(_WORD *)(a1 + 1264); /*0x42b6c*/
if ( a2 >= v4 ) /*0x42b83*/
return 0xFFFFFFFFLL; /*0x42b83*/
v9 = a3; /*0x42b8c*/
if ( a3 > v4 - a2 || !a3 ) /*0x42b9f*/
return 0xFFFFFFFFLL; /*0x42be0*/
(*(void (**)(void))(a1 + 1152))(); /*0x42ba1*/
if ( a3 ) /*0x42bab*/
{
v10 = v9; /*0x42bb0*/
v11 = a1 + 4LL * a2 + 1314; /*0x42bb3*/
do /*0x42bd1*/
{
*(_BYTE *)(v11 + 2) = 1; /*0x42bbb*/
v12 = *a4++; /*0x42bbf*/
*(_WORD *)v11 = v12; /*0x42bc6*/
v11 += 4; /*0x42bc9*/
--v10; /*0x42bcd*/
}
while ( v10 ); /*0x42bd1*/
}
(*(void (__fastcall **)(__int64))(a1 + 1168))(a1); /*0x42bd6*/
return 0; /*0x42bf2*/
}
// Function: RegRegister_2 @ 0x42bfc (0x208 bytes)
__int64 __fastcall RegRegister_2(__int64 a1)
{
unsigned int n18; // ebp
unsigned int v3; // edi
int v4; // eax
unsigned int v5; // ecx
int v6; // r15d
int v7; // r14d
int v8; // edx
unsigned __int16 *v9; // r12
__int64 n2048; // r13
int v11; // esi
__int64 v12; // rax
int v14; // [rsp+60h] [rbp+8h] BYREF
unsigned int v15; // [rsp+68h] [rbp+10h] BYREF
n18 = 0; /*0x42c10*/
v14 = 0; /*0x42c15*/
v3 = NvmCalcProtocolChecksum(a1); /*0x42c1e*/
if ( !v3 && *(_DWORD *)(a1 + 1248) == 6 ) /*0x42c2f*/
{
(*(void (__fastcall **)(__int64))(a1 + 1152))(a1); /*0x42c38*/
v4 = RegRegister_12(a1, &v15); /*0x42c46*/
v5 = v15; /*0x42c4b*/
if ( v4 ) /*0x42c51*/
v5 = 0; /*0x42c51*/
if ( v5 ) /*0x42c59*/
{
v7 = *(_DWORD *)(a1 + 1256); /*0x42c6a*/
v6 = 0; /*0x42c71*/
v8 = 0; /*0x42c74*/
}
else
{
v6 = *(_DWORD *)(a1 + 1256); /*0x42c5b*/
v7 = 0; /*0x42c62*/
v8 = 1; /*0x42c65*/
}
v3 = DxeRegister_48((_DWORD *)a1, v8); /*0x42c7b*/
if ( !v3 ) /*0x42c7f*/
{
v9 = (unsigned __int16 *)(a1 + 1318); /*0x42c85*/
n2048 = 2048; /*0x42c8c*/
while ( 1 ) /*0x42caa*/
{
v3 = DxeRegister_9(a1, n18 + v7, &v14); /*0x42caa*/
if ( *((_BYTE *)v9 - 2) ) /*0x42ca4*/
{
v11 = v14 & 0xFFFF0000 | *(v9 - 2); /*0x42cbd*/
v14 = v11; /*0x42cbf*/
}
else
{
v11 = v14; /*0x42cc5*/
}
if ( *((_BYTE *)v9 + 2) ) /*0x42cc9*/
{
v11 = (*v9 << 16) ^ (unsigned __int16)v11; /*0x42ce6*/
v14 = v11; /*0x42ce8*/
}
if ( v3 ) /*0x42cee*/
break; /*0x42cee*/
if ( n18 == 18 ) /*0x42cf7*/
{
v11 |= 0xC0000000; /*0x42cf9*/
v14 = v11; /*0x42cff*/
}
UtlRegisterRead(*(_QWORD *)a1, 100); /*0x42d0b*/
v3 = DxeRegister_21((__int64 *)a1, n18 + v6, v11); /*0x42d20*/
if ( v3 ) /*0x42d24*/
break; /*0x42d24*/
n18 += 2; /*0x42d2a*/
v9 += 4; /*0x42d2d*/
if ( n18 >= 0x800 ) /*0x42d34*/
{
v3 = DxeRegister_9(a1, v6 + 18, &v14); /*0x42d4d*/
if ( !v3 ) /*0x42d51*/
{
v14 &= ~0x40000000u; /*0x42d64*/
v3 = DxeRegister_21((__int64 *)a1, v6 + 18, v14); /*0x42d6e*/
if ( !v3 ) /*0x42d72*/
{
v3 = DxeRegister_9(a1, v7 + 18, &v14); /*0x42d85*/
if ( !v3 ) /*0x42d89*/
{
v3 = DxeRegister_21((__int64 *)a1, v7 + 18, v14 & 0xFFFFFF); /*0x42da3*/
if ( !v3 ) /*0x42da7*/
{
v12 = a1 + 1314; /*0x42da9*/
do /*0x42dc4*/
{
*(_BYTE *)(v12 + 2) = 0; /*0x42db5*/
*(_WORD *)v12 = -1; /*0x42db9*/
v12 += 4; /*0x42dbc*/
--n2048; /*0x42dc0*/
}
while ( n2048 ); /*0x42dc4*/
}
}
}
}
break; /*0x42dc4*/
}
}
}
(*(void (__fastcall **)(__int64))(a1 + 1168))(a1); /*0x42dca*/
if ( !v3 ) /*0x42dd5*/
{
(*(void (__fastcall **)(__int64))(a1 + 1176))(a1); /*0x42dda*/
UtlRegisterRead(*(_QWORD *)a1, 10000); /*0x42de8*/
}
}
return v3; /*0x42df4*/
}
// Function: RegRegister_1 @ 0x42e04 (0x216 bytes)
__int64 __fastcall RegRegister_1(__int64 a1)
{
unsigned int n19; // r12d
unsigned int v3; // edi
int v4; // eax
unsigned int v5; // ecx
int v6; // r15d
int v7; // edx
__int64 v8; // rbp
__int64 n2048; // r14
__int64 v10; // r13
__int16 v11; // si
__int64 v12; // rcx
unsigned int n0xFFFFFF; // edi
unsigned int v14; // esi
__int16 v16; // [rsp+60h] [rbp+8h] BYREF
unsigned int v17; // [rsp+68h] [rbp+10h] BYREF
unsigned int n0xFFFFFF_1; // [rsp+70h] [rbp+18h]
n19 = 0; /*0x42e18*/
v16 = 0; /*0x42e1e*/
v3 = NvmCalcProtocolChecksum(a1); /*0x42e29*/
if ( !v3 && *(_DWORD *)(a1 + 1248) == 6 ) /*0x42e3b*/
{
(*(void (__fastcall **)(__int64))(a1 + 1152))(a1); /*0x42e44*/
v4 = RegRegister_12(a1, &v17); /*0x42e52*/
v5 = v17; /*0x42e57*/
if ( v4 ) /*0x42e5e*/
v5 = 0; /*0x42e5e*/
if ( v5 ) /*0x42e68*/
{
v6 = *(_DWORD *)(a1 + 1256); /*0x42e7e*/
v17 = 0; /*0x42e85*/
v7 = 0; /*0x42e8a*/
}
else
{
v6 = 0; /*0x42e70*/
v7 = 1; /*0x42e73*/
v17 = *(_DWORD *)(a1 + 1256); /*0x42e78*/
}
v3 = DxeRegister_48((_DWORD *)a1, v7); /*0x42e91*/
if ( !v3 ) /*0x42e96*/
{
v8 = a1 + 1314; /*0x42e9c*/
n2048 = 2048; /*0x42ea3*/
v10 = a1 + 1314; /*0x42ea9*/
while ( 1 ) /*0x42eb1*/
{
if ( *(_BYTE *)(v10 + 2) ) /*0x42eac*/
{
v11 = *(_WORD *)v10; /*0x42eb3*/
v16 = *(_WORD *)v10; /*0x42eb8*/
}
else
{
v3 = DxeRegister_6(a1, 2 * (n19 + v6), 2, &v16); /*0x42ed5*/
if ( v3 ) /*0x42ed9*/
break; /*0x42ed9*/
v11 = v16; /*0x42edf*/
}
if ( n19 == 19 ) /*0x42ee8*/
{
v11 |= 0xC000u; /*0x42eef*/
v16 = v11; /*0x42ef2*/
}
v12 = *(_QWORD *)a1; /*0x42efb*/
n0xFFFFFF = 2 * (n19 + v17); /*0x42f07*/
n0xFFFFFF_1 = n0xFFFFFF; /*0x42f09*/
UtlRegisterRead(v12, 100); /*0x42f0d*/
v3 = DxeRegister_23((__int64 *)a1, n0xFFFFFF, v11); /*0x42f1f*/
if ( v3 ) /*0x42f23*/
break; /*0x42f23*/
UtlRegisterRead(*(_QWORD *)a1, 100); /*0x42f2f*/
v3 = DxeRegister_23((__int64 *)a1, n0xFFFFFF_1 + 1, HIBYTE(v11)); /*0x42f49*/
if ( v3 ) /*0x42f4d*/
break; /*0x42f4d*/
++n19; /*0x42f53*/
v10 += 4; /*0x42f56*/
if ( n19 >= 0x800 ) /*0x42f5d*/
{
v14 = v17; /*0x42f63*/
v3 = DxeRegister_6(a1, 2 * v17 + 38, 2, &v16); /*0x42f7e*/
if ( !v3 ) /*0x42f83*/
{
v3 = DxeRegister_23((__int64 *)a1, 2 * v14 + 39, (unsigned __int16)(v16 & 0xBFFF) >> 8); /*0x42fa5*/
if ( !v3 ) /*0x42faa*/
{
v3 = DxeRegister_23((__int64 *)a1, 2 * v6 + 39, 0); /*0x42fbc*/
if ( !v3 ) /*0x42fc1*/
{
do /*0x42fd8*/
{
*(_BYTE *)(v8 + 2) = 0; /*0x42fc8*/
*(_WORD *)v8 = -1; /*0x42fcc*/
v8 += 4; /*0x42fd0*/
--n2048; /*0x42fd4*/
}
while ( n2048 ); /*0x42fd8*/
}
}
}
break; /*0x42fd8*/
}
}
}
(*(void (__fastcall **)(__int64))(a1 + 1168))(a1); /*0x42fdf*/
if ( !v3 ) /*0x42feb*/
{
(*(void (__fastcall **)(__int64))(a1 + 1176))(a1); /*0x42ff0*/
UtlRegisterRead(*(_QWORD *)a1, 10000); /*0x42ffe*/
}
}
return v3; /*0x4300a*/
}
// Function: NvmInitMacAddress @ 0x4301c (0xa2 bytes)
__int64 __fastcall NvmInitMacAddress(__int64 a1)
{
unsigned __int16 n25; // si
__int16 n64; // di
__int64 result; // rax
unsigned __int16 v5; // [rsp+30h] [rbp+8h] BYREF
if ( (unsigned int)(*(_DWORD *)(a1 + 268) - 12) > 1 ) /*0x43043*/
{
n25 = 25; /*0x4304d*/
n64 = 64; /*0x43052*/
}
else
{
n25 = 3; /*0x43045*/
n64 = 1; /*0x43048*/
}
result = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, unsigned __int16 *))(a1 + 1160))(a1, n25, 1, &v5); /*0x43060*/
if ( !(_DWORD)result ) /*0x43068*/
{
if ( (v5 & (unsigned __int16)n64) != 0 ) /*0x43072*/
return NiiParseMacString(a1); /*0x43072*/
v5 |= n64; /*0x43085*/
result = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64, unsigned __int16 *))(a1 + 1208))(a1, n25, 1, &v5); /*0x4308a*/
if ( !(_DWORD)result ) /*0x43092*/
{
result = (*(__int64 (__fastcall **)(__int64))(a1 + 1184))(a1); /*0x43097*/
if ( !(_DWORD)result ) /*0x4309f*/
return NiiParseMacString(a1); /*0x430a4*/
}
}
return result; /*0x430b8*/
}
// Function: DxeRegister_5 @ 0x430c0 (0x139 bytes)
__int64 __fastcall DxeRegister_5(__int64 a1, unsigned int n0xFFFFFF, int a3)
{
unsigned __int8 v3; // bp
int v7; // edi
unsigned int v8; // esi
unsigned int v9; // eax
unsigned __int16 v10; // ax
char WordConfig; // al
unsigned __int8 n0xA; // al
v3 = 0; /*0x430d9*/
if ( *(_DWORD *)(a1 + 268) == 13 && n0xFFFFFF > 0xFFFFFF ) /*0x430f4*/
return 0xFFFFFFFFLL; /*0x430f6*/
v7 = *(_DWORD *)(a1 + 1260) + (n0xFFFFFF & 0xFFFFFF); /*0x43100*/
do /*0x431d6*/
{
UtlRegisterRead(*(_QWORD *)a1, 1); /*0x4310e*/
v8 = DxeRegister_13(a1); /*0x4311b*/
if ( v8 ) /*0x4311f*/
break; /*0x4311f*/
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x4312f*/
v9 = (unsigned int)NvmReadByteConfig(a1, 4u) >> 16; /*0x43139*/
else
LOWORD(v9) = NvmReadWordConfig(a1, 6u); /*0x43143*/
v10 = v9 & 0xFCF9 | 0x304; /*0x43155*/
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x43162*/
NvmWriteByteConfig(a1, 4u, v10 << 16); /*0x43171*/
else
NvmWriteWordConfig(a1, 6u, v10); /*0x43181*/
NvmWriteByteConfig(a1, 8u, v7); /*0x43191*/
NvmWriteByteConfig(a1, 0x10u, a3); /*0x431a1*/
v8 = DxeRegister_17(a1, 10000000); /*0x431b3*/
if ( !v8 ) /*0x431b7*/
break; /*0x431b7*/
WordConfig = NvmReadWordConfig(a1, 4u); /*0x431c1*/
if ( (WordConfig & 2) == 0 && (WordConfig & 1) == 0 ) /*0x431cc*/
break; /*0x431cc*/
n0xA = v3++; /*0x431ce*/
}
while ( n0xA < 0xAu ); /*0x431d6*/
return v8; /*0x431f2*/
}
// Function: DxeRegister_4 @ 0x431fc (0x13a bytes)
__int64 __fastcall DxeRegister_4(__int64 a1, unsigned int n0xFFFFFF, unsigned __int8 a3)
{
unsigned __int8 v3; // bp
int v5; // r12d
int v6; // esi
unsigned int v7; // ebx
unsigned int v8; // eax
unsigned __int16 v9; // ax
char WordConfig; // al
unsigned __int8 n0xA; // al
v3 = 0; /*0x43214*/
v5 = a3; /*0x43223*/
if ( *(_DWORD *)(a1 + 268) == 13 || n0xFFFFFF > 0xFFFFFF ) /*0x43234*/
{
return (unsigned int)-1; /*0x43318*/
}
else
{
v6 = *(_DWORD *)(a1 + 1260) + (n0xFFFFFF & 0xFFFFFF); /*0x43242*/
do /*0x43310*/
{
UtlRegisterRead(*(_QWORD *)a1, 1); /*0x43250*/
v7 = DxeRegister_13(a1); /*0x4325d*/
if ( v7 ) /*0x43261*/
break; /*0x43261*/
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x43271*/
v8 = (unsigned int)NvmReadByteConfig(a1, 4u) >> 16; /*0x4327b*/
else
LOWORD(v8) = NvmReadWordConfig(a1, 6u); /*0x43285*/
v9 = v8 & 0xFCF9 | 4; /*0x43295*/
if ( *(_DWORD *)(a1 + 268) == 13 ) /*0x432a0*/
NvmWriteByteConfig(a1, 4u, v9 << 16); /*0x432ad*/
else
NvmWriteWordConfig(a1, 6u, v9); /*0x432bd*/
NvmWriteByteConfig(a1, 8u, v6); /*0x432cd*/
NvmWriteByteConfig(a1, 0x10u, v5); /*0x432dd*/
v7 = DxeRegister_17(a1, 10000000); /*0x432ef*/
if ( !v7 ) /*0x432f3*/
break; /*0x432f3*/
WordConfig = NvmReadWordConfig(a1, 4u); /*0x432fb*/
if ( (WordConfig & 2) == 0 && (WordConfig & 1) == 0 ) /*0x43306*/
break; /*0x43306*/
n0xA = v3++; /*0x43308*/
}
while ( n0xA < 0xAu ); /*0x43310*/
}
return v7; /*0x4332c*/
}
// Function: DxeRegister_21 @ 0x43338 (0x97 bytes)
__int64 __fastcall DxeRegister_21(__int64 *a1, int a2, int a3)
{
unsigned int n0xFFFFFF; // esi
int v6; // ebx
unsigned __int16 i; // di
n0xFFFFFF = 2 * a2; /*0x4335d*/
v6 = 0; /*0x43366*/
if ( !(unsigned int)DxeRegister_5((__int64)a1, 2 * a2, a3) ) /*0x43361*/
return 0; /*0x4336c*/
for ( i = 0; i < 0x64u; ++i ) /*0x43376*/
{
UtlRegisterRead(*a1, 100); /*0x43384*/
if ( !(unsigned int)DxeRegister_5((__int64)a1, n0xFFFFFF, a3) ) /*0x43391*/
break; /*0x43398*/
}
LOBYTE(v6) = i != 100; /*0x433a8*/
return (unsigned int)(v6 - 1); /*0x433c4*/
}
// Function: DxeRegister_23 @ 0x433d0 (0x94 bytes)
__int64 __fastcall DxeRegister_23(__int64 *a1, unsigned int n0xFFFFFF, unsigned __int8 a3)
{
int v6; // ebx
unsigned __int16 i; // di
v6 = 0; /*0x433fb*/
if ( !(unsigned int)DxeRegister_4((__int64)a1, n0xFFFFFF, a3) ) /*0x433f6*/
return 0; /*0x43401*/
for ( i = 0; i < 0x64u; ++i ) /*0x4340b*/
{
UtlRegisterRead(*a1, 100); /*0x43418*/
if ( !(unsigned int)DxeRegister_4((__int64)a1, n0xFFFFFF, a3) ) /*0x43426*/
break; /*0x4342d*/
}
LOBYTE(v6) = i != 100; /*0x4343d*/
return (unsigned int)(v6 - 1); /*0x43459*/
}
// Function: DxeRegister_48 @ 0x43464 (0x180 bytes)
__int64 __fastcall DxeRegister_48(_DWORD *a1, int a2)
{
int v3; // r15d
unsigned int v5; // ebp
unsigned int v6; // r11d
int v7; // r11d
int v8; // r11d
int v9; // r11d
__int64 result; // rax
__int64 *n0x8000; // rsi
int v12; // ebx
int v13; // r13d
int v14; // r12d
int v15; // r14d
unsigned int v16; // eax
unsigned __int16 v17; // ax
unsigned int v18; // ebp
char WordConfig; // al
v3 = 0; /*0x43489*/
v5 = 2 * a1[314]; /*0x43493*/
LOWORD(v6) = NvmReadWordConfig((__int64)a1, 4u); /*0x4349a*/
v7 = (v6 >> 3) & 3; /*0x434a6*/
if ( v7 ) /*0x434aa*/
{
v8 = v7 - 1; /*0x434ac*/
if ( v8 ) /*0x434af*/
{
v9 = v8 - 1; /*0x434b1*/
if ( v9 ) /*0x434b4*/
{
if ( v9 != 1 ) /*0x434b9*/
return 0xFFFFFFFFLL; /*0x434be*/
n0x8000 = n0x8000_0; /*0x434c3*/
}
else
{
LODWORD(n0x8000) = 0x2000; /*0x434ca*/
}
}
else
{
LODWORD(n0x8000) = 4096; /*0x434d1*/
}
v12 = 1; /*0x434d6*/
}
else
{
LODWORD(n0x8000) = 256; /*0x434dc*/
v12 = v5 >> 8; /*0x434e1*/
}
v13 = 0; /*0x434ea*/
v14 = a1[315] + (a2 != 0 ? v5 : 0);
if ( v12 <= 0 ) /*0x434f9*/
return 0; /*0x435c1*/
v15 = 0; /*0x434ff*/
while ( 1 ) /*0x4350a*/
{
result = DxeRegister_13((__int64)a1); /*0x4350a*/
if ( (_DWORD)result ) /*0x43511*/
break; /*0x43511*/
if ( a1[67] == 13 ) /*0x43521*/
v16 = (unsigned int)NvmReadByteConfig((__int64)a1, 4u) >> 16; /*0x4352b*/
else
LOWORD(v16) = NvmReadWordConfig((__int64)a1, 6u); /*0x43532*/
v17 = v16 | 6; /*0x43537*/
if ( a1[67] == 13 ) /*0x43544*/
NvmWriteByteConfig((__int64)a1, 4u, v17 << 16); /*0x43553*/
else
NvmWriteWordConfig((__int64)a1, 6u, v17); /*0x43560*/
v14 += v15; /*0x43565*/
NvmWriteByteConfig((__int64)a1, 8u, v14); /*0x43573*/
v18 = DxeRegister_17((__int64)a1, 10000000); /*0x43585*/
if ( v18 ) /*0x43589*/
{
WordConfig = NvmReadWordConfig((__int64)a1, 4u); /*0x43593*/
if ( (WordConfig & 2) == 0 && (WordConfig & 1) == 0 ) /*0x4359e*/
return v18; /*0x435e0*/
if ( ++v3 < 10 ) /*0x435ac*/
continue; /*0x435ac*/
}
++v13; /*0x435b2*/
v15 += (int)n0x8000; /*0x435b5*/
if ( v13 >= v12 ) /*0x435bb*/
return 0; /*0x435bb*/
}
return result; /*0x435d2*/
}
// Function: NvmReadDefaultWord @ 0x435e4 (0x43 bytes)
__int64 __fastcall NvmReadDefaultWord(__int64 a1, _WORD *a2)
{
__int64 result; // rax
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64, _WORD *))(a1 + 1160))(a1, 4, 1, a2); /*0x435fc*/
if ( !(_DWORD)result ) /*0x43606*/
{
if ( !*a2 || *a2 == 0xFFFF ) /*0x43615*/
*a2 = 6529; /*0x4361c*/
return 0; /*0x4361f*/
}
return result; /*0x43621*/
}
// Function: MngUpdateFwImage @ 0x43628 (0x101 bytes)
__int64 __fastcall MngUpdateFwImage(__int64 a1)
{
__int64 result; // rax
char v3; // di
int v4; // eax
unsigned __int16 n0x14; // r9
unsigned int n4; // r8d
int n2; // eax
unsigned int v8; // r8d
unsigned int v9; // r8d
unsigned int v10; // r8d
unsigned int v11; // r8d
unsigned int v12; // r8d
int n10; // eax
unsigned __int16 v14; // [rsp+30h] [rbp+8h] BYREF
result = (*(__int64 (__fastcall **)(__int64, unsigned __int16 *))(a1 + 1192))(a1, &v14); /*0x4363a*/
v3 = 0; /*0x43640*/
if ( !(_DWORD)result ) /*0x43644*/
{
v4 = UtlRegisterWrite((__int64 *)a1, 0xE00u); /*0x43652*/
n0x14 = 0; /*0x43657*/
*(_DWORD *)(a1 + 276) = v4; /*0x4365e*/
*(_DWORD *)(a1 + 280) = v4; /*0x43664*/
*(_DWORD *)(a1 + 284) = v4; /*0x4366a*/
while ( 1 ) /*0x43686*/
{
n4 = (v14 >> (4 * v3)) & 0xF; /*0x43686*/
if ( n4 >= 4 ) /*0x4368e*/
{
if ( ((v14 >> (4 * v3)) & 0xFu) <= 6 ) /*0x43694*/
{
n2 = 2; /*0x436a3*/
goto LABEL_8; /*0x436a3*/
}
if ( ((v14 >> (4 * v3)) & 0xFu) <= 9 ) /*0x4369a*/
{
n2 = 10; /*0x4369c*/
LABEL_8:
*(_DWORD *)(a1 + 280) = (n2 << n0x14) | *(_DWORD *)(a1 + 280) & ~(31 << n0x14); /*0x436a6*/
}
}
v8 = n4 - 2; /*0x436c3*/
if ( !v8 ) /*0x436c6*/
goto LABEL_16; /*0x436c6*/
v9 = v8 - 1; /*0x436c8*/
if ( !v9 ) /*0x436cb*/
goto LABEL_15; /*0x436cb*/
v10 = v9 - 2; /*0x436cd*/
if ( !v10 ) /*0x436d0*/
goto LABEL_16; /*0x436d0*/
v11 = v10 - 1; /*0x436d2*/
if ( !v11 ) /*0x436d5*/
{
LABEL_15:
n10 = 10; /*0x436e1*/
LABEL_17:
*(_DWORD *)(a1 + 284) = (n10 << n0x14) | *(_DWORD *)(a1 + 284) & ~(31 << n0x14); /*0x436eb*/
goto LABEL_18; /*0x43702*/
}
v12 = v11 - 2; /*0x436d7*/
if ( !v12 ) /*0x436da*/
{
LABEL_16:
n10 = 2; /*0x436e8*/
goto LABEL_17; /*0x436e8*/
}
if ( v12 == 1 ) /*0x436df*/
goto LABEL_15; /*0x436df*/
LABEL_18:
n0x14 += 5; /*0x43708*/
++v3; /*0x4370d*/
if ( n0x14 >= 0x14u ) /*0x43716*/
return 0; /*0x4371c*/
}
}
return result; /*0x43723*/
}
// Function: MngCalcFwCrc @ 0x4372c (0x27 bytes)
__int64 __fastcall MngCalcFwCrc(__int64 a1)
{
__int64 result; // rax
result = NiiStationAddrSet(a1); /*0x43735*/
if ( !*(_DWORD *)(a1 + 1288) ) /*0x4373a*/
*(_DWORD *)(a1 + 1288) = 1; /*0x43743*/
return result; /*0x4374d*/
}
// Function: MngFwUpdateBlock @ 0x43754 (0x1f2 bytes)
__int64 __fastcall MngFwUpdateBlock(__int64 a1)
{
__int64 (__fastcall *v2)(__int64, __int64, __int64, char *); // rax
__int64 result; // rax
int v4; // edi
__int64 v5; // rdx
int v6; // eax
int v7; // eax
char v8; // [rsp+30h] [rbp+8h] BYREF
RegRegister_41(); /*0x43761*/
UtlRegisterAccess((__int64 *)a1, 0xD8u, -1); /*0x43772*/
UtlRegisterAccess((__int64 *)a1, 0x100u, 0); /*0x43782*/
UtlRegisterAccess((__int64 *)a1, 0x400u, 8); /*0x43797*/
UtlMicroStall((__int64 *)a1); /*0x4379f*/
UtlRegisterRead(*(_QWORD *)a1, 10000); /*0x437ac*/
if ( *(_DWORD *)(a1 + 268) == 7 ) /*0x437b8*/
{
UtlRegisterAccess((__int64 *)a1, 0x1000u, 8); /*0x437c5*/
UtlRegisterAccess((__int64 *)a1, 0x1008u, 16); /*0x437d6*/
}
if ( *(_DWORD *)(a1 + 268) == 10 ) /*0x437e2*/
{
v2 = *(__int64 (__fastcall **)(__int64, __int64, __int64, char *))(a1 + 1160); /*0x437e4*/
if ( v2 ) /*0x437ee*/
result = v2(a1, 27, 1, &v8); /*0x43801*/
else
result = 4294967293LL; /*0x43805*/
if ( (_DWORD)result ) /*0x4380c*/
return result; /*0x4380c*/
*(_BYTE *)(a1 + 9508) = v8 & 1; /*0x43818*/
}
v4 = UtlRegisterWrite((__int64 *)a1, 0); /*0x4382b*/
if ( !(*(unsigned int (__fastcall **)(__int64))(a1 + 904))(a1) ) /*0x4382d*/
{
v4 |= 0x80000000; /*0x43837*/
if ( *(_DWORD *)(a1 + 268) == 11 && (UtlRegisterWrite((__int64 *)a1, 0x5B54u) & 0x8000) == 0 ) /*0x43855*/
{
LOBYTE(v5) = 1; /*0x43857*/
RegRegister_49(a1, v5); /*0x4385c*/
}
}
MngInitSessionHw((__int64 *)a1); /*0x43864*/
UtlRegisterAccess((__int64 *)a1, 0, v4 | 0x4000000); /*0x43876*/
UtlRegisterRead(*(_QWORD *)a1, 20000); /*0x43883*/
if ( *(_DWORD *)(a1 + 268) == 11 ) /*0x4388f*/
{
v6 = UtlRegisterWrite((__int64 *)a1, 0x3Cu); /*0x43899*/
UtlRegisterAccess((__int64 *)a1, 0x3Cu, v6 & 0xF3FFFFFF | 0x8000000); /*0x438b1*/
}
if ( v4 >= 0 /*0x438d3*/
|| (result = (*(__int64 (__fastcall **)(__int64))(a1 + 928))(a1), !(_DWORD)result)
&& (result = RegRegister_14(a1), !(_DWORD)result) )
{
if ( *(_DWORD *)(a1 + 268) == 10 ) /*0x438dc*/
UtlRegisterAccess((__int64 *)a1, 0x5F50u, 1701143909); /*0x438ec*/
UtlRegisterAccess((__int64 *)a1, 0xD8u, -1); /*0x438fd*/
UtlRegisterWrite((__int64 *)a1, 0xC0u); /*0x4390a*/
if ( !*(_BYTE *)(a1 + 846) ) /*0x4390f*/
{
v7 = UtlRegisterWrite((__int64 *)a1, 0x3004u); /*0x43922*/
UtlRegisterAccess((__int64 *)a1, 0x3004u, v7 | 0x50000); /*0x43934*/
}
return 0; /*0x43939*/
}
return result; /*0x43940*/
}
// Function: MngFwFullUpdate @ 0x43948 (0x322 bytes)
__int64 __fastcall MngFwFullUpdate(__int64 a1)
{
int v2; // eax
int v3; // eax
int v4; // eax
int v5; // eax
int v6; // edi
unsigned int v7; // edi
int v8; // eax
int v9; // eax
int n12; // r11d
int v11; // eax
int v12; // eax
bool v13; // cf
unsigned __int16 v14; // ax
__int64 result; // rax
unsigned int v16; // esi
int v17; // eax
int v18; // eax
int n63; // edi
int v20; // eax
int v21; // eax
unsigned __int16 v22; // [rsp+30h] [rbp+8h] BYREF
v2 = UtlRegisterWrite((__int64 *)a1, 0x18u) | 0x400000; /*0x4396a*/
if ( *(int *)(a1 + 268) >= 10 ) /*0x43975*/
v2 |= 0x100000u; /*0x43977*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v2); /*0x43986*/
v3 = UtlRegisterWrite((__int64 *)a1, 0x3828u); /*0x43993*/
UtlRegisterAccess((__int64 *)a1, 0x3828u, v3 | 0x400000); /*0x439a7*/
v4 = UtlRegisterWrite((__int64 *)a1, 0x3928u); /*0x439b4*/
UtlRegisterAccess((__int64 *)a1, 0x3928u, v4 | 0x400000); /*0x439c8*/
v5 = UtlRegisterWrite((__int64 *)a1, 0x3840u); /*0x439d7*/
if ( *(_DWORD *)(a1 + 268) == 7 ) /*0x439e3*/
v5 |= 0x30000000u; /*0x439e5*/
UtlRegisterAccess((__int64 *)a1, 0x3840u, v5 | 0xD800000); /*0x439f7*/
v6 = UtlRegisterWrite((__int64 *)a1, 0x3940u); /*0x43a13*/
if ( (UtlRegisterWrite((__int64 *)a1, 0x400u) & 0x10000000) != 0 ) /*0x43a1e*/
v7 = v6 & 0xEFFFFFFF; /*0x43a20*/
else
v7 = v6 | 0x10000000; /*0x43a26*/
UtlRegisterAccess((__int64 *)a1, 0x3940u, v7 | 0x45000000); /*0x43a38*/
if ( *(_DWORD *)(a1 + 268) == 7 ) /*0x43a44*/
{
v8 = UtlRegisterWrite((__int64 *)a1, 8u); /*0x43a50*/
UtlRegisterAccess((__int64 *)a1, 8u, v8 & 0x7FFFFFFF); /*0x43a61*/
}
v9 = UtlRegisterWrite((__int64 *)a1, 0x5008u) | 0xC0; /*0x43a75*/
if ( *(_DWORD *)(a1 + 268) == 7 ) /*0x43a81*/
v9 |= 0x30000u; /*0x43a83*/
UtlRegisterAccess((__int64 *)a1, 0x5008u, v9); /*0x43a90*/
n12 = *(_DWORD *)(a1 + 268); /*0x43a95*/
if ( n12 == 12 || n12 == 13 ) /*0x43aa6*/
{
v11 = UtlRegisterWrite((__int64 *)a1, 0x100Cu); /*0x43ab2*/
UtlRegisterAccess((__int64 *)a1, 0x100Cu, v11 | 0x10000); /*0x43ac3*/
v12 = UtlRegisterWrite((__int64 *)a1, 0); /*0x43acd*/
UtlRegisterAccess((__int64 *)a1, 0, v12 | 0x80000); /*0x43ade*/
}
if ( !*(_BYTE *)(a1 + 846) ) /*0x43ae6*/
(*(void (__fastcall **)(__int64))(a1 + 40))(a1); /*0x43af2*/
NiiSetMacAddressList(a1, *(_WORD *)(a1 + 828)); /*0x43aff*/
v13 = *(_WORD *)(a1 + 310) != 0; /*0x43b04*/
v14 = 0; /*0x43b0c*/
while ( 1 ) /*0x43b36*/
{
v22 = v14; /*0x43b36*/
if ( !v13 ) /*0x43b3b*/
break; /*0x43b3b*/
UtlRegisterAccess((__int64 *)a1, 4 * v14 + 20992, 0); /*0x43b22*/
v14 = v22 + 1; /*0x43b2c*/
v13 = (unsigned __int16)(v22 + 1) < *(_WORD *)(a1 + 310); /*0x43b2f*/
}
if ( *(_DWORD *)(a1 + 1072) != 9 /*0x43b87*/
|| ((*(void (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 24625, &v22),
v22 &= ~0x10u,
(*(void (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 24625),
result = MngSetPowerState(a1),
!(_DWORD)result) )
{
v16 = (*(__int64 (__fastcall **)(__int64))(a1 + 176))(a1); /*0x43b9e*/
v17 = UtlRegisterWrite((__int64 *)a1, 0x3828u); /*0x43ba0*/
UtlRegisterAccess((__int64 *)a1, 0x3828u, v17 & 0xFEC0FFC0 | 0x101001F); /*0x43bbc*/
v18 = UtlRegisterWrite((__int64 *)a1, 0x3928u); /*0x43bc9*/
UtlRegisterAccess((__int64 *)a1, 0x3928u, v18 & 0xFEC0FFC0 | 0x101001F); /*0x43be0*/
n63 = -64; /*0x43bec*/
if ( *(_DWORD *)(a1 + 268) == 7 ) /*0x43bf6*/
n63 = 63; /*0x43bf6*/
if ( *(_DWORD *)(a1 + 1280) == 3 ) /*0x43c00*/
{
v20 = UtlRegisterWrite((__int64 *)a1, 0x5B00u); /*0x43c0f*/
UtlRegisterAccess((__int64 *)a1, 0x5B00u, n63 | v20 & 0xFFFFFFC0); /*0x43c24*/
}
v21 = UtlRegisterWrite((__int64 *)a1, 0x18u); /*0x43c31*/
UtlRegisterAccess((__int64 *)a1, 0x18u, v21 | 0x20000); /*0x43c45*/
Utl_442fc(a1); /*0x43c4d*/
return v16; /*0x43c52*/
}
return result; /*0x43c63*/
}
// Function: MngGetFwVersion @ 0x43c6c (0xba bytes)
__int64 __fastcall MngGetFwVersion(__int64 a1)
{
__int64 result; // rax
int n9; // r11d
if ( (*(unsigned int (**)(void))(a1 + 904))() ) /*0x43c75*/
return 0; /*0x43c7f*/
if ( *(_DWORD *)(a1 + 868) == 255 ) /*0x43c90*/
*(_DWORD *)(a1 + 868) = 3; /*0x43c92*/
*(_DWORD *)(a1 + 864) = *(_DWORD *)(a1 + 868); /*0x43ca5*/
result = (*(__int64 (__fastcall **)(__int64))(a1 + 184))(a1); /*0x43cab*/
if ( !(_DWORD)result ) /*0x43cb3*/
{
UtlRegisterAccess((__int64 *)a1, 0x170u, *(unsigned __int16 *)(a1 + 856)); /*0x43cc5*/
n9 = *(_DWORD *)(a1 + 1072); /*0x43cca*/
if ( n9 != 9 && n9 != 11 && n9 != 12 && n9 != 10 ) /*0x43ce7*/
return NiiReceiveFilterSet(a1); /*0x43ce7*/
UtlRegisterAccess((__int64 *)a1, 0x5F40u, *(unsigned __int16 *)(a1 + 858)); /*0x43cf9*/
result = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1016))( /*0x43d0e*/
a1,
24635,
*(unsigned __int16 *)(a1 + 856));
if ( !(_DWORD)result ) /*0x43d16*/
return NiiReceiveFilterSet(a1); /*0x43d1b*/
}
return result; /*0x43d20*/
}
// Function: MngParseFwVersion @ 0x43d28 (0x133 bytes)
__int64 __fastcall MngParseFwVersion(__int64 a1)
{
int v2; // eax
__int64 result; // rax
int n6; // eax
unsigned __int16 p_n0xFFFF_1; // r8
unsigned __int16 p_n0xFFFF; // [rsp+38h] [rbp+10h] BYREF
v2 = UtlRegisterWrite((__int64 *)a1, 0); /*0x43d37*/
UtlRegisterAccess((__int64 *)a1, 0, v2 & 0xFFFFE7BF | 0x40); /*0x43d50*/
result = RegRegister_37(a1, 4, 0xFFFFu); /*0x43d61*/
if ( !(_DWORD)result ) /*0x43d68*/
{
result = RegRegister_36(a1, 9, &p_n0xFFFF); /*0x43d75*/
if ( !(_DWORD)result ) /*0x43d7c*/
{
p_n0xFFFF |= 0x3Fu; /*0x43d8f*/
result = RegRegister_37(a1, 9, p_n0xFFFF); /*0x43d95*/
if ( !(_DWORD)result ) /*0x43d9c*/
{
n6 = *(_DWORD *)(a1 + 1072); /*0x43d9e*/
if ( n6 == 6 ) /*0x43da7*/
{
result = RegRegister_15(a1); /*0x43e51*/
goto LABEL_11; /*0x43e56*/
}
if ( n6 != 7 ) /*0x43db0*/
{
if ( n6 <= 7 ) /*0x43db2*/
return DxeRegister_56(a1); /*0x43db2*/
if ( n6 > 9 ) /*0x43db7*/
{
if ( n6 <= 11 ) /*0x43dbc*/
{
result = MacCheckBootMode(a1); /*0x43dc1*/
goto LABEL_11; /*0x43dc6*/
}
return DxeRegister_56(a1); /*0x43dd7*/
}
result = MacInitConfigFlags(a1); /*0x43dcb*/
LABEL_11:
if ( (_DWORD)result ) /*0x43dd2*/
return result; /*0x43dd2*/
return DxeRegister_56(a1); /*0x43dd2*/
}
result = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *))(a1 + 960))(a1, 28, &p_n0xFFFF); /*0x43df4*/
if ( !(_DWORD)result ) /*0x43dfc*/
{
if ( *(_BYTE *)(a1 + 1130) == 1 ) /*0x43e17*/
{
p_n0xFFFF_1 = p_n0xFFFF & 0xFF3F; /*0x43e34*/
}
else if ( *(_BYTE *)(a1 + 1130) == 2 ) /*0x43e1c*/
{
p_n0xFFFF_1 = p_n0xFFFF & 0xFF3F | 0x40; /*0x43e29*/
}
else
{
p_n0xFFFF_1 = p_n0xFFFF & 0xFF7F | 0x80; /*0x43e23*/
}
p_n0xFFFF = p_n0xFFFF_1; /*0x43e40*/
result = (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 28); /*0x43e46*/
goto LABEL_11; /*0x43e4c*/
}
}
}
}
return result; /*0x43de1*/
}
// Function: MngGetFwMode @ 0x43e5c (0x3f bytes)
__int64 __fastcall MngGetFwMode(__int64 *a1)
{
int v2; // eax
__int64 result; // rax
v2 = UtlRegisterWrite(a1, 0); /*0x43e67*/
UtlRegisterAccess(a1, 0, v2 & 0xFFFFE7BF | 0x40); /*0x43e7c*/
result = MacCheckBootMode(a1); /*0x43e84*/
if ( !(_DWORD)result ) /*0x43e8b*/
return DxeRegister_56(a1); /*0x43e90*/
return result; /*0x43e95*/
}
// Function: MngGetCapability @ 0x43e9c (0x15 bytes)
void __fastcall __noreturn MngGetCapability(__int64 *a1, __int16 *a2, _WORD *a3)
{
NiiMcIpToMacSet(a1, a2, a3); /*0x43eac*/
}
// Function: DxeRegister_32 @ 0x43fbc (0x74 bytes)
void __fastcall DxeRegister_32(__int64 a1)
{
__int16 v2; // di
unsigned __int16 p_n0xFFFF; // [rsp+30h] [rbp+8h] BYREF
if ( *(_DWORD *)(a1 + 268) == 7 && *(_DWORD *)(a1 + 1072) != 7 && !(unsigned int)RegRegister_36(a1, 3, &p_n0xFFFF) ) /*0x43fe5*/
{
v2 = p_n0xFFFF | 0x1000; /*0x43ffd*/
if ( !(unsigned int)RegRegister_37(a1, 3, p_n0xFFFF | 0x1000u) ) /*0x44007*/
RegRegister_37(a1, 3, v2 & 0xEFFF); /*0x44020*/
}
}
// Function: UtlRegWriteCtrl @ 0x44030 (0x37 bytes)
__int64 __fastcall Utl_44030(__int64 a1)
{
if ( *(_DWORD *)(a1 + 1072) == 7 ) /*0x4403e*/
return (*(__int64 (__fastcall **)(__int64, __int64))(a1 + 1016))(a1, 27); /*0x44047*/
UtlRegisterAccess(a1, 3584, *(unsigned int *)(a1 + 276)); /*0x4405b*/
return 0; /*0x44062*/
}
// Function: UtlRegWriteStatus @ 0x44068 (0x39 bytes)
__int64 __fastcall Utl_44068(__int64 a1)
{
if ( *(_DWORD *)(a1 + 1072) == 7 ) /*0x44076*/
return (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 27, 39); /*0x44081*/
UtlRegisterAccess(a1, 3584, *(unsigned int *)(a1 + 284)); /*0x44095*/
return 0; /*0x4409c*/
}
// Function: UtlRegWriteCtrlAlt @ 0x440a4 (0x39 bytes)
__int64 __fastcall Utl_440a4(__int64 a1)
{
if ( *(_DWORD *)(a1 + 1072) == 7 ) /*0x440b2*/
return (*(__int64 (__fastcall **)(__int64, __int64, __int64))(a1 + 1016))(a1, 27, 38); /*0x440bd*/
UtlRegisterAccess(a1, 3584, *(unsigned int *)(a1 + 280)); /*0x440d1*/
return 0; /*0x440d8*/
}
// Function: UtlNvmVtableWrite @ 0x440e0 (0x17 bytes)
__int64 __fastcall UtlNvmVtableWrite(__int64 a1)
{
return (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1016))(a1, 24606, *(unsigned __int16 *)(a1 + 280));
}
// Function: UtlNvmVtableRead @ 0x440f8 (0x17 bytes)
__int64 __fastcall UtlNvmVtableRead(__int64 a1)
{
return (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1016))(a1, 24606, *(unsigned __int16 *)(a1 + 276));
}
// Function: Utl_44110 @ 0x44110 (0x74 bytes)
__int64 __fastcall Utl_44110(__int64 a1)
{
unsigned __int16 v1; // bx
unsigned int i; // ecx
__int16 v4; // ax
v1 = *(_WORD *)(a1 + 284); /*0x4411a*/
if ( (UtlRegisterWrite((__int64 *)a1, 8u) & 2) == 0 ) /*0x44130*/
{
for ( i = 0; i < 0xF; i += 5 ) /*0x44132*/
{
if ( ((v1 >> i) & 7) == 2 ) /*0x44142*/
{
v4 = 8 << i; /*0x44149*/
if ( ((v1 >> i) & 8) != 0 ) /*0x4414f*/
v1 &= ~v4; /*0x44154*/
else
v1 |= v4; /*0x44159*/
}
}
}
return (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1016))(a1, 24606, v1); /*0x4417c*/
}
// Function: Utl_44184 @ 0x44184 (0x74 bytes)
__int64 __fastcall Utl_44184(__int64 a1)
{
unsigned __int16 v1; // bx
unsigned int i; // ecx
__int16 v4; // ax
v1 = *(_WORD *)(a1 + 280); /*0x4418e*/
if ( (UtlRegisterWrite((__int64 *)a1, 8u) & 2) == 0 ) /*0x441a4*/
{
for ( i = 0; i < 0xF; i += 5 ) /*0x441a6*/
{
if ( ((v1 >> i) & 7) == 2 ) /*0x441b6*/
{
v4 = 8 << i; /*0x441bd*/
if ( ((v1 >> i) & 8) != 0 ) /*0x441c3*/
v1 &= ~v4; /*0x441c8*/
else
v1 |= v4; /*0x441cd*/
}
}
}
return (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(a1 + 1016))(a1, 24606, v1); /*0x441f0*/
}
// Function: Utl_441f8 @ 0x441f8 (0x103 bytes)
__int64 __fastcall Utl_441f8(__int64 a1)
{
__int64 v2; // rcx
unsigned int v3; // esi
int n1500; // ebp
__int16 v5; // bx
int v6; // eax
int v7; // eax
unsigned int v9; // [rsp+40h] [rbp+8h] BYREF
v2 = *(_QWORD *)a1; /*0x4420d*/
v3 = 0; /*0x44210*/
v9 = 0; /*0x44212*/
UtlRegisterRead(v2, 10000); /*0x4421b*/
if ( *(int *)(a1 + 268) < 9 ) /*0x4422b*/
{
RegRegister_44((__int64 *)a1); /*0x4427b*/
}
else
{
n1500 = 1500; /*0x4422d*/
do /*0x44257*/
{
v5 = UtlRegisterWrite((__int64 *)a1, 8u); /*0x44245*/
UtlRegisterRead(*(_QWORD *)a1, 100); /*0x44247*/
if ( (v5 & 0x200) != 0 ) /*0x44252*/
break; /*0x44252*/
--n1500; /*0x44254*/
}
while ( n1500 ); /*0x44257*/
v6 = UtlRegisterWrite((__int64 *)a1, 8u); /*0x4425f*/
UtlRegisterAccess((__int64 *)a1, 8u, v6 & 0xFFFFFDFF); /*0x44271*/
}
v7 = UtlRegisterWrite((__int64 *)a1, 8u); /*0x44286*/
if ( (v7 & 0x400) != 0 ) /*0x4428f*/
UtlRegisterAccess((__int64 *)a1, 8u, v7 & 0xFFFFFBFF); /*0x4429e*/
if ( *(int *)(a1 + 268) > 8 ) /*0x442ad*/
{
if ( (unsigned int)RegRegister_12(a1, &v9) ) /*0x442d7*/
return (unsigned int)-3; /*0x442e3*/
}
else if ( (UtlRegisterWrite((__int64 *)a1, 0x10u) & 0x100) == 0 && *(_DWORD *)(a1 + 1072) == 6 ) /*0x442c6*/
{
MngSetDefaultConfig(a1); /*0x442cb*/
}
return v3; /*0x442f2*/
}
// Function: Utl_442fc @ 0x442fc (0x200 bytes)
__int64 __fastcall Utl_442fc(__int64 a1)
{
__int64 result; // rax
int n9; // r11d
char v4; // [rsp+30h] [rbp+8h] BYREF
RegRegister_5((__int64 *)a1); /*0x44305*/
UtlRegisterWrite((__int64 *)a1, 0x4004u); /*0x44312*/
UtlRegisterWrite((__int64 *)a1, 0x400Cu); /*0x4431f*/
UtlRegisterWrite((__int64 *)a1, 0x4034u); /*0x4432c*/
UtlRegisterWrite((__int64 *)a1, 0x403Cu); /*0x44339*/
UtlRegisterWrite((__int64 *)a1, 0x40F8u); /*0x44346*/
UtlRegisterWrite((__int64 *)a1, 0x40FCu); /*0x44353*/
UtlRegisterWrite((__int64 *)a1, 0x40B4u); /*0x44360*/
UtlRegisterWrite((__int64 *)a1, 0x40B8u); /*0x4436d*/
UtlRegisterWrite((__int64 *)a1, 0x40BCu); /*0x4437a*/
UtlRegisterWrite((__int64 *)a1, 0x4100u); /*0x44387*/
result = UtlRegisterWrite((__int64 *)a1, 0x4124u); /*0x44394*/
n9 = *(_DWORD *)(a1 + 1072); /*0x44399*/
if ( n9 == 9 || n9 == 11 || n9 == 12 || n9 == 10 ) /*0x443b6*/
{
result = (*(__int64 (__fastcall **)(__int64))(a1 + 880))(a1); /*0x443bf*/
if ( !(_DWORD)result ) /*0x443c7*/
{
if ( !(*(unsigned int (__fastcall **)(__int64, __int64))(a1 + 952))(a1, 24896) ) /*0x443d5*/
{
(*(void (__fastcall **)(__int64, __int64, char *))(a1 + 976))(a1, 24912, &v4); /*0x443f0*/
(*(void (__fastcall **)(__int64, __int64, char *))(a1 + 976))(a1, 24913, &v4); /*0x44403*/
(*(void (__fastcall **)(__int64, __int64, char *))(a1 + 976))(a1, 24914, &v4); /*0x44416*/
(*(void (__fastcall **)(__int64, __int64, char *))(a1 + 976))(a1, 24915, &v4); /*0x44429*/
(*(void (__fastcall **)(__int64, __int64, char *))(a1 + 976))(a1, 24916, &v4); /*0x4443c*/
(*(void (__fastcall **)(__int64, __int64, char *))(a1 + 976))(a1, 24917, &v4); /*0x4444f*/
(*(void (__fastcall **)(__int64, __int64, char *))(a1 + 976))(a1, 24919, &v4); /*0x44462*/
(*(void (__fastcall **)(__int64, __int64, char *))(a1 + 976))(a1, 24920, &v4); /*0x44475*/
(*(void (__fastcall **)(__int64, __int64, char *))(a1 + 976))(a1, 24921, &v4); /*0x44488*/
(*(void (__fastcall **)(__int64, __int64, char *))(a1 + 976))(a1, 24922, &v4); /*0x4449b*/
(*(void (__fastcall **)(__int64, __int64, char *))(a1 + 976))(a1, 24923, &v4); /*0x444ae*/
(*(void (__fastcall **)(__int64, __int64, char *))(a1 + 976))(a1, 24924, &v4); /*0x444c1*/
(*(void (__fastcall **)(__int64, __int64, char *))(a1 + 976))(a1, 24925, &v4); /*0x444d4*/
(*(void (__fastcall **)(__int64, __int64, char *))(a1 + 976))(a1, 24926, &v4); /*0x444e7*/
}
return (*(__int64 (__fastcall **)(__int64))(a1 + 984))(a1); /*0x444f0*/
}
}
return result; /*0x444f6*/
}
// Function: UtlNvmContextWrite @ 0x444fc (0x3d bytes)
unsigned __int64 __fastcall UtlNvmContextWrite(__int64 Handle, __int64 n32, __int64 a3)
{
__int64 (__fastcall *v3)(__int64, __int64, __int64, __int64); // rax
__int64 v4; // rcx
int v5; // eax
v3 = *(__int64 (__fastcall **)(__int64, __int64, __int64, __int64))(Handle + 1256); /*0x44500*/
v4 = Handle + 96; /*0x44507*/
if ( v3 ) /*0x44511*/
v5 = v3(v4, n32, 1, a3); /*0x44519*/
else
v5 = -3; /*0x4451d*/
return -(__int64)(v5 != 0) & 0x8000000000000007uLL; /*0x44534*/
}
// Function: UtlNvmContextRead @ 0x4453c (0x3f bytes)
unsigned __int64 __fastcall UtlNvmContextRead(__int64 Handle, __int64 n32, __int16 a3)
{
__int64 (__fastcall *v3)(__int64, __int64, __int64, __int16 *); // r10
__int64 v4; // rcx
int v5; // eax
__int16 v7; // [rsp+40h] [rbp+18h] BYREF
v7 = a3; /*0x4453c*/
v3 = *(__int64 (__fastcall **)(__int64, __int64, __int64, __int16 *))(Handle + 1304); /*0x44546*/
v4 = Handle + 96; /*0x4454d*/
v5 = 0; /*0x44551*/
if ( v3 ) /*0x44556*/
v5 = v3(v4, n32, 1, &v7); /*0x44561*/
return -(__int64)(v5 != 0) & 0x8000000000000007uLL; /*0x44576*/
}
// Function: UtlNvmContextRelease @ 0x4457c (0x34 bytes)
unsigned __int64 __fastcall UtlNvmContextRelease(__int64 Handle)
{
__int64 (__fastcall *v1)(__int64); // rax
__int64 v2; // rcx
int v3; // eax
v1 = *(__int64 (__fastcall **)(__int64))(Handle + 1280); /*0x44580*/
v2 = Handle + 96; /*0x44587*/
if ( v1 ) /*0x4458e*/
v3 = v1(v2); /*0x44590*/
else
v3 = -3; /*0x44594*/
return -(__int64)(v3 != 0) & 0x8000000000000007uLL; /*0x445ab*/
}
// Function: UtlNvmCrcVerify @ 0x445b0 (0x1ce bytes)
char __fastcall UtlNvmCrcVerify(__int64 Handle, int n0xFFFF)
{
unsigned int n0x10A4; // eax
char v4; // bl
__int64 v6; // rsi
__int64 v7; // [rsp+30h] [rbp-48h] BYREF
__int64 v8; // [rsp+38h] [rbp-40h] BYREF
__int64 v9; // [rsp+40h] [rbp-38h] BYREF
_BYTE v10[8]; // [rsp+48h] [rbp-30h] BYREF
_BYTE v11[40]; // [rsp+50h] [rbp-28h] BYREF
__int16 v12; // [rsp+80h] [rbp+8h] BYREF
__int16 v13; // [rsp+88h] [rbp+10h] BYREF
unsigned __int64 v14; // [rsp+90h] [rbp+18h] BYREF
__int64 v15; // [rsp+98h] [rbp+20h] BYREF
v14 = 0; /*0x445ba*/
n0x10A4 = *(unsigned __int16 *)(Handle + 9608); /*0x445bf*/
v4 = 1; /*0x445ce*/
if ( n0x10A4 >= 0x10A4 /*0x44605*/
&& (*(unsigned __int16 *)(Handle + 9608) <= 0x10A5u
|| n0x10A4 == 4284
|| *(unsigned __int16 *)(Handle + 9608) > 0x10D4u
&& (*(unsigned __int16 *)(Handle + 9608) <= 0x10D6u || n0x10A4 == 4328 || n0x10A4 == 5414)) )
{
if ( (*(__int64 (__fastcall **)(__int64, __int64 *, _QWORD, unsigned __int64 *, __int64 *))(BootServices + 312))( /*0x4463b*/
2,
qword_2A0,
0,
&v14,
&v7) < 0 )
return 0; /*0x4463f*/
v6 = 0; /*0x44644*/
if ( v14 ) /*0x4464e*/
{
while ( 1 ) /*0x4468b*/
{
if ( (*(__int64 (__fastcall **)(_QWORD, __int64 *, __int64 *, __int64, _QWORD, int))(BootServices + 280))( /*0x44694*/
*(_QWORD *)(v7 + 8 * v6),
qword_2A0,
&v15,
ImageHandle_1,
*(_QWORD *)(Handle + 56),
2) >= 0 )
{
(*(void (__fastcall **)(__int64, __int64 *, __int64 *, _BYTE *, _BYTE *))(v15 + 112))(v15, &v8, &v9, v11, v10); /*0x446ba*/
if ( v8 == *(_QWORD *)(Handle + 10264) && v9 == *(_QWORD *)(Handle + 10272) - 1LL ) /*0x446da*/
break; /*0x446da*/
}
if ( ++v6 >= v14 ) /*0x446e7*/
goto LABEL_21; /*0x446e7*/
}
if ( (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int64, __int16 *))(v15 + 48))(v15, 1, 2, 1, &v12) >= 0 /*0x44761*/
&& (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, __int64, __int16 *))(v15 + 48))(v15, 1, 0, 1, &v13) >= 0
&& (v12 == *(_WORD *)(Handle + 9608) || v13 == *(_WORD *)(Handle + 9614)) )
{
v4 = 0; /*0x44763*/
}
}
LABEL_21:
(*(void (__fastcall **)(__int64))(BootServices + 72))(v7); /*0x44765*/
}
return v4; /*0x44776*/
}
// Function: UtlCrc32Calc @ 0x44888 (0x32 bytes)
unsigned __int64 UtlCrc32Calc(
char *_r_n,
unsigned __int64 a2,
unsigned __int8 *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x,
...)
{
va_list va; // [rsp+58h] [rbp+20h] BYREF
va_start(va, %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x);
return UtlSPrintf(_r_n, a2 >> 1, 320, %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x, va, 0); /*0x448b5*/
}
// Function: UtlMemset @ 0x448bc (0x33 bytes)
_BYTE *__fastcall UtlMemset(_BYTE *_r_n, unsigned __int64 _r_n_1, __int64 i, __int16 n32, __int64 n2)
{
__int64 j; // r10
for ( j = 0; j < i; ++j ) /*0x448c2*/
{
if ( (unsigned __int64)_r_n >= _r_n_1 ) /*0x448c7*/
break; /*0x448c7*/
*_r_n = n32; /*0x448cf*/
if ( n2 != 1 ) /*0x448d2*/
_r_n[1] = HIBYTE(n32); /*0x448db*/
_r_n += n2; /*0x448de*/
}
return _r_n; /*0x448ee*/
}
// Function: UtlBufferFill @ 0x448f0 (0x1ba bytes)
unsigned __int64 __fastcall UtlBufferFill(_BYTE *k, int n160, unsigned __int64 n85, __int64 n37)
{
char v4; // di
__int64 n37_1; // rbx
_BYTE *k_1; // r10
_BYTE *_r_n; // rbp
_BYTE *v9; // rsi
unsigned __int64 v10; // rcx
unsigned __int64 n85_1; // rtt
unsigned __int64 v12; // r11
unsigned __int64 v13; // rcx
unsigned __int64 v14; // rdx
int v15; // edi
__int16 v16; // r9
__int64 v17; // r8
__int64 v18; // rax
_BYTE *k_2; // rax
__int64 v20; // rcx
_BYTE v22[48]; // [rsp+30h] [rbp-38h] BYREF
v4 = -96; /*0x4490c*/
n37_1 = n37; /*0x44911*/
k_1 = k; /*0x44917*/
if ( !n37 ) /*0x4491d*/
{
v4 = 0x80; /*0x4491d*/
n37_1 = 37; /*0x44927*/
}
_r_n = &k[2 * n37_1]; /*0x4492b*/
v9 = v22; /*0x4495f*/
v22[0] = 0; /*0x44964*/
v10 = v4 < 0 ? 16 : 10;
do /*0x44998*/
{
++v9; /*0x4497e*/
n85_1 = n85; /*0x44981*/
n85 /= v10; /*0x44984*/
*v9 = MEMORY[0x1A510][(unsigned int)(n85_1 % v10)]; /*0x44993*/
}
while ( n85 ); /*0x44998*/
v12 = v9 - v22; /*0x449a2*/
if ( (v4 & 0x20) != 0 ) /*0x449a9*/
k_1 = UtlMemset(k_1, (unsigned __int64)_r_n, n37_1 - v12, 48, 2); /*0x449c9*/
v13 = v12 % 3; /*0x449e3*/
if ( v12 % 3 ) /*0x449e3*/
v13 = 3 - v13; /*0x449f0*/
v14 = 0; /*0x449f3*/
if ( v12 ) /*0x449f8*/
{
v15 = v4 & 8; /*0x449fa*/
do /*0x44a62*/
{
v16 = (char)*v9; /*0x449fd*/
v17 = 0; /*0x44a01*/
do /*0x44a22*/
{
if ( k_1 >= _r_n ) /*0x44a07*/
break; /*0x44a07*/
++v17; /*0x44a0c*/
*k_1 = v16; /*0x44a0f*/
k_1 += 2; /*0x44a16*/
*(k_1 - 1) = HIBYTE(v16); /*0x44a1e*/
}
while ( v17 < 1 ); /*0x44a22*/
--v9; /*0x44a24*/
if ( v15 ) /*0x44a2a*/
{
if ( ++v13 == 3 ) /*0x44a33*/
{
v13 = 0; /*0x44a39*/
if ( v14 + 1 < v12 ) /*0x44a3e*/
{
v18 = 0; /*0x44a40*/
do /*0x44a5a*/
{
if ( k_1 >= _r_n ) /*0x44a45*/
break; /*0x44a45*/
++v18; /*0x44a47*/
*k_1 = 44; /*0x44a4a*/
k_1[1] = 0; /*0x44a4e*/
k_1 += 2; /*0x44a52*/
}
while ( v18 < 1 ); /*0x44a5a*/
}
}
}
++v14; /*0x44a5c*/
}
while ( v14 < v12 ); /*0x44a62*/
}
k_2 = k_1; /*0x44a64*/
v20 = 0; /*0x44a67*/
do /*0x44a84*/
{
if ( k_2 >= _r_n + 2 ) /*0x44a70*/
break; /*0x44a70*/
++v20; /*0x44a72*/
*k_2 = 0; /*0x44a75*/
k_2[1] = 0; /*0x44a78*/
k_2 += 2; /*0x44a7c*/
}
while ( v20 < 1 ); /*0x44a84*/
return (unsigned __int64)(k_1 - k) >> 1; /*0x44aa4*/
}
// Function: UtlSPrintf @ 0x44aac (0xc91 bytes)
unsigned __int64 __fastcall UtlSPrintf(
char *_r_n,
__int64 n38,
__int16 n320,
unsigned __int8 *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x,
va_list va,
int *a6)
{
__int64 v7; // rbp
char *_r_n_1; // r13
char v10; // al
char *_r_n_2; // r8
unsigned __int64 n2; // r9
char *_r_n_4; // r10
__int64 n2_2; // rdx
__int64 n0xFFFF; // rsi
int v16; // eax
unsigned __int64 n10; // rcx
int *v18; // r15
unsigned __int64 n512_2; // r12
unsigned __int64 n512_3; // rdi
char *_r_n_5; // rbx
va_list va_1; // r8
unsigned __int64 n13_1; // rcx
unsigned __int64 n512_6; // rbx
__int64 v25; // rax
unsigned __int64 n512_7; // r8
unsigned __int64 v27; // rcx
unsigned __int64 v28; // rcx
unsigned __int64 v29; // rcx
unsigned __int64 v30; // rcx
unsigned __int64 n4; // rcx
unsigned __int16 *v32; // r9
__int64 n4_1; // rcx
__int64 v34; // rcx
char n32; // al
char v36; // bl
char n32_1; // r11
unsign... [22427 chars total]
// Function: UtlVSPrintf @ 0x45740 (0x22 bytes)
unsigned __int64 UtlVSPrintf(
char *_r_n,
__int64 n38,
__int16 n320,
char *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x,
...)
{
va_list va; // [rsp+60h] [rbp+28h] BYREF
va_start(va, %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x);
return UtlSPrintf(_r_n, n38, n320, (unsigned __int8 *)%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x, va, 0); /*0x4575d*/
}
// Function: UtlMemCpy @ 0x45764 (0x47 bytes)
_BYTE *__fastcall UtlMemCpy(_BYTE *a1, _BYTE *a2, __int64 a3)
{
_BYTE *v3; // r9
__int64 v4; // rdx
_BYTE *v5; // r9
if ( a3 && a2 != a1 ) /*0x4576c*/
{
if ( a2 <= a1 ) /*0x4576e*/
{
if ( a2 < a1 ) /*0x4578b*/
{
v5 = &a1[a3]; /*0x4578d*/
do /*0x457a5*/
*--v5 = a2[--a3]; /*0x457a2*/
while ( a3 ); /*0x457a5*/
}
}
else
{
v3 = a1; /*0x45770*/
v4 = a2 - a1; /*0x45773*/
do /*0x45784*/
{
*v3 = v3[v4]; /*0x4577a*/
++v3; /*0x4577d*/
--a3; /*0x45780*/
}
while ( a3 ); /*0x45784*/
}
}
return a1; /*0x457aa*/
}
// Function: UtlMemMove @ 0x457ac (0x29 bytes)
unsigned __int64 __fastcall UtlMemMove(_BYTE *i, _BYTE *i_1, __int64 a3)
{
__int64 j; // r8
if ( i == i_1 ) /*0x457af*/
return 0; /*0x457b1*/
for ( j = a3 - 1; j; --j ) /*0x457b7*/
{
if ( *i != *i_1 ) /*0x457bd*/
break; /*0x457bd*/
++i; /*0x457bf*/
++i_1; /*0x457c2*/
}
return (unsigned __int8)*i - (unsigned __int64)(unsigned __int8)*i_1; /*0x457b3*/
}
// Function: UtlStrNCpy @ 0x45818 (0x36 bytes)
__int64 __fastcall UtlStrNCpy(_WORD *a1, _WORD *a2, unsigned __int64 a3)
{
if ( !a3 ) /*0x4581e*/
return 0; /*0x45820*/
while ( *a1 && *a1 == *a2 && a3 > 1 ) /*0x4582c*/
{
++a1; /*0x4582e*/
++a2; /*0x45832*/
--a3; /*0x45836*/
}
return (unsigned __int16)*a1 - (unsigned __int16)*a2; /*0x45822*/
}
// Function: UtlStrStr @ 0x4589c (0x53 bytes)
_WORD *__fastcall UtlStrStr(_WORD *a1, _WORD *a2)
{
_WORD *v4; // r8
_WORD *v5; // rdx
__int16 v6; // ax
if ( !*a2 ) /*0x458a2*/
return a1; /*0x458a8*/
while ( 1 ) /*0x458df*/
{
v6 = *a1; /*0x458df*/
if ( !*a1 ) /*0x458df*/
return 0; /*0x458ea*/
v4 = a2; /*0x458ac*/
v5 = a1; /*0x458af*/
if ( v6 == *a2 ) /*0x458b6*/
{
do /*0x458cd*/
{
if ( !v6 ) /*0x458bc*/
break; /*0x458bc*/
++a1; /*0x458be*/
++v4; /*0x458c2*/
v6 = *a1; /*0x458c6*/
}
while ( *a1 == *v4 ); /*0x458cd*/
}
if ( !*v4 ) /*0x458cf*/
break; /*0x458cf*/
if ( !*a1 ) /*0x458d9*/
return 0; /*0x458d9*/
a1 = v5 + 1; /*0x458db*/
}
return v5; /*0x458ab*/
}
// Function: UtlAllocZero @ 0x458f0 (0x2e bytes)
__int64 __fastcall UtlAllocZero(__int64 PoolType, __int64 AllocSize)
{
__int64 Status; // rax
__int64 AllocPtr; // rcx
__int64 AllocPtr_1; // [rsp+40h] [rbp+18h] BYREF
Status = (*(__int64 (__fastcall **)(__int64, __int64, __int64 *))(BootServices + 64))(4, AllocSize, &AllocPtr_1); /*0x45905*/
AllocPtr = AllocPtr_1; /*0x45908*/
if ( Status < 0 ) /*0x45912*/
return 0; /*0x45912*/
return AllocPtr; /*0x45919*/
}
// Function: UtlStrCmp @ 0x45920 (0x32 bytes)
_BYTE *__fastcall UtlStrCmp(__int64 a1, __int64 a2)
{
__int64 v2; // rbx
_BYTE *i_1; // rax
_BYTE *i; // rcx
v2 = a2; /*0x4592b*/
i_1 = (_BYTE *)UtlAllocZero(4, a2); /*0x4592e*/
if ( i_1 ) /*0x45936*/
{
for ( i = i_1; v2; --v2 ) /*0x4593e*/
*i++ = 0; /*0x45940*/
}
return i_1; /*0x4594c*/
}
// Function: UtlStrCpy @ 0x45954 (0x3e bytes)
_BYTE *__fastcall UtlStrCpy(int n4, __int64 a2, _BYTE *eng)
{
_BYTE *v5; // rcx
v5 = (_BYTE *)UtlAllocZero(4, a2); /*0x4596e*/
if ( v5 ) /*0x45974*/
return UtlMemCpy(v5, eng, a2); /*0x45981*/
return v5; /*0x4598c*/
}
// Function: UtlMemAllocAligned @ 0x45994 (0x71 bytes)
_BYTE *__fastcall UtlMemAllocAligned(
int AlignBytes,
unsigned __int64 CopySize,
unsigned __int64 CopySize_2,
_BYTE *SrcData)
{
unsigned __int64 CopySize_1; // rsi
_BYTE *NewBuf; // rax
_BYTE *NewBuf_1; // rbx
CopySize_1 = CopySize_2; /*0x459b6*/
NewBuf = UtlStrCmp(4, CopySize_2); /*0x459b9*/
NewBuf_1 = NewBuf; /*0x459be*/
if ( NewBuf && SrcData ) /*0x459c9*/
{
if ( CopySize < CopySize_1 ) /*0x459d4*/
CopySize_1 = CopySize; /*0x459d4*/
UtlMemCpy(NewBuf, SrcData, CopySize_1); /*0x459db*/
(*(void (__fastcall **)(_BYTE *))(BootServices + 72))(SrcData); /*0x459ea*/
}
return NewBuf_1; /*0x459ff*/
}
// Function: UtlParseTokenStr @ 0x45a08 (0x17f bytes)
unsigned __int64 __fastcall UtlParseTokenStr(_DWORD *eng, char *a2, __int64 a3, _QWORD *p_STACK[0x7D0], char a5)
{
__int64 v6; // r11
unsigned __int64 v9; // r8
char n59; // cl
unsigned __int64 v11; // rcx
_BYTE *eng_1; // r9
char *v13; // r10
char v14; // al
char n59_3; // al
char *v16; // rdx
char n59_4; // al
unsigned __int64 v18; // r8
char n59_1; // cl
unsigned __int64 v20; // rcx
_BYTE *eng_2; // r9
char *v22; // r10
char n59_2; // cl
char *v24; // r8
v6 = a3; /*0x45a15*/
if ( !p_STACK[0x7D0] ) /*0x45a1e*/
return 0x8000000000000002uLL; /*0x45a20*/
if ( a2 && a3 ) /*0x45a34*/
{
while ( 1 ) /*0x45adf*/
{
v14 = *a2; /*0x45adf*/
if ( !*a2 ) /*0x45adf*/
break; /*0x45adf*/
if ( a5 ) /*0x45a54*/
{
if ( ((*(_DWORD *)a2 ^ *eng) & 0xFFFFFF) == 0 ) /*0x45a5f*/
goto LABEL_26; /*0x45a5f*/
a2 += 3; /*0x45a65*/
}
else
{
v9 = 0; /*0x45a6b*/
if ( v14 ) /*0x45a70*/
{
n59 = *a2; /*0x45a72*/
do /*0x45a82*/
{
if ( n59 == 59 ) /*0x45a77*/
break; /*0x45a77*/
n59 = a2[++v9]; /*0x45a7c*/
}
while ( n59 ); /*0x45a82*/
}
v11 = v9; /*0x45a84*/
eng_1 = eng; /*0x45a87*/
v13 = a2; /*0x45a8a*/
if ( !v9 ) /*0x45a90*/
goto LABEL_20; /*0x45a90*/
while ( v14 && v14 == *eng_1 && v11 > 1 ) /*0x45a9d*/
{
++v13; /*0x45a9f*/
++eng_1; /*0x45aa2*/
--v11; /*0x45aa5*/
v14 = *v13; /*0x45aa8*/
}
if ( *v13 == (char)*eng_1 ) /*0x45ab7*/
{
LABEL_20:
if ( !*((_BYTE *)eng + v9) ) /*0x45ac3*/
{
LABEL_26:
while ( 1 ) /*0x45aee*/
{
v16 = *(char **)v6; /*0x45aee*/
if ( !*(_QWORD *)v6 ) /*0x45aee*/
return 0x8000000000000003uLL; /*0x45af4*/
n59_4 = *v16; /*0x45afa*/
while ( n59_4 ) /*0x45b7c*/
{
v18 = 0; /*0x45afe*/
n59_1 = n59_4; /*0x45b05*/
do /*0x45b15*/
{
if ( n59_1 == 59 ) /*0x45b0a*/
break; /*0x45b0a*/
n59_1 = v16[++v18]; /*0x45b0f*/
}
while ( n59_1 ); /*0x45b15*/
v20 = v18; /*0x45b17*/
eng_2 = eng; /*0x45b1a*/
v22 = v16; /*0x45b1d*/
if ( !v18 ) /*0x45b23*/
goto LABEL_32; /*0x45b23*/
while ( n59_4 && n59_4 == *eng_2 && v20 > 1 ) /*0x45b3c*/
{
++v22; /*0x45b3e*/
++eng_2; /*0x45b41*/
--v20; /*0x45b44*/
n59_4 = *v22; /*0x45b47*/
}
if ( *v22 == (char)*eng_2 ) /*0x45b56*/
{
LABEL_32:
*p_STACK[0x7D0] = *(_QWORD *)(v6 + 8); /*0x45b29*/
return 0; /*0x45b2e*/
}
v16 += v18; /*0x45b5d*/
n59_4 = *v16; /*0x45b60*/
if ( !*v16 ) /*0x45b60*/
break; /*0x45b60*/
n59_2 = *v16; /*0x45b66*/
v24 = v16; /*0x45b68*/
do /*0x45b73*/
{
if ( n59_2 != 59 ) /*0x45b6e*/
break; /*0x45b6e*/
n59_2 = *++v24; /*0x45b73*/
}
while ( *v24 ); /*0x45b73*/
}
v6 += 16; /*0x45b7e*/
}
}
}
a2 += v9; /*0x45ac5*/
n59_3 = *a2; /*0x45ac8*/
if ( !*a2 ) /*0x45acc*/
return 0x8000000000000003uLL; /*0x45acc*/
do /*0x45ad9*/
{
if ( n59_3 != 59 ) /*0x45ad4*/
break; /*0x45ad4*/
n59_3 = *++a2; /*0x45ad9*/
}
while ( *a2 ); /*0x45ad9*/
}
}
}
return 0x8000000000000003uLL; /*0x45a4e*/
}
// Function: UtlHexStrToBin @ 0x45b88 (0x2cb bytes)
__int64 __fastcall UtlHexStrToBin(char *eng, char *a2, _BYTE **a3, _BYTE *eng_2, char a5)
{
char n59_4; // al
unsigned __int64 v10; // r8
char n59; // cl
unsigned __int64 v12; // r10
char *eng_1; // rcx
char *v14; // r9
char n59_1; // al
_BYTE **v16; // r9
__int64 v17; // rdi
_BYTE *v18; // rax
_BYTE *v19; // rbx
unsigned __int64 v20; // r8
char n59_2; // al
unsigned __int64 v22; // rcx
_BYTE *v23; // r10
char *eng_3; // r11
char j; // al
_BYTE *v26; // rdx
char n59_3; // al
__int64 v28; // rdx
_BYTE *v29; // rax
__int64 v30; // rdi
_WORD *eng_4; // rax
_WORD *eng_5; // rax
__int64 i; // rdx
_BYTE *v34; // rax
if ( !eng || !eng_2 || !a3 ) /*0x45bc1*/
return 0x8000000000000002uLL; /*0x45bc1*/
if ( !a2 ) /*0x45bca*/
return 0x8000000000000003uLL; /*0x45bd6*/
if ( !*(_WORD *)eng_2 ) /*0x45bdb*/
return 0x8000000000000002uLL; /*0x45e30*/
n59_4 = *a2; /*0x45be5*/
if ( !*a2 ) /*0x45bea*/
return 0x8000000000000003uLL; /*0x45bea*/
while ( a5 ) /*0x45bf3*/
{
if ( ((*(_DWORD *)a2 ^ *(_DWORD *)eng) & 0xFFFFFF) == 0 ) /*0x45bfe*/
goto LABEL_24; /*0x45bfe*/
a2 += 3; /*0x45c04*/
LABEL_22:
n59_4 = *a2; /*0x45c75*/
if ( !*a2 ) /*0x45c75*/
return 0x8000000000000003uLL; /*0x45c7a*/
}
v10 = 0; /*0x45c0a*/
n59 = n59_4; /*0x45c0d*/
do /*0x45c1d*/
{
if ( n59 == 59 ) /*0x45c11*/
break; /*0x45c11*/
n59 = a2[++v10]; /*0x45c16*/
}
while ( n59 ); /*0x45c1d*/
v12 = v10; /*0x45c1f*/
eng_1 = eng; /*0x45c22*/
v14 = a2; /*0x45c25*/
if ( v10 ) /*0x45c2b*/
{
do /*0x45c40*/
{
if ( n59_4 != *eng_1 ) /*0x45c2f*/
break; /*0x45c2f*/
if ( v12 <= 1 ) /*0x45c35*/
break; /*0x45c35*/
++v14; /*0x45c37*/
++eng_1; /*0x45c3a*/
--v12; /*0x45c3d*/
n59_4 = *v14; /*0x45c40*/
}
while ( *v14 ); /*0x45c40*/
if ( *v14 != *eng_1 ) /*0x45c4f*/
{
a2 += v10; /*0x45c59*/
n59_1 = *a2; /*0x45c5c*/
if ( !*a2 ) /*0x45c61*/
return 0x8000000000000003uLL; /*0x45c61*/
do /*0x45c6e*/
{
if ( n59_1 != 59 ) /*0x45c69*/
break; /*0x45c69*/
n59_1 = *++a2; /*0x45c6e*/
}
while ( *a2 ); /*0x45c6e*/
goto LABEL_22; /*0x45c73*/
}
}
LABEL_24:
v16 = (_BYTE **)*a3; /*0x45c85*/
v17 = 0; /*0x45c89*/
if ( !*a3 ) /*0x45c85*/
goto LABEL_25; /*0x45c8f*/
LABEL_43:
v26 = *v16; /*0x45d3d*/
if ( !*v16 ) /*0x45d43*/
{
LABEL_25:
v18 = (_BYTE *)UtlAllocZero(4, 16 * (v17 + 2)); /*0x45c95*/
v19 = v18; /*0x45ca7*/
if ( v18 ) /*0x45cad*/
{
if ( *a3 ) /*0x45d5a*/
UtlMemCpy(v18, *a3, 16 * v17); /*0x45d6d*/
v28 = 0; /*0x45d72*/
if ( *eng ) /*0x45d75*/
{
do /*0x45d7d*/
++v28; /*0x45d7a*/
while ( eng[v28] ); /*0x45d7d*/
}
v29 = UtlStrCpy(4, v28 + 1, eng); /*0x45d8e*/
v30 = 2 * v17; /*0x45d93*/
*(_QWORD *)&v19[8 * v30] = v29; /*0x45d96*/
if ( v29 ) /*0x45d9d*/
{
if ( *(_WORD *)eng_2 ) /*0x45db1*/
{
eng_4 = eng_2; /*0x45db8*/
do /*0x45dbf*/
++eng_4; /*0x45dbb*/
while ( *eng_4 ); /*0x45dbf*/
}
eng_5 = eng_2; /*0x45dc5*/
for ( i = 0; *eng_5; ++i ) /*0x45dcb*/
++eng_5; /*0x45dd2*/
v34 = UtlStrCpy(4, 2 * i + 2, eng_2); /*0x45dec*/
*(_QWORD *)&v19[8 * v30 + 8] = v34; /*0x45df1*/
if ( v34 ) /*0x45df9*/
{
*(_QWORD *)&v19[8 * v30 + 16] = 0; /*0x45e0b*/
*(_QWORD *)&v19[8 * v30 + 24] = 0; /*0x45e10*/
if ( *a3 ) /*0x45e15*/
(*(void (**)(void))(BootServices + 72))(); /*0x45e25*/
*a3 = v19; /*0x45e28*/
return 0; /*0x45e2e*/
}
(*(void (__fastcall **)(_QWORD))(BootServices + 72))(*(_QWORD *)&v19[8 * v30]); /*0x45e06*/
}
(*(void (__fastcall **)(_BYTE *))(BootServices + 72))(v19); /*0x45da9*/
}
return 0x8000000000000009uLL; /*0x45cbd*/
}
while ( 1 ) /*0x45d2f*/
{
n59_2 = *v26; /*0x45d2f*/
if ( !*v26 ) /*0x45d2f*/
{
LABEL_42:
v16 += 2; /*0x45d36*/
++v17; /*0x45d3a*/
goto LABEL_43; /*0x45d3a*/
}
v20 = 0; /*0x45cc2*/
while ( n59_2 && n59_2 != 59 ) /*0x45cc9*/
n59_2 = v26[++v20]; /*0x45cce*/
v22 = v20; /*0x45cd7*/
v23 = v26; /*0x45cda*/
eng_3 = eng; /*0x45cdd*/
if ( !v20 ) /*0x45ce3*/
return 0x8000000000000014uLL; /*0x45e49*/
for ( j = *eng; j && j == *v23 && v22 > 1; j = *eng_3 ) /*0x45ce5*/
{
++eng_3; /*0x45cf4*/
++v23; /*0x45cf7*/
--v22; /*0x45cfa*/
}
if ( *eng_3 == (char)*v23 ) /*0x45d0d*/
return 0x8000000000000014uLL; /*0x45e49*/
v26 += v20; /*0x45d17*/
n59_3 = *v26; /*0x45d1a*/
if ( !*v26 ) /*0x45d1f*/
goto LABEL_42; /*0x45d1f*/
do /*0x45d28*/
{
if ( n59_3 != 59 ) /*0x45d23*/
break; /*0x45d23*/
n59_3 = *++v26; /*0x45d28*/
}
while ( *v26 ); /*0x45d28*/
}
}
// Function: UtlParseTokenStrWide @ 0x45e54 (0xa3 bytes)
__int64 __fastcall UtlParseTokenStrWide(__int16 *PlatformLang)
{
__int64 v1; // rbx
__int64 v2; // rax
__int64 v3; // rdi
__int64 v5; // [rsp+48h] [rbp+10h] BYREF
v1 = 0; /*0x45e60*/
v5 = 0; /*0x45e6d*/
if ( (*(__int64 (__fastcall **)(const __int16 *, __int64, _QWORD, __int64 *, _QWORD))(RuntimeServices + 72))( /*0x45e96*/
L"PlatformLang",
640,
0,
&v5,
0) == 0x8000000000000005uLL )
{
v2 = UtlAllocZero(4, v5); /*0x45ea0*/
v3 = v2; /*0x45ea5*/
if ( v2 ) /*0x45eab*/
{
if ( (*(__int64 (__fastcall **)(const __int16 *, __int64, _QWORD, __int64 *, __int64))(RuntimeServices + 72))( /*0x45ed5*/
L"PlatformLang",
640,
0,
&v5,
v2) >= 0 )
return v3; /*0x45ee6*/
else
(*(void (__fastcall **)(__int64))(BootServices + 72))(v3); /*0x45ee1*/
}
}
return v1; /*0x45ef1*/
}
// Function: UtlParseTokenStrSafe @ 0x45ef8 (0x15f bytes)
_BYTE *__fastcall UtlParseTokenStrSafe(char *a1, char a2, _BYTE *n91393, __int64 a4)
{
_BYTE **p_n91393; // rsi
char n59_1; // cl
unsigned __int64 n3_2; // rax
unsigned __int64 n3; // rdi
unsigned __int64 n3_1; // rdx
char *v11; // rbx
char n59; // al
char v13; // al
unsigned __int64 n3_3; // rcx
_BYTE *n91393_2; // r9
char *v16; // r10
_BYTE *v18; // rax
_BYTE *n91393_1; // [rsp+60h] [rbp+18h] BYREF
__int64 v20; // [rsp+68h] [rbp+20h]
n91393_1 = n91393; /*0x45efe*/
v20 = a4; /*0x45f02*/
if ( n91393 ) /*0x45f1b*/
{
p_n91393 = &n91393_1; /*0x45f21*/
do /*0x4601d*/
{
n59_1 = *n91393; /*0x45f25*/
n3_2 = 0; /*0x45f28*/
n3 = 3; /*0x45f2a*/
if ( !*n91393 ) /*0x45f25*/
goto LABEL_7; /*0x45f25*/
do /*0x45f36*/
++n3_2; /*0x45f33*/
while ( n91393[n3_2] ); /*0x45f36*/
if ( n3_2 > 3 ) /*0x45f40*/
{
n3_1 = 3; /*0x45f42*/
}
else
{
LABEL_7:
n3_1 = 0; /*0x45f47*/
if ( n59_1 ) /*0x45f4b*/
{
do /*0x45f50*/
++n3_1; /*0x45f4d*/
while ( n91393[n3_1] ); /*0x45f50*/
}
}
if ( a2 ) /*0x45f5a*/
{
LABEL_35:
while ( n3_1 ) /*0x46013*/
{
v11 = a1; /*0x45f87*/
if ( *a1 ) /*0x45f83*/
{
while ( 1 ) /*0x45f8f*/
{
if ( a2 ) /*0x45f8f*/
goto LABEL_42; /*0x45f8f*/
while ( *v11 == 59 ) /*0x45f9e*/
++v11; /*0x45f97*/
n59 = *v11; /*0x45fa0*/
n3 = 0; /*0x45fa2*/
while ( n59 && n59 != 59 ) /*0x45fa8*/
n59 = v11[++n3]; /*0x45fad*/
if ( n3_1 <= n3 ) /*0x45fb7*/
{
LABEL_42:
v13 = *v11; /*0x45fb9*/
n3_3 = n3_1; /*0x45fbb*/
n91393_2 = n91393; /*0x45fbe*/
v16 = v11; /*0x45fc1*/
while ( v13 && v13 == *n91393_2 && n3_3 > 1 ) /*0x45fcf*/
{
++v16; /*0x45fd1*/
++n91393_2; /*0x45fd4*/
--n3_3; /*0x45fd7*/
v13 = *v16; /*0x45fda*/
}
if ( *v16 == (char)*n91393_2 ) /*0x45fe9*/
break; /*0x45fe9*/
}
v11 += n3; /*0x45ff0*/
if ( !*v11 ) /*0x45ff3*/
goto LABEL_31; /*0x45ff6*/
}
v18 = UtlStrCmp(4, n3 + 1); /*0x4603d*/
if ( v18 ) /*0x46045*/
return UtlMemCpy(v18, v11, n3); /*0x46050*/
return 0; /*0x46045*/
}
LABEL_31:
if ( a2 ) /*0x45ffb*/
break; /*0x45ffb*/
if ( !--n3_1 ) /*0x46001*/
break; /*0x46001*/
do /*0x4600e*/
{
if ( n91393[n3_1] == 45 ) /*0x46008*/
break; /*0x46008*/
--n3_1; /*0x4600a*/
}
while ( n3_1 ); /*0x4600e*/
}
}
else
{
n3_1 = 0; /*0x45f60*/
if ( n59_1 ) /*0x45f64*/
{
do /*0x45f7c*/
{
if ( n59_1 == 59 ) /*0x45f6d*/
break; /*0x45f6d*/
n59_1 = n91393[++n3_1]; /*0x45f76*/
}
while ( n59_1 ); /*0x45f7c*/
goto LABEL_35; /*0x45f7c*/
}
}
n91393 = *++p_n91393; /*0x4601d*/
}
while ( *p_n91393 ); /*0x4601d*/
}
return 0; /*0x4602b*/
}
// Function: UtlMemAllocStruct @ 0x46058 (0x10f bytes)
__int64 UtlMemAllocStruct(_QWORD *GuidPtr, __int64 TypeInfo, ...)
{
_DWORD *FieldList; // rdi
int TotalDataSize; // ebx
_DWORD *FieldList_2; // rax
va_list v7; // r8
unsigned int AllocSize; // ebx
_BYTE *NewBuffer; // rax
_BYTE *NewBuffer_1; // rsi
_BYTE *DataPtr; // rcx
__int64 SourceVar; // rax
__int64 FieldPtr; // r11
__int64 FieldOffset; // rcx
__int64 FieldLen; // r10
__int64 InstallStatus; // rax
__int64 ResultHandle; // rcx
__int64 StackVars[9]; // [rsp+20h] [rbp-48h] BYREF
_DWORD *FieldList_1; // [rsp+80h] [rbp+18h] BYREF
va_list va; // [rsp+80h] [rbp+18h]
va_list va1; // [rsp+88h] [rbp+20h] BYREF
va_start(va1, TypeInfo);
va_start(va, TypeInfo);
FieldList_1 = va_arg(va1, _DWORD *); /*0x46058*/
FieldList = FieldList_1; /*0x46073*/
TotalDataSize = 0; /*0x46080*/
FieldList_2 = FieldList_1; /*0x46083*/
if ( !FieldList_1 ) /*0x46089*/
return 0; /*0x46089*/
va_copy(v7, va); /*0x4608f*/
do /*0x4609d*/
{
++v7; /*0x46095*/
TotalDataSize = TotalDataSize + *FieldList_2 - 4; /*0x46099*/
FieldList_2 = *v7; /*0x4609d*/
}
while ( *v7 ); /*0x4609d*/
if ( !TotalDataSize ) /*0x460a8*/
return 0; /*0x460a8*/
AllocSize = TotalDataSize + 24; /*0x460ae*/
NewBuffer = UtlStrCmp(4, AllocSize); /*0x460b8*/
NewBuffer_1 = NewBuffer; /*0x460bd*/
if ( !NewBuffer ) /*0x460c3*/
return 0; /*0x46158*/
DataPtr = NewBuffer + 20; /*0x460cd*/
*(_QWORD *)NewBuffer = *GuidPtr; /*0x460d9*/
SourceVar = GuidPtr[1]; /*0x460dc*/
*((_DWORD *)NewBuffer_1 + 4) = AllocSize; /*0x460e0*/
*((_QWORD *)NewBuffer_1 + 1) = SourceVar; /*0x460e3*/
do /*0x46108*/
{
UtlMemCpy(DataPtr, (_BYTE *)FieldList + 4, (unsigned int)(*FieldList - 4)); /*0x460f6*/
DataPtr = (_BYTE *)(FieldLen + FieldOffset); /*0x460ff*/
FieldList = *(_DWORD **)(FieldPtr + 8); /*0x46102*/
}
while ( FieldList ); /*0x46108*/
UtlMemCpy(DataPtr, &qword_1A630, 4); /*0x46117*/
InstallStatus = _ImageBase(0, NewBuffer_1, TypeInfo, StackVars); /*0x46131*/
ResultHandle = StackVars[0]; /*0x46133*/
if ( InstallStatus < 0 ) /*0x46142*/
ResultHandle = 0; /*0x46142*/
StackVars[0] = ResultHandle; /*0x46146*/
(*(void (__fastcall **)(_BYTE *))(BootServices + 72))(NewBuffer_1); /*0x4614e*/
return StackVars[0]; /*0x4615a*/
}
// Function: UtlStrCatMemPool @ 0x46168 (0x118 bytes)
__int64 UtlStrCatMemPool()
{
(*(void (__fastcall **)(__int64 *, _QWORD, __int64 *))(BootServices + 320))(&qword_2B0[2], 0, &qword_473E0); /*0x4619f*/
return 0; /*0x4627a*/
}
// Function: UtlMemPoolAlloc @ 0x46280 (0x1ee bytes)
char *UtlMemPoolAlloc()
{
__int64 *GuidTable; // rbp
__int64 *PtrWalk; // rax
__int64 TableLen; // rdx
char *i_2; // rax
char *i_1; // rbx
__int16 GuidTagChar; // dx
__int64 GuidLen; // rcx
char *i; // rax
__int16 *k_1; // rdi
unsigned __int64 j; // rsi
unsigned __int64 FillResult; // rax
__int16 *k_2; // rax
__int16 AmpersandChar; // dx
__int64 NameLen; // rcx
__int16 *k; // rax
unsigned __int16 UrlChar; // ax
__int16 *k_3; // rdi
__int16 *k_4; // rax
__int16 n38; // dx
__int64 PathLen; // rcx
__int16 *m; // rax
char InValueBlock; // dl
char *n; // rcx
unsigned __int16 HexChar; // ax
GuidTable = &qword_1B60[1]; /*0x4629b*/
PtrWalk = &qword_1B60[1]; /*0x462a2*/
TableLen = 0; /*0x462a5*/
do /*0x462bd*/
{
PtrWalk = (__int64 *)((char *)PtrWalk + 2); /*0x462b7*/
++TableLen; /*0x462ba*/
}
while ( *(_WORD *)PtrWalk ); /*0x462bd*/
i_2 = UtlStrCmp(4, 8 * TableLen + 100); /*0x462d0*/
i_1 = i_2; /*0x462d5*/
if ( !i_2 ) /*0x462db*/
return 0; /*0x462dd*/
GuidTagChar = 71; /*0x462eb*/
do /*0x46301*/
{
*(_WORD *)i_2 = GuidTagChar; /*0x462f3*/
i_2 += 2; /*0x462f6*/
GuidTagChar = *(_WORD *)&i_2[(char *)&GUID__ - i_1]; /*0x462f9*/
}
while ( GuidTagChar ); /*0x46301*/
*(_WORD *)i_2 = 0; /*0x46303*/
GuidLen = 0; /*0x46307*/
for ( i = i_1; *(_WORD *)i; ++GuidLen ) /*0x4630d*/
i += 2; /*0x46313*/
k_1 = (__int16 *)&i_1[2 * GuidLen]; /*0x4631f*/
for ( j = 0; j < 0x10; ++j ) /*0x46323*/
{
FillResult = UtlBufferFill(k_1, 160, *((unsigned __int8 *)&pProtocol2_ + j + 16), 2); /*0x46342*/
k_1 += FillResult; /*0x4634a*/
}
k_2 = k_1; /*0x46360*/
AmpersandChar = 38; /*0x46366*/
do /*0x46376*/
{
*k_2++ = AmpersandChar; /*0x46368*/
AmpersandChar = *(__int16 *)((char *)k_2 + (char *)&_NAME__ - (char *)k_1); /*0x4636e*/
}
while ( AmpersandChar ); /*0x46376*/
*k_2 = 0; /*0x46378*/
NameLen = 0; /*0x4637c*/
for ( k = k_1; *k; ++NameLen ) /*0x46382*/
++k; /*0x46388*/
UrlChar = 85; /*0x46394*/
k_3 = &k_1[NameLen]; /*0x4639b*/
while ( UrlChar ) /*0x463cc*/
{
GuidTable = (__int64 *)((char *)GuidTable + 2); /*0x463bd*/
k_3 += UtlBufferFill(k_3, 160, UrlChar, 4); /*0x463c0*/
UrlChar = *(_WORD *)GuidTable; /*0x463c4*/
}
k_4 = k_3; /*0x463d5*/
n38 = 38; /*0x463d8*/
do /*0x463eb*/
{
*k_4++ = n38; /*0x463dd*/
n38 = *(__int16 *)((char *)k_4 + (char *)L"&PATH=" - (char *)k_3); /*0x463e3*/
}
while ( n38 ); /*0x463eb*/
*k_4 = 0; /*0x463ed*/
PathLen = 0; /*0x463f1*/
for ( m = k_3; *m; ++PathLen ) /*0x463f7*/
++m; /*0x463fd*/
k_3[PathLen] = 0; /*0x46409*/
InValueBlock = 0; /*0x4640e*/
for ( n = i_1; *(_WORD *)n; n += 2 ) /*0x46414*/
{
HexChar = *(_WORD *)n; /*0x4641a*/
if ( *(_WORD *)n == 61 ) /*0x46421*/
{
InValueBlock = 1; /*0x46423*/
}
else if ( HexChar == 38 ) /*0x4642a*/
{
InValueBlock = 0; /*0x4642c*/
}
else if ( InValueBlock && HexChar >= 0x41u && HexChar <= 0x46u ) /*0x46440*/
{
*(_WORD *)n = HexChar + 32; /*0x46446*/
}
}
return i_1; /*0x46464*/
}
// Function: UtlStrStrWide @ 0x46470 (0x97 bytes)
bool __fastcall UtlStrStrWide(_WORD *Context, _WORD *a2, _WORD *GUID_, __int16 *&NAME_)
{
_WORD *v6; // rdi
_WORD *v7; // r11
bool result; // al
_WORD *v9; // rbx
_WORD *v10; // rax
__int64 v11; // r11
unsigned __int64 v12; // r11
v6 = UtlStrStr(Context, GUID_); /*0x46490*/
result = v6 /*0x464f4*/
&& (v9 = UtlStrStr(a2, v7)) != 0
&& UtlStrStr(v6, &NAME_)
&& (v10 = UtlStrStr(v9, &NAME_)) != 0
&& (v12 = (v11 - (__int64)v6) >> 1, v12 == v10 - v9)
&& UtlStrNCpy(v6, v9, v12) == 0;
return result; /*0x46501*/
}
// Function: UtlParseUrlParam @ 0x46508 (0x8c bytes)
char __fastcall UtlParseUrlParam(_WORD *Context)
{
char *v2; // rax
char *v3; // rbx
bool v4; // di
v2 = UtlMemPoolAlloc(); /*0x4652b*/
v3 = v2; /*0x46530*/
if ( v2 ) /*0x46536*/
{
v4 = UtlStrStrWide(Context, v2, &GUID__, (__int16 *)&_NAME__); /*0x46551*/
if ( v4 ) /*0x46556*/
v4 = UtlStrStrWide(Context, v3, &_NAME__, L"&PATH="); /*0x46571*/
(*(void (__fastcall **)(char *))(BootServices + 72))(v3); /*0x4657e*/
LOBYTE(v2) = v4; /*0x46581*/
}
return (char)v2; /*0x4658e*/
}
// Function: UtlParseUrlStr @ 0x46594 (0x10f bytes)
bool __fastcall UtlParseUrlStr(__int64 a1, __int64 a2, int n1416, _BYTE *NicConfig, __int64 a5)
{
const wchar_t *GUID_00000000000000000000000000000000&NAME_0000&PATH_00; // rdi
const wchar_t *GUID_00000000000000000000000000000000&NAME_0000&PATH_00_1; // rax
__int64 v8; // rbx
__int64 v9; // rbx
char *_r_n; // rbp
__int64 v12; // rax
__int64 v14; // rax
__int64 v15; // rbx
GUID_00000000000000000000000000000000&NAME_0000&PATH_00 = L"GUID=00000000000000000000000000000000&NAME=0000&PATH=00"; /*0x465ad*/
GUID_00000000000000000000000000000000&NAME_0000&PATH_00_1 = L"GUID=00000000000000000000000000000000&NAME=0000&PATH=00"; /*0x465ba*/
v8 = 0; /*0x465bd*/
do /*0x465c7*/
{
++GUID_00000000000000000000000000000000&NAME_0000&PATH_00_1; /*0x465c0*/
++v8; /*0x465c4*/
}
while ( *GUID_00000000000000000000000000000000&NAME_0000&PATH_00_1 ); /*0x465c7*/
v9 = 2 * v8 + 66; /*0x465cd*/
_r_n = UtlStrCmp(4, v9); /*0x465f8*/
UtlCrc32Calc( /*0x465fb*/
_r_n,
v9,
(unsigned __int8 *)L"%s&OFFSET=0&WIDTH=%016LX",
L"GUID=00000000000000000000000000000000&NAME=0000&PATH=00",
1416);
if ( !_r_n ) /*0x46603*/
return 0; /*0x46603*/
v12 = word_18(0, _r_n, NicConfig, 1416); /*0x46633*/
if ( v12 < 0 ) /*0x46648*/
a5 = 0; /*0x46648*/
(*(void (__fastcall **)(char *))(BootServices + 72))(_r_n); /*0x4664c*/
if ( !a5 ) /*0x46652*/
return 0; /*0x46605*/
v14 = 0; /*0x46654*/
do /*0x4665e*/
{
++GUID_00000000000000000000000000000000&NAME_0000&PATH_00; /*0x46657*/
++v14; /*0x4665b*/
}
while ( *GUID_00000000000000000000000000000000&NAME_0000&PATH_00 ); /*0x4665e*/
v15 = UtlStrCatMemPool(); /*0x4667c*/
(*(void (__fastcall **)(__int64))(BootServices + 72))(a5); /*0x4667f*/
return v15 != 0; /*0x4669c*/
}
// Function: UtlMemAlloc @ 0x466a4 (0x5b bytes)
_QWORD *UtlMemAlloc()
{
_QWORD *v0; // rbx
__int64 v2; // rax
v0 = (_QWORD *)UtlAllocZero(4, 24); /*0x466b7*/
if ( !v0 ) /*0x466bd*/
return 0; /*0x466bd*/
v2 = UtlAllocZero(4, 512); /*0x466cd*/
*v0 = v2; /*0x466d2*/
if ( !v2 ) /*0x466d8*/
{
(*(void (__fastcall **)(_QWORD *))(BootServices + 72))(v0); /*0x466e4*/
return 0; /*0x466c1*/
}
v0[2] = 0; /*0x466e9*/
v0[1] = 512; /*0x466ee*/
return v0; /*0x466f9*/
}
// Function: UtlMemFree @ 0x46700 (0x2e bytes)
__int64 __fastcall UtlMemFree(_QWORD *a1)
{
if ( *a1 ) /*0x46709*/
(*(void (**)(void))(BootServices + 72))(); /*0x46718*/
return (*(__int64 (__fastcall **)(_QWORD *))(BootServices + 72))(a1);
}
// Function: UtlMemDup @ 0x46730 (0x65 bytes)
_BYTE *__fastcall UtlMemDup(__int64 *Protocol, __int64 a2)
{
unsigned __int64 CopySize; // rdx
_BYTE *result; // rax
__int64 v6; // rcx
CopySize = Protocol[1]; /*0x46741*/
if ( a2 + Protocol[2] > CopySize ) /*0x4674f*/
{
result = UtlMemAllocAligned(4, CopySize, CopySize + a2 + 512, (_BYTE *)*Protocol); /*0x46761*/
if ( !result ) /*0x46769*/
return result; /*0x46769*/
*Protocol = (__int64)result; /*0x4676b*/
Protocol[1] += a2 + 512; /*0x46775*/
}
v6 = Protocol[2]; /*0x46779*/
result = (_BYTE *)(v6 + *Protocol); /*0x46780*/
Protocol[2] = a2 + v6; /*0x46786*/
return result; /*0x4678f*/
}
// Function: UtlBuildTlv @ 0x46798 (0x50 bytes)
_BYTE *__fastcall UtlBuildTlv(__int64 a1, _BYTE *a2, char a3, __int64 a4, char a5, char a6)
{
_BYTE *v8; // rax
*a2 = a3; /*0x467a6*/
a2[1] = (a6 << 7) | (a4 + a5) & 0x7F; /*0x467c5*/
v8 = (_BYTE *)UtlMemDup(a1, ((_BYTE)a4 + a5) & 0x7F); /*0x467cb*/
return UtlMemCpy(v8, a2, a4); /*0x467de*/
}
// Function: UtlMemDupFromPath @ 0x467e8 (0x31 bytes)
_BYTE *__fastcall UtlMemDupFromPath(__int64 *Protocol, _QWORD *DevicePath)
{
__int64 v2; // rbx
_BYTE *v3; // rdi
_BYTE *v4; // rax
v2 = DevicePath[2]; /*0x467f2*/
v3 = (_BYTE *)*DevicePath; /*0x467f6*/
v4 = UtlMemDup(Protocol, v2); /*0x467fc*/
return UtlMemCpy(v4, v3, v2); /*0x4680f*/
}
// Function: UtlBuildTlvWide @ 0x4681c (0x27 bytes)
_BYTE *__fastcall UtlBuildTlvWide(_QWORD *Protocol)
{
char v2; // [rsp+48h] [rbp+10h] BYREF
return UtlBuildTlv((__int64)Protocol, &v2, 41, 2, 0, 0); /*0x4683e*/
}
// Function: UtlBuildTlvPath @ 0x46844 (0x69 bytes)
_BYTE *__fastcall UtlBuildTlvPath(__int64 DevicePath, __int16 n40, __int64 Protocol, __int64 a4, int n2)
{
__int64 n14; // rax
_BYTE *v6; // r10
__int64 v7; // r11
_BYTE v9[2]; // [rsp+30h] [rbp-18h] BYREF
__int16 n40_1; // [rsp+32h] [rbp-16h]
char v11; // [rsp+34h] [rbp-14h]
char v12; // [rsp+35h] [rbp-13h]
_BYTE v13[18]; // [rsp+36h] [rbp-12h] BYREF
n14 = 14; /*0x4684b*/
v6 = v9; /*0x46850*/
do /*0x46860*/
{
*v6++ = 0; /*0x46855*/
--n14; /*0x4685c*/
}
while ( n14 ); /*0x46860*/
n40_1 = n40; /*0x46866*/
v11 = Protocol & 0x30; /*0x46870*/
v12 = 0; /*0x4687e*/
UtlMemCpy(v13, &n2, 1); /*0x46882*/
return UtlBuildTlv(v7, v9, 9, 14, 0, 0); /*0x468a8*/
}
// Function: UtlMemAllocPool @ 0x468b0 (0x53 bytes)
_BYTE *__fastcall UtlMemAllocPool(__int64 NicConfigPtr, __int64 *Var14Ptr, __int64 Param3, char TotalLen)
{
_BYTE *ZeroBuf; // r8
__int64 ZeroCount; // rax
_BYTE ZeroBuf_1[2]; // [rsp+30h] [rbp-28h] BYREF
__int64 v8; // [rsp+32h] [rbp-26h]
__int64 v9; // [rsp+3Ah] [rbp-1Eh]
ZeroBuf = ZeroBuf_1; /*0x468ba*/
ZeroCount = 18; /*0x468bf*/
do /*0x468cd*/
{
*ZeroBuf++ = 0; /*0x468c2*/
--ZeroCount; /*0x468c9*/
}
while ( ZeroCount ); /*0x468cd*/
v8 = *Var14Ptr; /*0x468da*/
v9 = Var14Ptr[1]; /*0x468e8*/
return UtlBuildTlv(NicConfigPtr, ZeroBuf_1, 95, 18, TotalLen - 18, 0); /*0x468fe*/
}
// Function: UtlAllocRegisterProto @ 0x46904 (0x281 bytes)
unsigned __int64 __fastcall UtlAllocRegisterProto(
__int64 ContextData,
__int16 n0x1235,
_BYTE *TlvData,
_QWORD *Protocol,
_BYTE **OutExtra,
_BYTE *ChecksumOut)
{
__int64 DestPtr; // rcx
_BYTE *OutPtr; // r13
__int64 TotalLen; // r10
int TotalLen_1; // ebp
unsigned __int64 DataLen; // r10
unsigned __int64 DataLen_1; // rsi
char FoundMatch; // di
unsigned __int64 DataLen_2; // r12
char *i; // rbx
char TagMatch; // r11
char TagType; // al
__int64 TagLen; // rcx
_BYTE *SrcPtr; // rcx
__int16 *p_n0x1235; // rdx
__int64 CmpLen; // r8
_BYTE *i_1; // rdx
__int64 TagLen2; // rax
_BYTE **OutExtra_1; // rdi
_BYTE *i_2; // r11
__int64 NextTagLen; // rax
char ExtraTagLen; // r9
__int64 RemainingLen; // rax
__int64 MatchTagLen; // r11
__int64 TagFieldLen; // r11
__int64 CopySize; // rcx
_BYTE *WritePtr; // r13
int WrittenSize; // ebp
__int64 ExtraCopySize; // rcx
unsigned __int64 RemainingAfterMatch; // rsi
__int64 TrailingSize; // r12
int ChecksumAccum; // r10d
__int64 ContextData_1; // [rsp+60h] [rbp+8h] BYREF
__int16 n0x1235_1; // [rsp+68h] [rbp+10h] BYREF
n0x1235_1 = n0x1235; /*0x46909*/
ContextData_1 = ContextData; /*0x4690e*/
UtlMemCpy(ChecksumOut, TlvData, 4); /*0x4693c*/
OutPtr = (_BYTE *)(DestPtr + 4); /*0x46941*/
TotalLen_1 = TotalLen; /*0x46950*/
UtlMemCpy(&ContextData_1, TlvData, TotalLen); /*0x46953*/
DataLen_1 = DataLen; /*0x46958*/
FoundMatch = 0; /*0x46963*/
DataLen_2 = ContextData_1 & 0xFFFFFF; /*0x46969*/
for ( i = TlvData + 4; ; i += TagLen2 ) /*0x46970*/
{
if ( DataLen_1 >= DataLen_2 ) /*0x46977*/
return 0x800000000000000EuLL; /*0x46977*/
UtlMemCpy(OutPtr, i, i[1] & 0x7F); /*0x4698c*/
TagType = *i; /*0x46995*/
TagLen = i[1] & 0x7F; /*0x46997*/
OutPtr += TagLen; /*0x4699a*/
TotalLen_1 += TagLen; /*0x4699d*/
if ( *i == 14 ) /*0x469a2*/
break; /*0x469a2*/
if ( TagType == 1 || TagType == 93 ) /*0x469d5*/
{
SrcPtr = i + 2; /*0x469d7*/
if ( i + 2 == (char *)&n0x1235_1 ) /*0x469e3*/
goto LABEL_15; /*0x469e3*/
p_n0x1235 = &n0x1235_1; /*0x469e5*/
CmpLen = 1; /*0x469ea*/
do /*0x469fc*/
{
if ( *SrcPtr != *(_BYTE *)p_n0x1235 ) /*0x469f1*/
break; /*0x469f1*/
++SrcPtr; /*0x469f3*/
p_n0x1235 = (__int16 *)((char *)p_n0x1235 + 1); /*0x469f6*/
--CmpLen; /*0x469f9*/
}
while ( CmpLen ); /*0x469fc*/
if ( (unsigned __int8)*SrcPtr == (unsigned __int64)*(unsigned __int8 *)p_n0x1235 ) /*0x46a04*/
LABEL_15:
TagMatch = 1; /*0x46a0e*/
else
TagMatch = 0; /*0x46a09*/
}
if ( FoundMatch ) /*0x46a14*/
goto LABEL_17; /*0x46a14*/
LABEL_23:
TagLen2 = i[1] & 0x7F; /*0x46a44*/
DataLen_1 += TagLen2; /*0x46a4b*/
}
if ( *(_OWORD *)(i + 2) != *(_OWORD *)&pProtocol2_ ) /*0x469af*/
{
FoundMatch = 0; /*0x469c3*/
goto LABEL_23; /*0x469c6*/
}
FoundMatch = 1; /*0x469be*/
LABEL_17:
if ( !TagMatch ) /*0x46a19*/
goto LABEL_23; /*0x46a19*/
i_1 = (_BYTE *)*Protocol; /*0x46a1b*/
if ( (((unsigned __int8)i[1] ^ *(_BYTE *)(*Protocol + 1LL)) & 0x7F) != 0 ) /*0x46a26*/
goto LABEL_23; /*0x46a26*/
if ( (i_1[1] & 0x7F) != 0 ? UtlMemMove(i, i_1, i_1[1] & 0x7F) : 0LL )
goto LABEL_23; /*0x46a42*/
OutExtra_1 = OutExtra; /*0x46a56*/
if ( OutExtra )
{
i_2 = *OutExtra; /*0x46a67*/
NextTagLen = i[1] & 0x7F; /*0x46a6a*/
DataLen_1 += NextTagLen; /*0x46a6d*/
i += NextTagLen; /*0x46a70*/
if ( DataLen_1 >= DataLen_2 ) /*0x46a76*/
return 0x800000000000000EuLL; /*0x46a76*/
ExtraTagLen = i_2[1] & 0x7F; /*0x46a80*/
do
{
if ( ExtraTagLen == (i[1] & 0x7F) && !((i_2[1] & 0x7F) != 0 ? UtlMemMove(i, i_2, i_2[1] & 0x7F) : 0LL) )
break; /*0x46aab*/
RemainingLen = i[1] & 0x7F; /*0x46ab1*/
DataLen_1 += RemainingLen; /*0x46ab4*/
i += RemainingLen; /*0x46ab7*/
}
while ( DataLen_1 < DataLen_2 );
if ( DataLen_1 >= DataLen_2 ) /*0x46ac2*/
return 0x800000000000000EuLL; /*0x46b66*/
}
MatchTagLen = *(_BYTE *)(*Protocol + 1LL) & 0x7F; /*0x46ad7*/
UtlMemCpy(OutPtr, (_BYTE *)(*Protocol + MatchTagLen), Protocol[2] - MatchTagLen); /*0x46ae2*/
CopySize = Protocol[2] - TagFieldLen; /*0x46aeb*/
WritePtr = &OutPtr[CopySize]; /*0x46aee*/
WrittenSize = CopySize + TotalLen_1; /*0x46af1*/
if ( OutExtra_1 ) /*0x46af7*/
{
UtlMemCpy(WritePtr, i, i[1] & 0x7F); /*0x46b08*/
ExtraCopySize = i[1] & 0x7F; /*0x46b11*/
WritePtr += ExtraCopySize; /*0x46b14*/
WrittenSize += ExtraCopySize; /*0x46b17*/
}
RemainingAfterMatch = (i[1] & 0x7F) + DataLen_1; /*0x46b24*/
TrailingSize = DataLen_2 - RemainingAfterMatch; /*0x46b27*/
UtlMemCpy(WritePtr, &TlvData[RemainingAfterMatch], TrailingSize); /*0x46b31*/
LODWORD(ContextData_1) = (ChecksumAccum ^ (TrailingSize + WrittenSize)) & 0xFFFFFF ^ ChecksumAccum; /*0x46b58*/
UtlMemCpy(ChecksumOut, &ContextData_1, 4); /*0x46b5d*/
return 0; /*0x46b75*/
}
// Function: UtlInstallProtocol @ 0x46b88 (0x250 bytes)
__int64 UtlInstallProtocol(
__int64 Status,
const __int64 *DeviceHandle,
__int16 ProtocolId,
_QWORD *ProtocolConfig,
...)
{
_BYTE *ConfigBuffer; // rsi
_BYTE *TlvBuffer; // rdi
__int64 result; // rax
__int64 Param1; // rax
__int64 Param1_1; // rbp
__int64 AllocBuffer; // rbx
unsigned int CurrentOffset; // r13d
char InstallStatus; // r14
_BYTE *v14; // rbx
_BYTE **ProtocolInstalled_1; // rdi
unsigned int CurrentOffset_1; // r15d
_BYTE *ConfigBuffer_1; // r12
__int64 v18; // r10
_BYTE *TlvBuffer_2; // r8
__int64 EntryLen; // [rsp+20h] [rbp-68h]
_BYTE *EntryDataPtr; // [rsp+38h] [rbp-50h] BYREF
_BYTE *TlvBuffer_1; // [rsp+40h] [rbp-48h]
_BYTE **ProtocolInstalled; // [rsp+B0h] [rbp+28h] BYREF
va_list ProtocolInstalleda; // [rsp+B0h] [rbp+28h]
va_list va1; // [rsp+B8h] [rbp+30h] BYREF
va_start(va1, ProtocolConfig);
va_start(ProtocolInstalleda, ProtocolConfig);
ProtocolInstalled = va_arg(va1, _BYTE **); /*0x46b88*/
ConfigBuffer = 0; /*0x46bb8*/
EntryDataPtr = 0; /*0x46bbd*/
TlvBuffer = 0; /*0x46bc8*/
result = (*(__int64 (__fastcall **)(_QWORD, __int64, _BYTE **, _QWORD))&word_1C[2])(0, Status, &EntryDataPtr, 0); /*0x46bcd*/
if ( result == 0x8000000000000005uLL ) /*0x46bdd*/
{
Param1 = UtlAllocZero(4, (__int64)EntryDataPtr); /*0x46beb*/
Param1_1 = Param1; /*0x46bf0*/
if ( !Param1 ) /*0x46bf6*/
return 0x8000000000000009uLL; /*0x46bf8*/
AllocBuffer = (*(__int64 (__fastcall **)(_QWORD, __int64, _BYTE **, __int64, __int64))&word_1C[2])( /*0x46c1f*/
0,
Status,
&EntryDataPtr,
Param1,
EntryLen);
if ( AllocBuffer >= 0 ) /*0x46c25*/
{
EntryDataPtr += ProtocolConfig[2]; /*0x46c3a*/
TlvBuffer = UtlStrCmp(4, (__int64)EntryDataPtr); /*0x46c44*/
TlvBuffer_1 = TlvBuffer; /*0x46c47*/
if ( TlvBuffer && (ConfigBuffer = UtlStrCmp(4, (__int64)EntryDataPtr)) != 0 ) /*0x46c75*/
{
CurrentOffset = 20; /*0x46c77*/
UtlMemCpy(TlvBuffer, (_BYTE *)Param1_1, 20); /*0x46c86*/
InstallStatus = 0; /*0x46c8e*/
v14 = TlvBuffer + 20; /*0x46c91*/
if ( *(_DWORD *)(Param1_1 + 16) <= 0x14u ) /*0x46c98*/
goto LABEL_16; /*0x46c98*/
ProtocolInstalled_1 = ProtocolInstalled; /*0x46c9e*/
CurrentOffset_1 = *(_DWORD *)(Param1_1 + 16); /*0x46ca6*/
do /*0x46d47*/
{
ConfigBuffer_1 = (_BYTE *)(Param1_1 + CurrentOffset); /*0x46cba*/
UtlMemCpy((_BYTE ***)ProtocolInstalleda, ConfigBuffer_1, 4); /*0x46cc0*/
CurrentOffset += *(_DWORD *)ConfigBuffer_1 & 0xFFFFFF; /*0x46ccf*/
if ( ConfigBuffer_1[3] == 2 /*0x46d06*/
&& (UtlAllocRegisterProto(
(__int64)&pProtocol2_,
ProtocolId,
ConfigBuffer_1,
ProtocolConfig,
ProtocolInstalled_1,
ConfigBuffer)
& 0x8000000000000000uLL) == 0LL )
{
InstallStatus = 1; /*0x46d08*/
ConfigBuffer_1 = ConfigBuffer; /*0x46d0b*/
}
UtlMemCpy((_BYTE ***)ProtocolInstalleda, ConfigBuffer_1, 4); /*0x46d1f*/
UtlMemCpy(v14, ConfigBuffer_1, (unsigned int)ProtocolInstalled & 0xFFFFFF); /*0x46d3c*/
v14 += v18; /*0x46d41*/
}
while ( CurrentOffset < CurrentOffset_1 ); /*0x46d47*/
TlvBuffer = TlvBuffer_1; /*0x46d4d*/
if ( InstallStatus ) /*0x46d5d*/
{
TlvBuffer_2 = TlvBuffer_1; /*0x46d62*/
EntryDataPtr = (_BYTE *)(v14 - TlvBuffer_1); /*0x46d68*/
*((_DWORD *)TlvBuffer_1 + 4) = (_DWORD)v14 - (_DWORD)TlvBuffer_1; /*0x46d6d*/
AllocBuffer = UndiCallbackDispatch_0(0, Status, TlvBuffer_2); /*0x46d7d*/
}
else
{
LABEL_16:
AllocBuffer = 0x800000000000000EuLL; /*0x46d82*/
}
}
else
{
AllocBuffer = 0x8000000000000009uLL; /*0x46c51*/
}
}
(*(void (__fastcall **)(__int64))(BootServices + 72))(Param1_1); /*0x46d96*/
if ( TlvBuffer ) /*0x46d9c*/
(*(void (__fastcall **)(_BYTE *))(BootServices + 72))(TlvBuffer); /*0x46da8*/
if ( ConfigBuffer ) /*0x46dae*/
(*(void (__fastcall **)(_BYTE *))(BootServices + 72))(ConfigBuffer); /*0x46dba*/
return AllocBuffer; /*0x46dbd*/
}
return result; /*0x46dc8*/
}
// Function: UtlConfigHash @ 0x46dd8 (0x114 bytes)
unsigned __int16 __fastcall UtlConfigHash(__int64 a1, __int64 a2, _BYTE *n91393, _BYTE *eng)
{
_BYTE *v6; // rax
__int64 v7; // rdx
_BYTE *v8; // rdi
unsigned __int16 result; // ax
__int64 v10; // rsi
_BYTE *v11; // rbx
_BYTE *v12; // r9
__int64 v13; // rax
unsigned __int16 v14; // [rsp+68h] [rbp+10h] BYREF
v14 = a2; /*0x46de7*/
if ( eng ) /*0x46e00*/
{
v7 = 0; /*0x46e09*/
if ( *eng ) /*0x46e0c*/
{
do /*0x46e14*/
++v7; /*0x46e11*/
while ( eng[v7] ); /*0x46e14*/
}
v6 = UtlStrCpy(4, v7 + 1, eng); /*0x46e25*/
}
else
{
v6 = (_BYTE *)UtlConfigCalcHash(a1, a2, n91393); /*0x46e02*/
}
v8 = v6; /*0x46e2a*/
if ( !v6 ) /*0x46e30*/
return 0; /*0x46e32*/
v10 = 0x8000000000000002uLL; /*0x46e3b*/
v11 = v6; /*0x46e45*/
if ( *v6 ) /*0x46e48*/
{
do /*0x46eb3*/
{
v12 = v11; /*0x46e4d*/
if ( *v11 ) /*0x46e50*/
{
do /*0x46e5d*/
{
if ( *v11 == 59 ) /*0x46e58*/
break; /*0x46e58*/
++v11; /*0x46e5a*/
}
while ( *v11 ); /*0x46e5d*/
if ( *v11 ) /*0x46e62*/
*v11++ = 0; /*0x46e67*/
}
if ( v14 ) /*0x46e84*/
v13 = ((__int64 (__fastcall *)(_QWORD, __int64, _QWORD, _BYTE *, _BYTE *, _QWORD))UndiCallbackDispatch_0)( /*0x46ea8*/
0,
a1,
v14,
v12,
n91393,
0);
else
v13 = ((__int64 (__fastcall *)(_QWORD, __int64, unsigned __int16 *, _BYTE *, _QWORD, _BYTE *, _QWORD))_ImageBase)( /*0x46e9a*/
0,
a1,
&v14,
v12,
0,
n91393,
0);
v10 = v13; /*0x46eae*/
}
while ( v13 >= 0 && *v11 ); /*0x46eb3*/
}
(*(void (__fastcall **)(_BYTE *))(BootServices + 72))(v8); /*0x46ec2*/
result = 0; /*0x46ec8*/
if ( v10 >= 0 ) /*0x46ecc*/
return v14; /*0x46ece*/
return result; /*0x46ee2*/
}
// Function: UtlConfigSaveToNvm @ 0x46eec (0x167 bytes)
_BYTE *__fastcall UtlConfigSaveToNvm(__int64 a1, __int64 a2, _BYTE *n91393)
{
unsigned __int16 v4; // r13
_BYTE *v6; // rbx
char *v7; // rsi
__int64 n91393_3; // rax
__int64 n91393_1; // r9
_BYTE *n91393_2; // r8
__int64 n91393_4; // r12
_BYTE *v12; // rdi
v4 = a2; /*0x46f07*/
v6 = 0; /*0x46f0e*/
v7 = (char *)UtlConfigCalcHash(a1, a2, n91393); /*0x46f15*/
if ( v7 ) /*0x46f1b*/
{
n91393_3 = UtlParseTokenStrWide(L"PlatformLang"); /*0x46f28*/
n91393_1 = 91393; /*0x46f2d*/
n91393_2 = ::n91393; /*0x46f37*/
n91393_4 = n91393_3; /*0x46f3d*/
if ( n91393 ) /*0x46f40*/
n91393_2 = n91393; /*0x46f40*/
if ( n91393_3 ) /*0x46f47*/
n91393_1 = n91393_3; /*0x46f47*/
v12 = UtlParseTokenStrSafe(v7, 0, n91393_2, n91393_1); /*0x46f5c*/
if ( v12 ) /*0x46f62*/
{
if ( n4099(0, v12, a1, v4) == 0x8000000000000005uLL ) /*0x46fad*/
{
v6 = UtlStrCmp(4, 0); /*0x46fbc*/
if ( v6 ) /*0x46fc2*/
{
if ( n4099(0, v12, a1, v4) < 0 ) /*0x46ff4*/
{
(*(void (__fastcall **)(_BYTE *))(BootServices + 72))(v6); /*0x47000*/
v6 = 0; /*0x47003*/
}
}
}
}
(*(void (__fastcall **)(char *))(BootServices + 72))(v7); /*0x4700f*/
if ( n91393_4 ) /*0x47015*/
(*(void (__fastcall **)(__int64))(BootServices + 72))(n91393_4); /*0x47021*/
if ( v12 ) /*0x47027*/
(*(void (__fastcall **)(_BYTE *))(BootServices + 72))(v12); /*0x47033*/
}
return v6; /*0x4704a*/
}
// Function: UtlConfigCalcHash @ 0x47054 (0x90 bytes)
__int64 __fastcall UtlConfigCalcHash(__int64 a1, __int64 a2, _BYTE *n91393)
{
__int64 v5; // rax
__int64 v6; // rbx
__int64 v7; // [rsp+38h] [rbp+10h] BYREF
__int64 v8; // [rsp+40h] [rbp+18h] BYREF
v8 = 0; /*0x47060*/
if ( word_18(0, a1, &v7, &v8) != 0x8000000000000005uLL ) /*0x4708d*/
return 0; /*0x4708d*/
v5 = UtlStrCmp(4, v8); /*0x4709d*/
v6 = v5; /*0x470a2*/
if ( !v5 ) /*0x470a8*/
return 0; /*0x470a8*/
if ( word_18(0, a1, v5, &v8) < 0 ) /*0x470c5*/
{
(*(void (__fastcall **)(__int64))(BootServices + 72))(v6); /*0x470d1*/
return 0; /*0x47091*/
}
return v6; /*0x470de*/
}