#include "Mtftp4Dxe.h"
//
// Mtftp4Dxe - UEFI Module
// Total functions: 123
//
// Function: CopyMem @ 0x2c0 (0x42 bytes)
char *__fastcall CopyMem(char *dst, char *src, unsigned __int64 count)
{
char *dst_1; // rax
unsigned __int64 count_1; // rcx
char *dst_2; // rdi
char *src_1; // rsi
dst_1 = dst; /*0x2d0*/
if ( src < dst && &src[count - 1] >= dst ) /*0x2d8*/
{
src_1 = &src[count - 1]; /*0x2f0*/
dst_2 = &dst[count - 1]; /*0x2f3*/
}
else
{
count_1 = count; /*0x2da*/
count &= 7u; /*0x2dd*/
count_1 >>= 3; /*0x2e4*/
qmemcpy(dst, src, 8 * count_1); /*0x2e8*/
src_1 = &src[8 * count_1]; /*0x2e8*/
dst_2 = &dst[8 * count_1]; /*0x2e8*/
}
qmemcpy(dst_2, src_1, count); /*0x2fc*/
return dst_1; /*0x2ff*/
}
// Function: ZeroMem @ 0x310 (0x20 bytes)
char *__fastcall ZeroMem(char *buf, unsigned __int64 a2)
{
memset(buf, 0, 8 * (a2 >> 3)); /*0x326*/
memset(&buf[8 * (a2 >> 3)], 0, a2 & 7); /*0x32b*/
return buf; /*0x32e*/
}
// Function: CompareMem @ 0x330 (0x1d bytes)
unsigned __int64 __fastcall CompareMem(_BYTE *a1, _BYTE *a2, __int64 n4)
{
bool v6; // zf
do /*0x33b*/
{
if ( !n4 ) /*0x33b*/
break; /*0x33b*/
v6 = *a1++ == *a2++; /*0x33b*/
--n4; /*0x33b*/
}
while ( v6 ); /*0x33b*/
return (unsigned __int8)*(a1 - 1) - (unsigned __int64)(unsigned __int8)*(a2 - 1); /*0x34a*/
}
// Function: Mtftp4Unload @ 0x3a4 (0x184 bytes)
__int64 __fastcall Mtftp4Unload(__int64 a1)
{
__int64 result; // rax
unsigned __int64 i; // rbx
__int64 v4; // rcx
unsigned __int64 j; // rdi
__int64 v6; // [rsp+30h] [rbp-10h] BYREF
__int64 v7; // [rsp+38h] [rbp-8h] BYREF
__int64 v8; // [rsp+68h] [rbp+28h] BYREF
__int64 v9; // [rsp+70h] [rbp+30h] BYREF
unsigned __int64 j_1; // [rsp+78h] [rbp+38h] BYREF
result = (*(__int64 (__fastcall **)(_QWORD, _QWORD, _QWORD, unsigned __int64 *, __int64 *))(BootServices + 312))( /*0x3d1*/
0,
0,
0,
&j_1,
&v9);
if ( result >= 0 ) /*0x3da*/
{
for ( i = 0; i < j_1; ++i ) /*0x3e6*/
{
if ( (*(__int64 (__fastcall **)(_QWORD, void *, __int64 *))(BootServices + 152))( /*0x40f*/
*(_QWORD *)(v9 + 8 * i),
&unk_9610,
&v8) >= 0 )
{
v4 = v8; /*0x415*/
if ( *(_QWORD *)(v8 + 32) == a1 ) /*0x41d*/
{
for ( j = 0; j < j_1; ++j ) /*0x429*/
{
(*(void (__fastcall **)(_QWORD, _QWORD, _QWORD))(BootServices + 272))( /*0x441*/
*(_QWORD *)(v9 + 8 * j),
*(_QWORD *)(v4 + 40),
0);
v4 = v8; /*0x447*/
}
(*(void (__fastcall **)(_QWORD, void *, __int64))(BootServices + 144))(*(_QWORD *)(v4 + 40), &unk_9610, v4); /*0x469*/
if ( (*(__int64 (__fastcall **)(_QWORD, void *, __int64 *))(BootServices + 152))( /*0x492*/
*(_QWORD *)(v9 + 8 * i),
&unk_9630,
&v6) >= 0 )
(*(void (__fastcall **)(_QWORD, void *, __int64))(BootServices + 144))(*(_QWORD *)(v8 + 40), &unk_9630, v6); /*0x4ae*/
if ( (*(__int64 (__fastcall **)(_QWORD, void *, __int64 *))(BootServices + 152))( /*0x4d7*/
*(_QWORD *)(v9 + 8 * i),
&unk_95B0,
&v7) >= 0 )
(*(void (__fastcall **)(_QWORD, void *, __int64))(BootServices + 144))(*(_QWORD *)(v8 + 40), &unk_95B0, v7); /*0x4f3*/
}
}
}
if ( v9 ) /*0x50d*/
(*(void (**)(void))(BootServices + 72))(); /*0x516*/
return 0; /*0x519*/
}
return result; /*0x520*/
}
// Function: _ModuleEntryPoint @ 0x528 (0x88 bytes)
EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
__int64 v4; // rax
__int64 v6; // [rsp+40h] [rbp+18h] BYREF
Mtftp4LibConstructor((__int64)ImageHandle, SystemTable); /*0x538*/
v4 = (*(__int64 (__fastcall **)(EFI_HANDLE, void *, __int64 *))(BootServices + 152))(ImageHandle, &unk_9580, &v6); /*0x553*/
if ( v4 < 0 ) /*0x55c*/
{
DebugPrint(0x80000000LL, (__int64)"\nASSERT_EFI_ERROR (Status = %r)\n", v4); /*0x56d*/
Assert_( /*0x585*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiDriverEntryPoint\\DriverEntryPoint.c",
126,
(__int64)"!EFI_ERROR (Status)");
}
*(_QWORD *)(v6 + 88) = Mtftp4Unload; /*0x599*/
return Mtftp4DriverEntryPoint((__int64)ImageHandle, SystemTable); /*0x5aa*/
}
// Function: Mtftp4LibConstructor @ 0x5b0 (0xf2 bytes)
__int64 __fastcall Mtftp4LibConstructor(__int64 ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
__int64 result; // rax
ImageHandle_1 = ImageHandle; /*0x5b6*/
if ( !ImageHandle ) /*0x5c3*/
Assert_( /*0x5d6*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
51,
(__int64)"gImageHandle != ((void *) 0)");
::SystemTable = (__int64)SystemTable; /*0x5db*/
if ( !SystemTable ) /*0x5e5*/
Assert_( /*0x5f8*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
57,
(__int64)"gST != ((void *) 0)");
BootServices = (__int64)SystemTable->BootServices; /*0x601*/
if ( !BootServices ) /*0x60b*/
Assert_( /*0x61e*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
63,
(__int64)"gBS != ((void *) 0)");
RuntimeServices = (__int64)SystemTable->RuntimeServices; /*0x627*/
if ( !RuntimeServices ) /*0x631*/
Assert_( /*0x644*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiRuntimeServicesTableLib\\UefiRuntimeServicesTableLib.c",
47,
(__int64)"gRT != ((void *) 0)");
AssertCpuDeadLoop(); /*0x649*/
result = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_9640, 0, &qword_9780); /*0x665*/
if ( result < 0 ) /*0x66e*/
{
DebugPrint(0x80000000LL, (__int64)"\nASSERT_EFI_ERROR (Status = %r)\n", result); /*0x67f*/
return Assert_((__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeDpcLib\\DpcLib.c", 46, (__int64)"!EFI_ERROR (Status)"); /*0x697*/
}
return result; /*0x69c*/
}
// Function: Mtftp4DriverEntryPoint @ 0x6a4 (0xff bytes)
__int64 __fastcall Mtftp4DriverEntryPoint(__int64 ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
EFI_RUNTIME_SERVICES *RuntimeServices; // rax
__int64 v4; // rbx
__int64 v5; // rax
_BYTE v7[24]; // [rsp+40h] [rbp-18h] BYREF
__int64 n10; // [rsp+68h] [rbp+10h] BYREF
RuntimeServices = SystemTable->RuntimeServices; /*0x6b0*/
n10 = 10; /*0x6bb*/
v4 = ((__int64 (__fastcall *)(const __int16 *, void *, _QWORD, __int64 *, _BYTE *))RuntimeServices->GetVariable)( /*0x6df*/
L"NetworkStackVar",
&unk_9650,
0,
&n10,
v7);
if ( !v4 ) /*0x6e5*/
{
if ( v7[0] ) /*0x6ef*/
{
::ImageHandle = ImageHandle; /*0x720*/
ImageHandle_0 = ImageHandle; /*0x73a*/
v5 = (*(__int64 (__fastcall **)(__int64 *, void *, __int64 (__fastcall **)(), void *, _UNKNOWN **, void *, _UNKNOWN **, _QWORD))(BootServices + 328))( /*0x75b*/
&ImageHandle_0,
&unk_9610,
off_9660,
&unk_9630,
&off_96A8,
&unk_95B0,
&off_9690,
0);
v4 = v5; /*0x761*/
if ( v5 < 0 ) /*0x767*/
{
DebugPrint(0x80000000LL, (__int64)"\nASSERT_EFI_ERROR (Status = %r)\n", v5); /*0x778*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\UefiLib\\UefiDriverModel.c", 287, (__int64)"!EFI_ERROR (Status)"); /*0x790*/
}
}
else
{
return 0x8000000000000003uLL; /*0x6f1*/
}
}
return v4; /*0x79d*/
}
// Function: Mtftp4UdpIoConfigure @ 0x7a4 (0x37 bytes)
__int64 __fastcall Mtftp4UdpIoConfigure(__int64 a1, __int64 a2)
{
return (*(__int64 (__fastcall **)(__int64, void *, _QWORD, _QWORD, __int64, int))(BootServices + 280))( /*0x7d6*/
a2,
&unk_95C0,
0,
*(_QWORD *)(a1 + 40),
a2,
4);
}
// Function: Mtftp4CreateService @ 0x7e0 (0x14d bytes)
__int64 __fastcall Mtftp4CreateService(__int64 a1, __int64 a2, _QWORD *a3)
{
__int64 v6; // rax
_QWORD *v7; // rbx
__int64 BootServices; // rax
__int64 v10; // rdi
__int64 v11; // r9
__int64 v12; // rax
*a3 = 0; /*0x805*/
v6 = AllocatePool(a1, 88); /*0x80f*/
v7 = (_QWORD *)v6; /*0x814*/
if ( !v6 ) /*0x81a*/
return 0x8000000000000009uLL; /*0x826*/
*(_DWORD *)v6 = 1347700308; /*0x836*/
*(_WORD *)(v6 + 24) = 0; /*0x83c*/
*(_OWORD *)(v6 + 8) = *(_OWORD *)off_78A0; /*0x841*/
InitializeListHead((_QWORD *)(v6 + 32)); /*0x846*/
BootServices = BootServices; /*0x84b*/
v7[6] = 0; /*0x85a*/
v7[7] = 0; /*0x861*/
v7[8] = a1; /*0x86b*/
v7[9] = a2; /*0x874*/
v7[10] = 0; /*0x87d*/
v10 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD *(__fastcall *)(__int64, __int64), _QWORD *, _QWORD *))(BootServices + 80))( /*0x889*/
2147484160LL,
8,
Mtftp4CheckTimeout,
v7,
v7 + 6);
if ( v10 < 0 ) /*0x88f*/
goto LABEL_4; /*0x88f*/
v10 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD))(BootServices + 80))(0x80000000LL, 8, 0); /*0x8bc*/
if ( v10 < 0 ) /*0x8c2*/
{
LABEL_8:
(*(void (__fastcall **)(_QWORD))(BootServices + 112))(v7[6]); /*0x8fb*/
LABEL_4:
AssertCpuDeadLoop_0(); /*0x891*/
return v10; /*0x89c*/
}
v12 = DxeConfig_3(a1, a2, sub_7DC, v11, 0); /*0x8d6*/
v7[10] = v12; /*0x8db*/
if ( !v12 ) /*0x8e2*/
{
(*(void (__fastcall **)(_QWORD))(BootServices + 112))(v7[7]); /*0x8ee*/
v10 = 0x8000000000000007uLL; /*0x8f1*/
goto LABEL_8; /*0x8f1*/
}
*a3 = v7; /*0x90b*/
return 0; /*0x91f*/
}
// Function: Mtftp4ServiceBindingCreateChild @ 0x930 (0x11a bytes)
signed __int64 __fastcall Mtftp4ServiceBindingCreateChild(__int64 a1, __int64 a2)
{
signed __int64 result; // rax
_QWORD *v4; // rbx
__int64 v5; // rdi
_QWORD *v6; // [rsp+40h] [rbp+8h] BYREF
__int64 v7; // [rsp+48h] [rbp+10h] BYREF
v7 = a2; /*0x935*/
if ( !(*(__int64 (__fastcall **)(__int64, void *, _QWORD, _QWORD, __int64, int))(BootServices + 280))( /*0x96a*/
a2,
&unk_9600,
0,
*(_QWORD *)(a1 + 40),
a2,
4) )
return 0x8000000000000014uLL; /*0x975*/
result = Mtftp4CreateService(v7, *(_QWORD *)(a1 + 40), &v6); /*0x992*/
if ( result >= 0 ) /*0x99a*/
{
v4 = v6; /*0x9a0*/
if ( !v6 ) /*0x9a8*/
Assert_( /*0x9bd*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Driver.c",
337,
(__int64)"MtftpSb != ((void *) 0)");
v5 = (*(__int64 (__fastcall **)(_QWORD, __int64, __int64))(BootServices + 88))(v4[6], 1, 10000000); /*0x9db*/
if ( v5 < 0 /*0xa09*/
|| (v5 = (*(__int64 (__fastcall **)(__int64 *, void *, _QWORD *, _QWORD))(BootServices + 328))(
&v7,
&unk_9600,
v4 + 1,
0),
v5 < 0) )
{
DxeConfig_5(v4[10]); /*0xa13*/
(*(void (__fastcall **)(_QWORD))(BootServices + 112))(v4[7]); /*0xa23*/
(*(void (__fastcall **)(_QWORD))(BootServices + 112))(v4[6]); /*0xa31*/
AssertCpuDeadLoop_0(); /*0xa37*/
return v5; /*0xa3c*/
}
else
{
return 0; /*0xa0b*/
}
}
return result; /*0xa44*/
}
// Function: Mtftp4DestroyChildCallback @ 0xa4c (0x9b bytes)
__int64 __fastcall Mtftp4DestroyChildCallback(_QWORD *i, _QWORD *a2)
{
__int64 v2; // rbx
_QWORD *i_1; // rdi
unsigned __int64 v5; // rax
__int64 v6; // rcx
v2 = 0; /*0xa5b*/
i_1 = i; /*0xa60*/
if ( !i || !a2 ) /*0xa6b*/
return 0x8000000000000002uLL; /*0xacd*/
if ( *((_DWORD *)i - 2) == 1886676596 ) /*0xa74*/
i_1 = i - 1; /*0xa90*/
else
Assert_( /*0xa89*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Driver.c",
394,
(__int64)"CR has Bad Signature");
v5 = a2[1]; /*0xa94*/
v6 = a2[2]; /*0xa9b*/
if ( !v5 || !v6 ) /*0xaa7*/
return 0; /*0xac0*/
while ( i_1[14] != *(_QWORD *)(v6 + 8 * v2) ) /*0xab6*/
{
if ( ++v2 >= v5 ) /*0xabe*/
return 0; /*0xabe*/
}
return (*(__int64 (__fastcall **)(_QWORD))(*a2 + 8LL))(*a2); /*0xae1*/
}
// Function: Mtftp4ServiceBindingDestroyChild @ 0xae8 (0x1df bytes)
__int64 __fastcall Mtftp4ServiceBindingDestroyChild(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
{
__int64 v7; // r14
unsigned __int64 v8; // rax
_BYTE *v9; // rcx
__int64 v10; // rdi
_QWORD *v12; // rbx
__int64 v13; // [rsp+30h] [rbp-30h] BYREF
__int64 v14; // [rsp+38h] [rbp-28h] BYREF
unsigned __int64 v15; // [rsp+40h] [rbp-20h] BYREF
__int64 v16[3]; // [rsp+48h] [rbp-18h] BYREF
if ( (*(__int64 (__fastcall **)(__int64, void *, __int64 *, unsigned __int64 *))(BootServices + 296))( /*0xb35*/
a2,
&unk_9620,
&v14,
&v15) < 0 )
return 0; /*0xb35*/
v7 = 0; /*0xb3f*/
v8 = 0; /*0xb46*/
if ( v15 ) /*0xb4b*/
{
v9 = (_BYTE *)(v14 + 16); /*0xb4d*/
while ( (*v9 & 0x10) == 0 ) /*0xb54*/
{
++v8; /*0xb56*/
v9 += 24; /*0xb59*/
if ( v8 >= v15 ) /*0xb60*/
goto LABEL_8; /*0xb60*/
}
v7 = *(_QWORD *)(v14 + 24 * v8 + 8); /*0xb68*/
}
LABEL_8:
(*(void (__fastcall **)(__int64))(BootServices + 72))(v14); /*0xb77*/
if ( !v7 ) /*0xb7d*/
return 0; /*0xca7*/
v10 = (*(__int64 (__fastcall **)(__int64, void *, __int64 *, _QWORD, __int64, int))(BootServices + 280))( /*0xbaf*/
v7,
&unk_9600,
&v13,
*(_QWORD *)(a1 + 40),
v7,
2);
if ( v10 < 0 ) /*0xbb5*/
return 0x8000000000000007uLL; /*0xbb7*/
v12 = (_QWORD *)(v13 - 8); /*0xbca*/
if ( *(_DWORD *)(v13 - 8) != 1347700308 ) /*0xbd4*/
{
Assert_( /*0xbe9*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Driver.c",
459,
(__int64)"CR has Bad Signature");
v12 = (_QWORD *)v13; /*0xbee*/
}
if ( !IsListEmpty(v12 + 4) ) /*0xbf9*/
{
v16[0] = v13; /*0xc06*/
v16[1] = a3; /*0xc0a*/
v16[2] = a4; /*0xc0e*/
if ( v12 == (_QWORD *)-32LL ) /*0xc15*/
v10 = 0x8000000000000002uLL; /*0xc28*/
else
v10 = NetDestroyChildrenInList(v12 + 4, v16); /*0xc23*/
}
if ( !a3 && IsListEmpty(v12 + 4) ) /*0xc3a*/
{
(*(void (__fastcall **)(__int64, void *, __int64))(BootServices + 144))(v7, &unk_9600, v13); /*0xc58*/
DxeConfig_5(v12[10]); /*0xc62*/
(*(void (__fastcall **)(_QWORD))(BootServices + 112))(v12[7]); /*0xc72*/
(*(void (__fastcall **)(_QWORD))(BootServices + 112))(v12[6]); /*0xc80*/
if ( src_0 ) /*0xc8a*/
{
Assert_0(); /*0xc8c*/
src_0 = 0; /*0xc91*/
}
AssertCpuDeadLoop_0(); /*0xc9b*/
return 0; /*0xca0*/
}
return v10; /*0xcbe*/
}
// Function: Mtftp4DriverBindingStart @ 0xcc8 (0x260 bytes)
__int64 __fastcall Mtftp4DriverBindingStart(__int64 a1, __int64 *a2)
{
__int64 v3; // rdi
__int64 buf; // rbx
__int64 v6; // r9
__int64 v7; // rax
__int64 v8; // rsi
__int64 v9; // rax
__int64 v10; // rcx
__int64 v11; // rax
_QWORD *v12; // rdx
__int64 v13; // rbx
__int64 BootServices; // rax
char v15; // [rsp+50h] [rbp+8h] BYREF
v3 = a1; /*0xce3*/
if ( !a1 || !a2 ) /*0xcf2*/
return 0x8000000000000002uLL; /*0xf05*/
buf = AllocatePool(a1, 272); /*0xd04*/
if ( !buf ) /*0xd0a*/
return 0x8000000000000009uLL; /*0xd16*/
if ( *(_DWORD *)(v3 - 8) == 1347700308 ) /*0xd22*/
v3 -= 8; /*0xd3e*/
else
Assert_( /*0xd37*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Driver.c",
558,
(__int64)"CR has Bad Signature");
MemGetInfo((char *)buf, 0x110u); /*0xd48*/
*(_DWORD *)buf = 1886676596; /*0xd51*/
InitializeListHead((_QWORD *)(buf + 8)); /*0xd5a*/
MemConfig_0((char *)(buf + 24), src, 0x40u); /*0xd73*/
*(_QWORD *)(buf + 88) = 0; /*0xd78*/
*(_QWORD *)(buf + 104) = v3; /*0xd84*/
InitializeListHead((_QWORD *)(buf + 192)); /*0xd88*/
v7 = DxeConfig_3(*(_QWORD *)(v3 + 64), *(_QWORD *)(v3 + 72), sub_7DC, v6, buf); /*0xda1*/
*(_QWORD *)(buf + 224) = v7; /*0xda6*/
if ( !v7 ) /*0xdb0*/
{
v8 = 0x8000000000000009uLL; /*0xdb2*/
LABEL_12:
AssertCpuDeadLoop_0(); /*0xdef*/
return v8; /*0xdfa*/
}
v8 = (*(__int64 (__fastcall **)(__int64 *, void *, __int64, _QWORD))(BootServices + 328))(a2, &unk_95A0, buf + 24, 0); /*0xddb*/
if ( v8 < 0 ) /*0xde1*/
{
LABEL_11:
DxeConfig_5(*(_QWORD *)(buf + 224)); /*0xde3*/
goto LABEL_12; /*0xdea*/
}
v9 = *a2; /*0xdff*/
*(_QWORD *)(buf + 112) = *a2; /*0xe07*/
v8 = (*(__int64 (__fastcall **)(_QWORD, void *, char *, __int64, __int64, int))(BootServices + 280))( /*0xe3b*/
*(_QWORD *)(*(_QWORD *)(v3 + 80) + 56LL),
&unk_9620,
&v15,
ImageHandle_0,
v9,
8);
if ( v8 < 0 ) /*0xe41*/
{
LABEL_16:
v10 = *(_QWORD *)(buf + 112); /*0xead*/
if ( v10 ) /*0xeb4*/
(*(void (__fastcall **)(__int64, void *, __int64, _QWORD))(BootServices + 336))(v10, &unk_95A0, buf + 24, 0); /*0xece*/
goto LABEL_11; /*0xed4*/
}
v8 = (*(__int64 (__fastcall **)(_QWORD, void *, char *, __int64, _QWORD, int))(BootServices + 280))( /*0xe7f*/
*(_QWORD *)(*(_QWORD *)(buf + 224) + 56LL),
&unk_9620,
&v15,
ImageHandle_0,
*(_QWORD *)(buf + 112),
8);
if ( v8 < 0 ) /*0xe8c*/
{
(*(void (__fastcall **)(_QWORD, void *, __int64, __int64 *))(BootServices + 288))( /*0xea7*/
*(_QWORD *)(*(_QWORD *)(v3 + 80) + 56LL),
&unk_9620,
ImageHandle_0,
a2);
goto LABEL_16; /*0xea7*/
}
v11 = (*(__int64 (__fastcall **)(__int64))(BootServices + 24))(8); /*0xede*/
v12 = (_QWORD *)(buf + 8); /*0xee5*/
v13 = v11; /*0xee8*/
InsertTailList((_QWORD *)(v3 + 32), v12); /*0xeeb*/
BootServices = BootServices; /*0xef0*/
++*(_WORD *)(v3 + 24); /*0xefa*/
(*(void (__fastcall **)(__int64))(BootServices + 32))(v13); /*0xefe*/
return 0; /*0xf1e*/
}
// Function: Mtftp4DriverBindingStop @ 0xf28 (0x1f3 bytes)
__int64 __fastcall Mtftp4DriverBindingStop(__int64 a1, __int64 a2)
{
__int64 v3; // rsi
__int64 result; // rax
__int64 v5; // rdi
__int64 BootServices; // rax
__int64 v7; // rcx
__int64 v8; // rbx
__int64 v9; // [rsp+40h] [rbp+8h] BYREF
v3 = a1; /*0xf3b*/
if ( !a1 || !a2 ) /*0xf4a*/
return 0x8000000000000002uLL; /*0xf4a*/
if ( (*(__int64 (__fastcall **)(__int64, void *, __int64 *, __int64, __int64, int))(BootServices + 280))( /*0xf80*/
a2,
&unk_95A0,
&v9,
ImageHandle_0,
a2,
2) < 0 )
return 0x8000000000000003uLL; /*0xf8c*/
v5 = v9 - 24; /*0xf96*/
if ( *(_DWORD *)(v9 - 24) != 1886676596 ) /*0xfa0*/
{
Assert_( /*0xfb5*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Driver.c",
706,
(__int64)"CR has Bad Signature");
v5 = v9; /*0xfba*/
}
if ( *(_DWORD *)(v3 - 8) == 1347700308 ) /*0xfc6*/
v3 -= 8; /*0xfe2*/
else
Assert_( /*0xfdb*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Driver.c",
707,
(__int64)"CR has Bad Signature");
if ( *(_QWORD *)(v5 + 104) != v3 ) /*0xfea*/
return 0x8000000000000002uLL; /*0x1101*/
if ( *(_BYTE *)(v5 + 96) ) /*0xff0*/
return 0; /*0xff8*/
BootServices = BootServices; /*0xffd*/
*(_BYTE *)(v5 + 96) = 1; /*0x100b*/
(*(void (__fastcall **)(_QWORD, void *, __int64, __int64))(BootServices + 288))( /*0x1021*/
*(_QWORD *)(*(_QWORD *)(v3 + 80) + 56LL),
&unk_9620,
ImageHandle_0,
a2);
(*(void (__fastcall **)(_QWORD, void *, __int64, __int64))(BootServices + 288))( /*0x104a*/
*(_QWORD *)(*(_QWORD *)(v5 + 224) + 56LL),
&unk_9620,
ImageHandle_0,
a2);
v7 = *(_QWORD *)(v5 + 264); /*0x1050*/
if ( v7 ) /*0x105a*/
(*(void (__fastcall **)(_QWORD, void *, __int64, __int64))(BootServices + 288))( /*0x1078*/
*(_QWORD *)(v7 + 56),
&unk_9620,
ImageHandle_0,
a2);
result = (*(__int64 (__fastcall **)(__int64, void *, __int64))(BootServices + 144))(a2, &unk_95A0, v9); /*0x1094*/
if ( result >= 0 ) /*0x109d*/
{
v8 = (*(__int64 (__fastcall **)(__int64))(BootServices + 24))(8); /*0x10c1*/
Mtftp4Cleanup(v5, 0x8000000000000007uLL); /*0x10c4*/
DxeConfig_5(*(_QWORD *)(v5 + 224)); /*0x10d0*/
RemoveEntryList((_QWORD *)(v5 + 8)); /*0x10d9*/
--*(_WORD *)(v3 + 24); /*0x10e6*/
(*(void (__fastcall **)(__int64))(BootServices + 32))(v8); /*0x10f1*/
AssertCpuDeadLoop_0(); /*0x10f7*/
return 0; /*0x10fc*/
}
*(_BYTE *)(v5 + 96) = 0; /*0x109f*/
return result; /*0x1115*/
}
// Function: Mtftp4GetBestLanguage @ 0x111c (0x33 bytes)
unsigned __int64 __fastcall Mtftp4GetBestLanguage(__int64 (__fastcall **a1)(), _BYTE *src, _QWORD *a3)
{
// "eng;en" /*0x114a*/
return Mtftp4ConfigStringLookup( /*0x114a*/
src,
a1[2],
src_1, // "eng;en"
a3,
a1 == (__int64 (__fastcall **)())&off_96A8);
}
// Function: Mtftp4ConfigNotification @ 0x1150 (0xd0 bytes)
__int64 __fastcall Mtftp4ConfigNotification(__int64 (__fastcall **a1)(_QWORD, _BYTE *))
{
__int64 result; // rax
_BYTE v2[20]; // [rsp+40h] [rbp-E8h] BYREF
unsigned __int16 v3; // [rsp+54h] [rbp-D4h]
_QWORD v4[21]; // [rsp+80h] [rbp-A8h] BYREF
if ( !a1 ) /*0x115a*/
return 0x8000000000000002uLL; /*0x115c*/
result = (*a1)(a1, v2); /*0x1170*/
if ( result >= 0 ) /*0x1175*/
{
UnicodeSPrint((__int64)v4, 0xA0u, L"MTFTPv4 (ServerIp=%d.%d.%d.%d, ServerPort=%d)", v2[16], v2[17], v2[18], v2[19], v3); /*0x11bb*/
if ( src_0 ) /*0x11c8*/
{
Assert_0(); /*0x11ca*/
src_0 = 0; /*0x11cf*/
}
result = Assert(byte_78B0, (char *)off_96B8, v4, 1); /*0x11f0*/
if ( result >= 0 ) /*0x11f8*/
return Assert(byte_78B4, (char *)off_96A0, v4, 0); /*0x1213*/
}
return result; /*0x1218*/
}
// Function: Mtftp4OpenProtocol @ 0x1220 (0x125 bytes)
__int64 __fastcall Mtftp4OpenProtocol(__int64 (__fastcall **a1)(), __int64 a2, __int64 a3, _BYTE *src, _QWORD *a5)
{
__int64 result; // rax
__int64 v9; // rbx
unsigned __int64 v10; // rcx
_BYTE *v11; // rax
unsigned __int64 v12; // [rsp+30h] [rbp-18h] BYREF
__int64 (__fastcall **v13)(_QWORD, _BYTE *); // [rsp+38h] [rbp-10h] BYREF
__int64 v14; // [rsp+60h] [rbp+18h] BYREF
if ( !a3 ) /*0x1243*/
return 0x8000000000000003uLL; /*0x1245*/
v9 = 0x8000000000000003uLL; /*0x1275*/
if ( (*(__int64 (__fastcall **)(__int64, void *, __int64 *, unsigned __int64 *))(BootServices + 296))( /*0x1282*/
a2,
&unk_9620,
&v14,
&v12) < 0 )
return v9; /*0x1282*/
v10 = 0; /*0x1289*/
if ( v12 ) /*0x1293*/
{
v11 = (_BYTE *)(v14 + 16); /*0x1295*/
while ( *((_QWORD *)v11 - 1) != a3 || (*v11 & 8) == 0 ) /*0x12a2*/
{
++v10; /*0x12a4*/
v11 += 24; /*0x12a7*/
if ( v10 >= v12 ) /*0x12ae*/
goto LABEL_11; /*0x12ae*/
}
v9 = 0; /*0x12b2*/
}
LABEL_11:
AssertCpuDeadLoop_0(); /*0x12b7*/
if ( v9 < 0 ) /*0x12bf*/
return v9; /*0x12c1*/
result = (*(__int64 (__fastcall **)(__int64, void *, __int64 (__fastcall ***)(_QWORD, _BYTE *), _QWORD, _QWORD, int))(BootServices + 280))( /*0x12ed*/
a3,
&unk_95A0,
&v13,
0,
0,
2);
if ( result >= 0 ) /*0x12f6*/
{
result = Mtftp4ConfigNotification(v13); /*0x12fd*/
if ( result >= 0 ) /*0x1305*/
return Mtftp4ConfigStringLookup(src, a1[2], src_0, a5, a1 == (__int64 (__fastcall **)())&off_96A8); /*0x132b*/
}
return result; /*0x133f*/
}
// Function: Mtftp4Cleanup @ 0x1348 (0x1d2 bytes)
char *__fastcall Mtftp4Cleanup(__int64 a1, __int64 a2)
{
_QWORD *v2; // rax
__int64 v4; // rcx
__int64 v5; // rdi
__int64 v6; // rdx
__int64 v7; // rcx
__int64 v8; // rcx
_QWORD *v9; // rdi
_QWORD *v10; // r14
char *result; // rax
v2 = *(_QWORD **)(a1 + 152); /*0x1361*/
if ( v2 ) /*0x1370*/
{
v4 = v2[1]; /*0x1372*/
*v2 = a2; /*0x1376*/
if ( v4 ) /*0x137c*/
(*(void (**)(void))(BootServices + 104))(); /*0x1385*/
*(_QWORD *)(a1 + 152) = 0; /*0x1388*/
}
if ( !*(_QWORD *)(a1 + 224) ) /*0x138f*/
Assert_( /*0x13ab*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Impl.c",
53,
(__int64)"Instance->UnicastPort != ((void *) 0)");
v5 = *(_QWORD *)(a1 + 224); /*0x13b0*/
if ( ((*(_BYTE *)(v5 + 32) - 4) & 0xFD) != 0 ) /*0x13be*/
Assert_( /*0x13d3*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c",
897,
(__int64)"(UdpIo->UdpVersion == 4) || (UdpIo->UdpVersion == 6)");
DxeGetInfo_2(v5); /*0x13db*/
v6 = *(_QWORD *)(v5 + 736); /*0x13e4*/
if ( *(_BYTE *)(v5 + 32) == 4 ) /*0x13eb*/
{
if ( v6 ) /*0x13f0*/
(*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(v5 + 744) + 48LL))(*(_QWORD *)(v5 + 744), v6 + 40); /*0x1400*/
}
else if ( v6 ) /*0x1408*/
{
(*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(v5 + 744) + 40LL))(*(_QWORD *)(v5 + 744), v6 + 40); /*0x1418*/
}
(*(void (__fastcall **)(_QWORD, _QWORD))(*(_QWORD *)(v5 + 744) + 8LL))(*(_QWORD *)(v5 + 744), 0); /*0x1427*/
v7 = *(_QWORD *)(a1 + 232); /*0x142a*/
if ( v7 ) /*0x1434*/
{
DxeConfig_14(v7); /*0x1436*/
*(_QWORD *)(a1 + 232) = 0; /*0x143b*/
}
v8 = *(_QWORD *)(a1 + 264); /*0x1442*/
if ( v8 ) /*0x144c*/
{
(*(void (__fastcall **)(_QWORD, void *, __int64, _QWORD))(BootServices + 288))( /*0x146b*/
*(_QWORD *)(v8 + 56),
&unk_9620,
ImageHandle_0,
*(_QWORD *)(a1 + 112));
DxeConfig_5(*(_QWORD *)(a1 + 264)); /*0x1478*/
*(_QWORD *)(a1 + 264) = 0; /*0x147d*/
}
v9 = *(_QWORD **)(a1 + 192); /*0x148b*/
v10 = (_QWORD *)*v9; /*0x148e*/
while ( v9 != (_QWORD *)(a1 + 192) ) /*0x14ac*/
{
RemoveEntryList(v9); /*0x1496*/
AssertCpuDeadLoop_0(); /*0x149e*/
v9 = v10; /*0x14a3*/
v10 = (_QWORD *)*v10; /*0x14a6*/
}
result = MemGetInfo((char *)(a1 + 160), 0x14u); /*0x14ba*/
*(_WORD *)(a1 + 184) = 0; /*0x14c9*/
*(_DWORD *)(a1 + 208) = 0; /*0x14d0*/
*(_QWORD *)(a1 + 212) = 0; /*0x14d6*/
*(_QWORD *)(a1 + 240) = 0; /*0x14dd*/
*(_QWORD *)(a1 + 248) = 0; /*0x14e4*/
*(_DWORD *)(a1 + 256) = 0; /*0x14eb*/
*(_WORD *)(a1 + 260) = 0; /*0x14f1*/
*(_DWORD *)(a1 + 180) = 0x2000000; /*0x14fd*/
*(_BYTE *)(a1 + 262) = 1; /*0x1507*/
return result; /*0x1513*/
}
// Function: Mtftp4PacketCallback @ 0x151c (0xe6 bytes)
unsigned __int64 __fastcall Mtftp4PacketCallback(__int64 a1, __int64 a2, unsigned __int16 count, char *src)
{
char ***v5; // rbx
__int16 n6; // ax
unsigned __int64 v8; // rax
v5 = *(char ****)(a2 + 72); /*0x1537*/
n6 = __ROL2__(*(_WORD *)src, 8); /*0x153f*/
if ( n6 == 5 ) /*0x1549*/
{
if ( *((_WORD *)src + 1) == 1 ) /*0x156e*/
DebugPrint(0x80000000LL, (__int64)"TFTP error code 1 (File Not Found)\n"); /*0x1577*/
else
DebugPrint(0x80000000LL, (__int64)"TFTP error code %d\n", *((unsigned __int16 *)src + 1)); /*0x158a*/
v8 = 0x8000000000000017uLL; /*0x158f*/
}
else
{
if ( n6 == 6 ) /*0x154e*/
{
v5[2] = 0; /*0x155c*/
goto LABEL_10; /*0x1561*/
}
v8 = 0x8000000000000018uLL; /*0x1550*/
}
v5[2] = (char **)v8; /*0x1599*/
LABEL_10:
if ( (*(__int64 (__fastcall **)(__int64, _QWORD, char **))(BootServices + 64))(4, count, *v5) >= 0 ) /*0x15b7*/
{
*(_DWORD *)v5[1] = count; /*0x15d6*/
MemConfig_0(**v5, src, count); /*0x15de*/
}
else
{
v5[2] = (char **)0x8000000000000009LL; /*0x15c3*/
}
return 0x8000000000000015uLL; /*0x15fc*/
}
// Function: Mtftp4CheckAddress @ 0x1604 (0x123 bytes)
bool __fastcall Mtftp4CheckAddress(_BYTE *buf, char *src)
{
int dst__1; // edx
bool v5; // zf
int dst__3; // r11d
int v7; // ebx
int dst_; // [rsp+48h] [rbp+10h] BYREF
__int16 dst; // [rsp+50h] [rbp+18h] BYREF
__int16 v11; // [rsp+52h] [rbp+1Ah]
__int16 dst__2; // [rsp+58h] [rbp+20h] BYREF
__int16 v13; // [rsp+5Ah] [rbp+22h]
MemConfig_0((char *)&dst, src + 4, 4u); /*0x1623*/
if ( (((unsigned __int16)__ROL2__(dst, 8) << 16) | (unsigned int)(unsigned __int16)__ROL2__(v11, 8)) - 1 > 0xFFFFFFFD ) /*0x1651*/
return 0; /*0x1651*/
MemConfig_0((char *)&dst_, src, 4u); /*0x1662*/
dst__1 = ((unsigned __int16)__ROL2__(dst_, 8) << 16) | (unsigned __int16)__ROL2__(HIWORD(dst_), 8); /*0x1681*/
v5 = buf[120] == 0; /*0x1683*/
dst_ = dst__1; /*0x1687*/
if ( !v5 || !dst__1 ) /*0x1693*/
return 1; /*0x1693*/
MemConfig_0((char *)&dst__2, buf + 125, 4u); /*0x16a5*/
MemConfig_0((char *)&dst, buf + 121, 4u); /*0x16b6*/
dst__3 = ((unsigned __int16)__ROL2__(dst__2, 8) << 16) | (unsigned __int16)__ROL2__(v13, 8); /*0x16da*/
v7 = ((unsigned __int16)__ROL2__(dst, 8) << 16) | (unsigned __int16)__ROL2__(v11, 8); /*0x16f3*/
if ( dst__3 ) /*0x16f8*/
{
if ( !NetIp4IsNetmaskValid(dst_, dst__3) ) /*0x1701*/
return 0; /*0x1701*/
}
return (dst_ & dst__3) == (v7 & dst__3); /*0x171d*/
}
// Function: Mtftp4ResolveAddress @ 0x1728 (0xd5 bytes)
bool __fastcall Mtftp4ResolveAddress(__int64 buf, __int64 a2, __int64 a3)
{
__int64 v6; // rdi
__int64 v7; // rbx
_BYTE v9[96]; // [rsp+30h] [rbp-68h] BYREF
if ( !*(_BYTE *)(buf + 120) ) /*0x173f*/
Assert_( /*0x1761*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Impl.c",
247,
(__int64)"Instance->Config.UseDefaultSetting");
v6 = *(_QWORD *)(buf + 104); /*0x1766*/
v7 = *(_QWORD *)(a2 + 744); /*0x177c*/
if ( (*(__int64 (__fastcall **)(_QWORD, __int64, __int64))(BootServices + 88))(*(_QWORD *)(v6 + 56), 2, 50000000) >= 0 ) /*0x178d*/
{
while ( (*(__int64 (__fastcall **)(_QWORD))(BootServices + 120))(*(_QWORD *)(v6 + 56)) < 0 ) /*0x17a0*/
{
(*(void (__fastcall **)(__int64))(v7 + 56))(v7); /*0x17a5*/
if ( (*(__int64 (__fastcall **)(__int64, _QWORD, _BYTE *, _QWORD, _QWORD))v7)(v7, 0, v9, 0, 0) >= 0 && v9[36] ) /*0x17c7*/
{
(*(void (__fastcall **)(__int64, _QWORD))(v7 + 8))(v7, 0); /*0x17ce*/
return (*(__int64 (__fastcall **)(__int64, __int64))(v7 + 8))(v7, a3) == 0; /*0x17e0*/
}
}
}
return 0; /*0x17f8*/
}
// Function: Mtftp4SendUdpPacket @ 0x1800 (0x144 bytes)
__int64 __fastcall Mtftp4SendUdpPacket(__int64 a1, __int64 buf)
{
char v2; // al
int v5; // edx
__int64 v6; // rdi
_QWORD *v8; // rbx
int v9; // [rsp+30h] [rbp-30h] BYREF
__int16 n0x4000; // [rsp+34h] [rbp-2Ch]
char v11; // [rsp+36h] [rbp-2Ah]
__int64 v12; // [rsp+38h] [rbp-28h]
char v13; // [rsp+40h] [rbp-20h]
char dst[4]; // [rsp+41h] [rbp-1Fh] BYREF
char dst_1[5]; // [rsp+45h] [rbp-1Bh] BYREF
__int16 v16; // [rsp+4Ah] [rbp-16h]
char dst_2[4]; // [rsp+4Ch] [rbp-14h] BYREF
__int16 v18; // [rsp+50h] [rbp-10h]
int src; // [rsp+80h] [rbp+20h] BYREF
v2 = *(_BYTE *)(buf + 120); /*0x181b*/
v9 = 0; /*0x1824*/
n0x4000 = 0x4000; /*0x182b*/
v11 = 0; /*0x1835*/
v12 = 0; /*0x183d*/
v13 = v2; /*0x1844*/
MemConfig_0(dst, (char *)(buf + 121), 4u); /*0x184b*/
MemConfig_0(dst_1, (char *)(buf + 125), 4u); /*0x185b*/
v5 = *(_DWORD *)(buf + 208); /*0x1860*/
v16 = 0; /*0x186b*/
v18 = 0; /*0x188a*/
src = ((unsigned __int16)__ROL2__(v5, 8) << 16) | (unsigned __int16)__ROL2__(HIWORD(v5), 8); /*0x188f*/
MemConfig_0(dst_2, (char *)&src, 4u); /*0x1896*/
v6 = (*(__int64 (__fastcall **)(_QWORD, int *))(*(_QWORD *)(a1 + 744) + 8LL))(*(_QWORD *)(a1 + 744), &v9); /*0x18ac*/
if ( v6 == 0x8000000000000011uLL && Mtftp4ResolveAddress(buf, a1, (__int64)&v9) ) /*0x18c8*/
return 0; /*0x18d1*/
if ( !*(_BYTE *)(buf + 120) ) /*0x18d5*/
{
v8 = (_QWORD *)(buf + 132); /*0x18db*/
if ( MemConfig(v8, 4) ) /*0x18e8*/
{
v6 = (*(__int64 (__fastcall **)(_QWORD, _QWORD, _QWORD *, _QWORD *, _QWORD *))(*(_QWORD *)(a1 + 744) + 24LL))( /*0x1910*/
*(_QWORD *)(a1 + 744),
0,
&unk_9778,
&unk_9778,
v8);
if ( v6 < 0 ) /*0x1916*/
(*(void (__fastcall **)(_QWORD, _QWORD))(*(_QWORD *)(a1 + 744) + 8LL))(*(_QWORD *)(a1 + 744), 0); /*0x1924*/
}
}
return v6; /*0x193b*/
}
// Function: Mtftp4Start @ 0x1944 (0x40b bytes)
unsigned __int64 __fastcall Mtftp4Start(__int64 buf, __int64 a2, __int16 n7)
{
__int64 buf_1; // rbx
__int64 v7; // r12
signed __int64 v8; // rdi
__int64 src; // r15
unsigned int v11; // edx
__int16 v12; // ax
int *v13; // r13
int v14; // edx
unsigned __int16 v15; // ax
char *v16; // rax
__int64 (__fastcall *IpConfig_8)(); // rdx
char *v18; // rax
if ( !buf /*0x19c5*/
|| !a2
|| !*(_QWORD *)(a2 + 24)
|| *(_DWORD *)(a2 + 40) && !*(_QWORD *)(a2 + 48)
|| (n7 == 1 || n7 == 7) && !*(_QWORD *)(a2 + 64) && !*(_QWORD *)(a2 + 80)
|| n7 == 2 && !*(_QWORD *)(a2 + 64) && !*(_QWORD *)(a2 + 96) )
{
return 0x8000000000000002uLL; /*0x1d28*/
}
buf_1 = buf - 24; /*0x19cf*/
if ( *(_DWORD *)(buf - 24) != 1886676596 ) /*0x19d9*/
{
Assert_( /*0x19ee*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Impl.c",
394,
(__int64)"CR has Bad Signature");
buf_1 = buf; /*0x19f3*/
}
v7 = (*(__int64 (__fastcall **)(__int64))(BootServices + 24))(8); /*0x1a09*/
v8 = -(__int64)(*(_QWORD *)(buf_1 + 88) != 1) & 0x8000000000000013uLL; /*0x1a1f*/
if ( *(_WORD *)(buf_1 + 180) ) /*0x1a2c*/
v8 = 0x800000000000000FuLL; /*0x1a34*/
if ( v8 < 0 ) /*0x1a3b*/
{
(*(void (__fastcall **)(__int64))(BootServices + 32))(v7); /*0x1a47*/
return v8; /*0x1a4d*/
}
*(_WORD *)(buf_1 + 180) = n7; /*0x1a52*/
src = *(_QWORD *)(a2 + 16); /*0x1a59*/
if ( src && !Mtftp4CheckAddress((_BYTE *)buf_1, *(char **)(a2 + 16)) ) /*0x1a68*/
{
v8 = 0x8000000000000002uLL; /*0x1a71*/
LABEL_23:
Mtftp4Cleanup(buf_1, v8); /*0x1a7b*/
(*(void (__fastcall **)(__int64))(BootServices + 32))(v7); /*0x1a90*/
return v8; /*0x1a93*/
}
v11 = *(_DWORD *)(a2 + 40); /*0x1a95*/
if ( v11 ) /*0x1a9a*/
{
v8 = Mtftp4ParseOptions(*(_QWORD *)(a2 + 48), v11, 1, (char *)(buf_1 + 160)); /*0x1aaf*/
if ( v8 < 0 ) /*0x1ab5*/
goto LABEL_23; /*0x1ab5*/
}
*(_QWORD *)(buf_1 + 152) = a2; /*0x1abc*/
*(_WORD *)(buf_1 + 182) = 512; /*0x1aca*/
MemConfig_0((char *)(buf_1 + 208), (char *)(buf_1 + 136), 4u); /*0x1ae1*/
*(_DWORD *)(buf_1 + 208) = ((unsigned __int16)__ROL2__(*(_DWORD *)(buf_1 + 208), 8) << 16) /*0x1b0d*/
| (unsigned __int16)__ROL2__(HIWORD(*(_DWORD *)(buf_1 + 208)), 8);
v12 = *(_WORD *)(buf_1 + 140); /*0x1b0f*/
*(_WORD *)(buf_1 + 214) = 0; /*0x1b16*/
v13 = (int *)(buf_1 + 216); /*0x1b1e*/
*(_WORD *)(buf_1 + 212) = v12; /*0x1b28*/
MemConfig_0((char *)(buf_1 + 216), (char *)(buf_1 + 132), 4u); /*0x1b2f*/
*(_DWORD *)(buf_1 + 216) = ((unsigned __int16)__ROL2__(*(_DWORD *)(buf_1 + 216), 8) << 16) /*0x1b50*/
| (unsigned __int16)__ROL2__(HIWORD(*(_DWORD *)(buf_1 + 216)), 8);
*(_DWORD *)(buf_1 + 248) = *(unsigned __int16 *)(buf_1 + 142); /*0x1b5b*/
*(_DWORD *)(buf_1 + 252) = *(unsigned __int16 *)(buf_1 + 144); /*0x1b68*/
*(_BYTE *)(buf_1 + 262) = 1; /*0x1b6e*/
if ( src ) /*0x1b78*/
{
MemConfig_0((char *)(buf_1 + 208), (char *)(src + 4), 4u); /*0x1b8b*/
MemConfig_0((char *)(buf_1 + 216), (char *)src, 4u); /*0x1b9c*/
v14 = *v13; /*0x1bb6*/
v15 = __ROL2__(HIWORD(*v13), 8); /*0x1bc4*/
*(_DWORD *)(buf_1 + 208) = ((unsigned __int16)__ROL2__(*(_DWORD *)(buf_1 + 208), 8) << 16) /*0x1bc8*/
| (unsigned __int16)__ROL2__(HIWORD(*(_DWORD *)(buf_1 + 208)), 8);
*v13 = ((unsigned __int16)__ROL2__(v14, 8) << 16) | v15; /*0x1bd9*/
*(_WORD *)(buf_1 + 212) = *(_WORD *)(src + 8); /*0x1be2*/
*(_DWORD *)(buf_1 + 248) = *(unsigned __int16 *)(src + 10); /*0x1bee*/
*(_DWORD *)(buf_1 + 252) = *(unsigned __int16 *)(src + 12); /*0x1bf9*/
}
if ( !*(_WORD *)(buf_1 + 212) ) /*0x1c02*/
*(_WORD *)(buf_1 + 212) = 69; /*0x1c10*/
if ( !*(_DWORD *)(buf_1 + 248) ) /*0x1c17*/
*(_DWORD *)(buf_1 + 248) = 5; /*0x1c20*/
if ( !*(_DWORD *)(buf_1 + 252) ) /*0x1c2a*/
*(_DWORD *)(buf_1 + 252) = 3; /*0x1c33*/
v8 = Mtftp4SendUdpPacket(*(_QWORD *)(buf_1 + 224), buf_1); /*0x1c4c*/
if ( v8 < 0 ) /*0x1c52*/
goto LABEL_23; /*0x1c52*/
*(_QWORD *)a2 = 0x8000000000000006uLL; /*0x1c67*/
if ( n7 == 2 ) /*0x1c6e*/
{
v16 = Mtftp4AllocateBlockRangeEntry(0, 0xFFFFu); /*0x1c72*/
if ( v16 ) /*0x1c7a*/
{
InsertTailList((_QWORD *)(buf_1 + 192), v16); /*0x1c86*/
v8 = Mtftp4BuildPacket(buf_1); /*0x1c93*/
if ( v8 >= 0 ) /*0x1c99*/
{
IpConfig_8 = (__int64 (__fastcall *)())IpConfig_1; /*0x1c9b*/
LABEL_42:
v8 = DxeConfig_10(*(_QWORD *)(buf_1 + 224), IpConfig_8, buf_1); /*0x1cd9*/
goto LABEL_44; /*0x1ceb*/
}
goto LABEL_44; /*0x1c99*/
}
LABEL_43:
v8 = 0x8000000000000009uLL; /*0x1ced*/
goto LABEL_44; /*0x1ced*/
}
v18 = Mtftp4AllocateBlockRangeEntry(1u, 0xFFFFu); /*0x1ca9*/
if ( !v18 ) /*0x1cb1*/
goto LABEL_43; /*0x1cb1*/
InsertTailList((_QWORD *)(buf_1 + 192), v18); /*0x1cbd*/
v8 = Mtftp4BuildPacket(buf_1); /*0x1cca*/
if ( v8 >= 0 ) /*0x1cd0*/
{
IpConfig_8 = (__int64 (__fastcall *)())IpConfig_0; /*0x1cd2*/
goto LABEL_42; /*0x1cd2*/
}
LABEL_44:
(*(void (__fastcall **)(__int64))(BootServices + 32))(v7); /*0x1cf7*/
if ( v8 < 0 ) /*0x1d07*/
goto LABEL_23; /*0x1d07*/
if ( *(_QWORD *)(a2 + 8) ) /*0x1d0d*/
return 0; /*0x1d13*/
while ( *(_QWORD *)a2 == 0x8000000000000006uLL ) /*0x1d21*/
(*(void (__fastcall **)(__int64))(buf + 56))(buf); /*0x1d1a*/
return *(_QWORD *)a2; /*0x1d41*/
}
// Function: Mtftp4GetInfo @ 0x1d50 (0xad bytes)
unsigned __int64 __fastcall Mtftp4GetInfo(__int64 a1, __int64 dst)
{
__int64 v3; // rdi
__int64 v4; // rsi
__int64 BootServices; // rax
v3 = a1; /*0x1d62*/
if ( !a1 || !dst ) /*0x1d6d*/
return 0x8000000000000002uLL; /*0x1de3*/
v4 = (*(__int64 (__fastcall **)(__int64))(BootServices + 24))(8); /*0x1d85*/
if ( *(_DWORD *)(v3 - 24) == 1886676596 ) /*0x1d88*/
v3 -= 24; /*0x1da4*/
else
Assert_( /*0x1d9d*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Impl.c",
563,
(__int64)"CR has Bad Signature");
MemConfig_0((char *)dst, (char *)(v3 + 120), 0x1Au); /*0x1db5*/
*(_QWORD *)(dst + 48) = 0; /*0x1dba*/
*(_QWORD *)(dst + 32) = blksize_; // "blksize" /*0x1dc6*/
BootServices = BootServices; /*0x1dcd*/
*(_BYTE *)(dst + 26) = 4; /*0x1dd4*/
*(_BYTE *)(dst + 40) = 0; /*0x1dd8*/
(*(void (__fastcall **)(__int64))(BootServices + 32))(v4); /*0x1ddc*/
return 0; /*0x1df7*/
}
// Function: Mtftp4Input @ 0x1e00 (0x246 bytes)
unsigned __int64 __fastcall Mtftp4Input(__int64 a1, char *src)
{
__int64 v3; // rdi
__int64 v4; // rbx
__int64 v5; // rcx
int dst_2; // r14d
int dst__2; // r11d
int dst__3; // esi
__int64 i; // rax
__int64 v10; // rax
__int64 v11; // rsi
char dst_1[4]; // [rsp+20h] [rbp-10h] BYREF
int dst; // [rsp+60h] [rbp+30h] BYREF
int dst_; // [rsp+70h] [rbp+40h] BYREF
int dst__1; // [rsp+78h] [rbp+48h] BYREF
v3 = a1; /*0x1e19*/
if ( a1 ) /*0x1e1f*/
{
if ( *(_DWORD *)(a1 - 24) == 1886676596 ) /*0x1e2c*/
v3 = a1 - 24; /*0x1e48*/
else
Assert_( /*0x1e41*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Impl.c",
642,
(__int64)"CR has Bad Signature");
if ( !src ) /*0x1e4f*/
{
v4 = (*(__int64 (__fastcall **)(__int64))(BootServices + 24))(8); /*0x1e6b*/
Mtftp4Cleanup(v3, 0x8000000000000015uLL); /*0x1e6e*/
MemGetInfo((char *)(v3 + 120), 0x1Au); /*0x1e7c*/
v5 = v4; /*0x1e81*/
*(_QWORD *)(v3 + 88) = 0; /*0x1e84*/
LABEL_23:
(*(void (__fastcall **)(__int64))(BootServices + 32))(v5); /*0x201d*/
return 0; /*0x2029*/
}
MemConfig_0((char *)&dst, src + 1, 4u); /*0x1e9d*/
MemConfig_0((char *)&dst_, src + 5, 4u); /*0x1ead*/
MemConfig_0((char *)&dst__1, src + 12, 4u); /*0x1ebd*/
MemConfig_0(dst_1, src + 16, 4u); /*0x1ecd*/
dst_2 = ((unsigned __int16)__ROL2__(dst, 8) << 16) | (unsigned __int16)__ROL2__(HIWORD(dst), 8); /*0x1eef*/
dst__2 = ((unsigned __int16)__ROL2__(dst_, 8) << 16) | (unsigned __int16)__ROL2__(HIWORD(dst_), 8); /*0x1f0c*/
dst = dst_2; /*0x1f0f*/
dst_ = dst__2; /*0x1f15*/
dst__3 = ((unsigned __int16)__ROL2__(dst__1, 8) << 16) | (unsigned __int16)__ROL2__(HIWORD(dst__1), 8); /*0x1f30*/
dst__1 = dst__3; /*0x1f4a*/
*(_DWORD *)dst_1 = ((unsigned __int16)__ROL2__(*(_WORD *)dst_1, 8) << 16) /*0x1f4d*/
| (unsigned __int16)__ROL2__(*(_WORD *)&dst_1[2], 8);
if ( (unsigned int)(*(_DWORD *)dst_1 - 1) <= 0xFFFFFFFD ) /*0x1f56*/
{
if ( *src ) /*0x1f5c*/
goto LABEL_27; /*0x1f5c*/
for ( i = 0; i <= 32; ++i ) /*0x1f61*/
{
if ( dst__2 == dword_8E60[i] ) /*0x1f6f*/
break; /*0x1f6f*/
}
if ( i != 33 && (!dst__2 || NetIp4IsNetmaskValid(dst_2, dst__2)) ) /*0x1f8f*/
{
LABEL_27:
if ( !dst__3 || (dst__2 & dst__3) == (dst_2 & dst__2) && (!dst__2 || NetIp4IsNetmaskValid(dst__3, dst__2)) ) /*0x1fbb*/
{
v10 = (*(__int64 (__fastcall **)(__int64))(BootServices + 24))(8); /*0x1fd0*/
v11 = v10; /*0x1fd8*/
if ( *(_QWORD *)(v3 + 88) == 1 && *(_WORD *)(v3 + 180) ) /*0x1fdd*/
{
(*(void (__fastcall **)(__int64))(BootServices + 32))(v10); /*0x1ff1*/
return 0x800000000000000FuLL; /*0x1ffe*/
}
MemConfig_0((char *)(v3 + 120), src, 0x1Au); /*0x200d*/
v5 = v11; /*0x2012*/
*(_QWORD *)(v3 + 88) = 1; /*0x2015*/
goto LABEL_23; /*0x2015*/
}
}
}
}
return 0x8000000000000002uLL; /*0x203a*/
}
// Function: Mtftp4ParseOptionOack @ 0x2048 (0x5e bytes)
signed __int64 __fastcall Mtftp4ParseOptionOack(__int64 a1, __int64 n2, _WORD *dst, _DWORD *a4, __int64 *a5)
{
signed __int64 result; // rax
if ( !a1 || (unsigned int)n2 < 2 || !dst || !a4 ) /*0x2066*/
return 0x8000000000000002uLL; /*0x2096*/
result = Mtftp4ParseOack(dst, n2, a4, a5); /*0x2073*/
if ( result >= 0 ) /*0x207b*/
return -(__int64)(*a4 == 0) & 0x800000000000000EuLL; /*0x2091*/
return result; /*0x20a0*/
}
// Function: Mtftp4ReadFile @ 0x20cc (0xf1 bytes)
unsigned __int64 __fastcall Mtftp4ReadFile(
__int64 buf,
__int64 a2,
__int64 a3,
__int64 a4,
unsigned __int8 a5,
__int64 a6,
_DWORD *a7,
_QWORD *a8)
{
unsigned __int64 result; // rax
_QWORD v9[2]; // [rsp+20h] [rbp-59h] BYREF
__int64 v10; // [rsp+30h] [rbp-49h]
__int64 v11[5]; // [rsp+40h] [rbp-39h] BYREF
int v12; // [rsp+68h] [rbp-11h]
__int64 v13; // [rsp+70h] [rbp-9h]
__int64 v14; // [rsp+78h] [rbp-1h]
__int64 v15; // [rsp+80h] [rbp+7h]
_QWORD *v16; // [rsp+88h] [rbp+Fh]
unsigned __int64 (__fastcall *Mtftp4PacketCallback_1)(__int64, __int64, unsigned __int16, char *); // [rsp+90h] [rbp+17h]
__int64 v18; // [rsp+98h] [rbp+1Fh]
__int64 v19; // [rsp+A0h] [rbp+27h]
if ( !buf || !a3 || !a7 || a5 && !a6 ) /*0x2111*/
return 0x8000000000000002uLL; /*0x21a2*/
if ( a8 ) /*0x211e*/
*a8 = 0; /*0x2120*/
*a7 = 0; /*0x2124*/
v10 = 0; /*0x2128*/
v11[0] = 0; /*0x212d*/
v11[1] = 0; /*0x2132*/
v14 = 0; /*0x2137*/
v15 = 0; /*0x213c*/
v18 = 0; /*0x2141*/
v19 = 0; /*0x2146*/
v9[0] = a8; /*0x214b*/
v12 = a5; /*0x2155*/
v16 = v9; /*0x215c*/
v11[3] = a3; /*0x2167*/
v13 = a6; /*0x2171*/
Mtftp4PacketCallback_1 = Mtftp4PacketCallback; /*0x2179*/
v9[1] = a7; /*0x217d*/
v11[2] = a2; /*0x2181*/
v11[4] = a4; /*0x2185*/
result = Mtftp4Start(buf, (__int64)v11, 1); /*0x2189*/
if ( result == 0x8000000000000015uLL ) /*0x219b*/
return v10; /*0x219b*/
return result; /*0x21b4*/
}
// Function: IpConfig_5 @ 0x21c0 (0x8d bytes)
__int64 __fastcall IpConfig_5(__int64 a1)
{
__int64 v1; // rbx
v1 = a1; /*0x21c6*/
if ( !a1 ) /*0x21cc*/
return 0x8000000000000002uLL; /*0x21ce*/
if ( *(_DWORD *)(a1 - 24) == 1886676596 ) /*0x21e5*/
v1 = a1 - 24; /*0x2201*/
else
Assert_( /*0x21fa*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Impl.c",
1086,
(__int64)"CR has Bad Signature");
if ( !*(_QWORD *)(v1 + 88) ) /*0x2205*/
return 0x8000000000000013uLL; /*0x220c*/
if ( *(_QWORD *)(v1 + 88) == 2 ) /*0x2221*/
return 0x8000000000000007uLL; /*0x2223*/
return (*(__int64 (__fastcall **)(_QWORD))(*(_QWORD *)(*(_QWORD *)(v1 + 224) + 744LL) + 56LL))(*(_QWORD *)(*(_QWORD *)(v1 + 224) + 744LL)); /*0x21d8*/
}
// Function: Mtftp4AllocateBlockRangeEntry @ 0x2250 (0x54 bytes)
char *__fastcall Mtftp4AllocateBlockRangeEntry(unsigned __int16 a1, unsigned __int16 n0xFFFF)
{
char *result; // rax
char *v5; // rbx
result = GetInfo_0(0x30u); /*0x226a*/
v5 = result; /*0x226f*/
if ( result ) /*0x2275*/
{
InitializeListHead(result); /*0x227a*/
*((_QWORD *)v5 + 2) = a1; /*0x2282*/
*((_QWORD *)v5 + 3) = n0xFFFF; /*0x2289*/
*((_QWORD *)v5 + 5) = n0xFFFF; /*0x228d*/
return v5; /*0x2291*/
}
return result; /*0x229e*/
}
// Function: Assert_1 @ 0x22a4 (0x63 bytes)
bool __fastcall Assert_1(_QWORD *a1, unsigned __int16 n0xFFFF)
{
bool result; // al
__int64 n0xFFFF_1; // rdi
__int64 v6; // rbx
result = IsListEmpty(a1); /*0x22b9*/
if ( !result ) /*0x22c0*/
{
n0xFFFF_1 = n0xFFFF; /*0x22c2*/
while ( 1 ) /*0x22c5*/
{
v6 = a1[1]; /*0x22c5*/
if ( *(_QWORD *)(v6 + 16) <= n0xFFFF_1 ) /*0x22cd*/
break; /*0x22cd*/
RemoveEntryList((_QWORD *)a1[1]); /*0x22d2*/
AssertCpuDeadLoop_0(); /*0x22da*/
result = IsListEmpty(a1); /*0x22e2*/
if ( result ) /*0x22e9*/
return result; /*0x22e9*/
}
if ( *(_QWORD *)(v6 + 24) > n0xFFFF_1 ) /*0x22f1*/
*(_QWORD *)(v6 + 24) = n0xFFFF_1; /*0x22f3*/
}
return result; /*0x2301*/
}
// Function: Mtftp4BlockRangeInsert @ 0x2308 (0x112 bytes)
unsigned __int64 __fastcall Mtftp4BlockRangeInsert(char ***a1, unsigned __int16 n0xFFFF, char a3, _QWORD *a4)
{
char **v4; // rbx
__int64 n0xFFFF_1; // r10
__int64 n0xFFFF_2; // rax
__int64 v9; // rdx
char *n0xFFFF_3; // rax
char *v11; // rax
v4 = *a1; /*0x2317*/
if ( *a1 == (char **)a1 ) /*0x2323*/
return 0x800000000000000EuLL; /*0x2323*/
n0xFFFF_1 = n0xFFFF; /*0x2325*/
while ( (__int64)v4[3] < n0xFFFF ) /*0x232d*/
{
v4 = (char **)*v4; /*0x232f*/
if ( v4 == (char **)a1 ) /*0x2335*/
return 0x800000000000000EuLL; /*0x2335*/
}
n0xFFFF_2 = (__int64)v4[2]; /*0x2351*/
if ( n0xFFFF_2 > n0xFFFF ) /*0x2358*/
return 0x800000000000000EuLL; /*0x2337*/
if ( n0xFFFF_2 == n0xFFFF ) /*0x235a*/
{
v9 = (__int64)v4[4]; /*0x235c*/
v4[2] = (char *)(n0xFFFF_2 + 1); /*0x2364*/
*a4 = n0xFFFF_1; /*0x2368*/
if ( v9 > 0 ) /*0x236e*/
*a4 = &v4[5][n0xFFFF_1 + 1 + (v9 - 1) * (unsigned int)(*((_DWORD *)v4 + 10) + 1)]; /*0x2387*/
if ( n0xFFFF_2 + 1 > (__int64)v4[5] ) /*0x238e*/
{
v4[2] = 0; /*0x2390*/
v4[4] = (char *)(v9 + 1); /*0x2399*/
}
if ( (__int64)v4[2] > (__int64)v4[3] || a3 ) /*0x23aa*/
{
RemoveEntryList(v4); /*0x23af*/
AssertCpuDeadLoop_0(); /*0x23b7*/
}
return 0; /*0x23b7*/
}
n0xFFFF_3 = v4[3]; /*0x23c0*/
if ( n0xFFFF_3 == (char *)n0xFFFF ) /*0x23c7*/
{
v4[3] = n0xFFFF_3 - 1; /*0x23cc*/
return 0; /*0x23be*/
}
v11 = Mtftp4AllocateBlockRangeEntry(n0xFFFF + 1, (unsigned __int16)n0xFFFF_3); /*0x23dd*/
if ( v11 ) /*0x23e8*/
{
v4[3] = (char *)(n0xFFFF - 1); /*0x2400*/
*((_QWORD *)v11 + 1) = v4; /*0x2404*/
*(_QWORD *)v11 = *v4; /*0x240b*/
*((_QWORD *)*v4 + 1) = v11; /*0x2411*/
*v4 = v11; /*0x2415*/
return 0; /*0x2418*/
}
return 0x8000000000000009uLL; /*0x234b*/
}
// Function: Mtftp4BuildPacket @ 0x241c (0x27f bytes)
__int64 __fastcall Mtftp4BuildPacket(__int64 buf)
{
__int64 v1; // rbp
char *octet; // r12
char **p_octet; // r15
unsigned __int64 v4; // rax
unsigned __int64 v5; // r14
unsigned int n4; // edi
unsigned __int64 v7; // r13
char **p_octet_1; // rsi
int v9; // ebx
int v10; // eax
char *v11; // rax
__int64 v12; // rsi
_WORD *v14; // rbx
unsigned int n0xF4240; // edi
unsigned __int64 octet_1; // rbx
__int64 v17; // rax
unsigned __int64 v18; // rbx
unsigned int n0xF4240_1; // edi
__int64 v20; // rax
unsigned __int64 octet_2; // r14
unsigned int n0xF4240_2; // edi
unsigned __int64 v23; // rbx
unsigned __int64 v24; // r13
unsigned __int64 v25; // r12
__int64 v26; // rax
unsigned __int64 v27; // r14
unsigned int n0xF4240_3; // edi
__int64 v29; // rax
unsigned __int64 v31; // [rsp+68h] [rbp+10h]
char *v32; // [rsp+70h] [rbp+18h]
v1 = *(_QWORD *)(buf + 152); /*0x2435*/
octet = "octet"; /*0x243c*/
if ( *(_QWORD *)(v1 + 32) ) /*0x2443*/
octet = *(char **)(v1 + 32); /*0x244c*/
p_octet = *(char ***)(v1 + 48); /*0x2451*/
v31 = AsciiStrLen(*(_BYTE **)(v1 + 24)); /*0x245d*/
v4 = AsciiStrLen(octet); /*0x2465*/
v5 = 0; /*0x246d*/
n4 = v4 + v31 + 4; /*0x2470*/
v7 = v4; /*0x2472*/
if ( *(_DWORD *)(v1 + 40) ) /*0x2475*/
{
p_octet_1 = p_octet; /*0x247b*/
do /*0x24a6*/
{
v9 = AsciiStrLen(*p_octet_1); /*0x248a*/
v10 = AsciiStrLen(p_octet_1[1]); /*0x248d*/
p_octet_1 += 2; /*0x2495*/
++v5; /*0x249b*/
n4 += v9 + v10 + 2; /*0x249e*/
}
while ( v5 < *(unsigned int *)(v1 + 40) ); /*0x24a6*/
}
v11 = DxeConfig_12(n4); /*0x24aa*/
v32 = v11; /*0x24af*/
v12 = (__int64)v11; /*0x24b4*/
if ( !v11 ) /*0x24ba*/
return 0x8000000000000009uLL; /*0x24bc*/
v14 = (_WORD *)DxeConfig_4((__int64)v11, n4); /*0x24dc*/
if ( !v14 ) /*0x24e2*/
Assert_( /*0x24f3*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Support.c",
320,
(__int64)"Packet != ((void *) 0)");
n0xF4240 = n4 - 2; /*0x24fd*/
*v14 = __ROL2__(*(_WORD *)(buf + 180), 8); /*0x250d*/
octet_1 = (unsigned __int64)(v14 + 1); /*0x2510*/
v17 = AsciiStrCpyS(octet_1, n0xF4240, *(char **)(v1 + 24)); /*0x251b*/
if ( v17 < 0 ) /*0x2528*/
{
DebugPrint(0x80000000LL, (__int64)"\nASSERT_EFI_ERROR (Status = %r)\n", v17); /*0x2534*/
Assert_( /*0x2548*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Support.c",
327,
(__int64)"!EFI_ERROR (Status)");
}
v18 = v31 + octet_1; /*0x2557*/
n0xF4240_1 = -1 - v31 + n0xF4240; /*0x255a*/
v20 = AsciiStrCpyS(v18 + 1, n0xF4240_1, octet); /*0x2565*/
if ( v20 < 0 ) /*0x256d*/
{
DebugPrint(0x80000000LL, (__int64)"\nASSERT_EFI_ERROR (Status = %r)\n", v20); /*0x257e*/
Assert_( /*0x2592*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Support.c",
331,
(__int64)"!EFI_ERROR (Status)");
}
octet_2 = v18 + v7 + 2; /*0x25a1*/
n0xF4240_2 = -1 - v7 + n0xF4240_1; /*0x25a4*/
v23 = 0; /*0x25a6*/
if ( *(_DWORD *)(v1 + 40) ) /*0x25a8*/
{
do /*0x266e*/
{
v24 = AsciiStrLen(*p_octet); /*0x25c2*/
v25 = AsciiStrLen(p_octet[1]); /*0x25d2*/
v26 = AsciiStrCpyS(octet_2, n0xF4240_2, *p_octet); /*0x25d5*/
if ( v26 < 0 ) /*0x25dd*/
{
DebugPrint(0x80000000LL, (__int64)"\nASSERT_EFI_ERROR (Status = %r)\n", v26); /*0x25ec*/
Assert_( /*0x2604*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Support.c",
340,
(__int64)"!EFI_ERROR (Status)");
}
v27 = v24 + octet_2; /*0x2613*/
n0xF4240_3 = -1 - v24 + n0xF4240_2; /*0x2616*/
v29 = AsciiStrCpyS(v27 + 1, n0xF4240_3, p_octet[1]); /*0x261e*/
if ( v29 < 0 ) /*0x2626*/
{
DebugPrint(0x80000000LL, (__int64)"\nASSERT_EFI_ERROR (Status = %r)\n", v29); /*0x2635*/
Assert_( /*0x264d*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Support.c",
345,
(__int64)"!EFI_ERROR (Status)");
}
octet_2 = v25 + v27 + 2; /*0x265c*/
n0xF4240_2 = -1 - v25 + n0xF4240_3; /*0x265f*/
++v23; /*0x2661*/
p_octet += 2; /*0x2667*/
}
while ( v23 < *(unsigned int *)(v1 + 40) ); /*0x266e*/
v12 = (__int64)v32; /*0x2674*/
}
return Mtftp4TransmitPacket(buf, v12); /*0x268b*/
}
// Function: Mtftp4SendError @ 0x269c (0xb3 bytes)
__int64 __fastcall Mtftp4SendError(__int64 buf, __int16 a2, char *octet)
{
unsigned int n4; // ebx
char *v7; // rax
__int64 v8; // rsi
_WORD *v10; // rdi
n4 = AsciiStrLen(octet) + 5; /*0x26c5*/
v7 = DxeConfig_12(n4); /*0x26ca*/
v8 = (__int64)v7; /*0x26cf*/
if ( !v7 ) /*0x26d5*/
return 0x8000000000000009uLL; /*0x26d7*/
v10 = (_WORD *)DxeConfig_4((__int64)v7, n4); /*0x26ed*/
if ( !v10 ) /*0x26f3*/
Assert_( /*0x2708*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Support.c",
385,
(__int64)"TftpError != ((void *) 0)");
*v10 = 1280; /*0x271f*/
v10[1] = __ROL2__(a2, 8); /*0x2722*/
AsciiStrCpyS((unsigned __int64)(v10 + 2), n4, octet); /*0x2726*/
return Mtftp4TransmitPacket(buf, v8); /*0x2745*/
}
// Function: Mtftp4TransmitPacket @ 0x2758 (0xf9 bytes)
__int64 __fastcall Mtftp4TransmitPacket(__int64 buf, __int64 a2)
{
__int64 v4; // rcx
bool v5; // zf
int v6; // eax
_WORD *v7; // rsi
__int16 n7; // cx
__int16 v9; // ax
__int64 v10; // rcx
__int64 result; // rax
char bufa[20]; // [rsp+30h] [rbp-38h] BYREF
int v13; // [rsp+44h] [rbp-24h]
__int16 v14; // [rsp+54h] [rbp-14h]
v4 = *(_QWORD *)(buf + 232); /*0x276d*/
if ( v4 ) /*0x2777*/
DxeConfig_14(v4); /*0x2779*/
*(_DWORD *)(buf + 244) = 0; /*0x277e*/
v5 = *(_BYTE *)(buf + 262) == 0; /*0x2785*/
v6 = *(_DWORD *)(buf + 252); /*0x278c*/
*(_QWORD *)(buf + 232) = a2; /*0x2792*/
if ( v5 ) /*0x2799*/
v6 *= 2; /*0x279b*/
*(_DWORD *)(buf + 240) = v6; /*0x27a2*/
MemGetInfo(bufa, 0x28u); /*0x27ad*/
v13 = *(_DWORD *)(buf + 208); /*0x27bd*/
v7 = (_WORD *)DxeConfig_13((_DWORD *)a2, 0, 0); /*0x27c9*/
if ( !v7 ) /*0x27cf*/
Assert_( /*0x27e4*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Support.c",
484,
(__int64)"Buffer != ((void *) 0)");
n7 = __ROL2__(*v7, 8); /*0x27f1*/
if ( (unsigned __int16)(n7 - 1) <= 1u || n7 == 7 ) /*0x2804*/
v9 = *(_WORD *)(buf + 212); /*0x280f*/
else
v9 = *(_WORD *)(buf + 214); /*0x2806*/
++*(_QWORD *)(a2 + 8); /*0x2816*/
v10 = *(_QWORD *)(buf + 224); /*0x281f*/
v14 = v9; /*0x2829*/
result = DxeConfig_9(v10, a2, bufa); /*0x2833*/
if ( result < 0 ) /*0x283b*/
--*(_QWORD *)(a2 + 8); /*0x283d*/
return result; /*0x284b*/
}
// Function: Mtftp4ResendPacket @ 0x2854 (0xee bytes)
__int64 __fastcall Mtftp4ResendPacket(__int64 buf)
{
_DWORD *v2; // rcx
_WORD *v3; // rdi
__int16 n7; // cx
__int16 v5; // ax
__int64 result; // rax
char bufa[20]; // [rsp+30h] [rbp-38h] BYREF
int v8; // [rsp+44h] [rbp-24h]
__int16 v9; // [rsp+54h] [rbp-14h]
if ( !*(_QWORD *)(buf + 232) ) /*0x285e*/
Assert_( /*0x287e*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Support.c",
533,
(__int64)"Instance->LastPacket != ((void *) 0)");
MemGetInfo(bufa, 0x28u); /*0x288d*/
v2 = *(_DWORD **)(buf + 232); /*0x289b*/
v8 = *(_DWORD *)(buf + 208); /*0x28a4*/
v3 = (_WORD *)DxeConfig_13(v2, 0, 0); /*0x28ad*/
if ( !v3 ) /*0x28b3*/
Assert_( /*0x28c8*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Support.c",
542,
(__int64)"Buffer != ((void *) 0)");
n7 = __ROL2__(*v3, 8); /*0x28d5*/
if ( (unsigned __int16)(n7 - 1) <= 1u || n7 == 7 ) /*0x28e8*/
v5 = *(_WORD *)(buf + 212); /*0x28f3*/
else
v5 = *(_WORD *)(buf + 214); /*0x28ea*/
v9 = v5; /*0x28fa*/
++*(_QWORD *)(*(_QWORD *)(buf + 232) + 8LL); /*0x2910*/
result = DxeConfig_9(*(_QWORD *)(buf + 224), *(_QWORD *)(buf + 232), bufa); /*0x2922*/
if ( result < 0 ) /*0x292a*/
--*(_QWORD *)(*(_QWORD *)(buf + 232) + 8LL); /*0x2933*/
return result; /*0x293c*/
}
// Function: Mtftp4CheckTimeout @ 0x2944 (0xe0 bytes)
_QWORD *__fastcall Mtftp4CheckTimeout(__int64 a1, __int64 a2)
{
_QWORD *v2; // rsi
_QWORD *result; // rax
_QWORD *v4; // rdi
_QWORD *v5; // rbx
int v6; // eax
int v7; // eax
__int64 (__fastcall *v8)(_QWORD *); // rax
__int64 v9; // rdx
int v10; // eax
v2 = (_QWORD *)(a2 + 32); /*0x2953*/
result = *(_QWORD **)(a2 + 32); /*0x2957*/
v4 = (_QWORD *)*result; /*0x295a*/
while ( result != v2 ) /*0x2a0e*/
{
v5 = result - 1; /*0x2962*/
v6 = *((_DWORD *)result + 58); /*0x2966*/
if ( v6 ) /*0x296e*/
{
v7 = v6 - 1; /*0x2974*/
*((_DWORD *)v5 + 60) = v7; /*0x2977*/
if ( !v7 ) /*0x297d*/
{
v8 = *(__int64 (__fastcall **)(_QWORD *))(v5[19] + 88LL); /*0x298a*/
if ( v8 && v8(v5 + 3) < 0 ) /*0x299c*/
{
Mtftp4SendError((__int64)v5, 8, "User aborted the transfer in time out"); /*0x29ad*/
v9 = 0x8000000000000015uLL; /*0x29b2*/
LABEL_12:
Mtftp4Cleanup((__int64)v5, v9); /*0x29fd*/
goto LABEL_13; /*0x2a00*/
}
if ( ++*((_DWORD *)v5 + 61) >= *((_DWORD *)v5 + 62) ) /*0x29d0*/
{
v9 = 0x8000000000000012uLL; /*0x29f3*/
goto LABEL_12; /*0x29f3*/
}
Mtftp4ResendPacket((__int64)v5); /*0x29d5*/
v10 = *((_DWORD *)v5 + 63); /*0x29e1*/
if ( !*((_BYTE *)v5 + 262) ) /*0x29da*/
v10 *= 2; /*0x29e9*/
*((_DWORD *)v5 + 60) = v10; /*0x29eb*/
}
}
LABEL_13:
result = v4; /*0x2a05*/
v4 = (_QWORD *)*v4; /*0x2a08*/
}
return result; /*0x2a1e*/
}
// Function: IpConfig_7 @ 0x2a24 (0x74 bytes)
bool __fastcall IpConfig_7(char *a1, char *blksize)
{
char *blksize_1; // rdi
char *v3; // rbx
char v4; // dl
char v5; // cl
blksize_1 = blksize; /*0x2a2e*/
v3 = a1; /*0x2a31*/
if ( !a1 || !blksize ) /*0x2a3c*/
Assert_( /*0x2a51*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Option.c",
44,
(__int64)"(Str1 != ((void *) 0)) && (Str2 != ((void *) 0))");
while ( 1 ) /*0x2a7c*/
{
v5 = *v3; /*0x2a7c*/
if ( !*v3 ) /*0x2a7c*/
return *v3 == *blksize_1; /*0x2a7c*/
v4 = *blksize_1; /*0x2a58*/
if ( !*blksize_1 ) /*0x2a58*/
return *v3 == *blksize_1; /*0x2a86*/
if ( (unsigned __int8)(v5 - 65) <= 0x19u ) /*0x2a63*/
v5 += 32; /*0x2a65*/
if ( (unsigned __int8)(v4 - 65) <= 0x19u ) /*0x2a6d*/
v4 += 32; /*0x2a6f*/
if ( v5 != v4 ) /*0x2a74*/
break; /*0x2a74*/
++v3; /*0x2a76*/
++blksize_1; /*0x2a79*/
}
return 0; /*0x2a8e*/
}
// Function: IpGetInfo_1 @ 0x2a98 (0x52 bytes)
__int64 __fastcall IpGetInfo_1(unsigned __int8 *a1)
{
unsigned int v1; // ebx
unsigned __int8 *v2; // rdi
unsigned __int8 n0x39; // al
v1 = 0; /*0x2aa2*/
v2 = a1; /*0x2aa4*/
if ( !a1 ) /*0x2aaa*/
Assert_( /*0x2abd*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Option.c",
85,
(__int64)"Str != ((void *) 0)");
while ( 1 ) /*0x2ad7*/
{
n0x39 = *v2; /*0x2ad7*/
if ( *v2 < 0x30u || n0x39 > 0x39u ) /*0x2ac6*/
break; /*0x2ac6*/
++v2; /*0x2ad1*/
v1 = n0x39 + 2 * (5 * v1 - 24); /*0x2ad4*/
}
return v1; /*0x2ae4*/
}
// Function: Mtftp4ParseOptionPairs @ 0x2aec (0xa3 bytes)
unsigned __int64 __fastcall Mtftp4ParseOptionPairs(_WORD *dst, unsigned int n2, _DWORD *a3, __int64 a4)
{
char *v4; // r10
unsigned __int8 v5; // r11
char *v6; // rdx
char *v7; // rdi
_BYTE *v8; // r10
_BYTE *v9; // rbx
__int64 v10; // rcx
v4 = (char *)(dst + 1); /*0x2af8*/
v5 = 0; /*0x2b00*/
v6 = (char *)dst + n2 - 1; /*0x2b03*/
while ( v4 < v6 ) /*0x2b54*/
{
v7 = v4; /*0x2b08*/
while ( *v4 ) /*0x2b14*/
++v4; /*0x2b0d*/
if ( v4 == v6 ) /*0x2b19*/
return 0x8000000000000002uLL; /*0x2b75*/
v8 = v4 + 1; /*0x2b1b*/
v9 = v8; /*0x2b1e*/
while ( *v8 ) /*0x2b2a*/
++v8; /*0x2b23*/
++v5; /*0x2b2c*/
if ( a4 && (unsigned int)v5 <= *a3 ) /*0x2b3b*/
{
v10 = 2LL * (v5 - 1); /*0x2b42*/
*(_QWORD *)(a4 + 8 * v10) = v7; /*0x2b45*/
*(_QWORD *)(a4 + 8 * v10 + 8) = v9; /*0x2b49*/
}
v4 = v8 + 1; /*0x2b4e*/
}
if ( *a3 >= (unsigned int)v5 && a4 ) /*0x2b62*/
{
*a3 = v5; /*0x2b64*/
return 0; /*0x2b67*/
}
else
{
*a3 = v5; /*0x2b77*/
return 0x8000000000000005uLL; /*0x2b7a*/
}
}
// Function: Mtftp4ParseOack @ 0x2b90 (0xb8 bytes)
unsigned __int64 __fastcall Mtftp4ParseOack(_WORD *dst, __int64 n2, _DWORD *a3, __int64 *a4)
{
unsigned int n2_1; // edi
unsigned __int64 result; // rax
unsigned int *v9; // r8
__int64 v10; // rax
*a3 = 0; /*0x2ba5*/
n2_1 = n2; /*0x2bac*/
if ( a4 ) /*0x2bb7*/
*a4 = 0; /*0x2bb9*/
if ( __ROL2__(*dst, 8) != 6 ) /*0x2bc8*/
return 0x8000000000000002uLL; /*0x2bc8*/
if ( (_DWORD)n2 == 2 ) /*0x2bd9*/
return 0; /*0x2c30*/
if ( *((_BYTE *)dst + (unsigned int)n2 - 1) ) /*0x2bdb*/
return 0x8000000000000002uLL; /*0x2bd4*/
result = Mtftp4ParseOptionPairs(dst, n2, a3, 0); /*0x2be7*/
if ( result == 0x8000000000000005uLL ) /*0x2bf9*/
{
if ( a4 ) /*0x2bfe*/
{
v10 = AllocatePool(0x8000000000000005uLL, 16LL * *v9); /*0x2c07*/
*a4 = v10; /*0x2c0c*/
if ( !v10 ) /*0x2c12*/
return 0x8000000000000009uLL; /*0x2c1e*/
Mtftp4ParseOptionPairs(dst, n2_1, a3, v10); /*0x2c2b*/
}
return 0; /*0x2c2b*/
}
return result; /*0x2c41*/
}
// Function: Mtftp4ParseMulticastOption @ 0x2c48 (0x135 bytes)
unsigned __int64 __fastcall Mtftp4ParseMulticastOption(_BYTE *a1, char *buf)
{
bool v3; // zf
_BYTE *v4; // rbx
unsigned __int8 *v5; // rsi
int v6; // r15d
unsigned __int64 n3; // r14
unsigned int Info_1; // eax
unsigned __int8 *v9; // rbx
unsigned int n0xFFFF; // eax
unsigned __int8 *v11; // rbx
unsigned int n2; // eax
v3 = *a1 == 44; /*0x2c65*/
v4 = a1; /*0x2c68*/
*((_DWORD *)buf + 2) = 0; /*0x2c6b*/
if ( !v3 ) /*0x2c6e*/
{
v5 = a1; /*0x2c70*/
v6 = 0; /*0x2c73*/
n3 = 0; /*0x2c76*/
while ( *v5 >= 0x30u ) /*0x2c79*/
{
if ( *v5 > 0x39u ) /*0x2c85*/
break; /*0x2c85*/
Info_1 = IpGetInfo_1(v5); /*0x2c8e*/
if ( Info_1 > 0xFF ) /*0x2c98*/
break; /*0x2c98*/
v6 = Info_1 | (v6 << 8); /*0x2ca2*/
while ( *v5 >= 0x30u && *v5 <= 0x39u ) /*0x2ca9*/
++v5; /*0x2cab*/
if ( n3 < 3 && *v5 != 46 ) /*0x2cbd*/
break; /*0x2cbd*/
++v5; /*0x2cc3*/
if ( ++n3 >= 4 ) /*0x2ccd*/
{
*((_DWORD *)buf + 2) = v6; /*0x2ccf*/
while ( *v4 ) /*0x2ce0*/
{
if ( *v4 == 44 ) /*0x2cd7*/
goto LABEL_18; /*0x2cd7*/
++v4; /*0x2cd9*/
}
goto LABEL_17; /*0x2ce0*/
}
}
return 0x8000000000000002uLL; /*0x2cbd*/
}
LABEL_17:
if ( *v4 != 44 ) /*0x2ce5*/
return 0x8000000000000002uLL; /*0x2ce5*/
LABEL_18:
v9 = v4 + 1; /*0x2ce7*/
if ( *v9 == 44 ) /*0x2ced*/
{
*((_WORD *)buf + 6) = 0; /*0x2cef*/
goto LABEL_25; /*0x2cf3*/
}
n0xFFFF = IpGetInfo_1(v9); /*0x2cf8*/
if ( n0xFFFF > 0xFFFF ) /*0x2d02*/
return 0x8000000000000002uLL; /*0x2d5a*/
*((_WORD *)buf + 6) = n0xFFFF; /*0x2d04*/
while ( *v9 >= 0x30u && *v9 <= 0x39u ) /*0x2d0c*/
++v9; /*0x2d0e*/
LABEL_25:
if ( *v9 != 44 ) /*0x2d1a*/
return 0x8000000000000002uLL; /*0x2d1a*/
v11 = v9 + 1; /*0x2d1c*/
n2 = IpGetInfo_1(v11); /*0x2d22*/
if ( n2 >= 2 ) /*0x2d2a*/
return 0x8000000000000002uLL; /*0x2d2a*/
buf[14] = n2 == 1; /*0x2d32*/
while ( *v11 >= 0x30u && *v11 <= 0x39u ) /*0x2d39*/
++v11; /*0x2d3b*/
return -(__int64)(*v11 != 0) & 0x8000000000000002uLL; /*0x2d73*/
}
// Function: Mtftp4ParseOptions @ 0x2d80 (0x14c bytes)
signed __int64 __fastcall Mtftp4ParseOptions(__int64 a1, unsigned int a2, char a3, char *buf)
{
int v4; // esi
unsigned __int8 **i; // rbx
char *v9; // rcx
int Info_1; // eax
int v11; // eax
int v12; // eax
signed __int64 result; // rax
*((_DWORD *)buf + 4) = 0; /*0x2d99*/
v4 = 0; /*0x2d9e*/
if ( !a2 ) /*0x2dab*/
return 0; /*0x2ea3*/
for ( i = (unsigned __int8 **)(a1 + 8); ; i += 2 ) /*0x2db1*/
{
v9 = (char *)*(i - 1); /*0x2db5*/
if ( !v9 || !*i ) /*0x2dc2*/
return 0x8000000000000002uLL; /*0x2e77*/
if ( IpConfig_7(v9, "blksize") ) /*0x2dd3*/
{
Info_1 = IpGetInfo_1(*i); /*0x2ddf*/
if ( (unsigned int)(Info_1 - 8) > 0xFFB0 ) /*0x2ded*/
return 0x8000000000000002uLL; /*0x2ded*/
*((_DWORD *)buf + 4) |= 1u; /*0x2def*/
*(_WORD *)buf = Info_1; /*0x2df3*/
goto LABEL_20; /*0x2df6*/
}
if ( IpConfig_7((char *)*(i - 1), "timeout") ) /*0x2e06*/
{
v11 = IpGetInfo_1(*i); /*0x2e12*/
if ( (unsigned int)(v11 - 1) > 0xFE ) /*0x2e20*/
return 0x8000000000000002uLL; /*0x2e20*/
buf[2] = v11; /*0x2e22*/
goto LABEL_20; /*0x2e25*/
}
if ( IpConfig_7((char *)*(i - 1), "tsize") ) /*0x2e32*/
{
v12 = IpGetInfo_1(*i); /*0x2e3e*/
*((_DWORD *)buf + 4) |= 4u; /*0x2e43*/
*((_DWORD *)buf + 1) = v12; /*0x2e47*/
goto LABEL_20; /*0x2e4a*/
}
if ( !IpConfig_7((char *)*(i - 1), "multicast") ) /*0x2e57*/
break; /*0x2e57*/
if ( a3 ) /*0x2e63*/
{
if ( **i ) /*0x2e68*/
return 0x8000000000000002uLL; /*0x2e6b*/
}
else
{
result = Mtftp4ParseMulticastOption(*i, buf); /*0x2e7f*/
if ( result < 0 ) /*0x2e87*/
return result; /*0x2e87*/
}
*((_DWORD *)buf + 4) |= 8u; /*0x2e89*/
LABEL_20:
if ( ++v4 >= a2 ) /*0x2e9d*/
return 0; /*0x2e9d*/
}
if ( !a3 ) /*0x2e92*/
goto LABEL_20; /*0x2e92*/
return 0x8000000000000003uLL; /*0x2eb9*/
}
// Function: IpConfig_6 @ 0x2ecc (0x7b bytes)
signed __int64 __fastcall IpConfig_6(_WORD *dst, __int64 n2, char *buf)
{
signed __int64 result; // rax
unsigned int v5; // ebx
signed __int64 v6; // rbx
unsigned int v7; // [rsp+40h] [rbp+18h] BYREF
__int64 v8; // [rsp+48h] [rbp+20h] BYREF
*((_DWORD *)buf + 4) = 0; /*0x2ed6*/
result = Mtftp4ParseOack(dst, n2, &v7, &v8); /*0x2ee8*/
if ( result >= 0 ) /*0x2ef0*/
{
v5 = v7; /*0x2ef2*/
if ( v7 ) /*0x2ef8*/
{
if ( !v8 ) /*0x2f00*/
Assert_( /*0x2f15*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Option.c",
528,
(__int64)"OptionList != ((void *) 0)");
v6 = Mtftp4ParseOptions(v8, v5, 0, buf); /*0x2f31*/
AssertCpuDeadLoop_0(); /*0x2f34*/
return v6; /*0x2f39*/
}
}
return result; /*0x2f41*/
}
// Function: IpGetInfo @ 0x2f48 (0x92 bytes)
__int64 __fastcall IpGetInfo(__int64 buf, __int16 a2)
{
char *v4; // rax
__int64 v5; // rbx
_WORD *v7; // rdi
v4 = DxeConfig_12(4u); /*0x2f69*/
v5 = (__int64)v4; /*0x2f6e*/
if ( !v4 ) /*0x2f74*/
return 0x8000000000000009uLL; /*0x2f76*/
v7 = (_WORD *)DxeConfig_4((__int64)v4, 4u); /*0x2f8c*/
if ( !v7 ) /*0x2f92*/
Assert_( /*0x2fa5*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Rrq.c",
113,
(__int64)"Ack != ((void *) 0)");
*v7 = 1024; /*0x2fb3*/
v7[1] = __ROL2__(a2, 8); /*0x2fbc*/
return Mtftp4TransmitPacket(buf, v5); /*0x2fd4*/
}
// Function: Mtftp4ProcessDataPacket @ 0x2fdc (0x168 bytes)
__int64 __fastcall Mtftp4ProcessDataPacket(__int64 buf, char *dst, int n4)
{
__int64 count; // r12
_QWORD *v4; // rdi
unsigned __int16 n4_1; // bp
unsigned __int16 n0xFFFF; // si
char v9; // r14
__int64 result; // rax
__int64 (__fastcall *v11)(__int64, _QWORD *, _QWORD, char *); // rax
__int64 v12; // rcx
__int64 v13; // r9
__int64 v14; // rbp
__int64 v15; // [rsp+50h] [rbp+8h] BYREF
count = (unsigned int)(n4 - 4); /*0x2ffc*/
v4 = *(_QWORD **)(buf + 152); /*0x300a*/
n4_1 = n4; /*0x3011*/
n0xFFFF = __ROL2__(*((_WORD *)dst + 1), 8); /*0x3014*/
v9 = 0; /*0x301e*/
if ( (unsigned int)count < *(unsigned __int16 *)(buf + 182) ) /*0x3024*/
{
*(_WORD *)(buf + 184) = n0xFFFF; /*0x3026*/
v9 = 1; /*0x3037*/
Assert_1((_QWORD *)(buf + 192), n0xFFFF); /*0x303a*/
}
result = Mtftp4BlockRangeInsert((char ***)(buf + 192), n0xFFFF, v9, &v15); /*0x3051*/
if ( result == 0x800000000000000EuLL ) /*0x3063*/
return 0; /*0x3063*/
if ( result < 0 ) /*0x306c*/
return result; /*0x306c*/
v11 = (__int64 (__fastcall *)(__int64, _QWORD *, _QWORD, char *))v4[10]; /*0x3072*/
if ( v11 && v11(buf + 24, v4, n4_1, dst) < 0 ) /*0x308e*/
{
Mtftp4SendError(buf, 4, "User aborted download"); /*0x309f*/
return 0x8000000000000015uLL; /*0x30ae*/
}
v12 = v4[8]; /*0x30b0*/
if ( !v12 ) /*0x30b7*/
return 0; /*0x30b7*/
v13 = *(unsigned __int16 *)(buf + 182) * (v15 - 1); /*0x30c8*/
v14 = count + v13; /*0x30cf*/
if ( (unsigned __int64)(count + v13) <= v4[7] ) /*0x30d7*/
{
MemConfig_0((char *)(v13 + v12), dst + 4, (unsigned int)count); /*0x30e0*/
if ( *(_WORD *)(buf + 184) == n0xFFFF ) /*0x30ec*/
{
if ( v9 ) /*0x30f1*/
v4[7] = v14; /*0x30f3*/
}
return 0; /*0x30f3*/
}
if ( !*(_WORD *)(buf + 184) ) /*0x311e*/
return 0; /*0x30f7*/
v4[7] = v14; /*0x3125*/
Mtftp4SendError(buf, 3, "User provided memory block is too small"); /*0x3133*/
return 0x8000000000000005uLL; /*0x3108*/
}
// Function: IpConfig_3 @ 0x3144 (0x11b bytes)
__int64 __fastcall IpConfig_3(__int64 buf, char *dst, int n4, __int64 a4, _BYTE *a5)
{
_QWORD *v5; // r14
unsigned __int16 v7; // bp
__int64 v10; // rdi
__int64 v11; // rsi
__int64 result; // rax
__int16 v13; // di
v5 = (_QWORD *)(buf + 192); /*0x3164*/
v7 = __ROL2__(*((_WORD *)dst + 1), 8); /*0x3176*/
*a5 = 0; /*0x3180*/
v10 = -1; /*0x3189*/
if ( IsListEmpty((_QWORD *)(buf + 192)) ) /*0x3184*/
{
v11 = -1; /*0x3191*/
LABEL_4:
Assert_( /*0x31a2*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Rrq.c",
263,
(__int64)"Expected >= 0");
goto LABEL_5; /*0x31b5*/
}
v11 = *(_QWORD *)(*v5 + 16LL); /*0x3199*/
if ( v11 < 0 ) /*0x31a0*/
goto LABEL_4; /*0x31a0*/
LABEL_5:
if ( !*(_BYTE *)(buf + 262) || v11 == v7 ) /*0x31c9*/
{
result = Mtftp4ProcessDataPacket(buf, dst, n4); /*0x31de*/
if ( result < 0 ) /*0x31e6*/
return result; /*0x31e6*/
if ( !*(_BYTE *)(buf + 262) ) /*0x31e8*/
*(_DWORD *)(buf + 240) = 2 * *(_DWORD *)(buf + 252); /*0x31f9*/
if ( !IsListEmpty(v5) ) /*0x3202*/
v10 = *(_QWORD *)(*v5 + 16LL); /*0x320e*/
if ( *(_BYTE *)(buf + 262) || v10 < 0 ) /*0x321e*/
{
if ( v10 >= 0 ) /*0x3223*/
{
v13 = v10 - 1; /*0x3232*/
}
else
{
v13 = *(_WORD *)(buf + 184); /*0x3225*/
*a5 = 1; /*0x322c*/
}
IpGetInfo(buf, v13); /*0x323b*/
}
}
else
{
Mtftp4ResendPacket(buf); /*0x31ce*/
}
return 0; /*0x3251*/
}
// Function: Mtftp4SetupMulticastReceive @ 0x3260 (0x163 bytes)
__int64 __fastcall Mtftp4SetupMulticastReceive(__int64 a1, __int64 a2)
{
char v2; // al
int v5; // edx
__int64 result; // rax
__int64 v7; // rsi
__int64 v8; // rdx
int v9; // [rsp+30h] [rbp-30h] BYREF
__int16 n0x4000; // [rsp+34h] [rbp-2Ch]
char v11; // [rsp+36h] [rbp-2Ah]
__int64 v12; // [rsp+38h] [rbp-28h]
char v13; // [rsp+40h] [rbp-20h]
char dst[4]; // [rsp+41h] [rbp-1Fh] BYREF
char dst_1[5]; // [rsp+45h] [rbp-1Bh] BYREF
__int16 v16; // [rsp+4Ah] [rbp-16h]
char dst_2[4]; // [rsp+4Ch] [rbp-14h] BYREF
__int16 v18; // [rsp+50h] [rbp-10h]
int src; // [rsp+90h] [rbp+30h] BYREF
char dst_; // [rsp+98h] [rbp+38h] BYREF
v2 = *(_BYTE *)(a2 + 120); /*0x3273*/
v9 = 0; /*0x327c*/
n0x4000 = 0x4000; /*0x3283*/
v11 = 0; /*0x328d*/
v12 = 0; /*0x3295*/
v13 = v2; /*0x329c*/
MemConfig_0(dst, (char *)(a2 + 121), 4u); /*0x32a3*/
MemConfig_0(dst_1, (char *)(a2 + 125), 4u); /*0x32b3*/
v5 = *(_DWORD *)(a2 + 208); /*0x32b8*/
v16 = *(_WORD *)(a2 + 260); /*0x32c8*/
v18 = 0; /*0x32e8*/
src = ((unsigned __int16)__ROL2__(v5, 8) << 16) | (unsigned __int16)__ROL2__(HIWORD(v5), 8); /*0x32ed*/
MemConfig_0(dst_2, (char *)&src, 4u); /*0x32f4*/
result = (*(__int64 (__fastcall **)(_QWORD, int *))(*(_QWORD *)(a1 + 744) + 8LL))(*(_QWORD *)(a1 + 744), &v9); /*0x3307*/
if ( result >= 0 ) /*0x330d*/
{
if ( *(_BYTE *)(a2 + 120) /*0x3354*/
|| !MemConfig((_QWORD *)(a2 + 132), 4)
|| (v7 = (*(__int64 (__fastcall **)(_QWORD, _QWORD, _QWORD *, _QWORD *, __int64))(*(_QWORD *)(a1 + 744) + 24LL))(
*(_QWORD *)(a1 + 744),
0,
&unk_9778,
&unk_9778,
a2 + 132),
v7 >= 0) )
{
src = ((unsigned __int16)__ROL2__(*(_DWORD *)(a2 + 256), 8) << 16) /*0x3390*/
| (unsigned __int16)__ROL2__(HIWORD(*(_DWORD *)(a2 + 256)), 8);
MemConfig_0(&dst_, (char *)&src, 4u); /*0x3397*/
LOBYTE(v8) = 1; /*0x33a7*/
return (*(__int64 (__fastcall **)(_QWORD, __int64, char *))(*(_QWORD *)(a1 + 744) + 16LL))( /*0x33ac*/
*(_QWORD *)(a1 + 744),
v8,
&dst_);
}
else
{
(*(void (__fastcall **)(_QWORD, _QWORD))(*(_QWORD *)(a1 + 744) + 8LL))(*(_QWORD *)(a1 + 744), 0); /*0x3362*/
return v7; /*0x3366*/
}
}
return result; /*0x33b7*/
}
// Function: IpConfig @ 0x33c4 (0x2db bytes)
__int64 __fastcall IpConfig(__int64 buf, _WORD *dst, __int64 n2, __int64 a4, _BYTE *a5)
{
__int64 v5; // rdi
unsigned int n2_1; // esi
__int64 v9; // rdi
__int64 v11; // r11
__int16 v12; // cx
unsigned __int8 v13; // al
__int16 v14; // r8
__int64 v15; // r9
int v16; // r10d
__int64 v17; // rax
__int64 v18; // rcx
__int64 v19; // rsi
char *Illegal_multicast_setting; // r8
char bufa[8]; // [rsp+30h] [rbp-38h] BYREF
unsigned int v22; // [rsp+38h] [rbp-30h]
__int16 v23; // [rsp+3Ch] [rbp-2Ch]
char v24; // [rsp+3Eh] [rbp-2Ah]
int v25; // [rsp+40h] [rbp-28h]
v5 = buf + 192; /*0x33e4*/
n2_1 = n2; /*0x33f4*/
*a5 = 0; /*0x33fa*/
if ( IsListEmpty((_QWORD *)(buf + 192)) ) /*0x33fd*/
{
v9 = -1; /*0x3406*/
LABEL_4:
Assert_( /*0x3419*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Rrq.c",
499,
(__int64)"Expected != -1");
goto LABEL_5; /*0x342c*/
}
v9 = *(_QWORD *)(*(_QWORD *)v5 + 16LL); /*0x340f*/
if ( v9 == -1 ) /*0x3417*/
goto LABEL_4; /*0x3417*/
LABEL_5:
if ( *(_BYTE *)(buf + 262) && v9 != 1 ) /*0x3443*/
return 0; /*0x3447*/
MemGetInfo(bufa, 0x14u); /*0x3456*/
v11 = IpConfig_6(dst, n2_1, bufa); /*0x346a*/
if ( v11 >= 0 && (~*(_DWORD *)(buf + 176) & v25) == 0 ) /*0x3484*/
{
v12 = *(_WORD *)bufa; /*0x348a*/
if ( (v25 & 1) == 0 || *(_WORD *)bufa <= *(_WORD *)(buf + 160) ) /*0x349b*/
{
v13 = bufa[2]; /*0x34a1*/
if ( (v25 & 2) == 0 || bufa[2] == *(_BYTE *)(buf + 162) ) /*0x34b0*/
{
if ( (v14 = v23, v15 = v22, (v25 & 8) == 0) /*0x34ee*/
|| (v16 = *(_DWORD *)(buf + 256)) == 0
|| (!v22 || v22 == v16) && (!v23 || v23 == *(_WORD *)(buf + 260)) )
{
if ( (v25 & 8) == 0 ) /*0x34f6*/
{
*(_BYTE *)(buf + 262) = 1; /*0x3627*/
if ( v12 ) /*0x3631*/
*(_WORD *)(buf + 182) = v12; /*0x3633*/
LABEL_38:
if ( v13 ) /*0x363c*/
*(_DWORD *)(buf + 252) = v13; /*0x3641*/
return IpGetInfo(buf, (unsigned __int16)v9 - 1); /*0x3641*/
}
*(_BYTE *)(buf + 262) = v24; /*0x3500*/
if ( *(_DWORD *)(buf + 256) ) /*0x3506*/
return IpGetInfo(buf, (unsigned __int16)v9 - 1); /*0x3656*/
if ( (_DWORD)v15 && v14 ) /*0x3520*/
{
*(_DWORD *)(buf + 256) = v15; /*0x3526*/
*(_WORD *)(buf + 260) = v14; /*0x352d*/
if ( !*(_QWORD *)(buf + 264) ) /*0x3535*/
{
v17 = DxeConfig_3( /*0x355a*/
*(_QWORD *)(*(_QWORD *)(buf + 104) + 64LL),
*(_QWORD *)(*(_QWORD *)(buf + 104) + 72LL),
Mtftp4SetupMulticastReceive,
v15,
buf);
*(_QWORD *)(buf + 264) = v17; /*0x355f*/
if ( v17 ) /*0x3569*/
{
if ( (*(__int64 (__fastcall **)(_QWORD, void *, _BYTE **, _QWORD, _QWORD, int))(BootServices + 280))( /*0x35a7*/
*(_QWORD *)(v17 + 56),
&unk_9620,
&a5,
*(_QWORD *)(*(_QWORD *)(buf + 104) + 72LL),
*(_QWORD *)(buf + 112),
8) < 0 )
{
DxeConfig_5(*(_QWORD *)(buf + 264)); /*0x35b0*/
*(_QWORD *)(buf + 264) = 0; /*0x35b5*/
return 0x8000000000000007uLL; /*0x35c6*/
}
}
}
v18 = *(_QWORD *)(buf + 264); /*0x35cb*/
if ( !v18 ) /*0x35d5*/
return 0x8000000000000007uLL; /*0x35d5*/
v19 = DxeConfig_10(v18, (__int64 (__fastcall *)())IpConfig_0, buf); /*0x35e6*/
if ( v19 < 0 ) /*0x35ec*/
{
Mtftp4SendError(buf, 2, "Failed to create socket to receive multicast packet"); /*0x35fd*/
return v19; /*0x3605*/
}
if ( *(_WORD *)bufa ) /*0x360f*/
*(_WORD *)(buf + 182) = *(_WORD *)bufa; /*0x3611*/
v13 = bufa[2]; /*0x3618*/
goto LABEL_38; /*0x361c*/
}
Illegal_multicast_setting = "Illegal multicast setting"; /*0x361e*/
goto LABEL_43; /*0x3625*/
}
}
}
}
if ( v11 != 0x8000000000000009uLL ) /*0x3665*/
{
Illegal_multicast_setting = "Mal-formated OACK packet"; /*0x3667*/
LABEL_43:
Mtftp4SendError(buf, 4, Illegal_multicast_setting); /*0x366e*/
}
return 0x8000000000000017uLL; /*0x3696*/
}
// Function: IpConfig_0 @ 0x36a0 (0x2a0 bytes)
void __fastcall IpConfig_0(_DWORD *a1, int *a2, __int64 a3, __int64 buf)
{
__int64 v8; // rdi
char v9; // r12
bool v10; // r15
int v11; // r13d
bool v12; // cf
__int64 v13; // rcx
__int16 v14; // ax
unsigned int n4; // ebp
char *dst; // rax
__int64 v17; // rdx
char *dst_1; // r14
__int64 v19; // r9
__int64 v20; // rdx
__int16 n5; // r15
__int64 (__fastcall *v22)(__int64, __int64, _QWORD, char *); // r10
__int64 v23; // rax
__int64 v24; // rcx
char v25; // [rsp+70h] [rbp+8h] BYREF
bool v26; // [rsp+80h] [rbp+18h]
int v27; // [rsp+88h] [rbp+20h]
if ( !buf || *(_DWORD *)buf != 1886676596 ) /*0x36cf*/
Assert_( /*0x36e4*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Rrq.c",
654,
(__int64)"((Instance) != ((void *) 0)) && ((Instance)->Signature == (((('t') | ('f' << 8)) | ((('t') | ('p' << 8)) << 16))))");
v25 = 0; /*0x36e9*/
v8 = 0; /*0x36ee*/
v9 = 0; /*0x36f1*/
v10 = 0; /*0x36f4*/
if ( a3 < 0 ) /*0x36fa*/
{
v8 = a3; /*0x36fc*/
goto LABEL_38; /*0x36ff*/
}
if ( !a1 ) /*0x3707*/
Assert_( /*0x371c*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Rrq.c",
666,
(__int64)"UdpPacket != ((void *) 0)");
v11 = *a2; /*0x3727*/
v27 = *(_DWORD *)(buf + 256); /*0x372d*/
v10 = v11 == v27; /*0x3734*/
v12 = a1[33] < 2u; /*0x3738*/
v26 = v11 == v27; /*0x373f*/
if ( !v12 ) /*0x3747*/
{
v13 = *((unsigned __int16 *)a2 + 18); /*0x374d*/
v14 = *(_WORD *)(buf + 214); /*0x3752*/
if ( (_WORD)v13 != v14 ) /*0x375c*/
{
if ( v14 ) /*0x3761*/
goto LABEL_38; /*0x3761*/
*(_WORD *)(buf + 214) = v13; /*0x3767*/
}
n4 = a1[33]; /*0x376e*/
if ( a1[32] <= 1u ) /*0x377f*/
{
dst_1 = (char *)DxeConfig_13(a1, 0, 0); /*0x37bc*/
if ( !dst_1 ) /*0x37c2*/
Assert_( /*0x37d7*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Rrq.c",
708,
(__int64)"Packet != ((void *) 0)");
}
else
{
dst = (char *)AllocatePool(v13, n4); /*0x3783*/
dst_1 = dst; /*0x3788*/
if ( !dst ) /*0x378e*/
{
v8 = 0x8000000000000009uLL; /*0x3790*/
goto LABEL_38; /*0x379a*/
}
DxeConfig_2(a1, v17, n4, dst); /*0x37a8*/
}
v20 = *(_QWORD *)(buf + 152); /*0x37dc*/
n5 = __ROL2__(*(_WORD *)dst_1, 8); /*0x37e7*/
v22 = *(__int64 (__fastcall **)(__int64, __int64, _QWORD, char *))(v20 + 80); /*0x37ec*/
if ( v22 ) /*0x37f3*/
{
if ( (unsigned __int16)(n5 - 5) <= 1u ) /*0x3801*/
{
v8 = v22(buf + 24, v20, (unsigned __int16)n4, dst_1); /*0x3811*/
if ( v8 < 0 ) /*0x3817*/
{
if ( n5 != 5 ) /*0x381e*/
Mtftp4SendError(buf, 8, "User aborted the transfer"); /*0x382f*/
v8 = 0x8000000000000015uLL; /*0x3834*/
goto LABEL_35; /*0x383e*/
}
}
}
if ( n5 == 3 ) /*0x3847*/
{
if ( n4 > (unsigned int)*(unsigned __int16 *)(buf + 182) + 4 || n4 < 4 ) /*0x3899*/
goto LABEL_35; /*0x3899*/
v23 = IpConfig_3(buf, dst_1, n4, v19, &v25); /*0x38ae*/
}
else
{
if ( n5 == 5 ) /*0x384c*/
{
v8 = 0x8000000000000017uLL; /*0x387c*/
LABEL_35:
if ( a1[32] > 1u ) /*0x38c6*/
AssertCpuDeadLoop_0(); /*0x38cb*/
v10 = v26; /*0x38d0*/
goto LABEL_38; /*0x38d0*/
}
if ( n5 != 6 || v11 == v27 || n4 <= 2 ) /*0x3860*/
goto LABEL_35; /*0x3860*/
v23 = IpConfig(buf, dst_1, n4, v19, &v25); /*0x3875*/
}
v9 = v25; /*0x38b3*/
v8 = v23; /*0x38b8*/
goto LABEL_35; /*0x38b8*/
}
LABEL_38:
if ( a1 ) /*0x38db*/
DxeConfig_14((__int64)a1); /*0x38e0*/
if ( v8 < 0 ) /*0x38e8*/
goto LABEL_48; /*0x38e8*/
if ( !v9 ) /*0x38ed*/
{
if ( v10 ) /*0x38fc*/
v24 = *(_QWORD *)(buf + 264); /*0x38fe*/
else
v24 = *(_QWORD *)(buf + 224); /*0x3907*/
v8 = DxeConfig_10(v24, (__int64 (__fastcall *)())IpConfig_0, buf); /*0x3913*/
}
if ( v8 < 0 || v9 ) /*0x391e*/
LABEL_48:
Mtftp4Cleanup(buf, v8); /*0x3926*/
}
// Function: IpConfig_2 @ 0x3940 (0x1c8 bytes)
unsigned __int64 __fastcall IpConfig_2(__int64 buf, unsigned __int16 n0xFFFF)
{
char *v4; // rax
__int64 v5; // r14
__int64 v7; // r15
__int64 v8; // rsi
unsigned __int16 count_3; // dx
__int64 v10; // r12
unsigned __int16 count_4; // ax
unsigned __int16 count_2; // cx
unsigned __int16 count_1; // ax
unsigned __int16 count; // [rsp+60h] [rbp+40h] BYREF
char *src; // [rsp+70h] [rbp+50h] BYREF
v4 = DxeConfig_12((unsigned int)*(unsigned __int16 *)(buf + 182) + 4); /*0x3967*/
v5 = (__int64)v4; /*0x396f*/
if ( !v4 ) /*0x3975*/
return 0x8000000000000009uLL; /*0x3981*/
v7 = DxeConfig_4((__int64)v4, 4u); /*0x3993*/
if ( !v7 ) /*0x3999*/
Assert_( /*0x39ac*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Wrq.c",
55,
(__int64)"Packet != ((void *) 0)");
*(_WORD *)v7 = 768; /*0x39b9*/
*(_WORD *)(v7 + 2) = __ROL2__(n0xFFFF, 8); /*0x39c1*/
v8 = *(_QWORD *)(buf + 152); /*0x39c6*/
count_3 = *(_WORD *)(buf + 182); /*0x39cd*/
count = count_3; /*0x39d4*/
if ( *(_QWORD *)(v8 + 64) ) /*0x39d8*/
{
v10 = count_3 * (__int64)(n0xFFFF - 1); /*0x39e9*/
if ( *(_QWORD *)(v8 + 56) < (unsigned __int64)count_3 + v10 ) /*0x39f5*/
{
count_4 = *(_WORD *)(v8 + 56) - v10; /*0x3a02*/
*(_WORD *)(buf + 184) = n0xFFFF; /*0x3a06*/
count = count_4; /*0x3a10*/
Assert_1((_QWORD *)(buf + 192), n0xFFFF); /*0x3a14*/
count_3 = count; /*0x3a19*/
}
if ( count_3 ) /*0x3a20*/
{
DxeConfig_4(v5, count_3); /*0x3a2c*/
MemConfig_0((char *)(v7 + 4), (char *)(v10 + *(_QWORD *)(v8 + 64)), count); /*0x3a41*/
}
return Mtftp4TransmitPacket(buf, v5); /*0x3ac5*/
}
src = 0; /*0x3a4c*/
if ( (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *, char **))(v8 + 96))(buf + 24, v8, &count, &src) >= 0 ) /*0x3a61*/
{
count_2 = *(_WORD *)(buf + 182); /*0x3a63*/
count_1 = count; /*0x3a6a*/
if ( count <= count_2 ) /*0x3a71*/
{
if ( count < count_2 ) /*0x3a73*/
{
*(_WORD *)(buf + 184) = n0xFFFF; /*0x3a7c*/
Assert_1((_QWORD *)(buf + 192), n0xFFFF); /*0x3a86*/
count_1 = count; /*0x3a8b*/
}
if ( count_1 ) /*0x3a92*/
{
DxeConfig_4(v5, count_1); /*0x3a9a*/
MemConfig_0((char *)(v7 + 4), src, count); /*0x3aac*/
AssertCpuDeadLoop_0(); /*0x3ab5*/
}
return Mtftp4TransmitPacket(buf, v5); /*0x3ab5*/
}
}
if ( src ) /*0x3ace*/
AssertCpuDeadLoop_0(); /*0x3ad0*/
Mtftp4SendError(buf, 8, "User aborted the transfer"); /*0x3ae4*/
return 0x8000000000000015uLL; /*0x3af8*/
}
// Function: IpConfig_4 @ 0x3b08 (0x10a bytes)
unsigned __int64 __fastcall IpConfig_4(__int64 buf, _WORD *dst, __int64 a3, char *a4)
{
__int16 v4; // si
char ***v5; // r14
unsigned __int16 n0xFFFF; // si
__int64 n0xFFFF_2; // rdi
__int16 n0xFFFF_1; // ax
__int64 v12; // [rsp+40h] [rbp+8h] BYREF
v4 = dst[1]; /*0x3b1b*/
v5 = (char ***)(buf + 192); /*0x3b1f*/
*a4 = 0; /*0x3b29*/
n0xFFFF = __ROL2__(v4, 8); /*0x3b30*/
if ( IsListEmpty((_QWORD *)(buf + 192)) ) /*0x3b37*/
{
n0xFFFF_2 = -1; /*0x3b40*/
}
else
{
n0xFFFF_2 = (__int64)(*v5)[2]; /*0x3b49*/
if ( n0xFFFF_2 >= 0 ) /*0x3b50*/
goto LABEL_5; /*0x3b50*/
}
Assert_( /*0x3b65*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Wrq.c",
154,
(__int64)"Expected >= 0");
LABEL_5:
if ( n0xFFFF_2 != n0xFFFF ) /*0x3b70*/
return 0; /*0x3b74*/
Mtftp4BlockRangeInsert(v5, n0xFFFF, *a4, &v12); /*0x3b87*/
if ( !IsListEmpty(v5) && (__int64)(*v5)[2] >= 0 ) /*0x3ba0*/
return IpConfig_2(buf, *((_WORD *)*v5 + 8)); /*0x3ba9*/
n0xFFFF_1 = *(_WORD *)(buf + 184); /*0x3bb0*/
if ( n0xFFFF_1 == n0xFFFF ) /*0x3bba*/
{
if ( !n0xFFFF_1 ) /*0x3bc0*/
Assert_( /*0x3bd5*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Wrq.c",
181,
(__int64)"Instance->LastBlock >= 1");
*a4 = 1; /*0x3bda*/
return 0; /*0x3bde*/
}
Mtftp4SendError(buf, 8, "Block number rolls back, not supported, try blksize option"); /*0x3bef*/
return 0x8000000000000017uLL; /*0x3c08*/
}
// Function: GetInfo @ 0x3c14 (0x125 bytes)
unsigned __int64 __fastcall GetInfo(__int64 buf, _WORD *dst, __int64 n2, char *a4)
{
__int64 v4; // rdi
unsigned int n2_1; // esi
__int64 v9; // r8
unsigned __int8 v10; // al
__int64 dst_1[2]; // [rsp+20h] [rbp-48h] BYREF
char bufa[16]; // [rsp+30h] [rbp-38h] BYREF
int v14; // [rsp+40h] [rbp-28h]
v4 = buf + 192; /*0x3c2c*/
*a4 = 0; /*0x3c3f*/
n2_1 = n2; /*0x3c42*/
if ( IsListEmpty((_QWORD *)(buf + 192)) || *(_QWORD *)(*(_QWORD *)v4 + 16LL) ) /*0x3c58*/
return 0; /*0x3d1d*/
MemGetInfo(bufa, 0x14u); /*0x3c6b*/
v9 = IpConfig_6(dst, n2_1, bufa); /*0x3c7f*/
if ( v9 < 0 /*0x3cb9*/
|| (~*(_DWORD *)(buf + 176) & v14) != 0
|| (v14 & 1) != 0 && *(_WORD *)bufa > *(_WORD *)(buf + 160)
|| (v10 = bufa[2], (v14 & 2) != 0) && bufa[2] != *(_BYTE *)(buf + 162) )
{
if ( v9 != 0x8000000000000009uLL ) /*0x3cfb*/
Mtftp4SendError(buf, 4, "Mal-formated OACK packet"); /*0x3d0c*/
return 0x8000000000000017uLL; /*0x3d11*/
}
else
{
if ( *(_WORD *)bufa ) /*0x3cbe*/
*(_WORD *)(buf + 182) = *(_WORD *)bufa; /*0x3cc0*/
if ( v10 ) /*0x3cc9*/
*(_DWORD *)(buf + 252) = v10; /*0x3cce*/
LODWORD(dst_1[0]) = 1024; /*0x3cd7*/
return IpConfig_4(buf, dst_1, v9, a4); /*0x3ce7*/
}
}
// Function: IpConfig_1 @ 0x3d3c (0x24e bytes)
void __fastcall IpConfig_1(_DWORD *a1, __int64 a2, __int64 Info, __int64 buf)
{
char v8; // r12
__int64 Info_1; // rbx
__int64 v10; // rcx
__int16 v11; // ax
unsigned int n4; // ebp
char *dst; // rax
__int64 v14; // rdx
_WORD *dst_1; // r14
__int64 v16; // r8
__int64 v17; // rdx
__int16 n5; // r15
__int64 (__fastcall *v19)(__int64, __int64, _QWORD, _WORD *); // r10
unsigned __int64 Info_2; // rax
char v21; // [rsp+50h] [rbp+8h] BYREF
if ( !buf || *(_DWORD *)buf != 1886676596 ) /*0x3d7a*/
Assert_( /*0x3d8b*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Wrq.c",
355,
(__int64)"((Instance) != ((void *) 0)) && ((Instance)->Signature == (((('t') | ('f' << 8)) | ((('t') | ('p' << 8)) << 16))))");
v21 = 0; /*0x3d90*/
v8 = 0; /*0x3d95*/
Info_1 = 0; /*0x3d98*/
if ( Info < 0 ) /*0x3d9e*/
{
Info_1 = Info; /*0x3da0*/
goto LABEL_35; /*0x3da3*/
}
if ( !a1 ) /*0x3dab*/
Assert_( /*0x3dbc*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Wrq.c",
366,
(__int64)"UdpPacket != ((void *) 0)");
if ( a1[33] >= 2u ) /*0x3dc8*/
{
v10 = *(unsigned __int16 *)(a2 + 36); /*0x3dce*/
v11 = *(_WORD *)(buf + 214); /*0x3dd3*/
if ( (_WORD)v10 != v11 ) /*0x3ddd*/
{
if ( v11 ) /*0x3de2*/
goto LABEL_35; /*0x3de2*/
*(_WORD *)(buf + 214) = v10; /*0x3de8*/
}
n4 = a1[33]; /*0x3def*/
if ( a1[32] <= 1u ) /*0x3e00*/
{
dst_1 = (_WORD *)DxeConfig_13(a1, 0, 0); /*0x3e3d*/
if ( !dst_1 ) /*0x3e43*/
Assert_( /*0x3e54*/
(__int64)"e:\\hs\\AmiNetworkPkg\\UefiNetworkStack\\Ipv4\\Mtftp4Dxe\\Mtftp4Wrq.c",
401,
(__int64)"Packet != ((void *) 0)");
}
else
{
dst = (char *)AllocatePool(v10, n4); /*0x3e04*/
dst_1 = dst; /*0x3e09*/
if ( !dst ) /*0x3e0f*/
{
Info_1 = 0x8000000000000009uLL; /*0x3e11*/
goto LABEL_35; /*0x3e1b*/
}
DxeConfig_2(a1, v14, n4, dst); /*0x3e29*/
}
v17 = *(_QWORD *)(buf + 152); /*0x3e59*/
n5 = __ROL2__(*dst_1, 8); /*0x3e64*/
v19 = *(__int64 (__fastcall **)(__int64, __int64, _QWORD, _WORD *))(v17 + 80); /*0x3e69*/
if ( v19 ) /*0x3e70*/
{
if ( (unsigned __int16)(n5 - 5) <= 1u ) /*0x3e7e*/
{
Info_1 = v19(buf + 24, v17, (unsigned __int16)n4, dst_1); /*0x3e8e*/
if ( Info_1 < 0 ) /*0x3e94*/
{
if ( n5 != 5 ) /*0x3e9b*/
Mtftp4SendError(buf, 8, "User aborted the transfer"); /*0x3eac*/
Info_1 = 0x8000000000000015uLL; /*0x3eb1*/
goto LABEL_33; /*0x3ebb*/
}
}
}
if ( n5 == 4 ) /*0x3ec4*/
{
if ( n4 != 4 ) /*0x3ef9*/
goto LABEL_33; /*0x3ef9*/
Info_2 = IpConfig_4(buf, dst_1, v16, &v21); /*0x3f06*/
}
else
{
if ( n5 == 5 ) /*0x3ec9*/
{
Info_1 = 0x8000000000000017uLL; /*0x3eea*/
goto LABEL_33; /*0x3ef4*/
}
if ( n5 != 6 || n4 <= 2 ) /*0x3ed3*/
{
LABEL_33:
if ( a1[32] > 1u ) /*0x3f1e*/
AssertCpuDeadLoop_0(); /*0x3f23*/
goto LABEL_35; /*0x3f23*/
}
Info_2 = GetInfo(buf, dst_1, n4, &v21); /*0x3ee3*/
}
v8 = v21; /*0x3f0b*/
Info_1 = Info_2; /*0x3f10*/
goto LABEL_33; /*0x3f10*/
}
LABEL_35:
if ( a1 ) /*0x3f2b*/
DxeConfig_14((__int64)a1); /*0x3f30*/
if ( Info_1 < 0 ) /*0x3f38*/
goto LABEL_42; /*0x3f38*/
if ( !v8 ) /*0x3f3d*/
Info_1 = DxeConfig_10(*(_QWORD *)(buf + 224), (__int64 (__fastcall *)())IpConfig_1, buf); /*0x3f55*/
if ( Info_1 < 0 || v8 ) /*0x3f60*/
LABEL_42:
Mtftp4Cleanup(buf, Info_1); /*0x3f68*/
}
// Function: IsListValid @ 0x3f8c (0x69 bytes)
char __fastcall IsListValid(_QWORD *a1)
{
if ( !a1 ) /*0x3f98*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\LinkedList.c", 80, (__int64)"List != ((void *) 0)"); /*0x3fab*/
if ( !*a1 ) /*0x3fb0*/
Assert_( /*0x3fc9*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\LinkedList.c",
81,
(__int64)"List->ForwardLink != ((void *) 0)");
if ( !a1[1] ) /*0x3fce*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\LinkedList.c", 82, (__int64)"List->BackLink != ((void *) 0)"); /*0x3fe8*/
return 1; /*0x3fef*/
}
// Function: InitializeListHead @ 0x3ff8 (0x36 bytes)
_QWORD *__fastcall InitializeListHead(_QWORD *a1)
{
if ( !a1 ) /*0x4004*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\LinkedList.c", 193, (__int64)"ListHead != ((void *) 0)"); /*0x4019*/
*a1 = a1; /*0x401e*/
a1[1] = a1; /*0x4024*/
return a1; /*0x4028*/
}
// Function: InsertHeadList @ 0x4030 (0x50 bytes)
__int64 *__fastcall InsertHeadList(__int64 *a1, __int64 *a2)
{
__int64 v4; // rax
if ( !IsListValid(a1) ) /*0x4040*/
Assert_( /*0x405c*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\LinkedList.c",
232,
(__int64)"InternalBaseLibIsListValid (ListHead)");
v4 = *a1; /*0x4061*/
*a2 = *a1; /*0x4064*/
a2[1] = (__int64)a1; /*0x4067*/
*(_QWORD *)(v4 + 8) = a2; /*0x406b*/
*a1 = (__int64)a2; /*0x4072*/
return a1; /*0x407a*/
}
// Function: InsertTailList @ 0x4080 (0x51 bytes)
_QWORD *__fastcall InsertTailList(_QWORD *a1, _QWORD *a2)
{
_QWORD *v4; // rax
if ( !IsListValid(a1) ) /*0x4090*/
Assert_( /*0x40ac*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\LinkedList.c",
273,
(__int64)"InternalBaseLibIsListValid (ListHead)");
*a2 = a1; /*0x40b1*/
v4 = (_QWORD *)a1[1]; /*0x40b4*/
a2[1] = v4; /*0x40b8*/
*v4 = a2; /*0x40bc*/
a1[1] = a2; /*0x40c2*/
return a1; /*0x40cb*/
}
// Function: IsListEmpty @ 0x40d4 (0x36 bytes)
bool __fastcall IsListEmpty(_QWORD *a1)
{
if ( !IsListValid(a1) ) /*0x40dd*/
Assert_( /*0x40f9*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\LinkedList.c",
416,
(__int64)"InternalBaseLibIsListValid (ListHead)");
return *a1 == (_QWORD)a1; /*0x4104*/
}
// Function: RemoveEntryList @ 0x410c (0x48 bytes)
__int64 __fastcall RemoveEntryList(_QWORD *a1)
{
if ( IsListEmpty(a1) ) /*0x4115*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\LinkedList.c", 600, (__int64)"!IsListEmpty (Entry)"); /*0x4131*/
*(_QWORD *)(*a1 + 8LL) = a1[1]; /*0x413d*/
*(_QWORD *)a1[1] = *a1; /*0x4148*/
return *a1; /*0x414e*/
}
// Function: StrLen @ 0x4154 (0x93 bytes)
unsigned __int64 __fastcall StrLen(_WORD *src)
{
_WORD *src_1; // rbx
unsigned __int64 n0xF4240; // rdi
src_1 = src; /*0x4165*/
if ( !src ) /*0x416b*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 172, (__int64)"String != ((void *) 0)"); /*0x4180*/
if ( ((unsigned __int8)src_1 & 1) != 0 ) /*0x4188*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 173, (__int64)"((UINTN) String & 0x00000001) == 0"); /*0x419d*/
n0xF4240 = 0; /*0x41a2*/
while ( *src_1 ) /*0x41d2*/
{
if ( n0xF4240 >= 0xF4240 ) /*0x41ae*/
Assert_( /*0x41c3*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c",
181,
(__int64)"Length < _gPcd_FixedAtBuild_PcdMaximumUnicodeStringLength");
++src_1; /*0x41c8*/
++n0xF4240; /*0x41cc*/
}
return n0xF4240; /*0x41e1*/
}
// Function: AsciiStrLen @ 0x41e8 (0x6b bytes)
unsigned __int64 __fastcall AsciiStrLen(_BYTE *a1)
{
_BYTE *v1; // rbx
unsigned __int64 i; // rdi
v1 = a1; /*0x41f2*/
if ( !a1 ) /*0x41f8*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 1082, (__int64)"String != ((void *) 0)"); /*0x420d*/
for ( i = 0; *v1; ++i ) /*0x4214*/
{
if ( i >= 0xF4240 ) /*0x4220*/
Assert_( /*0x4235*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c",
1090,
(__int64)"Length < _gPcd_FixedAtBuild_PcdMaximumAsciiStringLength");
++v1; /*0x423a*/
}
return i; /*0x424d*/
}
// Function: AsciiStrnCmp @ 0x4254 (0xc9 bytes)
__int64 __fastcall AsciiStrnCmp(_BYTE *src, _BYTE *a2, unsigned __int64 n0xF4240)
{
unsigned __int64 n0xF4240_1; // rdi
_BYTE *src_1; // rbx
n0xF4240_1 = n0xF4240; /*0x4263*/
src_1 = src; /*0x4269*/
if ( !n0xF4240 ) /*0x426f*/
return 0; /*0x4271*/
if ( AsciiStrLen(src) == -1 ) /*0x4281*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 1320, (__int64)"AsciiStrSize (FirstString)"); /*0x4296*/
if ( AsciiStrLen(a2) == -1 ) /*0x42a7*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 1321, (__int64)"AsciiStrSize (SecondString)"); /*0x42bc*/
if ( n0xF4240_1 > 0xF4240 ) /*0x42c8*/
Assert_( /*0x42dd*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c",
1324,
(__int64)"Length <= _gPcd_FixedAtBuild_PcdMaximumAsciiStringLength");
while ( *src_1 && *a2 && *src_1 == *a2 && n0xF4240_1 > 1 ) /*0x42f1*/
{
++src_1; /*0x42f3*/
++a2; /*0x42f6*/
--n0xF4240_1; /*0x42f9*/
}
return (char)*src_1 - (char)*a2; /*0x4317*/
}
// Function: StrnLenS @ 0x4320 (0x56 bytes)
unsigned __int64 __fastcall StrnLenS(_WORD *octet)
{
unsigned __int64 n0xF4240; // rax
if ( ((unsigned __int8)octet & 1) != 0 ) /*0x432c*/
Assert_( /*0x4341*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\SafeString.c",
128,
(__int64)"((UINTN) String & 0x00000001) == 0");
if ( !octet ) /*0x434b*/
return 0; /*0x436e*/
n0xF4240 = 0; /*0x434d*/
if ( *octet ) /*0x434f*/
{
while ( n0xF4240 < 0xF4240 ) /*0x435a*/
{
if ( !octet[++n0xF4240] ) /*0x435f*/
return n0xF4240; /*0x4363*/
}
return 1000001; /*0x4367*/
}
return n0xF4240; /*0x4370*/
}
// Function: AsciiStrnLenS @ 0x4378 (0x2a bytes)
unsigned __int64 __fastcall AsciiStrnLenS(_BYTE *octet, unsigned __int64 n0xF4240)
{
unsigned __int64 result; // rax
if ( !octet || !n0xF4240 ) /*0x4380*/
return 0; /*0x439f*/
result = 0; /*0x4382*/
if ( *octet ) /*0x4384*/
{
while ( result < n0xF4240 - 1 ) /*0x438f*/
{
if ( !octet[++result] ) /*0x4394*/
return result; /*0x4398*/
}
return n0xF4240; /*0x439b*/
}
return result; /*0x439a*/
}
// Function: AsciiStrCpyS @ 0x43a4 (0x14b bytes)
__int64 __fastcall AsciiStrCpyS(unsigned __int64 octet, unsigned __int64 n0xF4240, char *octet_2)
{
unsigned __int64 octet_1; // rbx
const char *(Destination____((void__)_0)); // r8
__int64 n1820; // rdx
unsigned __int64 n0xF4240_1; // rax
__int64 v10; // rdx
unsigned __int64 n0xF4240_2; // rbp
char v12; // al
char *v13; // rdi
octet_1 = octet; /*0x43be*/
if ( !octet ) /*0x43c4*/
{
(Destination____((void__)_0)) = "(Destination != ((void *) 0))"; /*0x43c6*/
n1820 = 1820; /*0x43cd*/
LABEL_3:
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\SafeString.c", n1820, (__int64)(Destination____((void__)_0))); /*0x43d2*/
return 0x8000000000000002uLL; /*0x43e8*/
}
if ( !octet_2 ) /*0x43f0*/
{
(Destination____((void__)_0)) = "(Source != ((void *) 0))"; /*0x43f2*/
n1820 = 1821; /*0x43f9*/
goto LABEL_3; /*0x43fe*/
}
if ( n0xF4240 > 0xF4240 ) /*0x4407*/
{
(Destination____((void__)_0)) = "(DestMax <= (_gPcd_FixedAtBuild_PcdMaximumAsciiStringLength))"; /*0x4409*/
n1820 = 1827; /*0x4410*/
goto LABEL_3; /*0x4415*/
}
if ( !n0xF4240 ) /*0x441a*/
{
(Destination____((void__)_0)) = "(DestMax != 0)"; /*0x441c*/
n1820 = 1833; /*0x4423*/
goto LABEL_3; /*0x4428*/
}
n0xF4240_1 = AsciiStrnLenS(octet_2, n0xF4240); /*0x442d*/
n0xF4240_2 = n0xF4240_1; /*0x4432*/
if ( n0xF4240 <= n0xF4240_1 ) /*0x4438*/
{
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\SafeString.c", 1839, (__int64)"(DestMax > SourceLen)"); /*0x444d*/
return 0x8000000000000005uLL; /*0x445c*/
}
if ( (unsigned __int64)octet_2 > octet_1 ) /*0x4461*/
goto LABEL_15; /*0x4461*/
if ( octet_1 >= (unsigned __int64)&octet_2[n0xF4240_1 + 1] ) /*0x446d*/
{
if ( octet_1 > (unsigned __int64)octet_2 ) /*0x4472*/
goto LABEL_18; /*0x4472*/
LABEL_15:
if ( (unsigned __int64)octet_2 >= octet_1 + v10 ) /*0x447b*/
goto LABEL_17; /*0x447b*/
}
Assert_( /*0x447d*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\SafeString.c",
1844,
(__int64)"InternalSafeStringNoAsciiStrOverlap (Destination, DestMax, (CHAR8 *)Source, SourceLen + 1)");
LABEL_17:
if ( (unsigned __int64)octet_2 > octet_1 ) /*0x4498*/
{
LABEL_20:
if ( (unsigned __int64)octet_2 < octet_1 + n0xF4240 ) /*0x44b2*/
return 0x800000000000000FuLL; /*0x44b2*/
goto LABEL_22; /*0x44b2*/
}
LABEL_18:
if ( octet_1 < (unsigned __int64)&octet_2[n0xF4240_2 + 1] ) /*0x44a4*/
return 0x800000000000000FuLL; /*0x44be*/
if ( (unsigned __int64)octet_2 >= octet_1 ) /*0x44a9*/
goto LABEL_20; /*0x44a9*/
LABEL_22:
v12 = *octet_2; /*0x44c0*/
if ( *octet_2 ) /*0x44c0*/
{
v13 = &octet_2[-octet_1]; /*0x44c6*/
do /*0x44d3*/
{
*(_BYTE *)octet_1++ = v12; /*0x44c9*/
v12 = v13[octet_1]; /*0x44ce*/
}
while ( v12 ); /*0x44d3*/
}
*(_BYTE *)octet_1 = 0; /*0x44d5*/
return 0; /*0x44e9*/
}
// Function: MemConfig_0 @ 0x44f0 (0x99 bytes)
char *__fastcall MemConfig_0(char *dst, char *src, unsigned __int64 count)
{
char *dst_1; // rax
unsigned __int64 v7; // rbp
dst_1 = dst; /*0x450d*/
if ( count ) /*0x4513*/
{
v7 = count - 1; /*0x4515*/
if ( count - 1 > ~(unsigned __int64)dst ) /*0x451f*/
Assert_( /*0x4534*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
56,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)");
if ( v7 > ~(unsigned __int64)src ) /*0x4542*/
Assert_( /*0x4557*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
57,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)");
if ( dst == src ) /*0x455f*/
return dst; /*0x4561*/
else
return CopyMem(dst, src, count); /*0x456f*/
}
return dst_1; /*0x4583*/
}
// Function: MemGetInfo @ 0x458c (0x63 bytes)
char *__fastcall sub_458C(char *buf, unsigned __int64 a2)
{
if ( !buf ) /*0x459f*/
Assert_( /*0x45b2*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
53,
(__int64)"Buffer != ((void *) 0)");
if ( a2 > -(__int64)buf ) /*0x45c0*/
Assert_( /*0x45d5*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
54,
(__int64)"Length <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer + 1)");
return ZeroMem(buf, a2); /*0x45e5*/
}
// Function: MemConfig @ 0x45f0 (0xbc bytes)
unsigned __int64 __fastcall sub_45F0(_QWORD *a1, __int64 n4)
{
if ( &unk_9778 == a1 ) /*0x4619*/
return 0; /*0x461b*/
if ( !a1 ) /*0x4622*/
Assert_( /*0x4635*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
61,
(__int64)"SourceBuffer != ((void *) 0)");
if ( n4 - 1 > (unsigned __int64)(-1LL - (_QWORD)&unk_9778) ) /*0x464b*/
Assert_( /*0x465e*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
62,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)");
if ( n4 - 1 > (unsigned __int64)(-1LL - (_QWORD)a1) ) /*0x4669*/
Assert_( /*0x467e*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
63,
(__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)");
return CompareMem(&unk_9778, a1, n4); /*0x46a5*/
}
// Function: CompareGuid @ 0x46ac (0x6e bytes)
bool __fastcall CompareGuid(__int64 a1, __int64 a2)
{
__int64 v3; // rdi
__int64 v4; // rbx
__int64 v5; // rbp
__int64 v6; // rax
v3 = ReadUnaligned64((__int64)&unk_95F0); /*0x46d2*/
v4 = ReadUnaligned64(a2); /*0x46e1*/
v5 = ReadUnaligned64((__int64)&unk_95F8); /*0x46ed*/
v6 = ReadUnaligned64(a2 + 8); /*0x46f0*/
return v3 == v4 && v5 == v6; /*0x4714*/
}
// Function: GetDebugOutput @ 0x471c (0x7f bytes)
__int64 GetDebugOutput()
{
__int64 result; // rax
unsigned __int64 n0x10; // rbx
__int64 v2; // rax
__int64 v3; // rcx
result = qword_9768; /*0x4726*/
if ( !qword_9768 ) /*0x4732*/
{
n0x10 = (*(__int64 (__fastcall **)(__int64))(BootServices + 24))(31); /*0x474b*/
(*(void (__fastcall **)(unsigned __int64))(BootServices + 32))(n0x10); /*0x474e*/
if ( n0x10 <= 0x10 ) /*0x4755*/
{
v2 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_9590, 0, &qword_9768); /*0x4772*/
v3 = qword_9768; /*0x4778*/
if ( v2 < 0 ) /*0x4782*/
v3 = 0; /*0x4782*/
qword_9768 = v3; /*0x4786*/
return v3; /*0x478d*/
}
else
{
return 0; /*0x4757*/
}
}
return result; /*0x4795*/
}
// Function: DebugPrint @ 0x479c (0x88 bytes)
char DebugPrint(__int64 a1, __int64 a2, ...)
{
__int64 v3; // rax
__int64 v4; // r8
char (__fastcall **v5)(__int64, __int64, __int64 *); // r9
unsigned __int8 v6; // al
char n3_1; // al
char n3; // cl
va_list va; // [rsp+40h] [rbp+18h] BYREF
va_start(va, a2);
v3 = GetDebugOutput(); /*0x47b3*/
v4 = 0; /*0x47b8*/
v5 = (char (__fastcall **)(__int64, __int64, __int64 *))v3; /*0x47bb*/
if ( v3 ) /*0x47c1*/
{
v6 = __inbyte(0x70u); /*0x47c7*/
__outbyte(0x70u, v6 & 0x80 | 0x4B); /*0x47cc*/
n3_1 = __inbyte(0x71u); /*0x47d1*/
n3 = n3_1; /*0x47d2*/
if ( (unsigned __int8)n3_1 > 3u ) /*0x47d8*/
{
n3 = n3; /*0x47da*/
if ( !n3 ) /*0x47e2*/
n3 = MEMORY[0xFDAF0490] & 2 | 1; /*0x47ee*/
}
LOBYTE(v3) = n3 - 1; /*0x47f2*/
if ( (unsigned __int8)(n3 - 1) <= 0xFDu ) /*0x47f6*/
{
LOBYTE(v3) = 4; /*0x47fa*/
v4 = 2147483718LL; /*0x47ff*/
if ( n3 == 1 ) /*0x4805*/
v4 = 2147483652LL; /*0x4805*/
}
if ( (v4 & a1) != 0 ) /*0x480c*/
LOBYTE(v3) = (*v5)(a1, a2, (__int64 *)va); /*0x481b*/
}
return v3; /*0x481e*/
}
// Function: Assert_ @ 0x4824 (0x3e bytes)
__int64 __fastcall Assert_(__int64 a1, __int64 a2, __int64 a3)
{
__int64 result; // rax
result = GetDebugOutput(); /*0x483c*/
if ( result ) /*0x4844*/
return (*(__int64 (__fastcall **)(__int64, __int64, __int64))(result + 8))(a1, a2, a3); /*0x484f*/
return result; /*0x485c*/
}
// Function: IpGetInfo_0 @ 0x4864 (0x8b bytes)
unsigned __int64 __fastcall IpGetInfo_0(
unsigned __int64 _r_n,
unsigned __int64 n160,
unsigned __int8 *MTFTPv4_(ServerIp_%d.%d.%d.%d__ServerPort_%d),
unsigned __int16 *va)
{
if ( (_r_n & 1) != 0 ) /*0x4887*/
Assert_( /*0x489c*/
(__int64)"e:\\hs\\MdePkg\\Library\\BasePrintLib\\PrintLib.c",
77,
(__int64)"(((UINTN) (StartOfBuffer)) & 0x01) == 0");
if ( ((unsigned __int8)MTFTPv4_(ServerIp_%d.%d.%d.%d__ServerPort_%d) & 1) != 0 ) /*0x48a4*/
Assert_( /*0x48b9*/
(__int64)"e:\\hs\\MdePkg\\Library\\BasePrintLib\\PrintLib.c",
78,
(__int64)"(((UINTN) (FormatString)) & 0x01) == 0");
return SPrint(_r_n, n160 >> 1, 320, MTFTPv4_(ServerIp_%d.%d.%d.%d__ServerPort_%d), va); /*0x48e9*/
}
// Function: UnicodeSPrint @ 0x48f0 (0x1d bytes)
unsigned __int64 UnicodeSPrint(
unsigned __int64 _r_n,
unsigned __int64 n160,
unsigned __int8 *MTFTPv4_(ServerIp_%d.%d.%d.%d__ServerPort_%d),
...)
{
va_list va; // [rsp+48h] [rbp+20h] BYREF
va_start(va, MTFTPv4_(ServerIp_%d.%d.%d.%d__ServerPort_%d));
return IpGetInfo_0(_r_n, n160, MTFTPv4_(ServerIp_%d.%d.%d.%d__ServerPort_%d), (unsigned __int16 *)va); /*0x4908*/
}
// Function: PadBuffer @ 0x4910 (0x33 bytes)
_BYTE *__fastcall PadBuffer(_BYTE *_r_n, unsigned __int64 _r_n_1, __int64 i, __int16 n32, __int64 n2)
{
__int64 j; // r10
for ( j = 0; j < i; ++j ) /*0x4916*/
{
if ( (unsigned __int64)_r_n >= _r_n_1 ) /*0x491b*/
break; /*0x491b*/
*_r_n = n32; /*0x4923*/
if ( n2 != 1 ) /*0x4926*/
_r_n[1] = HIBYTE(n32); /*0x492f*/
_r_n += n2; /*0x4932*/
}
return _r_n; /*0x4942*/
}
// Function: ValueToString @ 0x4944 (0x76 bytes)
_BYTE *__fastcall ValueToString(_BYTE *_r_n, unsigned __int64 a2, __int64 n16)
{
int n16_1; // edi
unsigned __int64 n16_2; // rbp
_BYTE *_r_n_1; // rbx
unsigned __int64 v7; // rtt
n16_1 = n16; /*0x4958*/
*_r_n = 0; /*0x495b*/
n16_2 = (unsigned int)n16; /*0x4961*/
_r_n_1 = _r_n; /*0x4964*/
do /*0x49a0*/
{
if ( !n16_1 ) /*0x4969*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\DivU64x32Remainder.c", 47, (__int64)"Divisor != 0"); /*0x497c*/
++_r_n_1; /*0x498d*/
v7 = a2; /*0x4990*/
a2 /= n16_2; /*0x4993*/
*_r_n_1 = a0123456789abcd[(unsigned int)(v7 % n16_2)]; /*0x499b*/
}
while ( a2 ); /*0x49a0*/
return _r_n_1; /*0x49b4*/
}
// Function: SPrint @ 0x49bc (0xe13 bytes)
unsigned __int64 __fastcall SPrint(
unsigned __int64 _r_n,
unsigned __int64 n0xF4240,
__int16 n320,
unsigned __int8 *octet,
unsigned __int16 *va)
{
unsigned __int8 *octet_2; // r13
__int64 v6; // r14
unsigned __int64 _r_n_1; // r15
__int64 v9; // rdi
const char *(Buffer____((void__)_0)); // r8
__int64 n578; // rdx
__int64 n2_2; // r9
__int64 n0xFFFF; // rdx
unsigned __int64 _r_n_12; // rbx
unsigned __int64 v16; // r10
int v17; // eax
bool v18; // zf
unsigned __int64 n10; // rcx
unsigned __int8 *octet_3; // rdx
unsigned __int8 *octet_4; // r8
unsigned __int64 v22; // r10
char n43; // di
char v24; // r11
unsigned __int64 v25; // rsi
const char *_r_n_3; // rbx
unsigned __int16 *va_1; // r9
unsigned __int8 *octet_5; // rdx
int v29; // eax
unsigned __int64 n13_1; // rcx
const char *v31; // rax
int v32; // eax
unsigned __int8 *octet_6; // rdx
unsigned __int64 v34; // rcx
unsigned __int64 v35; ... [29173 chars total]
// Function: UnicodeVSPrint @ 0x57d0 (0x22 bytes)
unsigned __int64 UnicodeVSPrint(_BYTE *_r_n, unsigned __int64 n38, __int16 n320, char *%02d_%02d_%04d__%02d:%02d, ...)
{
va_list va; // [rsp+60h] [rbp+28h] BYREF
va_start(va, %02d_%02d_%04d__%02d:%02d);
return SPrint( /*0x57ed*/
(unsigned __int64)_r_n,
n38,
n320,
(unsigned __int8 *)%02d_%02d_%04d__%02d:%02d,
(unsigned __int16 *)va);
}
// Function: AllocatePool @ 0x57f4 (0x2e bytes)
__int64 __fastcall AllocatePool(__int64 a1, __int64 a2)
{
__int64 v2; // rax
__int64 v3; // rcx
__int64 v5; // [rsp+40h] [rbp+18h] BYREF
v2 = (*(__int64 (__fastcall **)(__int64, __int64, __int64 *))(BootServices + 64))(4, a2, &v5); /*0x5809*/
v3 = v5; /*0x580c*/
if ( v2 < 0 ) /*0x5816*/
return 0; /*0x5816*/
return v3; /*0x581d*/
}
// Function: GetInfo_0 @ 0x5824 (0x2c bytes)
char *__fastcall GetInfo_0(unsigned __int64 n48)
{
char *buf; // rax
buf = (char *)AllocatePool(n48, n48); /*0x5830*/
if ( buf ) /*0x5838*/
{
if ( n48 ) /*0x583d*/
return MemGetInfo(buf, n48); /*0x5845*/
}
return buf; /*0x584a*/
}
// Function: MemConfig_1 @ 0x5850 (0x76 bytes)
char *__fastcall MemConfig_1(__int64 a1, unsigned __int64 count, char *src)
{
char *dst; // rax
if ( !src ) /*0x5863*/
Assert_( /*0x5878*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiMemoryAllocationLib\\MemoryAllocationLib.c",
569,
(__int64)"Buffer != ((void *) 0)");
if ( count > -(__int64)src ) /*0x5886*/
Assert_( /*0x589b*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiMemoryAllocationLib\\MemoryAllocationLib.c",
570,
(__int64)"AllocationSize <= (0xFFFFFFFFFFFFFFFFULL - (UINTN) Buffer + 1)");
dst = (char *)AllocatePool(a1, count); /*0x58a3*/
if ( dst ) /*0x58ab*/
return MemConfig_0(dst, src, count); /*0x58b6*/
return dst; /*0x58c0*/
}
// Function: AssertCpuDeadLoop_0 @ 0x58c8 (0x44 bytes)
__int64 sub_58C8()
{
__int64 result; // rax
result = (*(__int64 (**)(void))(BootServices + 72))(); /*0x58d3*/
if ( result < 0 ) /*0x58d9*/
{
DebugPrint(0x80000000LL, (__int64)"\nASSERT_EFI_ERROR (Status = %r)\n", result); /*0x58ea*/
return Assert_( /*0x5902*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiMemoryAllocationLib\\MemoryAllocationLib.c",
819,
(__int64)"!EFI_ERROR (Status)");
}
return result; /*0x5907*/
}
// Function: CompareMem3Bytes @ 0x590c (0x65 bytes)
bool __fastcall CompareMem3Bytes(_DWORD *src, _DWORD *a2)
{
int v4; // ebx
if ( !src ) /*0x591f*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 89, (__int64)"Buffer != ((void *) 0)"); /*0x5932*/
v4 = *src & 0xFFFFFF; /*0x5939*/
if ( !a2 ) /*0x5942*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 89, (__int64)"Buffer != ((void *) 0)"); /*0x5955*/
return v4 == (*a2 & 0xFFFFFF); /*0x596b*/
}
// Function: GetHobList @ 0x5974 (0x77 bytes)
unsigned __int64 __fastcall GetHobList(__int64 a1)
{
__int64 SystemTable; // rdi
__int64 v2; // rbx
__int64 i; // rsi
SystemTable = SystemTable; /*0x5983*/
v2 = 0; /*0x598a*/
qword_9770 = 0; /*0x598c*/
if ( !*(_QWORD *)(SystemTable + 104) ) /*0x5994*/
return 0x800000000000000EuLL; /*0x59b9*/
for ( i = 0; !CompareGuid(a1, i + *(_QWORD *)(SystemTable + 112)); i += 24 ) /*0x599a*/
{
if ( (unsigned __int64)++v2 >= *(_QWORD *)(SystemTable + 104) ) /*0x59b7*/
return 0x800000000000000EuLL; /*0x59b7*/
}
qword_9770 = *(_QWORD *)(*(_QWORD *)(SystemTable + 112) + 24 * v2 + 16); /*0x59e2*/
return 0; /*0x59cd*/
}
// Function: Mtftp4ConfigStringLookup @ 0x59ec (0x144 bytes)
unsigned __int64 __fastcall Mtftp4ConfigStringLookup(_BYTE *src, _BYTE *src_4, char *a3, _QWORD *a4, char a5)
{
char *v6; // rsi
_DWORD *src_1; // rbx
char i; // al
unsigned __int64 n0xF4240_1; // rdi
char n59_2; // al
unsigned __int64 n0xF4240; // rdi
char n59; // al
_BYTE *src_2; // rbx
char n59_1; // al
_BYTE *src_3; // rcx
v6 = a3; /*0x5a08*/
src_1 = src_4; /*0x5a0b*/
if ( !src || !a4 ) /*0x5a1d*/
return 0x8000000000000002uLL; /*0x5b0b*/
if ( src_4 && a3 ) /*0x5a2f*/
{
for ( i = *src_4; i; i = *(_BYTE *)src_1 ) /*0x5a35*/
{
if ( a5 ) /*0x5a44*/
{
if ( CompareMem3Bytes(src, src_1) ) /*0x5a4c*/
goto LABEL_31; /*0x5a53*/
src_1 = (_DWORD *)((char *)src_1 + 3); /*0x5a59*/
}
else
{
n0xF4240_1 = 0; /*0x5a5f*/
while ( i && i != 59 ) /*0x5a65*/
i = *((_BYTE *)src_1 + ++n0xF4240_1); /*0x5a6a*/
if ( !AsciiStrnCmp(src_1, src, n0xF4240_1) && !src[n0xF4240_1] ) /*0x5a87*/
{
LABEL_31:
src_2 = *(_BYTE **)v6; /*0x5aec*/
if ( !*(_QWORD *)v6 ) /*0x5aec*/
return 0x8000000000000003uLL; /*0x5af2*/
while ( 1 ) /*0x5ae2*/
{
n59 = *src_2; /*0x5ae2*/
if ( !*src_2 ) /*0x5ae2*/
{
v6 += 16; /*0x5ae8*/
goto LABEL_31; /*0x5ae8*/
}
n0xF4240 = 0; /*0x5aa3*/
while ( n59 && n59 != 59 ) /*0x5aa9*/
n59 = src_2[++n0xF4240]; /*0x5aae*/
if ( !AsciiStrnCmp(src_2, src, n0xF4240) ) /*0x5abe*/
break; /*0x5abe*/
src_2 += n0xF4240; /*0x5ac8*/
if ( *src_2 ) /*0x5acb*/
{
n59_1 = *src_2; /*0x5ad0*/
src_3 = src_2; /*0x5ad2*/
do /*0x5adc*/
{
if ( n59_1 != 59 ) /*0x5ad7*/
break; /*0x5ad7*/
n59_1 = *++src_3; /*0x5adc*/
}
while ( *src_3 ); /*0x5adc*/
}
}
*a4 = *((_QWORD *)v6 + 1); /*0x5b04*/
return 0; /*0x5b09*/
}
src_1 = (_DWORD *)((char *)src_1 + n0xF4240_1); /*0x5a89*/
n59_2 = *(_BYTE *)src_1; /*0x5a8c*/
if ( !*(_BYTE *)src_1 ) /*0x5a90*/
return 0x8000000000000003uLL; /*0x5a90*/
do /*0x5a99*/
{
if ( n59_2 != 59 ) /*0x5a94*/
break; /*0x5a94*/
src_1 = (_DWORD *)((char *)src_1 + 1); /*0x5a96*/
n59_2 = *(_BYTE *)src_1; /*0x5a99*/
}
while ( *(_BYTE *)src_1 ); /*0x5a99*/
}
}
}
return 0x8000000000000003uLL; /*0x5b29*/
}
// Function: Assert @ 0x5b30 (0x1ff bytes)
unsigned __int64 __fastcall Assert(char *src, _BYTE *src_6, char *src_3, char a4)
{
_DWORD *src_1; // rbx
char i; // al
__int64 v10; // rcx
unsigned __int64 n0xF4240; // rdi
char n59; // al
char *src_2; // rsi
__int64 v14; // rdi
char *dst; // rax
char *src_4; // rbx
unsigned __int64 n0xF4240_1; // rbp
char n59_1; // al
char *src_5; // rbx
char n59_2; // al
unsigned __int64 v21; // rax
__int64 v22; // rcx
char *v23; // rax
__int64 v24; // rdi
unsigned __int64 v25; // rax
__int64 v26; // rcx
char *v27; // rax
src_1 = src_6; /*0x5b4f*/
if ( !src_3 ) /*0x5b58*/
return 0x8000000000000002uLL; /*0x5b58*/
if ( !src_6 ) /*0x5b61*/
return 0x8000000000000003uLL; /*0x5b6d*/
if ( !*(_WORD *)src_3 ) /*0x5b72*/
return 0x8000000000000002uLL; /*0x5d0e*/
for ( i = *src_6; ; i = *(_BYTE *)src_1 ) /*0x5b7c*/
{
if ( !i ) /*0x5bda*/
return 0x8000000000000003uLL; /*0x5bda*/
if ( !a4 ) /*0x5b83*/
break; /*0x5b83*/
if ( CompareMem3Bytes(src, src_1) ) /*0x5b8b*/
goto LABEL_20; /*0x5b92*/
src_1 = (_DWORD *)((char *)src_1 + 3); /*0x5b94*/
LABEL_17:
; /*0x5bd6*/
}
n0xF4240 = 0; /*0x5b9a*/
while ( i && i != 59 ) /*0x5ba1*/
i = *((_BYTE *)src_1 + ++n0xF4240); /*0x5ba6*/
if ( AsciiStrnCmp(src_1, src, n0xF4240) ) /*0x5bb6*/
{
src_1 = (_DWORD *)((char *)src_1 + n0xF4240); /*0x5bc0*/
n59 = *(_BYTE *)src_1; /*0x5bc3*/
if ( !*(_BYTE *)src_1 ) /*0x5bc7*/
return 0x8000000000000003uLL; /*0x5bc7*/
do /*0x5bd0*/
{
if ( n59 != 59 ) /*0x5bcb*/
break; /*0x5bcb*/
src_1 = (_DWORD *)((char *)src_1 + 1); /*0x5bcd*/
n59 = *(_BYTE *)src_1; /*0x5bd0*/
}
while ( *(_BYTE *)src_1 ); /*0x5bd0*/
goto LABEL_17; /*0x5bd4*/
}
LABEL_20:
src_2 = src_0; /*0x5bde*/
v14 = 0; /*0x5be5*/
if ( !src_0 ) /*0x5beb*/
goto LABEL_21; /*0x5beb*/
LABEL_33:
src_5 = *(char **)src_2; /*0x5c5a*/
if ( !*(_QWORD *)src_2 ) /*0x5c60*/
{
LABEL_21:
dst = (char *)AllocatePool(v10, 16 * (v14 + 2)); /*0x5bed*/
src_4 = dst; /*0x5bfa*/
if ( dst ) /*0x5c00*/
{
if ( src_0 ) /*0x5c7d*/
MemConfig_0(dst, src_0, 16 * v14); /*0x5c89*/
v21 = AsciiStrLen(src); /*0x5c91*/
v23 = MemConfig_1(v22, v21 + 1, src); /*0x5c9d*/
v24 = 2 * v14; /*0x5ca2*/
*(_QWORD *)&src_4[8 * v24] = v23; /*0x5ca5*/
if ( v23 ) /*0x5cac*/
{
v25 = StrLen(src_3); /*0x5cbe*/
v27 = MemConfig_1(v26, 2 * v25 + 2, src_3); /*0x5cce*/
*(_QWORD *)&src_4[8 * v24 + 8] = v27; /*0x5cd3*/
if ( v27 ) /*0x5cdb*/
{
*(_QWORD *)&src_4[8 * v24 + 16] = 0; /*0x5ce8*/
*(_QWORD *)&src_4[8 * v24 + 24] = 0; /*0x5ced*/
if ( src_0 ) /*0x5cfc*/
AssertCpuDeadLoop_0(); /*0x5cfe*/
src_0 = src_4; /*0x5d03*/
return 0; /*0x5d0c*/
}
AssertCpuDeadLoop_0(); /*0x5ce1*/
}
AssertCpuDeadLoop_0(); /*0x5cb1*/
}
return 0x8000000000000009uLL; /*0x5c0c*/
}
while ( 1 ) /*0x5c4d*/
{
n59_1 = *src_5; /*0x5c4d*/
if ( !*src_5 ) /*0x5c4d*/
{
LABEL_32:
src_2 += 16; /*0x5c53*/
++v14; /*0x5c57*/
goto LABEL_33; /*0x5c57*/
}
n0xF4240_1 = 0; /*0x5c11*/
while ( n59_1 && n59_1 != 59 ) /*0x5c18*/
n59_1 = src_5[++n0xF4240_1]; /*0x5c1d*/
if ( !AsciiStrnCmp(src, src_5, n0xF4240_1) ) /*0x5c2d*/
return 0x8000000000000014uLL; /*0x5d22*/
src_5 += n0xF4240_1; /*0x5c37*/
n59_2 = *src_5; /*0x5c3a*/
if ( !*src_5 ) /*0x5c3e*/
goto LABEL_32; /*0x5c3e*/
do /*0x5c47*/
{
if ( n59_2 != 59 ) /*0x5c42*/
break; /*0x5c42*/
n59_2 = *++src_5; /*0x5c47*/
}
while ( *src_5 ); /*0x5c47*/
}
}
// Function: Assert_0 @ 0x5d30 (0x68 bytes)
__int64 Assert_0()
{
char *src; // rbx
__int64 v1; // rsi
char *src_1; // rdi
src = src_0; /*0x5d3f*/
if ( src_0 ) /*0x5d49*/
{
v1 = 0; /*0x5d4b*/
if ( *(_QWORD *)src_0 ) /*0x5d4d*/
{
src_1 = src_0; /*0x5d52*/
do /*0x5d78*/
{
AssertCpuDeadLoop_0(); /*0x5d58*/
if ( *((_QWORD *)src_1 + 1) ) /*0x5d5d*/
AssertCpuDeadLoop_0(); /*0x5d66*/
++v1; /*0x5d6b*/
src_1 = &src[16 * v1]; /*0x5d75*/
}
while ( *(_QWORD *)src_1 ); /*0x5d78*/
}
AssertCpuDeadLoop_0(); /*0x5d81*/
}
return 0; /*0x5d92*/
}
// Function: AssertCpuDeadLoop @ 0x5d98 (0x74 bytes)
__int64 __fastcall sub_5D98(__int64 a1)
{
__int64 result; // rax
signed __int64 v2; // rax
result = qword_9770; /*0x5d9c*/
if ( !qword_9770 ) /*0x5da6*/
{
v2 = GetHobList(a1); /*0x5da8*/
if ( v2 < 0 ) /*0x5db0*/
{
DebugPrint(0x80000000LL, (__int64)"\nASSERT_EFI_ERROR (Status = %r)\n", v2); /*0x5dc1*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 54, (__int64)"!EFI_ERROR (Status)"); /*0x5dd9*/
}
result = qword_9770; /*0x5dde*/
if ( !qword_9770 ) /*0x5de8*/
{
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 55, (__int64)"mHobList != ((void *) 0)"); /*0x5dfb*/
return qword_9770; /*0x5e00*/
}
}
return result; /*0x5e07*/
}
// Function: NetIp4IsNetmaskValid @ 0x5e0c (0x92 bytes)
bool __fastcall NetIp4IsNetmaskValid(int dst_, int a2)
{
__int64 n2; // r8
__int64 i; // rax
int v5; // edx
int v6; // ecx
if ( dst_ < 0 ) /*0x5e19*/
{
if ( (HIBYTE(dst_) & 0xC0) == 0x80 ) /*0x5e28*/
{
n2 = 2; /*0x5e2c*/
}
else if ( (HIBYTE(dst_) & 0xE0) == 0xC0 ) /*0x5e3b*/
{
n2 = 3; /*0x5e3d*/
}
else
{
n2 = ((HIBYTE(dst_) & 0xF0) != 0xE0) + 4LL; /*0x5e54*/
}
}
else
{
n2 = 1; /*0x5e1b*/
}
if ( (unsigned int)(dst_ - 1) > 0xFFFFFFFD ) /*0x5e5e*/
return 0; /*0x5e5e*/
if ( !a2 ) /*0x5e69*/
a2 = dword_8E60[8 * n2]; /*0x5e6f*/
for ( i = 0; i <= 32; ++i ) /*0x5e73*/
{
if ( a2 == dword_8E60[i] ) /*0x5e78*/
break; /*0x5e78*/
}
if ( i == 31 ) /*0x5e87*/
return 1; /*0x5e87*/
v5 = ~a2; /*0x5e89*/
v6 = dst_ & v5; /*0x5e8d*/
return (dst_ & v5) != v5 && v6; /*0x5e98*/
}
// Function: NetSwapBytes16 @ 0x5ea0 (0x10e bytes)
char *__fastcall NetSwapBytes16(char *src)
{
unsigned __int64 srca; // [rsp+30h] [rbp+8h] BYREF
unsigned __int64 dst; // [rsp+38h] [rbp+10h] BYREF
MemConfig_0((char *)&dst, src, 8u); /*0x5ec2*/
MemConfig_0((char *)&srca, src + 8, 8u); /*0x5ed3*/
dst = (unsigned __int16)__ROL2__(HIWORD(dst), 8) /*0x5f4e*/
| (((unsigned __int16)__ROL2__(WORD2(dst), 8)
| ((((unsigned __int64)(unsigned __int16)__ROL2__(dst, 8) << 16) | (unsigned __int16)__ROL2__(WORD1(dst), 8)) << 16)) << 16);
srca = (unsigned __int16)__ROL2__(HIWORD(srca), 8) /*0x5f7b*/
| ((unsigned __int16)__ROL2__(WORD2(srca), 8) << 16)
| ((((unsigned __int64)(unsigned __int16)__ROL2__(srca, 8) << 16) | (unsigned __int16)__ROL2__(WORD1(srca), 8)) << 32);
MemConfig_0(src, (char *)&srca, 8u); /*0x5f85*/
MemConfig_0(src + 8, (char *)&dst, 8u); /*0x5f96*/
return src; /*0x5fa8*/
}
// Function: NetDestroyChildrenInList @ 0x5fb0 (0x10c bytes)
__int64 __fastcall NetDestroyChildrenInList(_QWORD *i, _QWORD *a2)
{
__int64 result; // rax
__int64 v5; // rax
__int64 v6; // rsi
_QWORD *j; // rdi
_QWORD *k; // rax
_QWORD *i_1; // rcx
if ( !Mtftp4DestroyChildCallback ) /*0x5fd4*/
return 0x8000000000000002uLL; /*0x5fd6*/
v5 = 0; /*0x5fe5*/
do /*0x609f*/
{
v6 = v5; /*0x5fe7*/
LABEL_5:
if ( !IsListValid(i) ) /*0x5fed*/
Assert_( /*0x6009*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\LinkedList.c",
311,
(__int64)"InternalBaseLibIsListValid (List)");
for ( j = (_QWORD *)*i; ; j = (_QWORD *)*j ) /*0x600e*/
{
if ( !IsListValid(i) ) /*0x6014*/
Assert_( /*0x6030*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\LinkedList.c",
457,
(__int64)"InternalBaseLibIsListValid (List)");
if ( j == i ) /*0x6038*/
break; /*0x6038*/
result = Mtftp4DestroyChildCallback(j, a2); /*0x6040*/
if ( result < 0 ) /*0x6048*/
return result; /*0x6048*/
for ( k = (_QWORD *)*i; k != i; k = (_QWORD *)*k ) /*0x604a*/
{
if ( k == j ) /*0x6052*/
goto LABEL_17; /*0x6052*/
}
if ( k != j ) /*0x605f*/
goto LABEL_5; /*0x605f*/
LABEL_17:
if ( !IsListValid(i) ) /*0x6064*/
Assert_( /*0x6080*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\LinkedList.c",
347,
(__int64)"InternalBaseLibIsListValid (List)");
}
i_1 = (_QWORD *)*i; /*0x608a*/
v5 = 0; /*0x608d*/
while ( i_1 != i ) /*0x609a*/
{
i_1 = (_QWORD *)*i_1; /*0x6091*/
++v5; /*0x6094*/
}
}
while ( v5 != v6 ); /*0x609f*/
return 0; /*0x60b6*/
}
// Function: DxeGetInfo @ 0x60bc (0x91 bytes)
__int64 __fastcall sub_60BC(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
{
__int64 result; // rax
_QWORD v9[3]; // [rsp+30h] [rbp-18h] BYREF
if ( !a3 || !a4 ) /*0x60e4*/
Assert_( /*0x60f9*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\DxeNetLib.c",
1873,
(__int64)"(ServiceBindingGuid != ((void *) 0)) && (ChildHandle != ((void *) 0))");
result = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD *, __int64, __int64, int))(BootServices + 280))( /*0x6120*/
a1,
a3,
v9,
a2,
a1,
2);
if ( result >= 0 ) /*0x6129*/
return (*(__int64 (__fastcall **)(_QWORD, __int64))v9[0])(v9[0], a4); /*0x6136*/
return result; /*0x6147*/
}
// Function: DxeGetInfo_0 @ 0x6150 (0x8d bytes)
__int64 __fastcall sub_6150(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
{
__int64 result; // rax
_QWORD v9[3]; // [rsp+30h] [rbp-18h] BYREF
if ( !a3 ) /*0x6173*/
Assert_( /*0x6188*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\DxeNetLib.c",
1927,
(__int64)"ServiceBindingGuid != ((void *) 0)");
result = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD *, __int64, __int64, int))(BootServices + 280))( /*0x61af*/
a1,
a3,
v9,
a2,
a1,
2);
if ( result >= 0 ) /*0x61b8*/
return (*(__int64 (__fastcall **)(_QWORD, __int64))(v9[0] + 8LL))(v9[0], a4); /*0x61c5*/
return result; /*0x61d7*/
}
// Function: DxeConfig_11 @ 0x61e0 (0xb8 bytes)
char *__fastcall sub_61E0(int a1, int a2)
{
char *v4; // rax
char *v5; // rbx
char *v7; // rax
if ( !a2 ) /*0x61f6*/
Assert_((__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c", 47, (__int64)"BlockOpNum >= 1"); /*0x620b*/
v4 = GetInfo_0(40LL * (unsigned int)(a2 - 1) + 176); /*0x621f*/
v5 = v4; /*0x6224*/
if ( !v4 ) /*0x622a*/
return 0; /*0x622a*/
*(_DWORD *)v4 = 1718968942; /*0x6234*/
*((_QWORD *)v4 + 1) = 1; /*0x623a*/
*((_DWORD *)v4 + 32) = a2; /*0x6242*/
InitializeListHead((_QWORD *)v4 + 2); /*0x6248*/
if ( a1 ) /*0x624f*/
{
v7 = GetInfo_0(16 * ((unsigned int)(a1 - 1) + 4LL)); /*0x625c*/
if ( !v7 ) /*0x6264*/
{
AssertCpuDeadLoop_0(); /*0x6269*/
return 0; /*0x622e*/
}
*(_DWORD *)v7 = 1667593838; /*0x6270*/
*((_QWORD *)v7 + 1) = 1; /*0x6276*/
*((_DWORD *)v7 + 10) = a1; /*0x627e*/
*((_QWORD *)v5 + 15) = v7; /*0x6281*/
}
return v5; /*0x6292*/
}
// Function: DxeConfig_12 @ 0x6298 (0xa5 bytes)
char *__fastcall DxeConfig_12(unsigned int n4)
{
__int64 n4_1; // rdi
__int64 v2; // rcx
char *v3; // rbx
__int64 v5; // rcx
__int64 v6; // rax
n4_1 = n4; /*0x62a7*/
if ( !n4 ) /*0x62ab*/
Assert_((__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c", 105, (__int64)"Len > 0"); /*0x62be*/
v3 = DxeConfig_11(1, 1); /*0x62cf*/
if ( !v3 ) /*0x62d5*/
return 0; /*0x62d5*/
v5 = AllocatePool(v2, n4_1); /*0x62e3*/
if ( !v5 ) /*0x62e9*/
{
AssertCpuDeadLoop_0(); /*0x62ee*/
return 0; /*0x62d9*/
}
v6 = *((_QWORD *)v3 + 15); /*0x62f5*/
*(_DWORD *)(v6 + 36) = n4_1; /*0x62f9*/
*(_QWORD *)(v6 + 56) = v5; /*0x62fc*/
*(_DWORD *)(v6 + 48) = n4_1; /*0x6300*/
*((_DWORD *)v3 + 42) = 0; /*0x6307*/
*((_QWORD *)v3 + 18) = n4_1 + v5; /*0x630e*/
*((_QWORD *)v3 + 17) = v5; /*0x6318*/
*((_QWORD *)v3 + 19) = v5; /*0x631f*/
*((_QWORD *)v3 + 20) = v5; /*0x6326*/
return v3; /*0x6337*/
}
// Function: DxeConfig_8 @ 0x6340 (0xcc bytes)
__int64 __fastcall sub_6340(__int64 a1)
{
unsigned int v1; // edi
__int64 result; // rax
v1 = 0; /*0x634a*/
if ( a1 ) /*0x6352*/
{
if ( *(_DWORD *)a1 == 1667593838 ) /*0x6374*/
goto LABEL_5; /*0x6374*/
}
else
{
Assert_((__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c", 156, (__int64)"Vector != ((void *) 0)"); /*0x6367*/
}
result = Assert_( /*0x6389*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c",
157,
(__int64)"((Vector) != ((void *) 0)) && ((Vector)->Signature == (((('n') | ('v' << 8)) | ((('e') | ('c' << 8)) << 16))))");
LABEL_5:
if ( *(__int64 *)(a1 + 8) <= 0 ) /*0x6392*/
result = Assert_( /*0x63a7*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c",
158,
(__int64)"Vector->RefCnt > 0");
if ( (__int64)--*(_QWORD *)(a1 + 8) <= 0 ) /*0x63b4*/
{
if ( *(_QWORD *)(a1 + 16) ) /*0x63b6*/
{
if ( (*(_BYTE *)(a1 + 32) & 1) != 0 ) /*0x63c0*/
(*(void (__fastcall **)(_QWORD))(BootServices + 72))(*(_QWORD *)(a1 + 56)); /*0x63cd*/
(*(void (__fastcall **)(_QWORD))(a1 + 16))(*(_QWORD *)(a1 + 24)); /*0x63d4*/
}
else if ( *(_DWORD *)(a1 + 40) ) /*0x63d9*/
{
do /*0x63f7*/
(*(void (__fastcall **)(_QWORD))(BootServices + 72))(*(_QWORD *)(a1 + 16LL * v1++ + 56)); /*0x63ef*/
while ( v1 < *(_DWORD *)(a1 + 40) ); /*0x63f7*/
}
return AssertCpuDeadLoop_0(); /*0x63fc*/
}
return result; /*0x6406*/
}
// Function: DxeConfig_14 @ 0x640c (0x85 bytes)
__int64 __fastcall sub_640C(__int64 a1)
{
__int64 result; // rax
if ( a1 ) /*0x6418*/
{
if ( *(_DWORD *)a1 == 1718968942 ) /*0x643a*/
goto LABEL_5; /*0x643a*/
}
else
{
Assert_((__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c", 209, (__int64)"Nbuf != ((void *) 0)"); /*0x642d*/
}
result = Assert_( /*0x644f*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c",
210,
(__int64)"((Nbuf) != ((void *) 0)) && ((Nbuf)->Signature == (((('n') | ('b' << 8)) | ((('u') | ('f' << 8)) << 16))))");
LABEL_5:
if ( *(__int64 *)(a1 + 8) <= 0 ) /*0x6459*/
result = Assert_( /*0x646e*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c",
211,
(__int64)"Nbuf->RefCnt > 0");
if ( (*(_QWORD *)(a1 + 8))-- == 1 ) /*0x6473*/
{
DxeConfig_8(*(_QWORD *)(a1 + 120)); /*0x647e*/
return AssertCpuDeadLoop_0(); /*0x6486*/
}
return result; /*0x648b*/
}
// Function: DxeConfig_13 @ 0x6494 (0xa1 bytes)
__int64 __fastcall sub_6494(_DWORD *a1, unsigned int a2, _DWORD *a3)
{
unsigned int v6; // r9d
unsigned int v7; // r8d
__int64 v8; // rcx
_DWORD *i; // rdx
unsigned int v10; // r10d
if ( !a1 || *a1 != 1718968942 ) /*0x64b6*/
Assert_( /*0x64cb*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c",
383,
(__int64)"((Nbuf) != ((void *) 0)) && ((Nbuf)->Signature == (((('n') | ('b' << 8)) | ((('u') | ('f' << 8)) << 16))))");
if ( a2 >= a1[33] ) /*0x64d6*/
return 0; /*0x64d6*/
v6 = a1[32]; /*0x64d8*/
v7 = 0; /*0x64df*/
v8 = 0; /*0x64e2*/
if ( !v6 ) /*0x64e7*/
return 0; /*0x6509*/
for ( i = a1 + 42; ; i += 10 ) /*0x64e9*/
{
v10 = v7 + *i; /*0x64f3*/
if ( v10 > a2 ) /*0x64f9*/
break; /*0x64f9*/
v8 = (unsigned int)(v8 + 1); /*0x64fb*/
v7 = v10; /*0x6501*/
if ( (unsigned int)v8 >= v6 ) /*0x6507*/
return 0; /*0x6507*/
}
if ( a3 ) /*0x651e*/
*a3 = v8; /*0x6520*/
return *(_QWORD *)&a1[10 * v8 + 38] + a2 - v7; /*0x6515*/
}
// Function: DxeConfig_6 @ 0x6538 (0xe4 bytes)
_DWORD *__fastcall DxeConfig_6(__int64 a1, __int64 dst, unsigned int a3, unsigned int a4)
{
__int64 v4; // rsi
__int64 v6; // rbp
_DWORD *result; // rax
__int64 v9; // rdx
__int64 v10; // rcx
v4 = a4; /*0x654c*/
v6 = a3; /*0x6552*/
if ( !a1 || *(_DWORD *)a1 != 1718968942 ) /*0x6563*/
Assert_( /*0x6578*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c",
437,
(__int64)"((Nbuf) != ((void *) 0)) && ((Nbuf)->Signature == (((('n') | ('b' << 8)) | ((('u') | ('f' << 8)) << 16))))");
result = *(_DWORD **)(a1 + 120); /*0x657d*/
if ( !result || *result != 1667593838 ) /*0x658c*/
result = (_DWORD *)Assert_( /*0x65a1*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c",
438,
(__int64)"((Nbuf->Vector) != ((void *) 0)) && ((Nbuf->Vector)->Signature == (((('n') | ('v' << 8"
")) | ((('e') | ('c' << 8)) << 16))))");
if ( (unsigned int)v4 >= *(_DWORD *)(a1 + 128) ) /*0x65ac*/
result = (_DWORD *)Assert_( /*0x65c1*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c",
439,
(__int64)"Index < Nbuf->BlockOpNum");
v9 = 5 * v4; /*0x65c6*/
v10 = *(_QWORD *)(a1 + 120) + 16 * (v4 + 3); /*0x65d7*/
*(_DWORD *)v10 = v6; /*0x65db*/
*(_QWORD *)(v10 + 8) = dst; /*0x65dd*/
*(_DWORD *)(a1 + 8 * v9 + 168) = v6; /*0x65e5*/
*(_QWORD *)(a1 + 8 * v9 + 144) = dst + v6; /*0x65f1*/
*(_QWORD *)(a1 + 8 * v9 + 160) = dst + v6; /*0x65f9*/
*(_QWORD *)(a1 + 8 * v9 + 136) = dst; /*0x6601*/
*(_QWORD *)(a1 + 8 * v9 + 152) = dst; /*0x6609*/
return result; /*0x6616*/
}
// Function: DxeConfig_1 @ 0x661c (0x255 bytes)
__int64 __fastcall DxeConfig_1(
unsigned int *p_count,
unsigned int a2,
__int64 a3,
unsigned int count,
__int64 a5,
__int64 a6)
{
__int64 dst_1; // r15
int v10; // edi
unsigned int v11; // esi
int v12; // r13d
__int64 dst_2; // rax
char *dst; // rcx
unsigned int *p_count_1; // rbx
__int64 count_2; // rax
__int128 v18; // xmm0
char *v19; // rax
__int64 v20; // rbx
__int64 v21; // rbp
unsigned int *v22; // rdi
unsigned int v23; // ebp
__int128 v24; // [rsp+20h] [rbp-58h]
unsigned int v25; // [rsp+80h] [rbp+8h]
int v26; // [rsp+88h] [rbp+10h]
int v27; // [rsp+88h] [rbp+10h]
unsigned int v28; // [rsp+90h] [rbp+18h]
unsigned int count_1; // [rsp+98h] [rbp+20h]
__int64 dst_3; // [rsp+A0h] [rbp+28h]
__int64 v31; // [rsp+A0h] [rbp+28h]
if ( !p_count || !a2 ) /*0x6643*/
Assert_( /*0x6658*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c",
741,
(__int64)"(ExtFragment != ((void *) 0)) && (ExtNum > 0) && (ExtFree != ((void *) 0))");
dst_1 = 0; /*0x665d*/
*((_QWORD *)&v24 + 1) = 0; /*0x6660*/
v10 = a2; /*0x6665*/
LODWORD(v24) = 0; /*0x6668*/
v11 = 0; /*0x666c*/
count_1 = 0; /*0x666e*/
v12 = 0; /*0x6675*/
v25 = 0; /*0x6678*/
v28 = 0; /*0x667f*/
if ( *p_count >= count || a2 == 1 ) /*0x6690*/
count = 0; /*0x6692*/
if ( count ) /*0x6696*/
{
count_1 = count; /*0x669e*/
dst_2 = AllocatePool((__int64)p_count, count); /*0x66a5*/
dst_1 = dst_2; /*0x66aa*/
if ( !dst_2 ) /*0x66b0*/
return 0; /*0x66b4*/
dst_3 = dst_2; /*0x66b9*/
v10 = a2 + 1; /*0x66c1*/
v26 = a2 + 1; /*0x66c5*/
dst = (char *)dst_2; /*0x66cc*/
if ( a2 ) /*0x66d2*/
{
p_count_1 = p_count; /*0x66d8*/
while ( count >= *p_count_1 ) /*0x66dd*/
{
MemConfig_0(dst, *((char **)p_count_1 + 1), *p_count_1); /*0x66e6*/
count_2 = *p_count_1; /*0x66eb*/
--v10; /*0x66ed*/
v12 += count_2; /*0x66f7*/
v28 += count_2; /*0x66fa*/
dst = (char *)(count_2 + dst_3); /*0x6701*/
dst_3 += count_2; /*0x6704*/
v26 = v10; /*0x670c*/
count -= count_2; /*0x6713*/
if ( !count ) /*0x6715*/
{
++v11; /*0x6724*/
goto LABEL_18; /*0x6726*/
}
++v11; /*0x6717*/
p_count_1 += 4; /*0x6719*/
if ( v11 >= a2 ) /*0x6720*/
goto LABEL_18; /*0x6720*/
}
MemConfig_0(dst, *(char **)&p_count[4 * v11 + 2], count); /*0x6737*/
v18 = *(_OWORD *)&p_count[4 * v11]; /*0x673c*/
*(_QWORD *)&p_count[4 * v11 + 2] += count; /*0x6741*/
v12 += count; /*0x6746*/
v28 += count; /*0x6749*/
p_count[4 * v11] -= count; /*0x6750*/
v10 = v26; /*0x6754*/
v24 = v18; /*0x675b*/
v25 = v11; /*0x6761*/
}
}
LABEL_18:
v19 = DxeConfig_11(v10, v10); /*0x6768*/
v20 = (__int64)v19; /*0x6771*/
if ( !v19 ) /*0x6777*/
{
if ( dst_1 ) /*0x677c*/
AssertCpuDeadLoop_0(); /*0x6785*/
return 0; /*0x678a*/
}
v21 = *((_QWORD *)v19 + 15); /*0x678f*/
v31 = v21; /*0x67a1*/
*(_QWORD *)(v21 + 16) = DxeGetInfo_3; /*0x67a9*/
*(_QWORD *)(v21 + 24) = a6; /*0x67b5*/
*(_DWORD *)(v21 + 32) = count_1 != 0; /*0x67c0*/
v27 = 0; /*0x67c5*/
if ( count_1 ) /*0x67ce*/
{
DxeConfig_6((__int64)v19, dst_1, v28, 0); /*0x67e3*/
*(_DWORD *)(v20 + 168) = v28; /*0x67e8*/
v27 = 1; /*0x67ee*/
}
if ( v11 < a2 ) /*0x67fc*/
{
v22 = &p_count[4 * v11]; /*0x680b*/
v23 = v27 - v11; /*0x680e*/
do /*0x682f*/
{
DxeConfig_6(v20, *((_QWORD *)v22 + 1), *v22, v11 + v23); /*0x681e*/
v12 += *v22; /*0x6823*/
++v11; /*0x6826*/
v22 += 4; /*0x6828*/
}
while ( v11 < a2 ); /*0x682f*/
v21 = v31; /*0x6831*/
}
*(_DWORD *)(v21 + 36) = v12; /*0x6840*/
*(_DWORD *)(v20 + 132) = v12; /*0x6844*/
if ( v25 ) /*0x684d*/
*(_OWORD *)&p_count[4 * v25] = v24; /*0x6857*/
return v20; /*0x6860*/
}
// Function: NetbufGetFragmentTable @ 0x6874 (0x72 bytes)
unsigned __int64 __fastcall NetbufGetFragmentTable(__int64 a1, __int64 a2, unsigned int *va)
{
unsigned int v3; // r9d
__int64 i; // r10
__int64 v6; // rcx
v3 = 0; /*0x6879*/
for ( i = 0; (unsigned int)i < *(_DWORD *)(a1 + 128); i = (unsigned int)(i + 1) ) /*0x6885*/
{
if ( *(_DWORD *)(a1 + 40 * i + 168) ) /*0x6892*/
{
if ( v3 >= *va ) /*0x68a0*/
return 0x8000000000000005uLL; /*0x68da*/
v6 = 2LL * v3++; /*0x68ad*/
*(_QWORD *)(a2 + 8 * v6 + 8) = *(_QWORD *)(a1 + 40 * i + 152); /*0x68b3*/
*(_DWORD *)(a2 + 8 * v6) = *(_DWORD *)(a1 + 40 * i + 168); /*0x68c0*/
}
}
*va = v3; /*0x68cf*/
return 0; /*0x68d9*/
}
// Function: DxeConfig_4 @ 0x68e8 (0x120 bytes)
__int64 __fastcall sub_68E8(__int64 a1, unsigned int a2)
{
unsigned int v2; // edi
unsigned __int64 v3; // rsi
_DWORD *v5; // rax
int v6; // edx
__int64 v7; // r8
unsigned int v9; // [rsp+40h] [rbp+18h] BYREF
v2 = 0; /*0x68fc*/
v3 = a2; /*0x68fe*/
v9 = 0; /*0x6900*/
if ( !a1 || *(_DWORD *)a1 != 1718968942 ) /*0x6911*/
Assert_( /*0x6926*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c",
1056,
(__int64)"((Nbuf) != ((void *) 0)) && ((Nbuf)->Signature == (((('n') | ('b' << 8)) | ((('u') | ('f' << 8)) << 16))))");
v5 = *(_DWORD **)(a1 + 120); /*0x692b*/
if ( !v5 || *v5 != 1667593838 ) /*0x693a*/
Assert_( /*0x694f*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c",
1057,
(__int64)"((Nbuf->Vector) != ((void *) 0)) && ((Nbuf->Vector)->Signature == (((('n') | ('v' << 8)) | ((('e') | ('c'"
" << 8)) << 16))))");
if ( !(_DWORD)v3 ) /*0x6956*/
Assert_((__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c", 1059, (__int64)"Len > 0"); /*0x696b*/
v6 = *(_DWORD *)(a1 + 132); /*0x6970*/
if ( v6 ) /*0x6978*/
{
DxeConfig_13((_DWORD *)a1, v6 - 1, &v9); /*0x6984*/
v2 = v9; /*0x6989*/
if ( *(_QWORD *)(a1 + 40LL * v9 + 144) - *(_QWORD *)(a1 + 40LL * v9 + 160) < v3 && v9 < *(_DWORD *)(a1 + 128) - 1 ) /*0x69b4*/
v2 = v9 + 1; /*0x69b6*/
}
v7 = *(_QWORD *)(a1 + 40LL * v2 + 160); /*0x69c1*/
if ( *(_QWORD *)(a1 + 40LL * v2 + 144) - v7 < v3 ) /*0x69d7*/
return 0; /*0x69d9*/
*(_DWORD *)(a1 + 40LL * v2 + 168) += v3; /*0x69dd*/
*(_QWORD *)(a1 + 40LL * v2 + 160) = v7 + v3; /*0x69e7*/
*(_DWORD *)(a1 + 132) += v3; /*0x69f2*/
return v7; /*0x6a02*/
}
// Function: DxeConfig_2 @ 0x6a08 (0x17d bytes)
__int64 __fastcall DxeConfig_2(_DWORD *a1, __int64 a2, unsigned int n4, char *dst)
{
unsigned int n4_1; // eax
unsigned int v8; // r9d
__int64 v9; // rbp
_DWORD *v10; // rcx
char *src; // rdx
unsigned int count; // r14d
char *dst_1; // r15
unsigned int count_1; // esi
unsigned int count_2; // eax
if ( !a1 || *a1 != 1718968942 ) /*0x6a34*/
Assert_( /*0x6a49*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c",
1253,
(__int64)"((Nbuf) != ((void *) 0)) && ((Nbuf)->Signature == (((('n') | ('b' << 8)) | ((('u') | ('f' << 8)) << 16))))");
if ( !dst ) /*0x6a51*/
Assert_((__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeNetLib\\NetBuffer.c", 1254, (__int64)"Dest"); /*0x6a66*/
if ( !n4 ) /*0x6a6d*/
return 0; /*0x6a6d*/
n4_1 = a1[33]; /*0x6a73*/
if ( !n4_1 ) /*0x6a7b*/
return 0; /*0x6b6a*/
v8 = a1[32]; /*0x6a81*/
if ( n4_1 < n4 ) /*0x6a8a*/
n4 = a1[33]; /*0x6a8a*/
v9 = 0; /*0x6a8f*/
if ( v8 ) /*0x6a94*/
{
v10 = a1 + 42; /*0x6a96*/
do /*0x6ab8*/
{
if ( *v10 ) /*0x6a9d*/
break; /*0x6aa1*/
v9 = (unsigned int)(v9 + 1); /*0x6aaf*/
v10 += 10; /*0x6ab1*/
}
while ( (unsigned int)v9 < v8 ); /*0x6ab8*/
}
src = *(char **)&a1[10 * v9 + 38]; /*0x6ad4*/
count = a1[10 * v9 + 42]; /*0x6adc*/
if ( n4 > count ) /*0x6ae2*/
{
MemConfig_0(dst, src, count); /*0x6af6*/
dst_1 = &dst[count]; /*0x6afb*/
count_1 = n4 - count; /*0x6afe*/
while ( 1 ) /*0x6b3b*/
{
v9 = (unsigned int)(v9 + 1); /*0x6b3b*/
if ( (unsigned int)v9 >= a1[32] ) /*0x6b43*/
break; /*0x6b43*/
count_2 = a1[10 * v9 + 42]; /*0x6b11*/
if ( count_1 <= count_2 ) /*0x6b1a*/
{
count += count_1; /*0x6b55*/
MemConfig_0(dst_1, *(char **)&a1[10 * v9 + 38], count_1); /*0x6b60*/
return count; /*0x6b60*/
}
count_1 -= count_2; /*0x6b27*/
count += count_2; /*0x6b29*/
MemConfig_0(dst_1, *(char **)&a1[10 * v9 + 38], count_2); /*0x6b2c*/
dst_1 += (unsigned int)a1[10 * v9 + 42]; /*0x6b38*/
}
return count; /*0x6b65*/
}
else
{
MemConfig_0(dst, src, n4); /*0x6ae7*/
return n4; /*0x6aec*/
}
}
// Function: DxeGetInfo_4 @ 0x6b88 (0x4f bytes)
__int64 __fastcall DxeGetInfo_4(__int64 a1)
{
char n4; // cl
n4 = *(_BYTE *)(*(_QWORD *)(a1 + 24) + 32LL); /*0x6b95*/
if ( n4 == 4 || n4 == 6 ) /*0x6ba0*/
(*(void (__fastcall **)(_QWORD))(BootServices + 112))(*(_QWORD *)(a1 + 96)); /*0x6bad*/
else
Assert_((__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c", 45, (__int64)"((BOOLEAN)(0==1))"); /*0x6bc5*/
return AssertCpuDeadLoop_0(); /*0x6bcd*/
}
// Function: DxeGetInfo_5 @ 0x6bd8 (0x4f bytes)
__int64 __fastcall DxeGetInfo_5(__int64 a1)
{
char n4; // cl
n4 = *(_BYTE *)(*(_QWORD *)(a1 + 8) + 32LL); /*0x6be5*/
if ( n4 == 4 || n4 == 6 ) /*0x6bf0*/
(*(void (__fastcall **)(_QWORD))(BootServices + 112))(*(_QWORD *)(a1 + 40)); /*0x6bfd*/
else
Assert_((__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c", 67, (__int64)"((BOOLEAN)(0==1))"); /*0x6c15*/
return AssertCpuDeadLoop_0(); /*0x6c1d*/
}
// Function: DxeGetInfo_1 @ 0x6c28 (0x7b bytes)
__int64 __fastcall sub_6C28(__int64 a1)
{
if ( *(_DWORD *)a1 != 1414546517 ) /*0x6c37*/
Assert_( /*0x6c4c*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c",
91,
(__int64)"TxToken->Signature == ((('U') | ('D' << 8)) | ((('P') | ('T' << 8)) << 16))");
if ( ((*(_BYTE *)(*(_QWORD *)(a1 + 24) + 32LL) - 4) & 0xFD) != 0 ) /*0x6c5e*/
Assert_( /*0x6c73*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c",
93,
(__int64)"(TxToken->UdpIo->UdpVersion == 4) || (TxToken->UdpIo->UdpVersion == 6)");
RemoveEntryList((_QWORD *)(a1 + 8)); /*0x6c7c*/
(*(void (__fastcall **)(_QWORD, _QWORD, _QWORD, _QWORD))(a1 + 32))( /*0x6c93*/
*(_QWORD *)(a1 + 40),
0,
*(_QWORD *)(a1 + 104),
*(_QWORD *)(a1 + 48));
return DxeGetInfo_4(a1); /*0x6c99*/
}
// Function: QueueDpc @ 0x6ca4 (0x1c bytes)
__int64 __fastcall QueueDpc(__int64 a1, __int64 a2)
{
return (*(__int64 (__fastcall **)(__int64, __int64, __int64 (__fastcall *)(__int64), __int64))qword_9780)(
qword_9780,
8,
DxeGetInfo_1,
a2);
}
// Function: DxeGetInfo_3 @ 0x6cc0 (0x53 bytes)
__int64 __fastcall DxeGetInfo_3(__int64 a1)
{
char n4; // cl
n4 = *(_BYTE *)(*(_QWORD *)(a1 + 8) + 32LL); /*0x6ccd*/
if ( n4 == 4 || n4 == 6 ) /*0x6cd8*/
(*(void (__fastcall **)(_QWORD))(BootServices + 104))(*(_QWORD *)(*(_QWORD *)(a1 + 56) + 16LL)); /*0x6ce9*/
else
Assert_((__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c", 147, (__int64)"((BOOLEAN)(0==1))"); /*0x6d01*/
return DxeGetInfo_5(a1); /*0x6d09*/
}
// Function: DxeConfig @ 0x6d14 (0x279 bytes)
__int64 __fastcall DxeConfig(__int64 a1)
{
__int64 v2; // r8
__int64 v3; // rbx
char n4; // cl
__int64 v5; // rsi
bool v6; // zf
__int64 v7; // rcx
__int64 v9; // [rsp+20h] [rbp-40h]
char buf[4]; // [rsp+30h] [rbp-30h] BYREF
__int16 v11; // [rsp+40h] [rbp-20h]
char dst[4]; // [rsp+44h] [rbp-1Ch] BYREF
__int16 v13; // [rsp+54h] [rbp-Ch]
MemGetInfo(buf, 0x28u); /*0x6d37*/
if ( *(_DWORD *)a1 != 1380992085 || a1 != *(_QWORD *)(*(_QWORD *)(a1 + 8) + 736LL) ) /*0x6d4f*/
Assert_( /*0x6d64*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c",
181,
(__int64)"(RxToken->Signature == ((('U') | ('D' << 8)) | ((('P') | ('R' << 8)) << 16))) && (RxToken == RxToken->Udp"
"Io->RecvRequest)");
if ( ((*(_BYTE *)(*(_QWORD *)(a1 + 8) + 32LL) - 4) & 0xFD) != 0 ) /*0x6d76*/
Assert_( /*0x6d8b*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c",
184,
(__int64)"(RxToken->UdpIo->UdpVersion == 4) || (RxToken->UdpIo->UdpVersion == 6)");
*(_QWORD *)(*(_QWORD *)(a1 + 8) + 736LL) = 0; /*0x6d98*/
v2 = *(_QWORD *)(a1 + 48); /*0x6da4*/
v3 = *(_QWORD *)(a1 + 56); /*0x6da8*/
n4 = *(_BYTE *)(*(_QWORD *)(a1 + 8) + 32LL); /*0x6dac*/
if ( v2 < 0 || !v3 ) /*0x6dbb*/
{
if ( v2 == 0x8000000000000015uLL ) /*0x6f62*/
return DxeGetInfo_5(a1); /*0x6f72*/
LABEL_21:
(*(void (__fastcall **)(_QWORD, _QWORD, __int64, _QWORD))(a1 + 16))(0, 0, v2, *(_QWORD *)(a1 + 24)); /*0x6f64*/
return DxeGetInfo_5(a1); /*0x6f6c*/
}
if ( n4 == 4 ) /*0x6dc4*/
{
if ( *(_DWORD *)(v3 + 36) ) /*0x6dca*/
{
v5 = DxeConfig_1((unsigned int *)(v3 + 48), *(_DWORD *)(v3 + 40), v2, *(_DWORD *)(a1 + 32), v9, a1); /*0x6de9*/
if ( !v5 ) /*0x6def*/
{
LABEL_11:
(*(void (__fastcall **)(_QWORD))(BootServices + 104))(*(_QWORD *)(v3 + 16)); /*0x6df1*/
v2 = 0x8000000000000009uLL; /*0x6dff*/
goto LABEL_21; /*0x6e09*/
}
v11 = *(_WORD *)(v3 + 34); /*0x6e16*/
v13 = *(_WORD *)(v3 + 28); /*0x6e28*/
MemConfig_0(buf, (char *)(v3 + 30), 4u); /*0x6e2c*/
MemConfig_0(dst, (char *)(v3 + 24), 4u); /*0x6e3f*/
*(_DWORD *)buf = ((unsigned __int16)__ROL2__(*(_WORD *)buf, 8) << 16) /*0x6e6b*/
| (unsigned __int16)__ROL2__(*(_WORD *)&buf[2], 8);
*(_DWORD *)dst = ((unsigned __int16)__ROL2__(*(_WORD *)dst, 8) << 16) /*0x6e81*/
| (unsigned __int16)__ROL2__(*(_WORD *)&dst[2], 8);
return (*(__int64 (__fastcall **)(__int64, char *, _QWORD, _QWORD))(a1 + 16))(v5, buf, 0, *(_QWORD *)(a1 + 24)); /*0x6f53*/
}
}
else if ( *(_DWORD *)(v3 + 60) ) /*0x6e89*/
{
v5 = DxeConfig_1((unsigned int *)(v3 + 72), *(_DWORD *)(v3 + 64), v2, *(_DWORD *)(a1 + 32), v9, a1); /*0x6eee*/
if ( !v5 ) /*0x6ef4*/
goto LABEL_11; /*0x6ef4*/
v11 = *(_WORD *)(v3 + 58); /*0x6f02*/
v13 = *(_WORD *)(v3 + 40); /*0x6f14*/
MemConfig_0(buf, (char *)(v3 + 42), 0x10u); /*0x6f18*/
MemConfig_0(dst, (char *)(v3 + 24), 0x10u); /*0x6f2b*/
NetSwapBytes16(buf); /*0x6f34*/
NetSwapBytes16(dst); /*0x6f3d*/
return (*(__int64 (__fastcall **)(__int64, char *, _QWORD, _QWORD))(a1 + 16))(v5, buf, 0, *(_QWORD *)(a1 + 24)); /*0x6f3d*/
}
v6 = n4 == 4; /*0x6e96*/
v7 = *(_QWORD *)(v3 + 16); /*0x6e99*/
if ( v6 ) /*0x6e9d*/
{
(*(void (__fastcall **)(__int64))(BootServices + 104))(v7); /*0x6e9f*/
return (*(__int64 (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(*(_QWORD *)(a1 + 8) + 744LL) + 40LL))( /*0x6eb3*/
*(_QWORD *)(*(_QWORD *)(a1 + 8) + 744LL),
a1 + 40);
}
else
{
(*(void (__fastcall **)(__int64))(BootServices + 104))(v7); /*0x6ebc*/
return (*(__int64 (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(*(_QWORD *)(a1 + 8) + 744LL) + 32LL))( /*0x6ed0*/
*(_QWORD *)(*(_QWORD *)(a1 + 8) + 744LL),
a1 + 40);
}
}
// Function: QueueDpcForReceive @ 0x6f90 (0x1c bytes)
__int64 __fastcall QueueDpcForReceive(__int64 a1, __int64 a2)
{
return (*(__int64 (__fastcall **)(__int64, __int64, __int64 (__fastcall *)(__int64), __int64))qword_9780)(
qword_9780,
8,
DxeConfig,
a2);
}
// Function: DxeConfig_7 @ 0x6fac (0xcf bytes)
__int64 __fastcall DxeConfig_7(__int64 a1, __int64 (__fastcall *sub_3D3C)(), __int64 buf)
{
__int64 v6; // rax
__int64 v7; // rbx
if ( ((*(_BYTE *)(a1 + 32) - 4) & 0xFD) != 0 ) /*0x6fd0*/
Assert_( /*0x6fe5*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c",
361,
(__int64)"(UdpIo->UdpVersion == 4) || (UdpIo->UdpVersion == 6)");
v6 = AllocatePool(a1, 64); /*0x6fef*/
v7 = v6; /*0x6ff4*/
if ( !v6 ) /*0x6ffa*/
return 0; /*0x6ffa*/
*(_DWORD *)(v6 + 32) = 0; /*0x7000*/
*(_DWORD *)v6 = 1380992085; /*0x700b*/
*(_QWORD *)(v6 + 8) = a1; /*0x7014*/
*(_QWORD *)(v6 + 16) = sub_3D3C; /*0x701d*/
*(_QWORD *)(v6 + 24) = buf; /*0x7026*/
*(_QWORD *)(v6 + 56) = 0; /*0x7038*/
*(_QWORD *)(v6 + 48) = 0x8000000000000006uLL; /*0x703d*/
if ( (*(__int64 (__fastcall **)(__int64, __int64, __int64 (__fastcall *)(__int64, __int64), __int64, __int64))(BootServices + 80))( /*0x7057*/
512,
16,
QueueDpcForReceive,
v6,
v6 + 40) < 0 )
{
AssertCpuDeadLoop_0(); /*0x705c*/
return 0; /*0x6ffe*/
}
return v7; /*0x7075*/
}
// Function: DxeConfig_0 @ 0x707c (0x258 bytes)
_DWORD *DxeConfig_0(__int64 a1, __int64 a2, __int64 src, ...)
{
__int64 v6; // rax
__int64 v7; // rdi
bool v9; // zf
__int64 *v10; // rsi
__int64 v11; // rbx
__int64 v12; // [rsp+20h] [rbp-38h]
int srca; // [rsp+60h] [rbp+8h] BYREF
__int64 va; // [rsp+78h] [rbp+20h] BYREF
va_list vaa; // [rsp+78h] [rbp+20h]
__int64 v16; // [rsp+80h] [rbp+28h]
__int64 v17; // [rsp+88h] [rbp+30h]
va_list va1; // [rsp+90h] [rbp+38h] BYREF
va_start(va1, src);
va_start(vaa, src);
va = va_arg(va1, _QWORD); /*0x707c*/
v16 = va_arg(va1, _QWORD); /*0x707c*/
v17 = va_arg(va1, _QWORD); /*0x707c*/
if ( !a2 ) /*0x709d*/
Assert_( /*0x70b2*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c",
442,
(__int64)"Packet != ((void *) 0)");
if ( ((*(_BYTE *)(a1 + 32) - 4) & 0xFD) != 0 ) /*0x70be*/
Assert_( /*0x70d3*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c",
444,
(__int64)"(UdpIo->UdpVersion == 4) || (UdpIo->UdpVersion == 6)");
v6 = AllocatePool(a1, 16 * ((unsigned int)(*(_DWORD *)(a2 + 128) - 1) + 10LL)); /*0x70e8*/
v7 = v6; /*0x70ed*/
if ( !v6 ) /*0x70f3*/
return 0; /*0x70f3*/
*(_DWORD *)v6 = 1414546517; /*0x7100*/
InitializeListHead((_QWORD *)(v6 + 8)); /*0x7106*/
*(_QWORD *)(v7 + 24) = a1; /*0x710b*/
*(_QWORD *)(v7 + 32) = j_DxeConfig_14; /*0x7116*/
*(_QWORD *)(v7 + 48) = v17; /*0x712d*/
*(_QWORD *)(v7 + 40) = a2; /*0x7134*/
v9 = *(_BYTE *)(a1 + 32) == 4; /*0x7143*/
LODWORD(va) = *(_DWORD *)(a2 + 128); /*0x7147*/
*(_QWORD *)(v7 + 104) = 0x8000000000000006uLL; /*0x7155*/
v12 = v7 + 96; /*0x7160*/
if ( v9 ) /*0x7165*/
{
if ( (*(__int64 (__fastcall **)(__int64, __int64, __int64 (__fastcall *)(__int64, __int64), __int64, __int64))(BootServices + 80))( /*0x7176*/
512,
16,
QueueDpc,
v7,
v12) < 0 )
{
LABEL_9:
AssertCpuDeadLoop_0(); /*0x7178*/
return 0; /*0x70f7*/
}
v10 = (__int64 *)(v7 + 120); /*0x7185*/
*(_QWORD *)(v7 + 112) = v7 + 120; /*0x718c*/
*(_QWORD *)(v7 + 120) = 0; /*0x7194*/
*(_QWORD *)(v7 + 128) = 0; /*0x719d*/
*(_DWORD *)(v7 + 136) = *(_DWORD *)(a2 + 132); /*0x71a8*/
NetbufGetFragmentTable(a2, v7 + 144, (unsigned int *)vaa); /*0x71ab*/
*(_DWORD *)(v7 + 140) = va; /*0x71b5*/
if ( src ) /*0x71bc*/
{
v11 = v7 + 60; /*0x71c5*/
srca = ((unsigned __int16)__ROL2__(*(_DWORD *)src, 8) << 16) /*0x71ec*/
| (unsigned __int16)__ROL2__(HIWORD(*(_DWORD *)src), 8);
MemConfig_0((char *)(v7 + 60), (char *)&srca, 4u); /*0x71f3*/
srca = ((unsigned __int16)__ROL2__(*(_DWORD *)(src + 20), 8) << 16) /*0x721f*/
| (unsigned __int16)__ROL2__(HIWORD(*(_DWORD *)(src + 20)), 8);
MemConfig_0((char *)(v7 + 66), (char *)&srca, 4u); /*0x7227*/
*(_WORD *)(v7 + 64) = *(_WORD *)(src + 16); /*0x7231*/
*(_WORD *)(v7 + 70) = *(_WORD *)(src + 36); /*0x723a*/
LABEL_15:
*v10 = v11; /*0x72bd*/
}
}
else
{
if ( (*(__int64 (__fastcall **)(__int64, __int64, __int64 (__fastcall *)(__int64, __int64), __int64, __int64))(BootServices + 80))( /*0x724f*/
512,
16,
QueueDpc,
v7,
v12) < 0 )
goto LABEL_9; /*0x724f*/
v10 = (__int64 *)(v7 + 120); /*0x7255*/
*(_QWORD *)(v7 + 112) = v7 + 120; /*0x725c*/
*(_QWORD *)(v7 + 120) = 0; /*0x7264*/
*(_DWORD *)(v7 + 128) = *(_DWORD *)(a2 + 132); /*0x7273*/
NetbufGetFragmentTable(a2, v7 + 136, (unsigned int *)vaa); /*0x7276*/
*(_DWORD *)(v7 + 132) = va; /*0x7280*/
if ( src ) /*0x7287*/
{
v11 = v7 + 60; /*0x7289*/
MemConfig_0((char *)(v7 + 60), (char *)src, 0x10u); /*0x7296*/
MemConfig_0((char *)(v7 + 78), (char *)(src + 20), 0x10u); /*0x72a6*/
*(_WORD *)(v7 + 76) = *(_WORD *)(src + 16); /*0x72b0*/
*(_WORD *)(v7 + 94) = *(_WORD *)(src + 36); /*0x72b9*/
goto LABEL_15; /*0x72b9*/
}
}
return (_DWORD *)v7; /*0x72c8*/
}
// Function: DxeConfig_3 @ 0x72d4 (0x16f bytes)
__int64 __fastcall sub_72D4(
__int64 a1,
__int64 a2,
__int64 (__fastcall *sub_7DC)(__int64, __int64),
__int64 a4,
__int64 buf)
{
__int64 v8; // rax
__int64 v9; // rbx
__int64 *v10; // r14
if ( !sub_7DC ) /*0x72f8*/
Assert_( /*0x730d*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c",
611,
(__int64)"Configure != ((void *) 0)");
v8 = AllocatePool(a1, 808); /*0x7317*/
v9 = v8; /*0x731c*/
if ( v8 ) /*0x7322*/
{
*(_BYTE *)(v8 + 32) = 4; /*0x732c*/
*(_DWORD *)v8 = 1229997141; /*0x7330*/
InitializeListHead((_QWORD *)(v8 + 8)); /*0x7336*/
*(_QWORD *)(v9 + 24) = 1; /*0x7342*/
*(_QWORD *)(v9 + 40) = a1; /*0x734a*/
*(_QWORD *)(v9 + 48) = a2; /*0x734e*/
InitializeListHead((_QWORD *)(v9 + 720)); /*0x7352*/
*(_QWORD *)(v9 + 736) = 0; /*0x7357*/
v10 = (__int64 *)(v9 + 56); /*0x735f*/
*(_QWORD *)(v9 + 56) = 0; /*0x7363*/
if ( DxeGetInfo(a1, a2, (__int64)&unk_95C0, v9 + 56) >= 0 ) /*0x737f*/
{
if ( (*(__int64 (__fastcall **)(__int64, void *, __int64, __int64, __int64, int))(BootServices + 280))( /*0x73b9*/
*v10,
&unk_9620,
v9 + 744,
a2,
a1,
16) >= 0 )
{
if ( sub_7DC(v9, buf) >= 0 /*0x73e7*/
&& (**(__int64 (__fastcall ***)(_QWORD, _QWORD, _QWORD, _QWORD, __int64))(v9 + 744))(
*(_QWORD *)(v9 + 744),
0,
0,
0,
v9 + 64) >= 0 )
{
return v9; /*0x73ec*/
}
(*(void (__fastcall **)(__int64, void *, __int64, __int64))(BootServices + 288))(*v10, &unk_9620, a2, a1); /*0x7405*/
}
DxeGetInfo_0(a1, a2, (__int64)&unk_95C0, *v10); /*0x741b*/
}
AssertCpuDeadLoop_0(); /*0x7423*/
}
return 0; /*0x7439*/
}
// Function: DxeGetInfo_2 @ 0x7444 (0x79 bytes)
char __fastcall sub_7444(__int64 a1)
{
char result; // al
_QWORD **v3; // rcx
_QWORD *v4; // rsi
_QWORD **v5; // rdx
__int64 v6; // rax
result = *(_BYTE *)(a1 + 32) - 4; /*0x7459*/
if ( (result & 0xFD) != 0 ) /*0x745d*/
result = Assert_( /*0x7472*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c",
775,
(__int64)"(UdpIo->UdpVersion == 4) || (UdpIo->UdpVersion == 6)");
v3 = *(_QWORD ***)(a1 + 720); /*0x747e*/
v4 = *v3; /*0x7481*/
while ( v3 != (_QWORD **)(a1 + 720) ) /*0x74ab*/
{
v5 = v3 + 11; /*0x748a*/
v6 = *(_QWORD *)(a1 + 744); /*0x748e*/
if ( *(_BYTE *)(a1 + 32) == 4 ) /*0x7498*/
result = (*(__int64 (__fastcall **)(__int64, _QWORD **))(v6 + 48))(v6, v5); /*0x749a*/
else
result = (*(__int64 (__fastcall **)(__int64, _QWORD **))(v6 + 40))(v6, v5); /*0x749f*/
v3 = (_QWORD **)v4; /*0x74a2*/
v4 = (_QWORD *)*v4; /*0x74a5*/
}
return result; /*0x74b7*/
}
// Function: DxeConfig_5 @ 0x74c0 (0xfb bytes)
__int64 __fastcall sub_74C0(__int64 a1)
{
__int64 v2; // rdx
void *v3; // r8
if ( ((*(_BYTE *)(a1 + 32) - 4) & 0xFD) != 0 ) /*0x74d4*/
Assert_( /*0x74e9*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c",
810,
(__int64)"(UdpIo->UdpVersion == 4) || (UdpIo->UdpVersion == 6)");
DxeGetInfo_2(a1); /*0x74f1*/
v2 = *(_QWORD *)(a1 + 736); /*0x74fa*/
if ( *(_BYTE *)(a1 + 32) == 4 ) /*0x7501*/
{
if ( v2 ) /*0x7506*/
(*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(a1 + 744) + 48LL))(*(_QWORD *)(a1 + 744), v2 + 40); /*0x7516*/
(*(void (__fastcall **)(_QWORD, void *, _QWORD, _QWORD))(BootServices + 288))( /*0x7533*/
*(_QWORD *)(a1 + 56),
&unk_9620,
*(_QWORD *)(a1 + 48),
*(_QWORD *)(a1 + 40));
v3 = &unk_95C0; /*0x7539*/
}
else
{
if ( v2 ) /*0x7545*/
(*(void (__fastcall **)(_QWORD, __int64))(*(_QWORD *)(a1 + 744) + 40LL))(*(_QWORD *)(a1 + 744), v2 + 40); /*0x7555*/
(*(void (__fastcall **)(_QWORD, void *, _QWORD, _QWORD))(BootServices + 288))( /*0x7572*/
*(_QWORD *)(a1 + 56),
&unk_95D0,
*(_QWORD *)(a1 + 48),
*(_QWORD *)(a1 + 40));
v3 = &unk_95E0; /*0x7578*/
}
DxeGetInfo_0(*(_QWORD *)(a1 + 40), *(_QWORD *)(a1 + 48), (__int64)v3, *(_QWORD *)(a1 + 56)); /*0x758b*/
if ( !IsListEmpty((_QWORD *)(a1 + 8)) ) /*0x7594*/
RemoveEntryList((_QWORD *)(a1 + 8)); /*0x75a1*/
AssertCpuDeadLoop_0(); /*0x75a9*/
return 0; /*0x75b5*/
}
// Function: DxeConfig_9 @ 0x75bc (0xc1 bytes)
__int64 __fastcall DxeConfig_9(__int64 a1, __int64 a2, char *buf)
{
__int64 *v6; // rax
__int64 v7; // rdi
__int64 v9; // rdx
__int64 v10; // rax
__int64 v11; // rax
__int64 v12; // rbx
if ( ((*(_BYTE *)(a1 + 32) - 4) & 0xFD) != 0 ) /*0x75db*/
Assert_( /*0x75f0*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c",
956,
(__int64)"(UdpIo->UdpVersion == 4) || (UdpIo->UdpVersion == 6)");
v6 = (__int64 *)DxeConfig_0(a1, a2, (__int64)buf); /*0x7608*/
v7 = (__int64)v6; /*0x760d*/
if ( !v6 ) /*0x7613*/
return 0x8000000000000009uLL; /*0x7615*/
InsertHeadList((__int64 *)(a1 + 720), v6 + 1); /*0x762c*/
v9 = v7 + 96; /*0x7635*/
v10 = *(_QWORD *)(a1 + 744); /*0x7639*/
if ( *(_BYTE *)(a1 + 32) == 4 ) /*0x7643*/
v11 = (*(__int64 (__fastcall **)(__int64, __int64))(v10 + 32))(v10, v9); /*0x7645*/
else
v11 = (*(__int64 (__fastcall **)(__int64, __int64))(v10 + 24))(v10, v9); /*0x764a*/
v12 = v11; /*0x764d*/
if ( v11 >= 0 ) /*0x7653*/
return 0; /*0x766b*/
RemoveEntryList((_QWORD *)(v7 + 8)); /*0x7659*/
DxeGetInfo_4(v7); /*0x7661*/
return v12; /*0x7677*/
}
// Function: DxeConfig_10 @ 0x7680 (0xbf bytes)
__int64 __fastcall DxeConfig_10(__int64 a1, __int64 (__fastcall *sub_3D3C)(), __int64 buf)
{
__int64 v7; // rax
__int64 v8; // rdi
bool v9; // zf
__int64 v10; // rdx
__int64 v11; // rax
__int64 v12; // rax
__int64 v13; // rsi
if ( ((*(_BYTE *)(a1 + 32) - 4) & 0xFD) != 0 ) /*0x769f*/
Assert_( /*0x76b4*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeUdpIoLib\\DxeUdpIoLib.c",
1064,
(__int64)"(UdpIo->UdpVersion == 4) || (UdpIo->UdpVersion == 6)");
if ( *(_QWORD *)(a1 + 736) ) /*0x76b9*/
return 0x8000000000000014uLL; /*0x76c3*/
v7 = DxeConfig_7(a1, sub_3D3C, buf); /*0x76d8*/
v8 = v7; /*0x76dd*/
if ( !v7 ) /*0x76e3*/
return 0x8000000000000009uLL; /*0x76e5*/
v9 = *(_BYTE *)(a1 + 32) == 4; /*0x76f1*/
v10 = v7 + 40; /*0x76f5*/
v11 = *(_QWORD *)(a1 + 744); /*0x76f9*/
*(_QWORD *)(a1 + 736) = v8; /*0x7703*/
if ( v9 ) /*0x770a*/
v12 = (*(__int64 (__fastcall **)(__int64, __int64))(v11 + 40))(v11, v10); /*0x770c*/
else
v12 = (*(__int64 (__fastcall **)(__int64, __int64))(v11 + 32))(v11, v10); /*0x7711*/
v13 = v12; /*0x7714*/
if ( v12 < 0 ) /*0x771a*/
{
*(_QWORD *)(a1 + 736) = 0; /*0x771c*/
DxeGetInfo_5(v8); /*0x7727*/
}
return v13; /*0x7739*/
}
// Function: ReadUnaligned64 @ 0x7740 (0x2f bytes)
__int64 __fastcall ReadUnaligned64(__int64 a1)
{
if ( !a1 ) /*0x774c*/
Assert_((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 192, (__int64)"Buffer != ((void *) 0)"); /*0x7761*/
return *(_QWORD *)a1; /*0x7769*/
}