Skip to content

Instantly share code, notes, and snippets.

@vient
Created March 25, 2019 06:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vient/ac555d5092e9256041a18ba0ca943b5e to your computer and use it in GitHub Desktop.
Save vient/ac555d5092e9256041a18ba0ca943b5e to your computer and use it in GitHub Desktop.
0ctf2019 Sixology
/* This file was generated by the Hex-Rays decompiler.
Copyright (c) 2007-2018 Hex-Rays <info@hex-rays.com>
Detected compiler: Visual C++
*/
#include <windows.h>
#include <defs.h>
#include <stdarg.h>
//-------------------------------------------------------------------------
// Function declarations
__int64 __fastcall notify(void *user_data, event_t notification_code, va_list va);
__int64 get_frame_retsize();
__int64 __fastcall ana(insn_t *insn); // idb
_QWORD *__fastcall sub_1800016B0(_QWORD *a1, _DWORD *a2);
_QWORD *__fastcall sub_180001730(_QWORD *a1, _QWORD *a2, void *a3, _QWORD *a4, __int64 a5, _QWORD *a6);
// _QWORD *__usercall std::_Tree<std::_Tmap_traits<unsigned long,std::basic_string<char,std::char_traits<char>,std::allocator<char>>,std::less<unsigned long>,std::allocator<std::pair<unsigned long const,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>,0>>::_Insert_hint<std::pair<unsigned long const,std::basic_string<char,std::char_traits<char>,std::allocator<char>>> &,std::_Tree_node<std::pair<unsigned long const,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>,void *> *>@<rax>(void *a1@<rcx>, _QWORD *a2@<rdx>, __int64 *a3@<r8>, unsigned int *a4@<r9>, __int64 a5);
__int64 __fastcall sub_180001C60(void *a1, __int64 a2, void *a3, unsigned int *a4, _QWORD *a5);
void __fastcall sub_180001DE0(void *a1, void *a2);
void __fastcall sub_180001E40(void *a1);
void __fastcall sub_180001E80(void *a1);
void __fastcall sub_180001E90(__int64 **a1);
qvector_t *__fastcall qvector_int::copy_ctr(qvector_t *a1, qvector_t *a2); // idb
__int64 *__fastcall sub_180001FC0(void *a1, int *a2);
void *__stdcall local_state_ctr();
_QWORD *__fastcall sub_180002180(_QWORD *a1);
void __fastcall sub_1800021E0(__int64 a1, __int64 a2);
void __fastcall sub_180002210(__int64 a1, __int64 *a2);
_QWORD *__fastcall sub_180002280(__int64 a1, __int64 a2);
_QWORD *__fastcall sub_1800022E0(__int64 a1, _QWORD *a2);
__int64 *__fastcall sub_180002340(__int64 *a1, _QWORD *a2);
// __int64 __fastcall get_sp_change(insn_t *insn); idb
char __fastcall create_func_frame(unsigned int *a1);
__int64 __fastcall sub_1800025D0(void *a1, insn_t *a2, op_t *a3, possible_values_t *a4, int a5); // idb
// char __usercall track_possible_values_cfg@<al>(void *a1@<rcx>, insn_t *insn@<rdx>, unsigned int a3@<r8d>, int reg_num@<r9d>, possible_values_t *values, int a6); idb
char __fastcall get_possible_values(void *a1, insn_t *insn, op_t *a3, possible_values_t *values, int a5); // idb
// __int64 __fastcall emu(insn_t *insn); idb
__int64 *__fastcall sub_1800036A0(__int64 **a1, __int64 *a2, __int64 a3, __int64 a4);
_QWORD *__fastcall sub_1800037A0(_QWORD *a1, _QWORD *a2, __int64 *a3);
void __fastcall emu_internal(insn_t *insn, op_t *op, char use);
char __fastcall sub_180003D20(__int64 a1);
char __fastcall is_basic_block_end(__int64 a1);
__int64 __fastcall qvector_int::push_back(qvector_t *this, unsigned int *a2); // idb
char __fastcall insn_changes_reg(insn_t *insn, int reg_num); // idb
bool __fastcall out_insn(__int64 a1);
bool __fastcall sub_180003FF0(outctx_t *a1);
__int64 __fastcall out_mnem(__int64 a1);
char __fastcall sub_180004100(outctx_t *a1, op_t *op);
char __fastcall out_operand(outctx_t *outctx, op_t *op);
void sub_180004290(outctx_t *a1, const char *a2, ...); // idb
// __int64 __fastcall netnode_check(__int64 a1, __int64 a2, __int64 a3, __int64 a4);
// __int64 __fastcall hook_to_notification_point(_QWORD, _QWORD); weak
// __int64 __fastcall unhook_from_notification_point(_QWORD, _QWORD); weak
// __int64 __fastcall gen_decorate_name(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall get_bytes(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall qfree(qvector_t *a1); idb
// __int64 __fastcall qsnprintf(_QWORD, _QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall qalloc_or_throw(_QWORD); weak
// __int64 __fastcall qvector_reserve(qvector_t *a1, __int64 a2, __int64 a3, __int64 a4); idb
// __int64 __fastcall netnode_altval(_QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall netnode_supset(_QWORD, _QWORD, _QWORD, _QWORD, _DWORD); weak
// __int64 __fastcall get_switch_info(_QWORD, _QWORD); weak
// __int64 __fastcall set_switch_info(_QWORD, _QWORD); weak
// __int64 __fastcall getseg(_QWORD); weak
// __int64 __fastcall get_segm_name(_QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall segtype(_QWORD); weak
// __int64 __fastcall get_flags_ex(_QWORD, _QWORD); weak
// __int64 __fastcall is_loaded(_QWORD); weak
// __int64 __fastcall get_byte(_QWORD); weak
// __int64 __fastcall get_word(_QWORD); weak
// __int64 __fastcall get_dword(_QWORD); weak
// __int64 __fastcall op_adds_xrefs(_QWORD, _QWORD); weak
// __int64 __fastcall set_immd(__int64 a1);
// __int64 __fastcall set_cmt(_QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall get_func(_QWORD); weak
// __int64 __fastcall update_func(_QWORD); weak
// __int64 __fastcall add_cref(_QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall xrefblk_t_first_from(_QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall xrefblk_t_next_from(_QWORD); weak
// __int64 __fastcall xrefblk_t_first_to(_QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall xrefblk_t_next_to(_QWORD); weak
// __int64 __fastcall create_switch_table(_QWORD, _QWORD); weak
// __int64 __fastcall create_switch_xrefs(_QWORD, _QWORD); weak
// __int64 __fastcall insn_create_op_data(_QWORD, _QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall insn_add_cref(_QWORD, _QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall insn_add_dref(_QWORD, _QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall insn_add_off_drefs(_QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall decode_insn(_QWORD, _QWORD); weak
// __int64 __fastcall decode_prev_insn(insn_t *a1, __int64 a2);
// __int64 __fastcall has_insn_feature(_QWORD, _QWORD); weak
// __int64 get_auto_state(void); weak
// __int64 __fastcall add_frame(_QWORD, _QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall add_auto_stkpnt(_QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall get_spd(_QWORD, _QWORD); weak
// __int64 __fastcall recalc_spd(_QWORD); weak
// __int64 __fastcall remember_problem(_QWORD, _QWORD, _QWORD); weak
// void __fastcall `eh vector constructor iterator'(void *, unsigned __int64, int, void (__stdcall *)(void *), void (__stdcall *)(void *)); idb
// void __fastcall `eh vector copy constructor iterator'(void *, void *, unsigned __int64, int, void (__stdcall *)(void *, void *), void (__stdcall *)(void *)); idb
// void __fastcall `eh vector destructor iterator'(void *, unsigned __int64, int, void (__stdcall *)(void *)); idb
// void *__stdcall operator new(unsigned __int64); idb
// void __stdcall operator delete(void *); idb
// __int64 __fastcall CxxThrowException(_QWORD, _QWORD); weak
// void *__cdecl memset(void *Dst, int Val, size_t Size);
// __int64 __fastcall CRT_INIT(_QWORD, _QWORD, _QWORD); weak
// BOOL __stdcall DllEntryPoint(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved);
// __int64 __fastcall _DllMainCRTStartup(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); idb
// void __cdecl _security_init_cookie();
// BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);
void __cdecl RTC_Terminate();
void __cdecl RTC_Terminate_0();
void __fastcall sub_180004F50();
// __int64 __fastcall _clean_type_info_names_internal(_QWORD); weak
// void __usercall __noreturn sub_180004FC9(__int64 a1@<rbp>);
// void __usercall __noreturn sub_18000506D(__int64 a1@<rbp>);
// void __usercall __noreturn sub_18000508D(__int64 a1@<rbp>);
// __int64 __fastcall netnode_check(_QWORD, _QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall qfree(_QWORD); weak
// __int64 __fastcall qvector_reserve(_QWORD, _QWORD, _QWORD, _QWORD); weak
// __int64 __fastcall set_immd(_QWORD); weak
// __int64 __fastcall decode_prev_insn(_QWORD, _QWORD); weak
// void __stdcall std::_Xlength_error(const char *); weak
// void __stdcall std::_Xout_of_range(const char *); weak
// void std::_Xbad_alloc(void); weak
//-------------------------------------------------------------------------
// Data declarations
// extern _DWORD inf[]; idb
// extern processor_t *ph;
char aRodata[8] = ".rodata"; // weak
_UNKNOWN unk_180006EA2; // weak
_UNKNOWN unk_180006F78; // weak
_UNKNOWN unk_180006F88; // weak
int dword_180009090 = 4294967295; // weak
_UNKNOWN unk_180009848; // weak
//----- (0000000180001000) ----------------------------------------------------
__int64 __fastcall notify(void *user_data, event_t notification_code, va_list va)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
va& = va;
if ( notification_code > ev_max_ptr_size )
{
v13 = notification_code - ev_get_default_enum_size;
if ( v13 )
{
v14 = v13 - 8;
if ( v14 && v14 == 9 ) // ev_decorate_name
result = (unsigned __int8)gen_decorate_name(
*(_QWORD *)va,
*((_QWORD *)va + 1),
(unsigned __int8)va[16],
(unsigned __int8)va[24],
*((_QWORD *)va + 4)) != 0;
else
LABEL_5:
result = 0i64;
}
else
{
result = LOBYTE(inf[46]);
}
}
else if ( notification_code == ev_max_ptr_size )
{
result = 4i64;
}
else
{
switch ( notification_code )
{
case ev_init:
LOBYTE(va&) = 1;
netnode_check((__int64)&dword_180009090, (__int64)"$ 0ctf", 0i64, (__int64)va&);
inf[6] &= 0xFFFFFFDF;
hook_to_notification_point(3i64, get_frame_retsize);
goto LABEL_5;
case ev_term:
unhook_from_notification_point(3i64, get_frame_retsize);
return 0i64;
case ev_ana_insn:
return (int)ana(*(insn_t **)va);
case ev_emu_insn:
v8 = emu(*(insn_t **)va);
v9 = -1i64;
if ( v8 )
v9 = 1i64;
return v9;
case ev_out_header:
case ev_out_footer:
case ev_out_segstart:
goto LABEL_8;
case ev_out_insn:
out_insn(*(_QWORD *)va);
return 1i64;
case ev_out_mnem:
out_mnem(*(_QWORD *)va);
LABEL_8:
result = 1i64;
break;
case ev_out_operand:
v10 = out_operand(*(outctx_t **)va, *((op_t **)va + 1));
v11 = -1i64;
if ( v10 )
v11 = 1i64;
result = v11;
break;
case ev_is_ret_insn:
v7 = -1i64;
if ( *(_WORD *)(*(_QWORD *)va + offsetof(insn_t, itype)) == 29 )
v7 = 1i64;
result = v7;
break;
case ev_is_basic_block_end:
v5 = is_basic_block_end(*(_QWORD *)va);
v6 = -1i64;
if ( v5 )
v6 = 1i64;
result = v6;
break;
case ev_create_func_frame:
create_func_frame(*(unsigned int **)va);
result = 1i64;
break;
case ev_get_frame_retsize:
v12 = *(insn_t **)va;
v12->cs = get_frame_retsize();
result = 1i64;
break;
default:
goto LABEL_5;
}
}
return result;
}
// 1800042BA: using guessed type __int64 __fastcall hook_to_notification_point(_QWORD, _QWORD);
// 1800042C0: using guessed type __int64 __fastcall unhook_from_notification_point(_QWORD, _QWORD);
// 1800042C6: using guessed type __int64 __fastcall gen_decorate_name(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD);
// 180009090: using guessed type int dword_180009090;
//----- (0000000180001260) ----------------------------------------------------
__int64 get_frame_retsize()
{
return 0i64;
}
//----- (0000000180001270) ----------------------------------------------------
__int64 __fastcall ana(insn_t *insn)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
ea = insn->ea;
insn& = insn;
insn_bytes = O_VOID;
if ( get_bytes(&insn_bytes, 4i64, ea, 0i64, O_VOID) != 4 )
return 0i64;
insn_bytes& = insn_bytes;
insn&->size = 4;
insn&->itype = (insn_bytes& >> 12) & 0x1F;
switch ( (insn_bytes& >> 12) & 0x1F ) // itype
{
case OPC_ENTER:
insn&->ops[0].type = O_IMM;
insn&->ops[0].dtype = DT_DWORD;
insn&->ops[0].value_union.value = (insn_bytes& >> 20) | ((insn_bytes& & 0xFFF) << 12);
return insn&->size;
case OPC_STORE:
case OPC_LOADM:
insn&->ops[0].type = O_REG;
v5 = (insn_bytes& >> 19) & 3;
insn&->ops[0].reg_union.reg = (insn_bytes& >> 27) & 0x1F;
insn&->ops[0].dtype = (insn_bytes& >> 19) & 3;
switch ( (insn_bytes& >> 17) & 3 )
{
case 1u:
insn&->ops[1].type = O_PHRASE;
insn&->ops[1].dtype = v5;
insn&->ops[1].reg_union.phrase = (insn_bytes& >> 22) & 0x1F;
break;
case 2u:
insn&->ops[1].type = 4;
insn&->ops[1].dtype = v5;
insn&->ops[1].addr_union.addr = insn_bytes& & 0xFFF;
insn&->ops[1].reg_union.phrase = (insn_bytes& >> 22) & 0x1F;
break;
case 3u:
insn&->ops[1].type = O_MEM;
insn&->ops[1].dtype = v5;
insn&->ops[1].addr_union.addr = insn_bytes& & 0xFFF;
break;
}
return insn&->size;
case OPC_SWAP:
case OPC_LOADR:
insn&->ops[0].type = O_REG;
insn&->ops[0].dtype = DT_DWORD;
insn&->ops[0].reg_union.reg = (insn_bytes& >> 27) & 0x1F;
goto LABEL_15;
case OPC_LEAVE:
case OPC_RET:
insn&->ops[0].type = O_VOID;
return insn&->size;
case OPC_LPBEG:
insn&->ops[0].type = O_NEAR;
insn&->ops[0].dtype = DT_DWORD;
insn&->ops[0].addr_union.addr = insn&->ea + 4 + (__int16)(4 * (insn_bytes& & 0xFFF | (insn_bytes& >> 17 << 12)));
LABEL_15:
insn&->ops[1].type = O_REG;
insn&->ops[1].dtype = DT_DWORD;
insn&->ops[1].reg_union.reg = (insn_bytes& >> 22) & 0x1F;
return insn&->size;
case OPC_ADD:
case OPC_NOR:
case OPC_SUB:
insn&->ops[0].type = O_REG;
insn&->ops[0].reg_union.reg = (insn_bytes& >> 27) & 0x1F;
goto LABEL_17;
case OPC_LOADI:
v6 = insn&->ea + 4;
v11 = O_VOID;
if ( get_bytes(&v11, 4i64, v6, 0i64, O_VOID) != 4 )
return 0i64;
v7 = insn_bytes;
v8 = v11;
insn&->ops[0].type = O_REG;
insn&->ops[0].dtype = DT_DWORD;
insn&->ops[1].type = O_IMM;
insn&->ops[1].dtype = DT_DWORD;
insn&->ops[0].reg_union.reg = (v7 >> 27) & 0x1F;
insn&->ops[1].value_union.value = v8 ^ 0x46544330;
insn&->size += 4;
return insn&->size;
case OPC_CALL:
case OPC_JMP:
insn&->ops[0].type = O_NEAR;
insn&->ops[0].dtype = DT_DWORD;
insn&->ops[0].addr_union.addr = insn&->ea + 4 + (__int16)(4 * (insn_bytes& & 0xFFF | (insn_bytes& >> 17 << 12)));
return insn&->size;
case OPC_CMP:
case OPC_STRCMP:
insn&->ops[0].type = O_IDPSPEC0;
insn&->ops[0].reg_union.reg = ((insn_bytes& >> 30) & 3) + 32;
insn&->ops[0].specflag1 = (insn_bytes& >> 27) & 3;
LABEL_17:
insn&->ops[0].dtype = DT_DWORD;
insn&->ops[1].type = O_REG;
insn&->ops[1].dtype = DT_DWORD;
insn&->ops[2].type = O_REG;
insn&->ops[2].reg_union.reg = (insn_bytes& >> 17) & 0x1F;
insn&->ops[1].reg_union.reg = (insn_bytes& >> 22) & 0x1F;
insn&->ops[2].dtype = DT_DWORD;
break;
case OPC_LPEND:
insn&->ops[0].type = O_NEAR;
insn&->ops[0].dtype = DT_DWORD;
insn&->ops[0].addr_union.addr = insn&->ea + 4 + (__int16)(4 * (insn_bytes& >> 17));
break;
case OPC_DIV:
insn&->ops[0].type = O_REG;
insn&->ops[0].dtype = DT_DWORD;
insn&->ops[1].type = O_REG;
insn&->ops[1].dtype = DT_DWORD;
insn&->ops[2].type = O_REG;
insn&->ops[2].dtype = DT_DWORD;
insn&->ops[0].reg_union.reg = (insn_bytes& >> 27) & 0x1F;
insn&->ops[3].type = O_REG;
insn&->ops[3].dtype = DT_DWORD;
insn&->ops[1].reg_union.reg = (insn_bytes& >> 2) & 0x1F;
insn&->ops[3].reg_union.reg = (insn_bytes& >> 17) & 0x1F;
insn&->ops[2].reg_union.reg = (insn_bytes& >> 22) & 0x1F;
break;
case OPC_SWITCH:
insn&->ops[0].type = O_REG;
insn&->ops[0].dtype = DT_DWORD;
insn&->ops[1].type = O_NEAR;
insn&->ops[1].dtype = DT_DWORD;
insn&->ops[0].reg_union.reg = (insn_bytes& >> 29) & 7;
v9 = insn&->ea;
insn&->ops[2].type = O_IDPSPEC1;
insn&->ops[2].dtype = DT_DWORD;
insn&->ops[1].addr_union.addr = v9 + 4 + (__int16)(4 * (insn_bytes& & 0xFFF));
insn&->ops[2].addr_union.addr = insn&->ea + 4 + (__int16)(4 * ((insn_bytes& >> 17) & 0xFFF));
break;
case OPC_JNZ:
insn&->ops[0].type = O_REG;
insn&->ops[0].dtype = DT_DWORD;
insn&->ops[1].type = O_NEAR;
insn&->ops[1].dtype = DT_DWORD;
insn&->ops[0].reg_union.reg = ((insn_bytes& >> 30) & 3) + 32;
insn&->ops[1].addr_union.addr = insn&->ea + 4 + (__int16)(4 * (insn_bytes& & 0xFFF | (insn_bytes& >> 17 << 12)));
break;
default:
return insn&->size;
}
return insn&->size;
}
// 1800042CC: using guessed type __int64 __fastcall get_bytes(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD);
//----- (00000001800016B0) ----------------------------------------------------
_QWORD *__fastcall sub_1800016B0(_QWORD *a1, _DWORD *a2)
{
_DWORD *v2; // rdi
_QWORD *v3; // rax
_QWORD *v4; // rbx
v2 = a2;
v3 = sub_180002180(a1);
v4 = v3;
*((_WORD *)v3 + 12) = 0;
if ( v3 == (_QWORD *)-32i64 )
return v4;
*((_DWORD *)v3 + 8) = *v2;
`eh vector copy constructor iterator'(
v3 + 5,
v2 + 2,
0x28ui64,
36,
(void (__stdcall *)(void *, void *))sub_180001DE0,
(void (__stdcall *)(void *))sub_180001E80);
return v4;
}
//----- (0000000180001730) ----------------------------------------------------
_QWORD *__fastcall sub_180001730(_QWORD *a1, _QWORD *a2, void *a3, _QWORD *a4, __int64 a5, _QWORD *a6)
{
unsigned __int64 v6; // rax
_QWORD *v7; // r10
_QWORD *v8; // rbx
__int64 v9; // rax
_QWORD *v10; // rax
__int64 *v11; // rcx
__int64 *v12; // r8
__int64 *v13; // rdx
__int64 v14; // rdx
_QWORD *v15; // rdx
_QWORD *v16; // rcx
_QWORD *v17; // rdx
_QWORD *v18; // r8
__int64 v19; // rcx
_QWORD *v20; // rcx
__int64 v21; // rdx
__int64 v22; // rcx
_QWORD *v23; // rcx
_QWORD *v24; // rcx
__int64 v25; // rax
__int64 v26; // rcx
_QWORD *result; // rax
v6 = a1[1];
v7 = a1;
v8 = a2;
if ( v6 >= 0x2C47F4EE02C47Ei64 )
{
`eh vector destructor iterator'(a6 + 5, 0x28ui64, 36, (void (__stdcall *)(void *))sub_180001E80);
operator delete(a6);
std::_Xlength_error("map/set<T> too long");
__debugbreak();
}
a1[1] = v6 + 1;
a6[1] = a4;
if ( a4 == (_QWORD *)*a1 )
{
*(_QWORD *)(*a1 + 8i64) = a6;
*(_QWORD *)*a1 = a6;
v9 = *a1;
LABEL_10:
*(_QWORD *)(v9 + 16) = a6;
goto LABEL_11;
}
if ( !(_BYTE)a3 )
{
a4[2] = a6;
v9 = *a1;
if ( a4 != *(_QWORD **)(*a1 + 16i64) )
goto LABEL_11;
goto LABEL_10;
}
*a4 = a6;
if ( a4 == *(_QWORD **)*a1 )
*(_QWORD *)*a1 = a6;
LABEL_11:
v10 = a6;
while ( !*(_BYTE *)(v10[1] + 24i64) )
{
v11 = (__int64 *)v10[1];
v12 = (__int64 *)v11[1];
v13 = (__int64 *)*v12;
if ( v11 == (__int64 *)*v12 )
{
v14 = v12[2];
if ( *(_BYTE *)(v14 + 24) )
{
if ( v10 == (_QWORD *)v11[2] )
{
v15 = (_QWORD *)v11[2];
v10 = (_QWORD *)v10[1];
v11[2] = *v15;
if ( !*(_BYTE *)(*v15 + 25i64) )
*(_QWORD *)(*v15 + 8i64) = v11;
v15[1] = v11[1];
if ( v11 == *(__int64 **)(*v7 + 8i64) )
{
*(_QWORD *)(*v7 + 8i64) = v15;
}
else
{
v16 = (_QWORD *)v11[1];
if ( v10 == (_QWORD *)*v16 )
*v16 = v15;
else
v16[2] = v15;
}
*v15 = v10;
v10[1] = v15;
}
*(_BYTE *)(v10[1] + 24i64) = 1;
*(_BYTE *)(*(_QWORD *)(v10[1] + 8i64) + 24i64) = 0;
v17 = *(_QWORD **)(v10[1] + 8i64);
v18 = (_QWORD *)*v17;
*v17 = *(_QWORD *)(*v17 + 16i64);
v19 = v18[2];
if ( !*(_BYTE *)(v19 + 25) )
*(_QWORD *)(v19 + 8) = v17;
v18[1] = v17[1];
if ( v17 == *(_QWORD **)(*v7 + 8i64) )
{
*(_QWORD *)(*v7 + 8i64) = v18;
v18[2] = v17;
}
else
{
v20 = (_QWORD *)v17[1];
if ( v17 == (_QWORD *)v20[2] )
v20[2] = v18;
else
*v20 = v18;
v18[2] = v17;
}
LABEL_51:
v17[1] = v18;
continue;
}
*((_BYTE *)v11 + 24) = 1;
*(_BYTE *)(v14 + 24) = 1;
*(_BYTE *)(*(_QWORD *)(v10[1] + 8i64) + 24i64) = 0;
v10 = *(_QWORD **)(v10[1] + 8i64);
}
else
{
if ( *((_BYTE *)v13 + 24) )
{
if ( v10 == (_QWORD *)*v11 )
{
v21 = *v11;
v10 = (_QWORD *)v10[1];
*v11 = *(_QWORD *)(*v11 + 16);
v22 = *(_QWORD *)(v21 + 16);
if ( !*(_BYTE *)(v22 + 25) )
*(_QWORD *)(v22 + 8) = v10;
*(_QWORD *)(v21 + 8) = v10[1];
if ( v10 == *(_QWORD **)(*v7 + 8i64) )
{
*(_QWORD *)(*v7 + 8i64) = v21;
}
else
{
v23 = (_QWORD *)v10[1];
if ( v10 == (_QWORD *)v23[2] )
v23[2] = v21;
else
*v23 = v21;
}
*(_QWORD *)(v21 + 16) = v10;
v10[1] = v21;
}
*(_BYTE *)(v10[1] + 24i64) = 1;
*(_BYTE *)(*(_QWORD *)(v10[1] + 8i64) + 24i64) = 0;
v17 = *(_QWORD **)(v10[1] + 8i64);
v18 = (_QWORD *)v17[2];
v17[2] = *v18;
if ( !*(_BYTE *)(*v18 + 25i64) )
*(_QWORD *)(*v18 + 8i64) = v17;
v18[1] = v17[1];
if ( v17 == *(_QWORD **)(*v7 + 8i64) )
{
*(_QWORD *)(*v7 + 8i64) = v18;
}
else
{
v24 = (_QWORD *)v17[1];
if ( v17 == (_QWORD *)*v24 )
*v24 = v18;
else
v24[2] = v18;
}
*v18 = v17;
goto LABEL_51;
}
*((_BYTE *)v11 + 24) = 1;
*((_BYTE *)v13 + 24) = 1;
*(_BYTE *)(*(_QWORD *)(v10[1] + 8i64) + 24i64) = 0;
v10 = *(_QWORD **)(v10[1] + 8i64);
}
}
v25 = *v7;
*v8 = a6;
v26 = *(_QWORD *)(v25 + 8);
result = v8;
*(_BYTE *)(v26 + 24) = 1;
return result;
}
// 1800061D8: using guessed type void __stdcall std::_Xlength_error(const char *);
//----- (00000001800019F0) ----------------------------------------------------
_QWORD *__usercall std::_Tree<std::_Tmap_traits<unsigned long,std::basic_string<char,std::char_traits<char>,std::allocator<char>>,std::less<unsigned long>,std::allocator<std::pair<unsigned long const,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>,0>>::_Insert_hint<std::pair<unsigned long const,std::basic_string<char,std::char_traits<char>,std::allocator<char>>> &,std::_Tree_node<std::pair<unsigned long const,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>,void *> *>@<rax>(void *a1@<rcx>, _QWORD *a2@<rdx>, __int64 *a3@<r8>, unsigned int *a4@<r9>, __int64 a5)
{
unsigned int *v5; // r11
_QWORD *v6; // rbx
_QWORD *v7; // r10
__int64 **v9; // rcx
__int64 *v10; // r9
__int64 *v11; // r9
unsigned int v12; // esi
bool v13; // cf
__int64 *v14; // rax
__int64 *v15; // r9
__int64 *j; // rax
__int64 *i; // rdx
__int64 *v18; // r9
__int64 *v19; // r9
__int64 **v20; // rax
__int64 *l; // rax
__int64 *k; // rax
__int64 v23; // [rsp+20h] [rbp-38h]
char v24; // [rsp+38h] [rbp-20h]
v5 = a4;
v6 = a2;
v7 = a1;
if ( !*((_QWORD *)a1 + 1) )
{
LOBYTE(a3) = 1;
sub_180001730(a1, a2, a3, *(_QWORD **)a1, (__int64)a4, (_QWORD *)a5);
return v6;
}
v9 = *(__int64 ***)a1;
if ( a3 == *v9 )
{
if ( *a4 < *((_DWORD *)a3 + 8) )
{
v23 = (__int64)a4;
v10 = a3;
LOBYTE(a3) = 1;
sub_180001730(v7, a2, a3, v10, v23, (_QWORD *)a5);
return v6;
}
goto LABEL_43;
}
if ( a3 == (__int64 *)v9 )
{
v11 = v9[2];
if ( *((_DWORD *)v11 + 8) < *v5 )
{
sub_180001730(v7, a2, 0i64, v11, (__int64)v5, (_QWORD *)a5);
return v6;
}
goto LABEL_43;
}
v12 = *a4;
v13 = *((_DWORD *)a3 + 8) < *a4;
if ( *((_DWORD *)a3 + 8) > *a4 )
{
v14 = a3;
if ( *((_BYTE *)a3 + 25) )
{
v15 = (__int64 *)a3[2];
}
else
{
v15 = (__int64 *)*a3;
if ( *(_BYTE *)(*a3 + 25) )
{
for ( i = (__int64 *)a3[1]; !*((_BYTE *)i + 25); i = (__int64 *)i[1] )
{
if ( v14 != (__int64 *)*i )
break;
v14 = i;
}
v15 = v14;
if ( !*((_BYTE *)v14 + 25) )
v15 = i;
}
else
{
for ( j = (__int64 *)v15[2]; !*((_BYTE *)j + 25); j = (__int64 *)j[2] )
v15 = j;
}
}
if ( *((_DWORD *)v15 + 8) < v12 )
{
if ( *(_BYTE *)(v15[2] + 25) )
{
sub_180001730(v7, v6, 0i64, v15, (__int64)v5, (_QWORD *)a5);
}
else
{
v18 = a3;
LOBYTE(a3) = 1;
sub_180001730(v7, v6, a3, v18, (__int64)v5, (_QWORD *)a5);
}
return v6;
}
v13 = *((_DWORD *)a3 + 8) < v12;
}
if ( !v13 )
goto LABEL_43;
v19 = a3;
if ( !*((_BYTE *)a3 + 25) )
{
v20 = (__int64 **)a3[2];
if ( *((_BYTE *)v20 + 25) )
{
for ( k = (__int64 *)a3[1]; !*((_BYTE *)k + 25); k = (__int64 *)k[1] )
{
if ( v19 != (__int64 *)k[2] )
break;
v19 = k;
}
v19 = k;
}
else
{
v19 = (__int64 *)a3[2];
for ( l = *v20; !*((_BYTE *)l + 25); l = (__int64 *)*l )
v19 = l;
}
}
if ( v19 != (__int64 *)v9 && v12 >= *((_DWORD *)v19 + 8) )
{
LABEL_43:
*v6 = *(_QWORD *)sub_180001C60(v7, (__int64)&v24, 0i64, v5, (_QWORD *)a5);
return v6;
}
if ( *(_BYTE *)(a3[2] + 25) )
{
sub_180001730(v7, v6, 0i64, a3, (__int64)v5, (_QWORD *)a5);
}
else
{
LOBYTE(a3) = 1;
sub_180001730(v7, v6, a3, v19, (__int64)v5, (_QWORD *)a5);
}
return v6;
}
//----- (0000000180001C60) ----------------------------------------------------
__int64 __fastcall sub_180001C60(void *a1, __int64 a2, void *a3, unsigned int *a4, _QWORD *a5)
{
unsigned int *v5; // rsi
char v6; // r10
__int64 v7; // rdi
__int64 *v8; // rax
__int64 *v9; // r9
unsigned int v10; // edx
__int64 *v11; // rbx
__int64 *j; // rax
__int64 *i; // rax
int v15; // [rsp+38h] [rbp-10h]
v5 = a4;
v6 = (char)a3;
v7 = a2;
v8 = *(__int64 **)(*(_QWORD *)a1 + 8i64);
v9 = *(__int64 **)a1;
LOBYTE(a3) = 1;
if ( !*((_BYTE *)v8 + 25) )
{
v10 = *v5;
do
{
v9 = v8;
if ( v6 )
LOBYTE(a3) = *((_DWORD *)v8 + 8) >= v10;
else
LOBYTE(a3) = v10 < *((_DWORD *)v8 + 8);
if ( (_BYTE)a3 )
v8 = (__int64 *)*v8;
else
v8 = (__int64 *)v8[2];
}
while ( !*((_BYTE *)v8 + 25) );
}
v11 = v9;
if ( (_BYTE)a3 )
{
if ( v9 == **(__int64 ***)a1 )
{
LOBYTE(a3) = 1;
*(_QWORD *)v7 = *sub_180001730(a1, &v15, a3, v9, (__int64)v5, a5);
*(_BYTE *)(v7 + 8) = 1;
return v7;
}
if ( *((_BYTE *)v9 + 25) )
{
v11 = (__int64 *)v9[2];
}
else if ( *(_BYTE *)(*v9 + 25) )
{
for ( i = (__int64 *)v9[1]; !*((_BYTE *)i + 25); i = (__int64 *)i[1] )
{
if ( v11 != (__int64 *)*i )
break;
v11 = i;
}
if ( !*((_BYTE *)v11 + 25) )
v11 = i;
}
else
{
v11 = (__int64 *)*v9;
for ( j = *(__int64 **)(*v9 + 16); !*((_BYTE *)j + 25); j = (__int64 *)j[2] )
v11 = j;
}
}
if ( *((_DWORD *)v11 + 8) >= *v5 )
{
`eh vector destructor iterator'(a5 + 5, 0x28ui64, 36, (void (__stdcall *)(void *))sub_180001E80);
operator delete(a5);
*(_QWORD *)v7 = v11;
*(_BYTE *)(v7 + 8) = 0;
}
else
{
*(_QWORD *)v7 = *sub_180001730(a1, &v15, a3, v9, (__int64)v5, a5);
*(_BYTE *)(v7 + 8) = 1;
}
return v7;
}
//----- (0000000180001DE0) ----------------------------------------------------
void __fastcall sub_180001DE0(void *a1, void *a2)
{
_BYTE *v2; // rdi
__int64 *v3; // rcx
_BYTE *v4; // rbx
v2 = a1;
v3 = (__int64 *)((char *)a1 + 8);
*((_DWORD *)v3 - 2) = *(_DWORD *)a2;
v4 = a2;
*((_DWORD *)v3 - 1) = *((_DWORD *)a2 + 1);
*v3 = 0i64;
v3[1] = 0i64;
v3[2] = 0i64;
sub_180002340(v3, (_QWORD *)a2 + 1);
v2[32] = v4[32];
v2[33] = v4[33];
}
//----- (0000000180001E40) ----------------------------------------------------
void __fastcall sub_180001E40(void *a1)
{
*((_DWORD *)a1 + 1) = -1;
*(_DWORD *)a1 = 0;
*((_QWORD *)a1 + 1) = 0i64;
*((_QWORD *)a1 + 2) = 0i64;
*((_QWORD *)a1 + 3) = 0i64;
*((_WORD *)a1 + 16) = 0;
}
//----- (0000000180001E80) ----------------------------------------------------
void __fastcall sub_180001E80(void *a1)
{
qfree(*((qvector_t **)a1 + 1));
}
//----- (0000000180001E90) ----------------------------------------------------
void __fastcall sub_180001E90(__int64 **a1)
{
void **v1; // rbx
char v2; // [rsp+30h] [rbp+8h]
v1 = (void **)a1;
sub_1800036A0(a1, (__int64 *)&v2, **a1, (__int64)*a1);
operator delete(*v1);
}
//----- (0000000180001EF0) ----------------------------------------------------
qvector_t *__fastcall qvector_int::copy_ctr(qvector_t *a1, qvector_t *a2)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
v2 = a2;
v3 = a1;
if ( a1 == a2 )
return v3;
v4 = a2->length;
if ( a1->length < v4 )
v4 = a1->length;
for ( i = 0i64; i < v4; a1->begin[i - 1] = v2->begin[i - 1] )
++i;
v6 = v2->length;
if ( a1->length > v6 )
{
a1->length = v6;
return a1;
}
if ( v6 > a1->capacity )
a1->begin = (_DWORD *)qvector_reserve(a1, (__int64)a1->begin, v6, 4i64);
for ( ; v3->length < v2->length; ++v3->length )
{
v8 = v3->length;
v9 = &v3->begin[v8];
if ( v9 )
*v9 = v2->begin[v8];
}
return v3;
}
//----- (0000000180001FC0) ----------------------------------------------------
__int64 *__fastcall sub_180001FC0(void *a1, int *a2)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
v10 = -2i64;
v2 = a2;
v3 = a1;
v4 = *(__int64 **)a1;
v5 = *(__int64 **)(*(_QWORD *)a1 + 8i64);
v6 = v4;
while ( !*((_BYTE *)v5 + 25) )
{
if ( *((_DWORD *)v5 + 8) >= (unsigned int)*a2 )
{
v6 = v5;
v5 = (__int64 *)*v5;
}
else
{
v5 = (__int64 *)v5[2];
}
}
if ( v6 != v4 && (unsigned int)*a2 >= *((_DWORD *)v6 + 8) )
return v6 + 5;
`eh vector constructor iterator'(
&v11,
0x28ui64,
36,
(void (__stdcall *)(void *))sub_180001E40,
(void (__stdcall *)(void *))sub_180001E80);
v12 = *v2;
`eh vector copy constructor iterator'(
&v13,
&v11,
0x28ui64,
36,
(void (__stdcall *)(void *, void *))sub_180001DE0,
(void (__stdcall *)(void *))sub_180001E80);
v7 = (unsigned int *)sub_1800016B0(v3, &v12);
std::_Tree<std::_Tmap_traits<unsigned long,std::basic_string<char,std::char_traits<char>,std::allocator<char>>,std::less<unsigned long>,std::allocator<std::pair<unsigned long const,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>,0>>::_Insert_hint<std::pair<unsigned long const,std::basic_string<char,std::char_traits<char>,std::allocator<char>>> &,std::_Tree_node<std::pair<unsigned long const,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>,void *> *>(
v3,
v9,
v6,
v7 + 8,
(__int64)v7);
v6 = *(__int64 **)v9;
`eh vector destructor iterator'(&v13, 0x28ui64, 36, (void (__stdcall *)(void *))sub_180001E80);
`eh vector destructor iterator'(&v11, 0x28ui64, 36, (void (__stdcall *)(void *))sub_180001E80);
return v6 + 5;
}
//----- (0000000180002130) ----------------------------------------------------
void *__stdcall local_state_ctr()
{
void *result; // rax
result = operator new(0x5C8ui64);
if ( !result )
std::_Xbad_alloc();
*(_QWORD *)result = result;
if ( result != (void *)-8i64 )
*((_QWORD *)result + 1) = result;
if ( result != (void *)-16i64 )
*((_QWORD *)result + 2) = result;
*((_WORD *)result + 12) = 257;
return result;
}
// 180002158: variable 'result' is possibly undefined
// 1800061E8: using guessed type void std::_Xbad_alloc(void);
//----- (0000000180002180) ----------------------------------------------------
_QWORD *__fastcall sub_180002180(_QWORD *a1)
{
_QWORD *v1; // rbx
_QWORD *v2; // rdx
v1 = a1;
v2 = operator new(0x5C8ui64);
if ( !v2 )
std::_Xbad_alloc();
*v2 = *v1;
if ( v2 != (_QWORD *)-8i64 )
v2[1] = *v1;
if ( v2 != (_QWORD *)-16i64 )
v2[2] = *v1;
return v2;
}
// 1800021B3: variable 'v2' is possibly undefined
// 1800061E8: using guessed type void std::_Xbad_alloc(void);
//----- (00000001800021E0) ----------------------------------------------------
void __fastcall sub_1800021E0(__int64 a1, __int64 a2)
{
void *v2; // rbx
v2 = (void *)a2;
`eh vector destructor iterator'((void *)(a2 + 40), 0x28ui64, 36, (void (__stdcall *)(void *))sub_180001E80);
operator delete(v2);
}
//----- (0000000180002210) ----------------------------------------------------
void __fastcall sub_180002210(__int64 a1, __int64 *a2)
{
__int64 *v2; // rdi
__int64 v3; // rsi
__int64 *i; // rbx
v2 = a2;
v3 = a1;
for ( i = a2; !*((_BYTE *)i + 25); v2 = i )
{
sub_180002210(v3, (__int64 *)i[2]);
i = (__int64 *)*i;
`eh vector destructor iterator'(v2 + 5, 0x28ui64, 36, (void (__stdcall *)(void *))sub_180001E80);
operator delete(v2);
}
}
//----- (0000000180002280) ----------------------------------------------------
_QWORD *__fastcall sub_180002280(__int64 a1, __int64 a2)
{
_QWORD *v2; // r8
_QWORD *result; // rax
v2 = *(_QWORD **)(a2 + 16);
*(_QWORD *)(a2 + 16) = *v2;
if ( !*(_BYTE *)(*v2 + 25i64) )
*(_QWORD *)(*v2 + 8i64) = a2;
v2[1] = *(_QWORD *)(a2 + 8);
result = *(_QWORD **)a1;
if ( a2 == *(_QWORD *)(*(_QWORD *)a1 + 8i64) )
{
result[1] = v2;
*v2 = a2;
*(_QWORD *)(a2 + 8) = v2;
}
else
{
result = *(_QWORD **)(a2 + 8);
if ( a2 == *result )
*result = v2;
else
result[2] = v2;
*v2 = a2;
*(_QWORD *)(a2 + 8) = v2;
}
return result;
}
//----- (00000001800022E0) ----------------------------------------------------
_QWORD *__fastcall sub_1800022E0(__int64 a1, _QWORD *a2)
{
__int64 v2; // r8
__int64 v3; // rax
_QWORD *result; // rax
v2 = *a2;
*a2 = *(_QWORD *)(*a2 + 16i64);
v3 = *(_QWORD *)(v2 + 16);
if ( !*(_BYTE *)(v3 + 25) )
*(_QWORD *)(v3 + 8) = a2;
*(_QWORD *)(v2 + 8) = a2[1];
result = *(_QWORD **)a1;
if ( a2 == *(_QWORD **)(*(_QWORD *)a1 + 8i64) )
{
result[1] = v2;
*(_QWORD *)(v2 + 16) = a2;
a2[1] = v2;
}
else
{
result = (_QWORD *)a2[1];
if ( a2 == (_QWORD *)result[2] )
result[2] = v2;
else
*result = v2;
*(_QWORD *)(v2 + 16) = a2;
a2[1] = v2;
}
return result;
}
//----- (0000000180002340) ----------------------------------------------------
__int64 *__fastcall sub_180002340(__int64 *a1, _QWORD *a2)
{
unsigned __int64 v2; // rdi
_QWORD *v3; // rsi
__int64 *v4; // rbx
__int64 v5; // rax
__int64 v6; // rcx
_DWORD *v7; // rdx
v2 = a2[1];
v3 = a2;
v4 = a1;
if ( !v2 )
return v4;
v5 = qalloc_or_throw(4 * v2);
v4[2] = v2;
for ( *v4 = v5; v4[1] < v2; ++v4[1] )
{
v6 = 4 * v4[1];
v7 = (_DWORD *)(v6 + *v4);
if ( v7 )
*v7 = *(_DWORD *)(v6 + *v3);
}
return v4;
}
// 1800042DE: using guessed type __int64 __fastcall qalloc_or_throw(_QWORD);
//----- (0000000180002510) ----------------------------------------------------
char __fastcall create_func_frame(unsigned int *a1)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
v1 = *a1;
v2 = 0;
v3 = a1;
v7 = 0;
v6 = -1;
while ( 1 )
{
if ( v1 >= v3[1] || !(unsigned int)decode_insn(&v5, v1) )
return 0;
if ( (_WORD)v7 == 2 && v8 == 5 )
break;
++v2;
v1 += HIWORD(v7);
if ( v2 >= 10 )
return 0;
}
*((_WORD *)v3 + 4) |= 0x10u;
update_func(v3);
return add_frame(v3, v9, 8i64, 0i64);
}
// 18000434A: using guessed type __int64 __fastcall update_func(_QWORD);
// 180004392: using guessed type __int64 __fastcall decode_insn(_QWORD, _QWORD);
// 1800043AA: using guessed type __int64 __fastcall add_frame(_QWORD, _QWORD, _QWORD, _QWORD);
//----- (00000001800025D0) ----------------------------------------------------
__int64 __fastcall sub_1800025D0(void *a1, insn_t *a2, op_t *a3, possible_values_t *a4, int a5)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
v5 = a4;
v6 = a3;
v7 = a2;
v12.d0 = 0;
v12.d1 = -1;
v12.addresses.begin = 0i64;
v12.addresses.length = 0i64;
v12.addresses.capacity = 0i64;
*(_WORD *)&v12.b5 = 0;
v8 = 0;
if ( track_possible_values_cfg(a1, a2, a2->ea, a3->reg_union.reg, &v12, a5 + 1) )
{
if ( v6->type == 4 )
{
v8 = 1;
v9 = v6->addr_union.addr + v12.d0;
if ( v7->ops[1].dtype )
{
if ( v7->ops[1].dtype == 1 )
v10 = (unsigned __int16)get_word(v9);
else
v10 = get_dword(v9);
}
else
{
v10 = (unsigned __int8)get_byte(v9);
}
qfree(0i64);
if ( v5 )
{
v5->d0 = v10;
if ( v10 != -1 )
{
v5->b6 &= 0xFDu;
v5->b6 |= 1u;
}
v5->d1 = v9;
v5->b5 = v6->n;
}
}
else
{
qfree(0i64);
v8 = 0;
}
}
qfree((qvector_t *)v12.addresses.begin);
return v8;
}
// 180004320: using guessed type __int64 __fastcall get_byte(_QWORD);
// 180004326: using guessed type __int64 __fastcall get_word(_QWORD);
// 18000432C: using guessed type __int64 __fastcall get_dword(_QWORD);
//----- (0000000180003030) ----------------------------------------------------
char __fastcall get_possible_values(void *a1, insn_t *insn, op_t *a3, possible_values_t *values, int a5)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
values& = values;
insn& = insn;
switch ( (unsigned __int8)a3->type )
{
case O_REG:
case O_IDPSPEC0:
result = track_possible_values_cfg(a1, insn, insn->ea, a3->reg_union.reg, values, a5);
break;
case O_MEM:
if ( values )
{
v9 = a3->addr_union.addr;
v10 = -1;
if ( insn->itype == OPC_LOADM )
{
v10 = a3->addr_union.addr;
v9 = -1;
if ( (unsigned __int8)is_loaded(v10) )
{
if ( insn&->ops[1].dtype )
{
if ( insn&->ops[1].dtype == 1 )
v9 = (unsigned __int16)get_word(v10);
else
v9 = get_dword(v10);
}
else
{
v9 = (unsigned __int8)get_byte(v10);
}
values&->b6 = values&->b6 & 0xFD | 5;
qvector_int::push_back(&values&->addresses, &insn&->ea);
}
}
values&->d1 = v10;
values&->d0 = v9;
}
result = 1;
break;
case O_PHRASE:
case O_DISPL:
a4.d0 = 0;
a4.d1 = -1;
a4.addresses.begin = 0i64;
a4.addresses.length = 0i64;
a4.addresses.capacity = 0i64;
*(_WORD *)&a4.b5 = 0;
if ( !(unsigned __int8)sub_1800025D0(a1, insn, a3, &a4, a5 + 1) || (v8 = a4.b6, (a4.b6 & 3) != 1) )
{
qfree((qvector_t *)a4.addresses.begin);
goto LABEL_23;
}
if ( values& )
{
values&->d0 = a4.d0;
values&->d1 = a4.d1;
qvector_int::copy_ctr(&values&->addresses, &a4.addresses);
values&->b5 = a4.b5;
values&->b6 = v8;
qvector_int::push_back(&values&->addresses, &insn&->ea);
}
qfree((qvector_t *)a4.addresses.begin);
result = 1;
break;
case O_IMM:
if ( values )
{
values->d0 = a3->value_union.value;
values->b6 = values->b6 & 0xFD | 5;
qvector_int::push_back(&values->addresses, &insn->ea);
}
result = 1;
break;
default:
LABEL_23:
result = 0;
break;
}
return result;
}
// 18000431A: using guessed type __int64 __fastcall is_loaded(_QWORD);
// 180004320: using guessed type __int64 __fastcall get_byte(_QWORD);
// 180004326: using guessed type __int64 __fastcall get_word(_QWORD);
// 18000432C: using guessed type __int64 __fastcall get_dword(_QWORD);
//----- (00000001800036A0) ----------------------------------------------------
__int64 *__fastcall sub_1800036A0(__int64 **a1, __int64 *a2, __int64 a3, __int64 a4)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
v16 = a4;
v15 = a3;
v4 = a2;
v5 = *a1;
v6 = a1;
if ( a3 != **a1 || (__int64 *)a4 != v5 )
{
if ( a3 != a4 )
{
do
{
v10 = (__int64 *)a3;
if ( !*(_BYTE *)(a3 + 25) )
{
v11 = *(_QWORD *)(a3 + 16);
if ( *(_BYTE *)(v11 + 25) )
{
for ( i = *(_QWORD *)(a3 + 8); !*(_BYTE *)(i + 25); i = *(_QWORD *)(i + 8) )
{
if ( a3 != *(_QWORD *)(i + 16) )
break;
v15 = i;
a3 = i;
}
v15 = i;
}
else
{
for ( j = *(_QWORD *)v11; !*(_BYTE *)(j + 25); j = *(_QWORD *)j )
v11 = j;
v15 = v11;
}
}
sub_1800037A0(v6, &v14, v10);
a3 = v15;
}
while ( v15 != v16 );
}
*v4 = a3;
result = v4;
}
else
{
sub_180002210((__int64)a1, (__int64 *)v5[1]);
(*v6)[1] = (__int64)*v6;
**v6 = (__int64)*v6;
(*v6)[2] = (__int64)*v6;
v7 = *v6;
v6[1] = 0i64;
v8 = *v7;
result = v4;
*v4 = v8;
}
return result;
}
//----- (00000001800037A0) ----------------------------------------------------
_QWORD *__fastcall sub_1800037A0(_QWORD *a1, _QWORD *a2, __int64 *a3)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
v3 = a2;
v4 = a1;
if ( *((_BYTE *)a3 + 25) )
{
std::_Xout_of_range("invalid map/set<T> iterator");
__debugbreak();
}
i = a3[2];
v6 = a3 + 2;
v7 = a3;
if ( *(_BYTE *)(i + 25) )
{
for ( i = a3[1]; !*(_BYTE *)(i + 25); i = *(_QWORD *)(i + 8) )
{
if ( a3 != *(__int64 **)(i + 16) )
break;
a3 = (__int64 *)i;
}
}
else
{
for ( j = *(_QWORD *)i; !*(_BYTE *)(j + 25); j = *(_QWORD *)j )
i = j;
}
v21 = i;
if ( *(_BYTE *)(*v7 + 25) )
{
v9 = *v6;
LABEL_16:
v10 = v7[1];
if ( !*(_BYTE *)(v9 + 25) )
*(_QWORD *)(v9 + 8) = v10;
if ( *(__int64 **)(*v4 + 8i64) == v7 )
{
*(_QWORD *)(*v4 + 8i64) = v9;
}
else if ( *(__int64 **)v10 == v7 )
{
*(_QWORD *)v10 = v9;
}
else
{
*(_QWORD *)(v10 + 16) = v9;
}
if ( *(__int64 **)*v4 == v7 )
{
if ( *(_BYTE *)(v9 + 25) )
{
k = v10;
}
else
{
v12 = *(_QWORD *)v9;
for ( k = v9; !*(_BYTE *)(v12 + 25); v12 = *(_QWORD *)v12 )
k = v12;
}
*(_QWORD *)*v4 = k;
}
v13 = *v4;
if ( *(__int64 **)(*v4 + 16i64) == v7 )
{
if ( *(_BYTE *)(v9 + 25) )
{
*(_QWORD *)(v13 + 16) = v10;
}
else
{
v14 = *(_QWORD *)(v9 + 16);
for ( l = v9; !*(_BYTE *)(v14 + 25); v14 = *(_QWORD *)(v14 + 16) )
l = v14;
*(_QWORD *)(v13 + 16) = l;
}
}
goto LABEL_46;
}
if ( *(_BYTE *)(*v6 + 25) )
{
v9 = *v7;
goto LABEL_16;
}
v9 = *(_QWORD *)(i + 16);
if ( (__int64 *)i == v7 )
goto LABEL_16;
*(_QWORD *)(*v7 + 8) = i;
*(_QWORD *)i = *v7;
if ( i == *v6 )
{
v10 = i;
}
else
{
v10 = *(_QWORD *)(i + 8);
if ( !*(_BYTE *)(v9 + 25) )
*(_QWORD *)(v9 + 8) = v10;
*(_QWORD *)v10 = v9;
*(_QWORD *)(i + 16) = *v6;
*(_QWORD *)(*v6 + 8) = i;
}
if ( *(__int64 **)(*v4 + 8i64) == v7 )
{
*(_QWORD *)(*v4 + 8i64) = i;
}
else
{
v16 = (__int64 *)v7[1];
if ( (__int64 *)*v16 == v7 )
*v16 = i;
else
v16[2] = i;
}
*(_QWORD *)(i + 8) = v7[1];
v17 = *(_BYTE *)(i + 24);
*(_BYTE *)(i + 24) = *((_BYTE *)v7 + 24);
*((_BYTE *)v7 + 24) = v17;
LABEL_46:
if ( *((_BYTE *)v7 + 24) == 1 )
{
for ( ; v9 != *(_QWORD *)(*v4 + 8i64); v10 = *(_QWORD *)(v10 + 8) )
{
if ( *(_BYTE *)(v9 + 24) != 1 )
break;
v18 = *(_BYTE **)v10;
if ( v9 == *(_QWORD *)v10 )
{
v18 = *(_BYTE **)(v10 + 16);
if ( !v18[24] )
{
v18[24] = 1;
*(_BYTE *)(v10 + 24) = 0;
sub_180002280((__int64)v4, v10);
v18 = *(_BYTE **)(v10 + 16);
}
if ( v18[25] )
goto LABEL_64;
if ( *(_BYTE *)(*(_QWORD *)v18 + 24i64) != 1 || *(_BYTE *)(*((_QWORD *)v18 + 2) + 24i64) != 1 )
{
if ( *(_BYTE *)(*((_QWORD *)v18 + 2) + 24i64) == 1 )
{
*(_BYTE *)(*(_QWORD *)v18 + 24i64) = 1;
v18[24] = 0;
sub_1800022E0((__int64)v4, v18);
v18 = *(_BYTE **)(v10 + 16);
}
v18[24] = *(_BYTE *)(v10 + 24);
*(_BYTE *)(v10 + 24) = 1;
*(_BYTE *)(*((_QWORD *)v18 + 2) + 24i64) = 1;
sub_180002280((__int64)v4, v10);
break;
}
}
else
{
if ( !v18[24] )
{
v18[24] = 1;
*(_BYTE *)(v10 + 24) = 0;
sub_1800022E0((__int64)v4, (_QWORD *)v10);
v18 = *(_BYTE **)v10;
}
if ( v18[25] )
goto LABEL_64;
if ( *(_BYTE *)(*((_QWORD *)v18 + 2) + 24i64) != 1 || *(_BYTE *)(*(_QWORD *)v18 + 24i64) != 1 )
{
if ( *(_BYTE *)(*(_QWORD *)v18 + 24i64) == 1 )
{
*(_BYTE *)(*((_QWORD *)v18 + 2) + 24i64) = 1;
v18[24] = 0;
sub_180002280((__int64)v4, (__int64)v18);
v18 = *(_BYTE **)v10;
}
v18[24] = *(_BYTE *)(v10 + 24);
*(_BYTE *)(v10 + 24) = 1;
*(_BYTE *)(*(_QWORD *)v18 + 24i64) = 1;
sub_1800022E0((__int64)v4, (_QWORD *)v10);
break;
}
}
v18[24] = 0;
LABEL_64:
v9 = v10;
}
*(_BYTE *)(v9 + 24) = 1;
}
`eh vector destructor iterator'(v7 + 5, 0x28ui64, 36, (void (__stdcall *)(void *))sub_180001E80);
operator delete(v7);
v19 = v4[1];
if ( v19 )
v4[1] = v19 - 1;
*v3 = v21;
return v3;
}
// 1800061E0: using guessed type void __stdcall std::_Xout_of_range(const char *);
//----- (0000000180003B10) ----------------------------------------------------
void __fastcall emu_internal(insn_t *insn, op_t *op, char use)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
op_type = op->type;
use& = use;
op& = op;
insn& = insn;
switch ( op_type )
{
case O_MEM:
v16 = op->addr_union.addr;
insn_create_op_data(insn, op->addr_union.addr, (unsigned int)op->offb, (unsigned __int8)op->dtype);
insn_add_dref(insn&, v16, (unsigned int)op&->offb, (unsigned int)(use& != 0) + 2);
break;
case O_IMM:
set_immd(insn->ea);
v15 = get_flags_ex(insn&->ea, 0i64);
if ( (unsigned __int8)op_adds_xrefs(v15, op&->n) )
insn_add_off_drefs(insn&, op&, 1i64);
break;
case O_NEAR:
v12 = insn->itype;
if ( v12 != 7
&& (v12 != 23
|| (unsigned int)netnode_altval((unsigned int)dword_180009090, insn->ops[0].addr_union.addr, 332i64) != 1) )
{
v13 = has_insn_feature(insn&->itype, CF_CALL);
v14 = 19i64; // fl_JN
if ( v13 )
v14 = 17i64; // fl_CN
insn_add_cref(insn&, op&->addr_union.addr, (unsigned int)op&->offb, v14);
}
break;
default:
if ( op_type == O_IDPSPEC1 && insn->itype == 26 )
{
memset(&Dst, 0, 0x30ui64);
v7 = insn&->ea;
v19 = -1;
v21 = -1i64;
Dst = 0;
v23 = -1;
if ( get_switch_info(&Dst, v7) <= 0 )
{
v8 = insn&->ops[2].addr_union.addr;
v9 = (unsigned __int64)get_dword(insn&->ops[2].addr_union.addr) ^ 'FTC0';
if ( v9 <= 0x80 )
{
LODWORD(v21) = insn&->ops[1].addr_union.addr;
v10 = insn&->ops[0].reg_union.reg;
v19 = v8 + 4;
v11 = insn&->ea;
v18 = v9;
v23 = v10;
HIDWORD(v21) = v11;
v24 = 2;
v20 = 0;
Dst = ((Dst | 0x2204) & 0xFFFFFFFB | 4) & 0xFFFFFE7F;
v22 = v11 + 4;
set_switch_info(v11, &Dst);
create_switch_table(insn&->ea, &Dst);
create_switch_xrefs(insn&->ea, &Dst);
}
}
}
break;
}
}
// 1800042EA: using guessed type __int64 __fastcall netnode_altval(_QWORD, _QWORD, _QWORD);
// 1800042F6: using guessed type __int64 __fastcall get_switch_info(_QWORD, _QWORD);
// 1800042FC: using guessed type __int64 __fastcall set_switch_info(_QWORD, _QWORD);
// 180004314: using guessed type __int64 __fastcall get_flags_ex(_QWORD, _QWORD);
// 18000432C: using guessed type __int64 __fastcall get_dword(_QWORD);
// 180004332: using guessed type __int64 __fastcall op_adds_xrefs(_QWORD, _QWORD);
// 18000436E: using guessed type __int64 __fastcall create_switch_table(_QWORD, _QWORD);
// 180004374: using guessed type __int64 __fastcall create_switch_xrefs(_QWORD, _QWORD);
// 18000437A: using guessed type __int64 __fastcall insn_create_op_data(_QWORD, _QWORD, _QWORD, _QWORD);
// 180004380: using guessed type __int64 __fastcall insn_add_cref(_QWORD, _QWORD, _QWORD, _QWORD);
// 180004386: using guessed type __int64 __fastcall insn_add_dref(_QWORD, _QWORD, _QWORD, _QWORD);
// 18000438C: using guessed type __int64 __fastcall insn_add_off_drefs(_QWORD, _QWORD, _QWORD);
// 18000439E: using guessed type __int64 __fastcall has_insn_feature(_QWORD, _QWORD);
// 180009090: using guessed type int dword_180009090;
//----- (0000000180003D20) ----------------------------------------------------
char __fastcall sub_180003D20(__int64 a1)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
v1 = a1;
result = is_loaded(a1);
if ( !result )
return result;
v3 = getseg(v1);
if ( v3 )
{
v9 = 0i64;
v10 = 0i64;
v11 = 0i64;
if ( get_segm_name(&v9, v3, 0i64) > 0 )
{
for ( i = 0i64; i < 1; ++i )
{
v5 = (qvector_t *)&unk_180006EA2;
if ( v10 )
v5 = v9;
v6 = 0i64;
while ( 1 )
{
v7 = *((_BYTE *)&v5->begin + v6++);
if ( v7 != aRodata[v6 - 1] )
break;
if ( v6 == 8 )
{
qfree(v9);
goto LABEL_11;
}
}
}
}
qfree(v9);
}
if ( (unsigned __int8)segtype(v1) == 2 || (v8 = getseg(v1)) != 0 && (*(_BYTE *)(v8 + 22) & 6) == 4 )
LABEL_11:
result = 1;
else
result = 0;
return result;
}
// 180004302: using guessed type __int64 __fastcall getseg(_QWORD);
// 180004308: using guessed type __int64 __fastcall get_segm_name(_QWORD, _QWORD, _QWORD);
// 18000430E: using guessed type __int64 __fastcall segtype(_QWORD);
// 18000431A: using guessed type __int64 __fastcall is_loaded(_QWORD);
//----- (0000000180003E20) ----------------------------------------------------
char __fastcall is_basic_block_end(__int64 a1)
{
__int64 v1; // rbx
char v3; // [rsp+20h] [rbp-28h]
char v4; // [rsp+28h] [rbp-20h]
char v5; // [rsp+29h] [rbp-1Fh]
v1 = a1;
if ( !(((unsigned int)get_flags_ex(*(_DWORD *)(a1 + 8) + (unsigned int)*(unsigned __int16 *)(a1 + 14), 0i64) >> 16) & 1) )
return 1;
if ( (unsigned __int8)xrefblk_t_first_from(&v3, *(unsigned int *)(v1 + 8), 1i64) )
{
do
{
if ( !v4 )
break;
if ( (unsigned __int8)(v5 - 18) <= 1u )
return 1;
}
while ( (unsigned __int8)xrefblk_t_next_from(&v3) );
}
return 0;
}
// 180004314: using guessed type __int64 __fastcall get_flags_ex(_QWORD, _QWORD);
// 180004356: using guessed type __int64 __fastcall xrefblk_t_first_from(_QWORD, _QWORD, _QWORD);
// 18000435C: using guessed type __int64 __fastcall xrefblk_t_next_from(_QWORD);
//----- (0000000180003EC0) ----------------------------------------------------
__int64 __fastcall qvector_int::push_back(qvector_t *this, unsigned int *a2)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
v2 = a2;
v3 = (__int64 *)this;
v4 = this->length + 1i64;
if ( v4 > this->capacity )
this->begin = (_DWORD *)qvector_reserve(this, (__int64)this->begin, v4, 4i64);
result = *v3;
v6 = (_DWORD *)(*v3 + 4 * v3[1]);
if ( v6 )
{
result = *v2;
*v6 = result;
}
++v3[1];
return result;
}
//----- (0000000180003F20) ----------------------------------------------------
char __fastcall insn_changes_reg(insn_t *insn, int reg_num)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
insn& = insn;
itype = insn->itype;
switch ( (_DWORD)itype )
{
case OPC_ENTER:
if ( (unsigned int)(reg_num - 30) <= 1 )
return 1;
break;
case OPC_LEAVE:
break;
case OPC_CALL: // call
return 0;
default:
v4 = (int)ph->instruc_start;
if ( (int)itype < (int)v4 )
return 0;
if ( (int)itype >= (signed int)ph->instruc_end )
return 0;
v5 = *(&(*(&ph + 0xE))->flag + 4 * (itype - v4));
if ( !v5 )
return 0;
if ( (!(v5 & CF_CHG1) || insn&->ops[0].type != O_REG || insn&->ops[0].reg_union.reg != reg_num)
&& (!(v5 & CF_CHG2) || insn&->ops[1].type != O_REG || insn&->ops[1].reg_union.reg != reg_num)
&& (!(v5 & CF_CHG3) || insn&->ops[2].type != O_REG || insn&->ops[2].reg_union.reg != reg_num)
&& (!(v5 & CF_CHG4) || insn&->ops[3].type != O_REG || insn&->ops[3].reg_union.reg != reg_num) )
{
return 0;
}
return 1;
}
if ( (unsigned int)(reg_num - 29) > 2 )
return 0;
return 1;
}
//----- (0000000180003FF0) ----------------------------------------------------
bool __fastcall sub_180003FF0(outctx_t *a1)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
v1 = a1;
((void (__fastcall *)(outctx_t *))a1->vt[2].f0)(a1);
if ( BYTE1(v1[29].vt) )
((void (__fastcall *)(outctx_t *, _QWORD))v1->vt[2].out_vprintf)(v1, 0i64);
if ( BYTE1(v1[32].vt) )
{
LOBYTE(v2) = ',';
v1->vt->out_symbol(v1, v2);
LOBYTE(v3) = ' ';
v1->vt->out_char(v1, v3);
((void (__fastcall *)(outctx_t *, __int64))v1->vt[2].out_vprintf)(v1, 1i64);
}
if ( BYTE1(v1[35].vt) )
{
LOBYTE(v2) = ',';
v1->vt->out_symbol(v1, v2);
LOBYTE(v4) = ' ';
v1->vt->out_char(v1, v4);
((void (__fastcall *)(outctx_t *, __int64))v1->vt[2].out_vprintf)(v1, 2i64);
}
if ( BYTE1(v1[38].vt) )
{
LOBYTE(v2) = ',';
v1->vt->out_symbol(v1, v2);
LOBYTE(v5) = ' ';
v1->vt->out_char(v1, v5);
((void (__fastcall *)(outctx_t *, __int64))v1->vt[2].out_vprintf)(v1, 3i64);
}
((void (__fastcall *)(outctx_t *))v1->vt[2].out_symbol)(v1);
LODWORD(v1[17].vt) |= 0x80u;
return v1->vt->flush_outbuf(v1, -1);
}
// 18000402A: variable 'v2' is possibly undefined
// 180004035: variable 'v3' is possibly undefined
// 180004065: variable 'v4' is possibly undefined
// 180004095: variable 'v5' is possibly undefined
//----- (00000001800040E0) ----------------------------------------------------
__int64 __fastcall out_mnem(__int64 a1)
{
return (*(__int64 (__fastcall **)(__int64, __int64))(*(_QWORD *)a1 + 272i64))(a1, 8i64);
}
//----- (0000000180004100) ----------------------------------------------------
char __fastcall sub_180004100(outctx_t *a1, op_t *op)
{
// [COLLAPSED LOCAL DECLARATIONS. PRESS KEYPAD CTRL-"+" TO EXPAND]
v2 = a1;
op& = op;
v4 = (unsigned __int8)op->type;
switch ( v4 )
{
case O_REG:
if ( op&->reg_union.reg >= (signed int)ph->regs_num )
v14 = "42";
else
v14 = (const char *)*((_QWORD *)&(*(&ph + 7))->version + op&->reg_union.reg);
v15 = 33;
a1->vt->out_line(a1, v14, v15);
break;
case O_IMM:
v13 = op&->dtype;
v18 = 5;
v19 = v13;
v20 = op&->value_union.value;
a1->vt->out_value(a1, (const op_t *)&v17, 68);
break;
case O_NEAR:
if ( !a1->vt->out_name_expr(a1, op&, op&->addr_union.addr, 0xFFFFFFFFi64) )
{
v9 = 18;
v2->vt->out_tagon(v2, *(_QWORD *)&v9);
LOBYTE(v10) = 16;
v2->vt->out_long(v2, op&->addr_union.addr, v10);
LOBYTE(v11) = 18;
v2->vt->out_tagoff(v2, v11);
LOBYTE(v12) = 2;
remember_problem(v12, LODWORD(v2[27].vt), 0i64);
}
break;
case O_IDPSPEC1:
if ( !a1->vt->out_name_expr(a1, op&, op&->addr_union.addr + 4, 0xFFFFFFFFi64) )
{
LOBYTE(v5) = 18;
v2->vt->out_tagon(v2, v5);
LOBYTE(v6) = 16;
v2->vt->out_long(v2, op&->addr_union.addr + 4, v6);
LOBYTE(v7) = 18;
v2->vt->out_tagoff(v2, v7);
LOBYTE(v8) = 2;
remember_problem(v8, LODWORD(v2[27].vt), 0i64);
}
break;
default:
sub_180004290(a1, "#%d", op&->n);
break;
}
return 1;
}
// 18000417D: variable 'v5' is possibly undefined
// 18000418F: variable 'v6' is possibly undefined
// 18000419A: variable 'v7' is possibly undefined
// 1800041A8: variable 'v8' is possibly undefined
// 1800041D6: variable 'v9' is possibly undefined
// 1800041E5: variable 'v10' is possibly undefined
// 1800041F0: variable 'v11' is possibly undefined
// 1800041FE: variable 'v12' is possibly undefined
// 1800043C2: using guessed type __int64 __fastcall remember_problem(_QWORD, _QWORD, _QWORD);
//----- (0000000180004290) ----------------------------------------------------
void sub_180004290(outctx_t *a1, const char *a2, ...)
{
va_list va; // [rsp+40h] [rbp+18h]
va_start(va, a2);
a1->vt->out_vprintf(a1, a2, va);
}
//----- (0000000180004ED4) ----------------------------------------------------
void __cdecl RTC_Terminate()
{
void (**i)(void); // rbx
for ( i = (void (**)(void))&unk_180006F78; i < (void (**)(void))&unk_180006F78; ++i )
{
if ( *i )
(*i)();
}
}
//----- (0000000180004F0C) ----------------------------------------------------
void __cdecl RTC_Terminate_0()
{
void (**i)(void); // rbx
for ( i = (void (**)(void))&unk_180006F88; i < (void (**)(void))&unk_180006F88; ++i )
{
if ( *i )
(*i)();
}
}
//----- (0000000180004F50) ----------------------------------------------------
void __fastcall sub_180004F50()
{
_clean_type_info_names_internal(&unk_180009848);
}
// 180004F86: using guessed type __int64 __fastcall _clean_type_info_names_internal(_QWORD);
//----- (0000000180004FC9) ----------------------------------------------------
void __usercall __noreturn sub_180004FC9(__int64 a1@<rbp>)
{
operator delete(*(void **)(a1 + 96));
CxxThrowException(0i64, 0i64);
}
// 18000454A: using guessed type __int64 __fastcall CxxThrowException(_QWORD, _QWORD);
//----- (000000018000506D) ----------------------------------------------------
void __usercall __noreturn sub_18000506D(__int64 a1@<rbp>)
{
operator delete(*(void **)(a1 + 72));
CxxThrowException(0i64, 0i64);
}
// 18000454A: using guessed type __int64 __fastcall CxxThrowException(_QWORD, _QWORD);
//----- (000000018000508D) ----------------------------------------------------
void __usercall __noreturn sub_18000508D(__int64 a1@<rbp>)
{
operator delete(*(void **)(a1 + 72));
CxxThrowException(0i64, 0i64);
}
// 18000454A: using guessed type __int64 __fastcall CxxThrowException(_QWORD, _QWORD);
// ALL OK, 40 function(s) have been successfully decompiled
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment