{"type": "func", "start": 6443762508, "end": 6443763247, "name": "_write_nolock", "pseudocode": "// \n// _write_nolock from 0x18014034c to 0x18014062f (739 bytes)\n// \n// 2 xrefs:\n// > _write @ 0x180140306\n// > <???> @ 0x180203c14\n// \n// This function is hookable on this platform!\n// \n// Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA\n// Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings\n// \n\n__int64 __fastcall write_nolock(int a1, _BYTE *a2, unsigned int a3)\n{\n  int v3; // ebx\n  __int64 v4; // r14\n  __int64 v8; // r13\n  __int64 v9; // r15\n  __int64 v10; // rcx\n  int v11; // esi\n  _BYTE *v12; // r12\n  _WORD *v13; // r14\n  DWORD v14; // esi\n  __int64 v15; // rax\n  __int64 v16; // xmm0_8\n  __int64 v17; // rcx\n  void *v18; // rcx\n  DWORD NumberOfBytesWritten[2]; // [rsp+30h] [rbp-30h] BYREF\n  int v20; // [rsp+38h] [rbp-28h]\n  __int64 v21; // [rsp+40h] [rbp-20h]\n  DWORD Mode[4]; // [rsp+50h] [rbp-10h] BYREF\n\n  v3 = 0;\n  v4 = a3;\n  if ( !a3 )\n    return 0;\n  if ( !a2\n    || (v8 = (__int64)a1 >> 6,\n        v9 = 9LL * (a1 & 0x3F),\n        v10 = qword_1801F5160[v8],\n        v11 = *(char *)(v10 + 72LL * (a1 & 0x3F) + 57),\n        (unsigned __int8)(*(_BYTE *)(v10 + 72LL * (a1 & 0x3F) + 57) - 1) <= 1u)\n    && (a3 & 1) != 0 )\n  {\n    *_doserrno() = 0;\n    *errno() = 22;\n    invalid_parameter_noinfo();\n    return 0xFFFFFFFFLL;\n  }\n  if ( (*(_BYTE *)(v10 + 72LL * (a1 & 0x3F) + 56) & 0x20) != 0 )\n    common_lseek_nolock<__int64>((unsigned int)a1, 0, 2);\n  v21 = 0;\n  if ( !isatty(a1)\n    || *(char *)(qword_1801F5160[v8] + 72LL * (a1 & 0x3F) + 56) >= 0\n    || !*(_QWORD *)(*(_QWORD *)(_acrt_getptd() + 144) + 312LL)\n    && !*(_BYTE *)(qword_1801F5160[v8] + 72LL * (a1 & 0x3F) + 57)\n    || !GetConsoleMode(*(HANDLE *)(qword_1801F5160[v8] + 72LL * (a1 & 0x3F) + 40), Mode) )\n  {\n    v17 = qword_1801F5160[v8];\n    if ( *(char *)(v17 + 72LL * (a1 & 0x3F) + 56) >= 0 )\n    {\n      v18 = *(void **)(v17 + 72LL * (a1 & 0x3F) + 40);\n      *(_QWORD *)NumberOfBytesWritten = 0;\n      v20 = 0;\n      if ( !WriteFile(v18, a2, v4, &NumberOfBytesWritten[1], nullptr) )\n        NumberOfBytesWritten[0] = GetLastError();\n      v3 = v20;\nLABEL_37:\n      v16 = *(_QWORD *)NumberOfBytesWritten;\n      goto LABEL_38;\n    }\n    if ( (_BYTE)v11 )\n    {\n      if ( v11 == 1 )\n      {\n        v15 = write_text_utf8_nolock((__int64)NumberOfBytesWritten, a1, (WCHAR *)a2, v4);\n      }\n      else\n      {\n        if ( v11 != 2 )\n          goto LABEL_39;\n        v15 = write_text_utf16le_nolock((__int64)NumberOfBytesWritten, a1, (__int16 *)a2, v4);\n      }\n    }\n    else\n    {\n      v15 = write_text_ansi_nolock((__int64)NumberOfBytesWritten, a1, a2, v4);\n    }\nLABEL_26:\n    v16 = *(_QWORD *)v15;\n    v3 = *(_DWORD *)(v15 + 8);\nLABEL_38:\n    v21 = v16;\n    goto LABEL_39;\n  }\n  if ( !(_BYTE)v11 )\n  {\n    v15 = (__int64)write_double_translated_ansi_nolock(NumberOfBytesWritten, a1, a2, v4);\n    goto LABEL_26;\n  }\n  if ( (unsigned __int8)(v11 - 1) <= 1u )\n  {\n    v12 = &a2[v4];\n    *(_QWORD *)NumberOfBytesWritten = 0;\n    v13 = a2;\n    if ( a2 < v12 )\n    {\n      v14 = NumberOfBytesWritten[1];\n      while ( 1 )\n      {\n        LOWORD(Mode[0]) = *v13;\n        if ( putwch_nolock(Mode[0]) != LOWORD(Mode[0]) )\n          break;\n        v14 += 2;\n        NumberOfBytesWritten[1] = v14;\n        if ( LOWORD(Mode[0]) == 10 )\n        {\n          if ( putwch_nolock(0xDu) != 13 )\n            break;\n          NumberOfBytesWritten[1] = ++v14;\n          ++v3;\n        }\n        if ( ++v13 >= (_WORD *)v12 )\n          goto LABEL_37;\n      }\n      NumberOfBytesWritten[0] = GetLastError();\n    }\n    goto LABEL_37;\n  }\nLABEL_39:\n  if ( HIDWORD(v21) )\n    return (unsigned int)(HIDWORD(v21) - v3);\n  if ( (_DWORD)v21 )\n  {\n    if ( (_DWORD)v21 == 5 )\n    {\n      *errno() = 9;\n      *_doserrno() = 5;\n    }\n    else\n    {\n      _acrt_errno_map_os_error(v21);\n    }\n    return 0xFFFFFFFFLL;\n  }\n  if ( (*(_BYTE *)(qword_1801F5160[v8] + 8 * v9 + 56) & 0x40) == 0 || *a2 != 26 )\n  {\n    *errno() = 28;\n    *_doserrno() = 0;\n    return 0xFFFFFFFFLL;\n  }\n  return 0;\n}", "assembly": "; \n; _write_nolock from 0x18014034c to 0x18014062f (739 bytes)\n; \n; 2 xrefs:\n; > _write @ 0x180140306\n; > <???> @ 0x180203c14\n; \n; This function is hookable on this platform!\n; \n; Using BromaIDA 8.0.0 @ https:;github.com/Stazzical/BromaIDA\n; Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https:;github.com/geode-sdk/bindings\n; \n\nmov     [rsp-38h+arg_18], rbx                                          ; +0x0, 0x18014034c\npush    rbp                                                            ; +0x5, 0x180140351\npush    rsi                                                            ; +0x6, 0x180140352\npush    rdi                                                            ; +0x7, 0x180140353\npush    r12                                                            ; +0x8, 0x180140354\npush    r13                                                            ; +0xa, 0x180140356\npush    r14                                                            ; +0xc, 0x180140358\npush    r15                                                            ; +0xe, 0x18014035a\nmov     rbp, rsp                                                       ; +0x10, 0x18014035c\nsub     rsp, 60h                                                       ; +0x13, 0x18014035f\nxor     ebx, ebx                                                       ; +0x17, 0x180140363\nmov     r14d, r8d                                                      ; +0x19, 0x180140365\nmovsxd  r12, ecx                                                       ; +0x1c, 0x180140368\nmov     rdi, rdx                                                       ; +0x1f, 0x18014036b\ntest    r8d, r8d                                                       ; +0x22, 0x18014036e\njz      loc_180140615                                                  ; +0x25, 0x180140371\ntest    rdx, rdx                                                       ; +0x2b, 0x180140377\njnz     short loc_18014039B                                            ; +0x2e, 0x18014037a\ncall    __doserrno                                                     ; +0x30, 0x18014037c\nmov     [rax], ebx                                                     ; +0x35, 0x180140381\ncall    _errno                                                         ; +0x37, 0x180140383\nmov     dword ptr [rax], 16h                                           ; +0x3c, 0x180140388\ncall    _invalid_parameter_noinfo                                      ; +0x42, 0x18014038e\nor      eax, 0FFFFFFFFh                                                ; +0x47, 0x180140393\njmp     loc_180140617                                                  ; +0x4a, 0x180140396\nmov     rax, r12                                                       ; +0x4f, 0x18014039b\nlea     rcx, qword_1801F5160                                           ; +0x52, 0x18014039e\nand     eax, 3Fh                                                       ; +0x59, 0x1801403a5\nmov     r13, r12                                                       ; +0x5c, 0x1801403a8\nsar     r13, 6                                                         ; +0x5f, 0x1801403ab\nlea     r15, [rax+rax*8]                                               ; +0x63, 0x1801403af\nmov     rcx, [rcx+r13*8]                                               ; +0x67, 0x1801403b3\nmovsx   esi, byte ptr [rcx+r15*8+39h]                                  ; +0x6b, 0x1801403b7\nlea     eax, [rsi-1]                                                   ; +0x71, 0x1801403bd\ncmp     al, 1                                                          ; +0x74, 0x1801403c0\nja      short loc_1801403CD                                            ; +0x76, 0x1801403c2\nmov     eax, r14d                                                      ; +0x78, 0x1801403c4\nnot     eax                                                            ; +0x7b, 0x1801403c7\ntest    al, 1                                                          ; +0x7d, 0x1801403c9\njz      short loc_18014037C                                            ; +0x7f, 0x1801403cb\ntest    byte ptr [rcx+r15*8+38h], 20h                                  ; +0x81, 0x1801403cd\njz      short loc_1801403E3                                            ; +0x87, 0x1801403d3\nxor     edx, edx                                                       ; +0x89, 0x1801403d5\nmov     ecx, r12d                                                      ; +0x8b, 0x1801403d7\nlea     r8d, [rdx+2]                                                   ; +0x8e, 0x1801403da\ncall    j_??$common_lseek_nolock@_J@@YA_JH_JH@Z                        ; +0x92, 0x1801403de\nmov     ecx, r12d; FileHandle                                          ; +0x97, 0x1801403e3\nmov     [rbp+var_20], rbx                                              ; +0x9a, 0x1801403e6\ncall    _isatty                                                        ; +0x9e, 0x1801403ea\ntest    eax, eax                                                       ; +0xa3, 0x1801403ef\njz      loc_180140502                                                  ; +0xa5, 0x1801403f1\nlea     rax, qword_1801F5160                                           ; +0xab, 0x1801403f7\nmov     rax, [rax+r13*8]                                               ; +0xb2, 0x1801403fe\ncmp     [rax+r15*8+38h], bl                                            ; +0xb6, 0x180140402\njge     loc_180140502                                                  ; +0xbb, 0x180140407\ncall    __acrt_getptd                                                  ; +0xc1, 0x18014040d\nmov     rcx, [rax+90h]                                                 ; +0xc6, 0x180140412\ncmp     [rcx+138h], rbx                                                ; +0xcd, 0x180140419\njnz     short loc_180140438                                            ; +0xd4, 0x180140420\nlea     rax, qword_1801F5160                                           ; +0xd6, 0x180140422\nmov     rax, [rax+r13*8]                                               ; +0xdd, 0x180140429\ncmp     [rax+r15*8+39h], bl                                            ; +0xe1, 0x18014042d\njz      loc_180140502                                                  ; +0xe6, 0x180140432\nlea     rax, qword_1801F5160                                           ; +0xec, 0x180140438\nmov     rcx, [rax+r13*8]                                               ; +0xf3, 0x18014043f\nlea     rdx, [rbp+Mode]; lpMode                                        ; +0xf7, 0x180140443\nmov     rcx, [rcx+r15*8+28h]; hConsoleHandle                           ; +0xfb, 0x180140447\ncall    cs:GetConsoleMode                                              ; +0x100, 0x18014044c\ntest    eax, eax                                                       ; +0x106, 0x180140452\njz      loc_180140502                                                  ; +0x108, 0x180140454\ntest    sil, sil                                                       ; +0x10e, 0x18014045a\njz      loc_1801404E4                                                  ; +0x111, 0x18014045d\ndec     sil                                                            ; +0x117, 0x180140463\ncmp     sil, 1                                                         ; +0x11a, 0x180140466\nja      loc_18014059E                                                  ; +0x11e, 0x18014046a\nlea     r12, [rdi+r14]                                                 ; +0x124, 0x180140470\nmov     qword ptr [rbp+NumberOfBytesWritten], rbx                      ; +0x128, 0x180140474\nmov     r14, rdi                                                       ; +0x12c, 0x180140478\ncmp     rdi, r12                                                       ; +0x12f, 0x18014047b\njnb     loc_180140594                                                  ; +0x132, 0x18014047e\nmov     esi, [rbp+NumberOfBytesWritten+4]                              ; +0x138, 0x180140484\nmovzx   eax, word ptr [r14]                                            ; +0x13b, 0x180140487\nmovzx   ecx, ax; Character                                             ; +0x13f, 0x18014048b\nmov     word ptr [rbp+Mode], ax                                        ; +0x142, 0x18014048e\ncall    _putwch_nolock                                                 ; +0x146, 0x180140492\nmovzx   ecx, word ptr [rbp+Mode]                                       ; +0x14b, 0x180140497\ncmp     ax, cx                                                         ; +0x14f, 0x18014049b\njnz     short loc_1801404D6                                            ; +0x152, 0x18014049e\nadd     esi, 2                                                         ; +0x154, 0x1801404a0\nmov     [rbp+NumberOfBytesWritten+4], esi                              ; +0x157, 0x1801404a3\ncmp     cx, 0Ah                                                        ; +0x15a, 0x1801404a6\njnz     short loc_1801404C7                                            ; +0x15e, 0x1801404aa\nmov     ecx, 0Dh; Character                                            ; +0x160, 0x1801404ac\ncall    _putwch_nolock                                                 ; +0x165, 0x1801404b1\nmov     ecx, 0Dh                                                       ; +0x16a, 0x1801404b6\ncmp     ax, cx                                                         ; +0x16f, 0x1801404bb\njnz     short loc_1801404D6                                            ; +0x172, 0x1801404be\ninc     esi                                                            ; +0x174, 0x1801404c0\nmov     [rbp+NumberOfBytesWritten+4], esi                              ; +0x176, 0x1801404c2\ninc     ebx                                                            ; +0x179, 0x1801404c5\nadd     r14, 2                                                         ; +0x17b, 0x1801404c7\ncmp     r14, r12                                                       ; +0x17f, 0x1801404cb\njnb     loc_180140594                                                  ; +0x182, 0x1801404ce\njmp     short loc_180140487                                            ; +0x188, 0x1801404d4\ncall    cs:GetLastError                                                ; +0x18a, 0x1801404d6\nmov     [rbp+NumberOfBytesWritten], eax                                ; +0x190, 0x1801404dc\njmp     loc_180140594                                                  ; +0x193, 0x1801404df\nmov     r9d, r14d                                                      ; +0x198, 0x1801404e4\nlea     rcx, [rbp+NumberOfBytesWritten]                                ; +0x19b, 0x1801404e7\nmov     r8, rdi                                                        ; +0x19f, 0x1801404eb\nmov     edx, r12d                                                      ; +0x1a2, 0x1801404ee\ncall    ?write_double_translated_ansi_nolock@@YA?AUwrite_result@?A0x17268360@@HQEBDI@Z ; +0x1a5, 0x1801404f1\nmovsd   xmm0, qword ptr [rax]                                          ; +0x1aa, 0x1801404f6\nmov     ebx, [rax+8]                                                   ; +0x1ae, 0x1801404fa\njmp     loc_180140599                                                  ; +0x1b1, 0x1801404fd\nlea     rax, qword_1801F5160                                           ; +0x1b6, 0x180140502\nmov     rcx, [rax+r13*8]                                               ; +0x1bd, 0x180140509\ncmp     [rcx+r15*8+38h], bl                                            ; +0x1c1, 0x18014050d\njge     short loc_180140561                                            ; +0x1c6, 0x180140512\nmov     ecx, esi                                                       ; +0x1c8, 0x180140514\ntest    sil, sil                                                       ; +0x1ca, 0x180140516\njz      short loc_18014054D                                            ; +0x1cd, 0x180140519\nsub     ecx, 1                                                         ; +0x1cf, 0x18014051b\njz      short loc_180140539                                            ; +0x1d2, 0x18014051e\ncmp     ecx, 1                                                         ; +0x1d4, 0x180140520\njnz     short loc_18014059E                                            ; +0x1d7, 0x180140523\nmov     r9d, r14d                                                      ; +0x1d9, 0x180140525\nlea     rcx, [rbp+NumberOfBytesWritten]                                ; +0x1dc, 0x180140528\nmov     r8, rdi                                                        ; +0x1e0, 0x18014052c\nmov     edx, r12d                                                      ; +0x1e3, 0x18014052f\ncall    ?write_text_utf16le_nolock@@YA?AUwrite_result@?A0x17268360@@HQEBDI@Z ; +0x1e6, 0x180140532\njmp     short loc_1801404F6                                            ; +0x1eb, 0x180140537\nmov     r9d, r14d                                                      ; +0x1ed, 0x180140539\nlea     rcx, [rbp+NumberOfBytesWritten]                                ; +0x1f0, 0x18014053c\nmov     r8, rdi                                                        ; +0x1f4, 0x180140540\nmov     edx, r12d                                                      ; +0x1f7, 0x180140543\ncall    ?write_text_utf8_nolock@@YA?AUwrite_result@?A0x17268360@@HQEBDI@Z ; +0x1fa, 0x180140546\njmp     short loc_1801404F6                                            ; +0x1ff, 0x18014054b\nmov     r9d, r14d                                                      ; +0x201, 0x18014054d\nlea     rcx, [rbp+NumberOfBytesWritten]                                ; +0x204, 0x180140550\nmov     r8, rdi                                                        ; +0x208, 0x180140554\nmov     edx, r12d                                                      ; +0x20b, 0x180140557\ncall    ?write_text_ansi_nolock@@YA?AUwrite_result@?A0x17268360@@HQEBDI@Z ; +0x20e, 0x18014055a\njmp     short loc_1801404F6                                            ; +0x213, 0x18014055f\nmov     rcx, [rcx+r15*8+28h]; hFile                                    ; +0x215, 0x180140561\nlea     r9, [rbp+NumberOfBytesWritten+4]; lpNumberOfBytesWritten       ; +0x21a, 0x180140566\nxor     eax, eax                                                       ; +0x21e, 0x18014056a\nmov     r8d, r14d; nNumberOfBytesToWrite                               ; +0x220, 0x18014056c\nand     [rsp+60h+var_40], rax                                          ; +0x223, 0x18014056f\nmov     rdx, rdi; lpBuffer                                             ; +0x228, 0x180140574\nmov     qword ptr [rbp+NumberOfBytesWritten], rax                      ; +0x22b, 0x180140577\nmov     [rbp+var_28], eax                                              ; +0x22f, 0x18014057b\ncall    cs:WriteFile                                                   ; +0x232, 0x18014057e\ntest    eax, eax                                                       ; +0x238, 0x180140584\njnz     short loc_180140591                                            ; +0x23a, 0x180140586\ncall    cs:GetLastError                                                ; +0x23c, 0x180140588\nmov     [rbp+NumberOfBytesWritten], eax                                ; +0x242, 0x18014058e\nmov     ebx, [rbp+var_28]                                              ; +0x245, 0x180140591\nmovsd   xmm0, qword ptr [rbp+NumberOfBytesWritten]                     ; +0x248, 0x180140594\nmovsd   [rbp+var_20], xmm0                                             ; +0x24d, 0x180140599\nmov     rax, [rbp+var_20]                                              ; +0x252, 0x18014059e\nshr     rax, 20h                                                       ; +0x256, 0x1801405a2\ntest    eax, eax                                                       ; +0x25a, 0x1801405a6\njnz     short loc_18014060E                                            ; +0x25c, 0x1801405a8\nmov     eax, dword ptr [rbp+var_20]                                    ; +0x25e, 0x1801405aa\ntest    eax, eax                                                       ; +0x261, 0x1801405ad\njz      short loc_1801405DE                                            ; +0x263, 0x1801405af\ncmp     eax, 5                                                         ; +0x265, 0x1801405b1\njnz     short loc_1801405D1                                            ; +0x268, 0x1801405b4\ncall    _errno                                                         ; +0x26a, 0x1801405b6\nmov     dword ptr [rax], 9                                             ; +0x26f, 0x1801405bb\ncall    __doserrno                                                     ; +0x275, 0x1801405c1\nmov     dword ptr [rax], 5                                             ; +0x27a, 0x1801405c6\njmp     loc_180140393                                                  ; +0x280, 0x1801405cc\nmov     ecx, dword ptr [rbp+var_20]                                    ; +0x285, 0x1801405d1\ncall    __acrt_errno_map_os_error                                      ; +0x288, 0x1801405d4\njmp     loc_180140393                                                  ; +0x28d, 0x1801405d9\nlea     rax, qword_1801F5160                                           ; +0x292, 0x1801405de\nmov     rax, [rax+r13*8]                                               ; +0x299, 0x1801405e5\ntest    byte ptr [rax+r15*8+38h], 40h                                  ; +0x29d, 0x1801405e9\njz      short loc_1801405F6                                            ; +0x2a3, 0x1801405ef\ncmp     byte ptr [rdi], 1Ah                                            ; +0x2a5, 0x1801405f1\njz      short loc_180140615                                            ; +0x2a8, 0x1801405f4\ncall    _errno                                                         ; +0x2aa, 0x1801405f6\nmov     dword ptr [rax], 1Ch                                           ; +0x2af, 0x1801405fb\ncall    __doserrno                                                     ; +0x2b5, 0x180140601\nand     dword ptr [rax], 0                                             ; +0x2ba, 0x180140606\njmp     loc_180140393                                                  ; +0x2bd, 0x180140609\nmov     eax, dword ptr [rbp+var_20+4]                                  ; +0x2c2, 0x18014060e\nsub     eax, ebx                                                       ; +0x2c5, 0x180140611\njmp     short loc_180140617                                            ; +0x2c7, 0x180140613\nxor     eax, eax                                                       ; +0x2c9, 0x180140615\nmov     rbx, [rsp+60h+arg_18]                                          ; +0x2cb, 0x180140617\nadd     rsp, 60h                                                       ; +0x2d3, 0x18014061f\npop     r15                                                            ; +0x2d7, 0x180140623\npop     r14                                                            ; +0x2d9, 0x180140625\npop     r13                                                            ; +0x2db, 0x180140627\npop     r12                                                            ; +0x2dd, 0x180140629\npop     rdi                                                            ; +0x2df, 0x18014062b\npop     rsi                                                            ; +0x2e0, 0x18014062c\npop     rbp                                                            ; +0x2e1, 0x18014062d\nretn                                                                   ; +0x2e2, 0x18014062e", "xrefs": ["_write @ 0x180140306", "<???> @ 0x180203c14"], "is_objc": false, "is_arm32": false, "is_arm64": false, "bida_info": "8.0.0 @ https://github.com/Stazzical/BromaIDA", "bindings_info": "commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings"}