-
-
Save vient/ac555d5092e9256041a18ba0ca943b5e to your computer and use it in GitHub Desktop.
0ctf2019 Sixology
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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