Newer
Older
AMI-Aptio-BIOS-Reversed / UbaMainPeim / UbaMainPeim.c
@Ajax Dong Ajax Dong 2 days ago 805 KB Init
#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) = nullsub_1; /*0x2c145*/
  *(_QWORD *)(a1 + 224) = NiiSnpInitialize; /*0x2c149*/
  *(_QWORD *)(a1 + 88) = nullsub_1; /*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) = nullsub_1; /*0x2c18d*/
  *(_QWORD *)(a1 + 144) = CompNameNullThunk; /*0x2c19b*/
  *(_QWORD *)(a1 + 200) = nullsub_1; /*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) = nullsub_1; /*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) = nullsub_1; /*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 sub_33004(__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 sub_331FC(__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 sub_33B10(__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 sub_34D64(__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 sub_34F2C(__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: nullsub_1 @ 0x35db8 (0x3 bytes)

void nullsub_1()
{
  ; /*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 sub_37B64()
{
  JUMPOUT(0x37BE0); /*0x37be0*/
}

// Function: DxeRegister_39 @ 0x37b9c (0x43 bytes)

__int64 __fastcall sub_37B9C(__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 sub_38B84(__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 sub_39668(__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 sub_3A15C(__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 sub_3A8C8()
{
  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*/
    sub_3E098(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) = sub_3BD98; /*0x3c627*/
  *(_QWORD *)(a1 + 1168) = sub_3BDA4; /*0x3c635*/
  *(_QWORD *)(a1 + 1192) = CompNameGetChildHandle; /*0x3c643*/
  if ( (UtlRegisterWrite((__int64 *)a1, 0x10u) & 0x80000) != 0 ) /*0x3c653*/
  {
    *(_DWORD *)(a1 + 1248) = 4; /*0x3c655*/
    *(_QWORD *)(a1 + 1160) = sub_3BFC4; /*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] = nullsub_1; /*0x3ca44*/
  IfrnTable[124] = CompNameNullThunk; /*0x3ca4b*/
  IfrnTable[130] = nullsub_1; /*0x3ca52*/
  IfrnTable[131] = nullsub_1; /*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 sub_3DA10(__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) = nullsub_1; /*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) = sub_435E4; /*0x405e2*/
  *(_QWORD *)(a1 + 1200) = sub_4301C; /*0x405f0*/
  *(_QWORD *)(a1 + 1208) = sub_42B54; /*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 = sub_408C4(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 sub_42438(__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 sub_43FBC(__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*/
}