; assembly | /* r2dec pseudo code output */ | /* balb_controlmanager.t/assume @ 0x40a910 */ | #include | ; (fcn) method.bsl::basic_stringbuf_char__std::__1::char_traits_char___bsl::allocator_char___.seekoff_long_long__std::__1::ios_base::seekdir__unsigned_int_ () | int64_t method_bsl::basic_stringbuf_char_std::_1::char_traits_char_bsl::allocator_char_seekoff_long_long_std::_1::ios_base::seekdir_unsigned_int_ (int64_t arg4, uint32_t arg3, int32_t arg2, uint32_t arg1) { | rcx = arg4; | rdx = arg3; | rsi = arg2; | rdi = arg1; | /* bsl::basic_stringbuf, bsl::allocator >::seekoff(long long, std::__1::ios_base::seekdir, unsigned int) */ 0x0040a910 cmp edx, 1 | | if (edx == 1) { 0x0040a913 jne 0x40a92a | 0x0040a915 mov eax, ecx | eax = ecx; 0x0040a917 and eax, 0x18 | eax &= 0x18; 0x0040a91a mov r8, 0xffffffffffffffff | r8 = 0xffffffffffffffff; 0x0040a921 cmp eax, 0x18 | | if (eax == 0x18) { 0x0040a924 je 0x40aae8 | goto label_0; | } | } 0x0040a92a mov r8, 0xffffffffffffffff | r8 = 0xffffffffffffffff; 0x0040a931 test cl, 8 | | if ((cl & 8) != 0) { 0x0040a934 je 0x40a9d4 | 0x0040a93a test byte [rdi + 0x78], 8 | | if ((*((rdi + 0x78)) & 8) == 0) { 0x0040a93e je 0x40a9d4 | goto label_1; | } 0x0040a944 cmp edx, 2 | | if (edx != 2) { 0x0040a947 je 0x40a95b | 0x0040a949 cmp edx, 1 | | if (edx == 1) { 0x0040a94c jne 0x40a97a | 0x0040a94e mov rax, qword [rdi + 0x18] | rax = *((rdi + 0x18)); 0x0040a952 add rax, rsi | rax += rsi; 0x0040a955 mov r9, qword [rdi + 0x10] | r9 = *((rdi + 0x10)); 0x0040a959 jmp 0x40a982 | | } else { 0x0040a95b mov r9, qword [rdi + 0x10] | r9 = *((rdi + 0x10)); 0x0040a95f mov rax, qword [rdi + 0x30] | rax = *((rdi + 0x30)); 0x0040a963 sub rax, qword [rdi + 0x28] | rax -= *((rdi + 0x28)); 0x0040a967 mov r8, qword [rdi + 0x70] | r8 = *((rdi + 0x70)); 0x0040a96b cmp r8, rax | | if (r8 >= rax) { 0x0040a96e cmovge rax, r8 | rax = r8; | } 0x0040a972 add rax, r9 | rax += r9; 0x0040a975 add rax, rsi | rax += rsi; 0x0040a978 jmp 0x40a982 | | } else { 0x0040a97a mov r9, qword [rdi + 0x10] | r9 = *((rdi + 0x10)); 0x0040a97e lea rax, [r9 + rsi] | rax = r9 + rsi; | } | } 0x0040a982 mov r8, 0xffffffffffffffff | r8 = 0xffffffffffffffff; 0x0040a989 cmp rax, r9 | | if (rax < r9) { 0x0040a98c jb 0x40aae8 | goto label_0; | } 0x0040a992 mov r10, qword [rdi + 0x30] | r10 = *((rdi + 0x30)); 0x0040a996 mov r11, qword [rdi + 0x70] | r11 = *((rdi + 0x70)); 0x0040a99a sub r10, qword [rdi + 0x28] | r10 -= *((rdi + 0x28)); 0x0040a99e cmp r11, r10 | | if (r11 >= r10) { 0x0040a9a1 cmovge r10, r11 | r10 = r11; | } 0x0040a9a5 add r9, r10 | r9 += r10; 0x0040a9a8 cmp rax, r9 | | if (rax > r9) { 0x0040a9ab ja 0x40aae8 | goto label_0; | } 0x0040a9b1 lea r8, [rdi + 0x40] | r8 = rdi + 0x40; 0x0040a9b5 cmp qword [rdi + 0x60], 0x17 | | if (*((rdi + 0x60)) != 0x17) { 0x0040a9ba je 0x40a9bf | 0x0040a9bc mov r8, qword [r8] | r8 = *(r8); | } 0x0040a9bf add r10, r8 | r10 += r8; 0x0040a9c2 mov qword [rdi + 0x10], r8 | *((rdi + 0x10)) = r8; 0x0040a9c6 mov qword [rdi + 0x18], rax | *((rdi + 0x18)) = rax; 0x0040a9ca mov qword [rdi + 0x20], r10 | *((rdi + 0x20)) = r10; 0x0040a9ce sub rax, r8 | rax -= r8; 0x0040a9d1 mov r8, rax | r8 = rax; | } | label_1: 0x0040a9d4 test cl, 0x10 | | if ((cl & 0x10) != 0) { 0x0040a9d7 je 0x40aae8 | 0x0040a9dd test byte [rdi + 0x78], 0x10 | | if ((*((rdi + 0x78)) & 0x10) == 0) { 0x0040a9e1 je 0x40aae8 | goto label_0; | } 0x0040a9e7 cmp edx, 2 | | if (edx != 2) { 0x0040a9ea je 0x40a9fb | 0x0040a9ec cmp edx, 1 | | if (edx == 1) { 0x0040a9ef jne 0x40aa19 | 0x0040a9f1 add rsi, qword [rdi + 0x30] | rsi += *((rdi + 0x30)); 0x0040a9f5 mov rax, qword [rdi + 0x28] | rax = *((rdi + 0x28)); 0x0040a9f9 jmp 0x40aa20 | | } else { 0x0040a9fb mov rax, qword [rdi + 0x28] | rax = *((rdi + 0x28)); 0x0040a9ff mov rcx, qword [rdi + 0x30] | rcx = *((rdi + 0x30)); 0x0040aa03 sub rcx, rax | rcx -= rax; 0x0040aa06 mov rdx, qword [rdi + 0x70] | rdx = *((rdi + 0x70)); 0x0040aa0a cmp rdx, rcx | | if (rdx >= rcx) { 0x0040aa0d cmovge rcx, rdx | rcx = rdx; | } 0x0040aa11 add rcx, rax | rcx += rax; 0x0040aa14 add rsi, rcx | rsi += rcx; 0x0040aa17 jmp 0x40aa20 | | } else { 0x0040aa19 mov rax, qword [rdi + 0x28] | rax = *((rdi + 0x28)); 0x0040aa1d add rsi, rax | rsi += rax; | } | } 0x0040aa20 mov r8, 0xffffffffffffffff | r8 = 0xffffffffffffffff; 0x0040aa27 cmp rsi, rax | | if (rsi < rax) { 0x0040aa2a jb 0x40aae8 | goto label_0; | } 0x0040aa30 mov rcx, qword [rdi + 0x30] | rcx = *((rdi + 0x30)); 0x0040aa34 mov rdx, qword [rdi + 0x70] | rdx = *((rdi + 0x70)); 0x0040aa38 sub rcx, rax | rcx -= rax; 0x0040aa3b cmp rdx, rcx | | if (rdx >= rcx) { 0x0040aa3e cmovge rcx, rdx | rcx = rdx; | } 0x0040aa42 add rcx, rax | rcx += rax; 0x0040aa45 cmp rsi, rcx | | if (rsi > rcx) { 0x0040aa48 ja 0x40aae8 | goto label_0; | } 0x0040aa4e lea r8, [rdi + 0x40] | r8 = rdi + 0x40; 0x0040aa52 cmp qword [rdi + 0x60], 0x17 | | if (*((rdi + 0x60)) != 0x17) { 0x0040aa57 je 0x40aa5c | 0x0040aa59 mov r8, qword [r8] | r8 = *(r8); | } 0x0040aa5c sub rsi, r8 | rsi -= r8; 0x0040aa5f mov rax, qword [rdi + 0x58] | rax = *((rdi + 0x58)); 0x0040aa63 add rax, r8 | rax += r8; 0x0040aa66 mov qword [rdi + 0x30], r8 | *((rdi + 0x30)) = r8; 0x0040aa6a mov qword [rdi + 0x28], r8 | *((rdi + 0x28)) = r8; 0x0040aa6e mov qword [rdi + 0x38], rax | *((rdi + 0x38)) = rax; 0x0040aa72 mov eax, 0x80000000 | eax = 0x80000000; 0x0040aa77 cmp rsi, rax | | if (rsi >= rax) { 0x0040aa7a jl 0x40aad4 | 0x0040aa7c mov eax, 0xfffffffe | eax = 0xfffffffe; 0x0040aa81 cmp rsi, rax | | if (rsi < rax) { 0x0040aa84 cmovl rax, rsi | rax = rsi; | } 0x0040aa88 neg rax | rax = -rax; 0x0040aa8b lea rcx, [rsi + rax + 0x7ffffffe] | rcx = rsi + rax + 0x7ffffffe; 0x0040aa93 movabs rdx, 0x200000005 | rdx = 0x200000005; 0x0040aa9d mov rax, rcx | rax = rcx; 0x0040aaa0 mul rdx | rdx:rax = rax * rdx; 0x0040aaa3 sub rcx, rdx | rcx -= rdx; 0x0040aaa6 shr rcx, 1 | rcx >>= 1; 0x0040aaa9 add rcx, rdx | rcx += rdx; 0x0040aaac shr rcx, 0x1e | rcx >>= 0x1e; 0x0040aab0 mov rdx, rcx | rdx = rcx; 0x0040aab3 shl rdx, 0x1f | rdx <<= 0x1f; 0x0040aab7 sub rdx, rcx | rdx -= rcx; 0x0040aaba lea r8, [rdx + r8 + 0x7fffffff] | r8 = rdx + r8 + 0x7fffffff; 0x0040aac2 mov rax, rsi | rax = rsi; 0x0040aac5 sub rax, rdx | rax -= rdx; 0x0040aac8 add rax, 0xffffffff80000001 | rax += 0xffffffff80000001; 0x0040aace mov qword [rdi + 0x30], r8 | *((rdi + 0x30)) = r8; 0x0040aad2 jmp 0x40aad7 | | } else { 0x0040aad4 mov rax, rsi | rax = rsi; | } 0x0040aad7 test rax, rax | | if (rax != 0) { 0x0040aada je 0x40aae5 | 0x0040aadc cdqe | rax = (int64_t) eax; 0x0040aade add r8, rax | r8 += rax; 0x0040aae1 mov qword [rdi + 0x30], r8 | *((rdi + 0x30)) = r8; | } 0x0040aae5 mov r8, rsi | r8 = rsi; | } | label_0: 0x0040aae8 xor eax, eax | eax = 0; 0x0040aaea mov rdx, r8 | rdx = r8; 0x0040aaed ret | return rax; | }