Subversion Repositories Kolibri OS

Rev

Rev 5460 | Rev 6344 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;COLOR_THEME fix BLACK_ON_WHITE
  2. COLOR_THEME fix MOVIEOS
  3.  
  4. format binary as ""
  5. include '../../macros.inc'
  6. use32
  7.         db      'MENUET01'
  8.         dd      1
  9.         dd      start
  10.         dd      i_end
  11.         dd      used_mem
  12.         dd      used_mem
  13.         dd      i_param
  14.         dd      0
  15.  
  16. ;-----------------------------------------------------------------------------
  17.  
  18. REG_MODE_CPU equ 1
  19. REG_MODE_MMX equ 2
  20. REG_MODE_SSE equ 3
  21. REG_MODE_AVX equ 4
  22.  
  23. ;-----------------------------------------------------------------------------
  24.  
  25. include 'gui.inc' ; GUI routines
  26.  
  27. ;-----------------------------------------------------------------------------
  28. ;                          Find command in list
  29.  
  30. find_cmd:
  31. ; all commands are case-insensitive
  32.         push    edi
  33.  
  34.     .x4:
  35.         mov     al, [edi]
  36.         cmp     al, 0
  37.         jz      .x5
  38.         cmp     al, 'A'
  39.         jb      @f
  40.         cmp     al, 'Z'
  41.         ja      @f
  42.         or      al, 20h
  43.  
  44.     @@:
  45.         stosb
  46.         jmp     .x4
  47.  
  48.     ; find command
  49.     .x5:
  50.         pop     edi
  51.  
  52.     .x6:
  53.         cmp     dword [esi], 0
  54.         jz      .x7
  55.         push    esi
  56.         mov     esi, [esi]
  57.         lodsb
  58.         movzx   ecx, al
  59.         push    edi
  60.         repz cmpsb
  61.         pop     edi
  62.         pop     esi
  63.         jz      .x8
  64.         add     esi, 17
  65.         jmp     .x6
  66.  
  67.     .x7:
  68.         stc
  69.  
  70.     .x8:
  71.         ret
  72.  
  73. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  74. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DEBUGGING ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  75. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  76.  
  77. ;-----------------------------------------------------------------------------
  78. ;                                 Help event
  79.  
  80. OnHelp:
  81.         mov     esi, help_msg
  82.         mov     edi, [curarg]
  83.         cmp     byte [edi], 0
  84.         jz      .x
  85.         mov     esi, help_groups
  86.         call    find_cmd
  87.         jc      .nocmd
  88.         mov     esi, [esi+12]
  89.  
  90.     .x:
  91.         jmp     put_message
  92.  
  93.     .nocmd:
  94.         mov     esi, aUnknownCommand
  95.         jmp     .x
  96.  
  97. ;-----------------------------------------------------------------------------
  98. ;                                Quit event
  99. OnQuit:
  100.         mcall  -1
  101.  
  102. ;-----------------------------------------------------------------------------
  103. ;                        Working with debug context
  104.  
  105. get_new_context:
  106.         mov     esi, context
  107.         mov     edi, oldcontext
  108.         mov     ecx, (ctx_end-context)/4
  109.         rep movsd
  110.  
  111. get_context:
  112.         mcall   69, 1, [debuggee_pid], ctx_end-context, context
  113.         ret
  114.  
  115. set_context:
  116.         ;push    2
  117.         ;pop     ebx
  118.         ;push    69
  119.         ;pop     eax
  120.         ;mov     ecx, [debuggee_pid]
  121.         ;mov     esi, context
  122.         ;push    28h
  123.         ;pop     edx
  124.         mcall    69, 2, [debuggee_pid], 28h, context
  125.         ret
  126.  
  127. get_dump:
  128.         mov     edi, dumpdata
  129.         mov     esi, [edi-4]
  130.         mov     edx, dump_height*10h
  131.         mov     ecx, edx
  132.         xor     eax, eax
  133.         push    edi
  134.         rep stosb
  135.         pop     edi
  136.         ;mov     ecx, [debuggee_pid]
  137.         ;mov     al, 69
  138.         ;push    6
  139.         ;pop     ebx
  140.         mcall    69, 6, [debuggee_pid]
  141.         cmp     eax, -1
  142.         jnz     @f
  143.         mov     esi, read_mem_err
  144.         call    put_message
  145.         xor     eax, eax
  146.  
  147.     @@:
  148.         mov     [edi-8], eax
  149. ;       call    restore_from_breaks
  150. ;       ret
  151.  
  152. ; in: edi=buffer,eax=size,esi=address
  153. restore_from_breaks:
  154.         mov     ebx, breakpoints
  155.  
  156.     @@:
  157.         test    byte [ebx+4], 1
  158.         jz      .cont           ; ignore invalid
  159.         test    byte [ebx+4], 2 or 8
  160.         jnz     .cont           ; ignore disabled and memory breaks
  161.         mov     ecx, [ebx]
  162.         sub     ecx, esi
  163.         cmp     ecx, eax
  164.         jae     .cont
  165.         mov     dl, [ebx+5]
  166.         mov     [edi+ecx], dl
  167.  
  168.     .cont:
  169.         add     ebx, 6
  170.         cmp     ebx, breakpoints+breakpoints_n*6
  171.         jb      @b
  172.         ret
  173.  
  174. ;-----------------------------------------------------------------------------
  175. ;                           Load executable event
  176.  
  177. OnLoad:
  178.         mov     esi, [curarg]
  179.  
  180. OnLoadInit:
  181.         mov     edi, loadname
  182.         or      [prgname_len], -1
  183.         mov     [prgname_ptr], edi
  184.  
  185.     .copyname:
  186.         lodsb
  187.         stosb
  188.         inc     [prgname_len]
  189.         cmp     al, '/'
  190.         jnz     @f
  191.         or      [prgname_len], -1
  192.         mov     [prgname_ptr], edi
  193.  
  194.     @@:
  195.         cmp     al, ' '
  196.         ja      .copyname
  197.         mov     byte [edi-1], 0
  198.         and     [load_params], 0
  199.         dec     esi
  200.         call    get_arg.skip_spaces
  201.         cmp     al, 0
  202.         jz      @f
  203.         mov     [load_params], esi
  204.  
  205.     @@:
  206.         and     [dumppos], 0
  207.         mov     ecx, [symbols]
  208.         jecxz   do_reload
  209.         mcall   68, 13
  210.         and     [symbols], 0
  211.         and     [num_symbols], 0
  212.  
  213. ; TODO: make it local
  214. do_reload:
  215.         ;push    18
  216.         ;pop     eax
  217.         ;push    7
  218.         ;pop     ebx
  219.         mcall    18, 7
  220.         mov     [dbgwnd], eax
  221.         xchg    ecx, eax
  222.         ;push    70
  223.         ;pop     eax
  224.         ;mov     ebx, fn70_load_block
  225.         mcall    70, fn70_load_block
  226.         test    eax, eax
  227.         jns     .load_ok
  228.  
  229.     .load_err:
  230.         push    eax
  231.         mov     esi, load_err_msg
  232.         call    put_message
  233.         pop     eax
  234.         not     eax
  235.         cmp     eax, 0x20
  236.         jae     .unk_err
  237.         mov     esi, [load_err_msgs+eax*4]
  238.         test    esi, esi
  239.         jnz     put_message
  240.  
  241.     .unk_err:
  242.         mov     esi, unk_err_msg
  243.         inc     eax
  244.         push    eax
  245.         call    put_message_nodraw
  246.         jmp     draw_messages
  247.  
  248.     .load_ok:
  249.         mov     [debuggee_pid], eax
  250.         mov     [bSuspended], 1
  251.         push    ecx
  252.         call    get_context
  253.         mov     edi, oldcontext
  254.         mov     ecx, (ctx_end-context)/4
  255.         rep movsd
  256.  
  257.     ; activate debugger window
  258.         pop     ecx
  259.         ;mov     bl, 3
  260.         ;push    18
  261.         ;pop     eax
  262.         mcall    18, 3
  263.         call    redraw_title
  264.         call    draw_registers.redraw
  265.     ; read and draw dump of memory
  266.         call    get_dump
  267.         call    draw_dump.redraw
  268.         call    update_disasm_eip_force
  269.         mov     esi, load_succ_msg
  270.         push    [debuggee_pid]
  271.         call    put_message_nodraw
  272.         call    draw_messages
  273.     ; try to load symbols
  274.         mov     esi, loadname
  275.         mov     edi, symbolsfile
  276.         push    edi
  277.  
  278.     @@:
  279.         lodsb
  280.         stosb
  281.         test    al, al
  282.         jnz     @b
  283.         lea     ecx, [edi-1]
  284.  
  285.     @@:
  286.         dec     edi
  287.         cmp     edi, symbolsfile
  288.         jb      @f
  289.         cmp     byte [edi], '/'
  290.         jz      @f
  291.         cmp     byte [edi], '.'
  292.         jnz     @b
  293.         mov     ecx, edi
  294.  
  295.     @@:
  296.         mov     dword[ecx], '.dbg'
  297.         mov     byte[ecx+4], 0
  298.         pop     esi
  299.         mov     ebp, esi
  300.         push    ecx esi
  301.         call    OnLoadSymbols.silent            ; Try to load .dbg file
  302.         pop     esi ecx
  303.         xor     eax, eax
  304.         cmp     [num_symbols], eax
  305.         jne     @f
  306.         mov     dword[ecx], '.map'              ; If failed, try .map file too
  307.         call    OnLoadSymbols.silent
  308.     @@:
  309.  
  310.     ; now test for packed progs
  311.         cmp     [disasm_buf_size], 100h
  312.         jz      @f
  313.         ret
  314.  
  315.     @@:
  316.         mov     esi, mxp_nrv_sig
  317.         mov     ebp, disasm_buffer
  318.         mov     edi, ebp
  319.         push    3
  320.         pop     ecx
  321.         repz cmpsb
  322.         jnz     .not_mxp_nrv
  323.         cmpsb
  324.         mov     cl, mxp_nrv_sig_size-4
  325.         repz cmpsb
  326.         mov     esi, mxp_nrv_name
  327.         jz      .packed
  328.  
  329.     .not_mxp_nrv:
  330.         mov     esi, mxp_sig
  331.         mov     edi, ebp
  332.         mov     cl, mxp_sig_size
  333.         repz cmpsb
  334.         mov     esi, mxp_name
  335.         jz      .packed
  336.  
  337.     .not_mxp:
  338.         mov     esi, mxp_lzo_sig1
  339.         mov     edi, ebp
  340.         mov     cl, mxp_lzo_sig1_size
  341.         repz cmpsb
  342.         mov     esi, mxp_lzo_name
  343.         jz      .packed
  344.         mov     esi, mxp_lzo_sig2
  345.         mov     edi, ebp
  346.         mov     cl, 8
  347.         repz cmpsb
  348.         jnz     .not_mxp_lzo
  349.         cmpsb
  350.         mov     cl, mxp_lzo_sig2_size - 9
  351.         repz cmpsb
  352.         mov     esi, mxp_lzo_name
  353.         jz      .packed
  354.  
  355.     .not_mxp_lzo:
  356.         mov     esi, mtappack_name
  357.         cmp     dword [ebp], 0xBF5E246A
  358.         jnz     .not_mtappack
  359.         cmp     dword [ebp+8], 0xEC4E8B57
  360.         jnz     .not_mtappack1
  361.         cmp     dword [ebp+12], 0x8D5EA4F3
  362.         jnz     .not_mtappack1
  363.         cmp     byte [ebp+12h], 0xE9
  364.         jz      .packed
  365.  
  366.     .not_mtappack1:
  367.         cmp     word [ebp+8], 0xB957
  368.         jnz     .not_mtappack
  369.         cmp     dword [ebp+14], 0x575EA4F3
  370.         jnz     .not_mtappack2
  371.         cmp     byte [ebp+17h], 0xE9
  372.         jz      .packed
  373.  
  374.     .not_mtappack2:
  375.         cmp     dword [ebp+14], 0x5F8DA4F3
  376.         jnz     .not_mtappack3
  377.         cmp     word [ebp+18], 0xE9FC
  378.         jz      .packed
  379.  
  380.     .not_mtappack3:
  381.         cmp     word [ebp+14], 0xA4F3
  382.         jnz     .not_mtappack
  383.         cmp     byte [ebp+15h], 0xE9
  384.         jz      .packed
  385.  
  386.     .not_mtappack:
  387.         ret
  388.  
  389.     .packed:
  390.         push    esi
  391.         mov     esi, aPacked1
  392.         call    put_message_nodraw
  393.         pop     esi
  394.         call    put_message_nodraw
  395.         mov     esi, aPacked2
  396.         call    put_message
  397.         call    hide_cursor
  398.         ;push    40
  399.         ;pop     eax
  400.         ;push    7
  401.         ;pop     ebx
  402.         mcall    40, 7
  403.  
  404.     .wait:
  405.         ;push    10
  406.         ;pop     eax
  407.         mcall    10
  408.         dec     eax
  409.         jz      .redraw
  410.         dec     eax
  411.         jz      .key
  412.         or      eax, -1
  413.         mcall
  414.  
  415.     .redraw:
  416.         call    draw_window
  417.         call    hide_cursor
  418.         jmp     .wait
  419.  
  420.     .key:
  421.         mov     al, 2
  422.         mcall
  423.         cmp     ah, 'y'
  424.         jz      .yes
  425.         cmp     ah, 'Y'
  426.         jz      .yes
  427.         cmp     ah, 0xD
  428.         jz      .yes
  429.         cmp     ah, 'n'
  430.         jz      .no
  431.         cmp     ah, 'N'
  432.         jnz     .wait
  433.  
  434.     .no:
  435.         ;push    40
  436.         ;pop     eax
  437.         ;mov     ebx, 0x107
  438.         mcall    40, 0x107
  439.         call    draw_cursor
  440.         mov     esi, aN_str
  441.         jmp     put_message
  442.  
  443.     .yes:
  444.         ;push    40
  445.         ;pop     eax
  446.         ;mov     ebx, 0x107
  447.         mcall    40, 0x107
  448.         call    draw_cursor
  449.         mov     esi, aY_str
  450.         call    put_message
  451.         call    OnUnpack
  452.         ret
  453.  
  454. ;-----------------------------------------------------------------------------
  455. ;                       Searching signatures
  456.  
  457. mxp_nrv_sig:
  458.         xor     eax, eax
  459.         mov     ecx, 0x95       ; 0xA1 for programs with parameters
  460.         mov     [eax], ecx
  461.         add     ecx, [eax+24h]
  462.         push    40h
  463.         pop     esi
  464.         mov     edi, [eax+20h]
  465.         push    edi
  466.         rep movsb
  467.         jmp     dword [esp]
  468.         pop     esi
  469.         add     esi, [eax]
  470.         xor     edi, edi
  471.  
  472. mxp_nrv_sig_size = $ - mxp_nrv_sig
  473.  
  474. mxp_sig:
  475.         mov     ecx, 1CBh
  476.         push    46h
  477.         pop     esi
  478.         mov     edi, [20h]
  479.         rep movsb
  480.         mov     ecx, [24h]
  481.         rep movsb
  482.         jmp     dword [20h]
  483.         mov     eax, [20h]
  484.         add     eax, 1CBh
  485.         push    eax
  486.         push    dword [24h]
  487.         push    0
  488.         push    8
  489.         call    $+0x25
  490.  
  491. mxp_sig_size = $ - mxp_sig
  492.  
  493. mxp_lzo_sig1:
  494.         xor     eax, eax
  495.         mov     ebp, 0FFh
  496.         mov     ecx, 175h
  497.         mov     [eax], ecx
  498.         add     ecx, [eax+24h]
  499.         push    45h
  500.         pop     esi
  501.         mov     edi, [eax+20h]
  502.         push    edi
  503.         rep movsb
  504.         jmp     dword [esp]
  505.         pop     ebx
  506.         add     ebx, [eax]
  507.         xor     edi, edi
  508.         cmp     byte [ebx], 11h
  509.         jbe     $+0x1A
  510.  
  511. mxp_lzo_sig1_size = $ - mxp_lzo_sig1
  512.  
  513. mxp_lzo_sig2:
  514.         xor     eax, eax
  515.         mov     ebp, 0FFh
  516.         mov     ecx, 188h       ; or 177h
  517.         mov     [eax], ecx
  518.         add     ecx, [eax+24h]
  519.         push    44h
  520.         pop     esi
  521.         mov     edi, [eax+20h]
  522.         rep movsb
  523.         jmp     dword [eax+20h]
  524.         mov     ebx, [eax+20h]
  525.         add     ebx, [eax]
  526.  
  527. mxp_lzo_sig2_size = $ - mxp_lzo_sig2
  528.  
  529. ;-----------------------------------------------------------------------------
  530. ;                         Reload executable event
  531.  
  532. OnReload:
  533.         cmp     [debuggee_pid], 0
  534.         jnz     terminate_reload
  535.         mov     esi, need_debuggee
  536.         cmp     byte [loadname], 0
  537.         jnz     do_reload
  538.         jz      put_message
  539.  
  540. ; TODO: make it local
  541. terminate_reload:
  542.         mov     [bReload], 1
  543.  
  544. ;-----------------------------------------------------------------------------
  545. ;                        Terminate process event
  546.  
  547. OnTerminate:
  548.         ;mov     ecx, [debuggee_pid]
  549.         ;push    8
  550.         ;pop     ebx
  551.         ;push    69
  552.         ;pop     eax
  553.         mcall    69, 8, [debuggee_pid]
  554.         ret
  555. ;-----------------------------------------------------------------------------
  556. ;                         Suspend process event
  557.  
  558. AfterSuspend:
  559.         mov     [bSuspended], 1
  560.         call    get_new_context
  561.         call    get_dump
  562.         call    redraw_title
  563.         call    draw_registers.redraw
  564.         call    draw_dump.redraw
  565.         call    update_disasm_eip
  566.         ret
  567.  
  568. OnSuspend:
  569.         ;mov     ecx, [debuggee_pid]
  570.         ;push    4
  571.         ;pop     ebx
  572.         ;push    69
  573.         ;pop     eax
  574.         mcall    69, 4, [debuggee_pid]
  575.         call    AfterSuspend
  576.         mov     esi, aSuspended
  577.         jmp     put_message
  578.  
  579. ;-----------------------------------------------------------------------------
  580. ;                        Resume process event
  581.  
  582. DoResume:
  583.         ;mov     ecx, [debuggee_pid]
  584.         ;push    5
  585.         ;pop     ebx
  586.         ;push    69
  587.         ;pop     eax
  588.         mcall    69, 5, [debuggee_pid]
  589.         mov     [bSuspended], 0
  590.         ret
  591.  
  592. OnResume:
  593.         mov     esi, [curarg]
  594.         cmp     byte [esi], 0
  595.         jz      GoOn
  596.         call    calc_expression
  597.         jc      .ret
  598.         mov     eax, ebp
  599.         push    eax
  600.         call    find_enabled_breakpoint
  601.         pop     eax
  602.         jz      GoOn
  603.         mov     bl, 5   ; valid enabled one-shot
  604.         call    add_breakpoint
  605.         jnc     GoOn
  606.         mov     esi, aBreakpointLimitExceeded
  607.         call    put_message
  608.  
  609.     .ret:
  610.         ret
  611.  
  612. GoOn:
  613.     ; test for enabled breakpoint at eip
  614.         mov     eax, [_eip]
  615.         call    find_enabled_breakpoint
  616.         jnz     .nobreak
  617.     ; temporarily disable breakpoint, make step, enable breakpoint, continue
  618.         inc     eax
  619.         mov     [temp_break], eax
  620.         mov     [bAfterGo], 1
  621.         dec     eax
  622.         call    disable_breakpoint
  623.         call    get_context
  624.         or      byte [_eflags+1], 1             ; set TF
  625.         call    set_context
  626.         and     byte [_eflags+1], not 1
  627.         call    DoResume
  628.         ret
  629.  
  630.     .nobreak:
  631.         call    DoResume
  632.         call    redraw_title
  633.         call    draw_registers.redraw
  634.         call    draw_dump.redraw
  635.         ret
  636.  
  637. ;-----------------------------------------------------------------------------
  638. ;                        Detach process event
  639.  
  640. OnDetach:
  641.         ;mov     ecx, [debuggee_pid]
  642.         ;push    3
  643.         ;pop     ebx
  644.         ;push    69
  645.         ;pop     eax
  646.         mcall    69, 3, [debuggee_pid]
  647.         and     [debuggee_pid], 0
  648.         call    redraw_title
  649.         call    draw_registers.redraw
  650.         call    draw_dump.redraw
  651.         call    free_symbols
  652.         mov     esi, aContinued
  653.         jmp     put_message
  654.  
  655. after_go_exception:
  656.         push    eax
  657.         mov     eax, [temp_break]
  658.         dec     eax
  659.         push    esi
  660.         call    enable_breakpoint
  661.     ; in any case, clear TF and RF
  662.         call    get_new_context
  663.         and     [_eflags], not 10100h           ; clear TF,RF
  664.         call    set_context
  665.         xor     edx, edx
  666.         mov     [temp_break], edx
  667.         xchg    dl, [bAfterGo]
  668.         pop     esi
  669.         pop     eax
  670.         cmp     dl, 2
  671.         jnz     @f
  672.         lodsd
  673.         push    esi
  674.         call    get_dump
  675.         jmp     exception.done
  676.  
  677.     @@:
  678.         test    eax, eax
  679.         jz      .notint1
  680.     ; if exception is result of single step, simply ignore it and continue
  681.         test    dword [esi], 0xF
  682.         jnz     dbgmsgstart.5
  683.         lodsd
  684.         push    esi
  685.         mov     esi, oldcontext
  686.         mov     edi, context
  687.         mov     ecx, 28h/4
  688.         rep movsd
  689.         call    DoResume
  690.         jmp     dbgmsgend
  691.  
  692.     .notint1:
  693.     ; in other case, work as without temp_break
  694.         lodsd
  695.         push    esi
  696.         push    eax
  697.         jmp     exception.4
  698.  
  699.     .notour:
  700.  
  701. ; TODO: split it out
  702. debugmsg:
  703.         neg     [dbgbufsize]
  704.         mov     esi, dbgbuf
  705.  
  706. ; TODO: make it local
  707. dbgmsgstart:
  708.         lodsd
  709. ;       push    eax esi
  710. ;       push    dword [esi]
  711. ;       mov     esi, dbgmsg_str
  712. ;       call    put_message_nodraw
  713. ;       pop     esi eax
  714.         add     esi, 4
  715.         dec     eax
  716.         jz      exception
  717.         dec     eax
  718.         jz      terminated
  719.         mov     [bSuspended], 1
  720.         cmp     [bAfterGo], 0
  721.         jnz     after_go_exception
  722.         push    esi
  723.         call    get_new_context
  724.         and     [_eflags], not 10100h           ; clear TF,RF
  725.         call    set_context
  726.         pop     esi
  727.  
  728.     ; TODO: WTF? Need for meaning label names
  729.     .5:
  730.         push    esi
  731.         call    get_dump
  732.         pop     esi
  733.         lodsd
  734.         xor     ecx, ecx
  735.  
  736.     .6:
  737.         bt      eax, ecx
  738.         jnc     .7
  739.         mov     ebx, [drx_break+ecx*4]
  740.         test    ebx, ebx
  741.         jz      .7
  742.         pushad
  743.         dec     ebx
  744.         push    ebx
  745.         mov     esi, aBreakStop
  746.         call    put_message_nodraw
  747.         popad
  748.  
  749.     .7:
  750.         inc     ecx
  751.         cmp     cl, 4
  752.         jb      .6
  753.         push    esi
  754.         jmp     exception.done_draw
  755.  
  756. ; TODO: make it local
  757. terminated:
  758.         push    esi
  759.         mov     esi, terminated_msg
  760.         call    put_message
  761.         and     [debuggee_pid], 0
  762.         and     [temp_break], 0
  763.         mov     [bAfterGo], 0
  764.         xor     eax, eax
  765.         mov     ecx, breakpoints_n*6/4+4
  766.         mov     edi, breakpoints
  767.         rep stosd
  768.         cmp     [bReload], 1
  769.         sbb     [bReload], -1
  770.         jnz     exception.done
  771.         call    free_symbols
  772.         jmp     exception.done
  773.  
  774. exception:
  775.         mov     [bSuspended], 1
  776.         cmp     [bAfterGo], 0
  777.         jnz     after_go_exception
  778.         lodsd
  779.         push    esi
  780.         push    eax
  781.         call    get_new_context
  782.         and     [_eflags], not 10100h           ; clear TF,RF
  783.         call    set_context
  784.  
  785.     ; TODO: fix for useful name
  786.     .4:
  787.         call    get_dump
  788.         pop     eax
  789.     ; int3 command generates exception 0D, #GP
  790.         push    eax
  791.         cmp     al, 0Dh
  792.         jnz     .notdbg
  793.     ; check for 0xCC byte at eip
  794.         push    0
  795.         mcall   69, 6, [debuggee_pid], 1, [_eip], esp
  796.         pop     eax
  797.         cmp     al, 0xCC
  798.         je      .int3
  799.     ; check for 0xCD03 word at eip
  800.         push    0
  801.         inc     edx
  802.         mcall   69;, 6, [debuggee_pid], 2, [_eip], esp
  803.         pop     eax
  804.         cmp     ax, 0x03CD
  805.         jne     .notdbg
  806.         mov     eax, [_eip]
  807.         inc     [_eip]
  808.         inc     [_eip]
  809.         jmp     .user_int3_
  810.     .int3:
  811.     ; this is either dbg breakpoint or int3 cmd in debuggee
  812.         mov     eax, [_eip]
  813.         call    find_enabled_breakpoint
  814.         jnz     .user_int3
  815.     ; dbg breakpoint; clear if one-shot
  816.         pop     ecx
  817.         push    eax
  818.         mov     esi, aBreakStop
  819.         test    byte [edi+4], 4
  820.         jz      .put_msg_eax
  821.         pop     ecx
  822.         call    clear_breakpoint
  823.         jmp     .done
  824.  
  825.     .user_int3:
  826.         mov     eax, [_eip]
  827.         inc     [_eip]
  828.     .user_int3_:
  829.         pop     ecx
  830.         push    eax
  831.         call    set_context
  832.         mov     esi, aUserBreak
  833.         jmp     .put_msg_eax
  834.  
  835.     .notdbg:
  836.         pop     eax
  837.         push    eax
  838.         push    eax
  839.         mov     esi, aException
  840.         call    put_message_nodraw
  841.         pop     eax
  842.  
  843.         cmp     al, 16
  844.         ja      .suspended
  845.         mov     esi, [msg_fault_sel + eax*4]
  846.         call    put_message_nodraw
  847.  
  848.     .suspended:
  849.         mov     esi, aSuspended
  850.  
  851.     .put_msg_eax:
  852.         call    put_message_nodraw
  853.  
  854.     .done_draw:
  855.         call    draw_messages
  856.  
  857.     .done:
  858.         mcall   18, 3, [dbgwnd]    ; activate dbg window
  859.         call    redraw_title
  860.         call    draw_registers.redraw
  861.         call    draw_dump.redraw
  862.         call    update_disasm_eip
  863.  
  864. dbgmsgend:
  865.         pop     esi
  866.         mov     ecx, [dbgbuflen]
  867.         add     ecx, dbgbuf
  868.         cmp     esi, ecx
  869.         jnz     dbgmsgstart
  870.         and     [dbgbuflen], 0
  871.         neg     [dbgbufsize]
  872.         cmp     [bReload], 2
  873.         jnz     @f
  874.         mov     [bReload], 0
  875.         call    do_reload
  876.  
  877.     @@:
  878.         jmp     waitevent
  879.  
  880. ; TODO: make it local
  881. F7:
  882.         cmp     [debuggee_pid], 0
  883.         jz      .no
  884.         call    OnStep
  885.  
  886.     .no:
  887.         jmp     waitevent
  888.  
  889. ; TODO: make it local
  890. F8:
  891.         cmp     [debuggee_pid], 0
  892.         jz      F7.no
  893.         call    OnProceed
  894.         jmp     F7.no
  895.  
  896. ;-----------------------------------------------------------------------------
  897. ;                       Step execution event
  898.  
  899. ;Here we get [<number>] argument at do step <number> times
  900. OnStepMultiple:
  901.         cmp     [bSuspended], 0
  902.         jz      OnStep.running
  903.         mov     [step_num], 1
  904.         mov     esi, [curarg]
  905.         test    esi, esi
  906.         jz      .do
  907.         cmp     byte [esi], 0
  908.         jz      .do
  909.         call    get_hex_number
  910.         jc      .ret
  911.         cmp     eax, 0 ; check if lesser or equal than 0
  912.         jle     .ret
  913.         mov     [step_num], eax
  914. .do:
  915.         call    OnStep
  916.         dec     [step_num]
  917.         jnz     .do
  918. .ret:
  919.         ret
  920.  
  921. OnStep:
  922.         cmp     [bSuspended], 0
  923.         jz      .running
  924.         call    get_context
  925.         or      byte [_eflags+1], 1             ; set TF
  926.         call    set_context
  927.         and     byte [_eflags+1], not 1
  928.     ; if instruction at eip is "int xx", set one-shot breakpoint immediately after
  929.         mov     eax, [_eip]
  930.         call    find_enabled_breakpoint
  931.         jnz     @f
  932.         cmp     byte [edi+5], 0xCD
  933.         jz      .int
  934.  
  935.      @@:
  936.         push    0
  937.         ;push    69
  938.         ;pop     eax
  939.         ;push    6
  940.         ;pop     ebx
  941.         ;mov     ecx, [debuggee_pid]
  942.         ;push    3
  943.         ;pop     edx
  944.         ;mov     edi, esp
  945.         ;mov     esi, [_eip]
  946.         mcall    69, 6, [debuggee_pid], 3, [_eip], esp
  947.         cmp     eax, edx
  948.         pop     eax
  949.         jnz     .doit
  950.         cmp     al, 0xCD
  951.         jz      .int
  952.         cmp     ax, 0x050F
  953.         jz      .syscall
  954.         cmp     ax, 0x340F
  955.         jz      .sysenter
  956.  
  957.     ; resume process
  958.     .doit:
  959.         call    GoOn
  960.         cmp     [bAfterGo], 0
  961.         jz      @f
  962.         mov     [bAfterGo], 2
  963.  
  964.     @@:
  965.         ret
  966.  
  967.     ; return address is [ebp-4]
  968.     .sysenter:
  969.         push    0
  970.         ;push    69
  971.         ;pop     eax
  972.         inc     edx     ; read 4 bytes
  973.         mov     esi, [_ebp]
  974.         sub     esi, 4
  975.         mcall    69
  976.         cmp     eax, edx
  977.         pop     eax
  978.         jnz     .syscall
  979.         push    eax
  980.         and     byte [_eflags+1], not 1
  981.         call    set_context
  982.         pop     eax
  983.         jmp     @f
  984.  
  985.     .syscall:
  986.         and     byte [_eflags+1], not 1 ; clear TF - avoid system halt (!)
  987.         call    set_context
  988.  
  989.     .int:
  990.         mov     eax, [_eip]
  991.         inc     eax
  992.         inc     eax
  993.  
  994.     @@:
  995.         push    eax
  996.         call    find_enabled_breakpoint
  997.         pop     eax
  998.         jz      .doit
  999.     ; there is no enabled breakpoint yet; set temporary breakpoint
  1000.         mov     bl, 5
  1001.         call    add_breakpoint
  1002.         jmp     .doit
  1003.  
  1004.     .running:
  1005.         mov     esi, aRunningErr
  1006.         jmp     put_message
  1007.  
  1008. ;-----------------------------------------------------------------------------
  1009. ;                       Proceed process event
  1010. ;Here we get [<number>] argument at do step <number> times
  1011. OnProceedMultiple:
  1012.         cmp     [bSuspended], 0
  1013.         jz      OnStep.running
  1014.         mov     [proc_num], 1
  1015.         mov     esi, [curarg]
  1016.         test    esi, esi
  1017.         jz      .do
  1018.         cmp     byte [esi], 0
  1019.         jz      .do
  1020.         call    get_hex_number
  1021.         jc      .ret
  1022.         cmp     eax, 0 ; check if lesser or equal than 0
  1023.         jle     .ret
  1024.         mov     [proc_num], eax
  1025.         mov     [curarg], 0
  1026. .do:
  1027.         call    OnProceed
  1028.         dec     [proc_num]
  1029.         jnz     .do
  1030. .ret:
  1031.         ret
  1032.  
  1033.  
  1034. OnProceed:
  1035.         cmp     [bSuspended], 0
  1036.         jz      OnStep.running
  1037.         mov     esi, [_eip]
  1038.  
  1039.     @@:
  1040.         call    get_byte_nobreak
  1041.         jc      OnStep
  1042.         inc     esi
  1043.     ; skip prefixes
  1044.         call    is_prefix
  1045.         jz      @b
  1046.         cmp     al, 0xE8        ; call
  1047.         jnz     @f
  1048.         add     esi, 4
  1049.         jmp     .doit
  1050.  
  1051.     ; A4,A5 = movs; A6,A7 = cmps
  1052.     @@:
  1053.         cmp     al, 0xA4
  1054.         jb      @f
  1055.         cmp     al, 0xA8
  1056.         jb      .doit
  1057.  
  1058.     ; AA,AB = stos; AC,AD = lods; AE,AF = scas
  1059.     @@:
  1060.         cmp     al, 0xAA
  1061.         jb      @f
  1062.         cmp     al, 0xB0
  1063.         jb      .doit
  1064.  
  1065.     ; E0 = loopnz; E1 = loopz; E2 = loop
  1066.     @@:
  1067.         cmp     al, 0xE0
  1068.         jb      .noloop
  1069.         cmp     al, 0xE2
  1070.         ja      .noloop
  1071.         inc     esi
  1072.         jmp     .doit
  1073.  
  1074.     ; FF /2 = call
  1075.     .noloop:
  1076.         cmp     al, 0xFF
  1077.         jnz     OnStep
  1078.         call    get_byte_nobreak
  1079.         jc      OnStep
  1080.         inc     esi
  1081.         mov     cl, al
  1082.         and     al, 00111000b
  1083.         cmp     al, 00010000b
  1084.         jnz     OnStep
  1085.     ; skip instruction
  1086.         mov     al, cl
  1087.         and     eax, 7
  1088.         shr     cl, 6
  1089.         jz      .mod0
  1090.         jp      .doit
  1091.         cmp     al, 4
  1092.         jnz     @f
  1093.         inc     esi
  1094.  
  1095.     @@:
  1096.         inc     esi
  1097.         dec     cl
  1098.         jz      @f
  1099.         add     esi, 3
  1100.  
  1101.     @@:
  1102.         jmp     .doit
  1103.  
  1104.     .mod0:
  1105.         cmp     al, 4
  1106.         jnz     @f
  1107.         call    get_byte_nobreak
  1108.         jc      OnStep
  1109.         inc     esi
  1110.         and     al, 7
  1111.  
  1112.     @@:
  1113.         cmp     al, 5
  1114.         jnz     .doit
  1115.         add     esi, 4
  1116.  
  1117.     .doit:
  1118.     ; insert one-shot breakpoint at esi and resume
  1119.         call    get_byte_nobreak
  1120.         jc      OnStep
  1121.         mov     eax, esi
  1122.         call    find_enabled_breakpoint
  1123.         jz      @f
  1124.         mov     eax, esi
  1125.         mov     bl, 5
  1126.         call    add_breakpoint
  1127.         jmp     OnStep.doit
  1128.  
  1129.     @@:
  1130.         ret
  1131.  
  1132. ;-----------------------------------------------------------------------------
  1133. ;                        Read next byte of machine code
  1134.  
  1135. get_byte_nobreak:
  1136.         mov     eax, esi
  1137.         call    find_enabled_breakpoint
  1138.         jnz     .nobreak
  1139.         mov     al, [edi+5]
  1140.         clc
  1141.         ret
  1142.  
  1143.     .nobreak:
  1144.         ;push    69
  1145.         ;pop     eax
  1146.         ;push    6
  1147.         ;pop     ebx
  1148.         ;mov     ecx, [debuggee_pid]
  1149.         xor     edx, edx
  1150.         push    edx
  1151.         inc     edx
  1152.         mov     edi, esp
  1153.         mcall    69, 6, [debuggee_pid]
  1154.         dec     eax
  1155.         clc
  1156.         jz      @f
  1157.         stc
  1158.  
  1159.     @@:
  1160.         pop     eax
  1161.         ret
  1162.  
  1163. include 'parser.inc'
  1164.  
  1165. ;-----------------------------------------------------------------------------
  1166. ;                        Calculate expression event
  1167.  
  1168. OnCalc:
  1169.         mov     esi, [curarg]
  1170.         call    calc_expression
  1171.         jc      .ret
  1172.         push    ebp
  1173.         mov     esi, calc_string
  1174.         call    put_message_nodraw
  1175.         jmp     draw_messages
  1176.  
  1177.     .ret:
  1178.         ret
  1179.  
  1180. ;-----------------------------------------------------------------------------
  1181. ;                            Dump memory event
  1182.  
  1183. OnDump:
  1184.         mov     esi, [curarg]
  1185.         cmp     byte [esi], 0
  1186.         jnz     .param
  1187.         add     [dumppos], dump_height*10h
  1188.         jmp     .doit
  1189.  
  1190.     .param:
  1191.         call    calc_expression
  1192.         jc      .ret
  1193.         mov     [dumppos], ebp
  1194.  
  1195.     .doit:
  1196.         call    get_dump
  1197.         call    draw_dump.redraw
  1198.  
  1199.     .ret:
  1200.         ret
  1201.  
  1202. ;-----------------------------------------------------------------------------
  1203. ;                   Dissassemble block of executable event
  1204.  
  1205. OnUnassemble:
  1206.         mov     esi, [curarg]
  1207.         cmp     byte [esi], 0
  1208.         jnz     .param
  1209.         mov     eax, [disasm_start_pos]
  1210.         mov     ecx, [disasm_height_dd]
  1211.         mov     [disasm_cur_pos], eax
  1212.  
  1213.     .l:
  1214.         mov     eax, [disasm_cur_pos]
  1215.         call    find_symbol
  1216.         jc      @f
  1217.         dec     ecx
  1218.         jz      .m
  1219.  
  1220.     @@:
  1221.         push    ecx
  1222.         call    disasm_instr
  1223.         pop     ecx
  1224.         jc      .err
  1225.         loop    .l
  1226.  
  1227.     .m:
  1228.         mov     eax, [disasm_cur_pos]
  1229.         jmp     .doit
  1230.  
  1231.     .param:
  1232.         call    calc_expression
  1233.         jc      .ret
  1234.         mov     eax, ebp
  1235.  
  1236.     .doit:
  1237.         push    eax
  1238.         push    [disasm_start_pos]
  1239.         mov     [disasm_start_pos], eax
  1240.         call    update_disasm
  1241.         pop     [disasm_start_pos]
  1242.         pop     eax
  1243.         cmp     [disasm_cur_str], 0
  1244.         jz      @f
  1245.         mov     [disasm_start_pos], eax
  1246.  
  1247.     .ret:
  1248.         ret
  1249.  
  1250.     @@:
  1251.         call    update_disasm
  1252.  
  1253.     .err:
  1254.         mov     esi, aInvAddr
  1255.         jmp     put_message
  1256.  
  1257. ;-----------------------------------------------------------------------------
  1258. ;                       Access to register value event
  1259.  
  1260. OnReg:
  1261.         mov     esi, [curarg]
  1262.         call    get_arg.skip_spaces
  1263.         call    find_reg
  1264.         jnc     @f
  1265.  
  1266.     .err:
  1267.         mov     esi, RSyntax
  1268.         jmp     put_message
  1269.  
  1270.     @@:
  1271.         call    get_arg.skip_spaces
  1272.         test    al, al
  1273.         jz      .err
  1274.         cmp     al, '='
  1275.         jnz     @f
  1276.         inc     esi
  1277.         call    get_arg.skip_spaces
  1278.         test    al, al
  1279.         jz      .err
  1280.  
  1281.     @@:
  1282.         push    edi
  1283.         call    calc_expression
  1284.         pop     edi
  1285.         jc      .ret
  1286.     ; now edi=register id, ebp=value
  1287.         cmp     [bSuspended], 0
  1288.         mov     esi, aRunningErr
  1289.         jz      put_message
  1290.         xchg    eax, ebp
  1291.         cmp     edi, 24
  1292.         jz      .eip
  1293.         sub     edi, 4
  1294.         jb      .8lo
  1295.         sub     edi, 4
  1296.         jb      .8hi
  1297.         sub     edi, 8
  1298.         jb      .16
  1299.         mov     [_eax+edi*4], eax
  1300.         jmp     .ret
  1301.  
  1302.     .16:
  1303.         mov     word [_eax+(edi+8)*4], ax
  1304.         jmp     .ret
  1305.  
  1306.     .8lo:
  1307.         mov     byte [_eax+(edi+4)*4], al
  1308.         jmp     .ret
  1309.  
  1310.     .8hi:
  1311.         mov     byte [_eax+(edi+4)*4+1], al
  1312.         jmp     .ret
  1313.  
  1314.     .eip:
  1315.         mov     [_eip], eax
  1316.         call    update_disasm_eip
  1317.  
  1318.     .ret:
  1319.         call    set_context
  1320.         jmp     draw_registers.redraw
  1321.  
  1322. ;-----------------------------------------------------------------------------
  1323. ;                        Breakpoints manipulation
  1324. OnBp:
  1325.         mov     esi, [curarg]
  1326.         call    calc_expression
  1327.         jc      .ret
  1328.         xchg    eax, ebp
  1329.         push    eax
  1330.         call    find_breakpoint
  1331.         inc     eax
  1332.         pop     eax
  1333.         jz      .notfound
  1334.         mov     esi, aDuplicateBreakpoint
  1335.         jmp     .sayerr
  1336.  
  1337.     .notfound:
  1338.         mov     bl, 1
  1339.         call    add_breakpoint
  1340.         jnc     .ret
  1341.         mov     esi, aBreakpointLimitExceeded
  1342.  
  1343.     .sayerr:
  1344.         call    put_message
  1345.  
  1346.     .ret:
  1347.         jmp     draw_disasm
  1348.  
  1349. OnBpmb:
  1350.         mov     dh, 0011b
  1351.         jmp     DoBpm
  1352.  
  1353. OnBpmw:
  1354.         mov     dh, 0111b
  1355.         jmp     DoBpm
  1356.  
  1357. OnBpmd:
  1358.         mov     dh, 1111b
  1359.  
  1360. DoBpm:
  1361.         mov     esi, [curarg]
  1362.         cmp     byte [esi], 'w'
  1363.         jnz     @f
  1364.         and     dh, not 2
  1365.         inc     esi
  1366.  
  1367.     @@:
  1368.         push    edx
  1369.         call    calc_expression
  1370.         pop     edx
  1371.         jnc     @f
  1372.         ret
  1373.  
  1374.     ; ebp = expression, dh = flags
  1375.     @@:
  1376.         movzx   eax, dh
  1377.         shr     eax, 2
  1378.         test    ebp, eax
  1379.         jz      @f
  1380.         mov     esi, aUnaligned
  1381.         jmp     put_message
  1382.  
  1383.     @@:
  1384.         mov     eax, ebp
  1385.         mov     bl, 0Bh
  1386.         call    add_breakpoint
  1387.         jnc     @f
  1388.         mov     esi, aBreakpointLimitExceeded
  1389.         jmp     put_message
  1390.  
  1391.     ; now find index
  1392.     @@:
  1393.         push    eax
  1394.         xor     ecx, ecx
  1395.  
  1396.     .l1:
  1397.         cmp     [drx_break+ecx*4], 0
  1398.         jnz     .l2
  1399.         ;push    69
  1400.         ;pop     eax
  1401.         push    ecx
  1402.         mov     dl, cl
  1403.         ;mov     ecx, [debuggee_pid]
  1404.         mov     esi, ebp
  1405.         ;push    9
  1406.         ;pop     ebx
  1407.         mcall    69, 9, [debuggee_pid]
  1408.         test    eax, eax
  1409.         jz      .ok
  1410.         pop     ecx
  1411.  
  1412.     .l2:
  1413.         inc     ecx
  1414.         cmp     ecx, 4
  1415.         jb      .l1
  1416.         pop     eax
  1417.         call    clear_breakpoint
  1418.         mov     esi, aBreakpointLimitExceeded
  1419.         jmp     put_message
  1420.  
  1421.     .ok:
  1422.         pop     ecx
  1423.         pop     eax
  1424.         and     byte [edi], not 2       ; breakpoint is enabled
  1425.         shl     dl, 6
  1426.         or      dl, dh
  1427.         mov     byte [edi+1], dl
  1428.         inc     eax
  1429.         mov     [drx_break+ecx*4], eax
  1430.         ret
  1431.  
  1432. OnBc:
  1433.         mov     esi, [curarg]
  1434.  
  1435.     @@:
  1436.         call    get_hex_number
  1437.         jc      OnBp.ret
  1438.         call    clear_breakpoint
  1439.         jmp     @b
  1440.  
  1441. OnBd:
  1442.         mov     esi, [curarg]
  1443.  
  1444.     @@:
  1445.         call    get_hex_number
  1446.         jc      OnBp.ret
  1447.         call    disable_breakpoint
  1448.         jmp     @b
  1449.  
  1450. OnBe:
  1451.         mov     esi, [curarg]
  1452.  
  1453.     @@:
  1454.         call    get_hex_number
  1455.         jc      OnBp.ret
  1456.         push    eax
  1457.         call    find_enabled_breakpoint
  1458.         pop     eax
  1459.         jz      .err
  1460.         call    enable_breakpoint
  1461.         jmp     @b
  1462.  
  1463.     .err:
  1464.         mov     esi, OnBeErrMsg
  1465.         jmp     put_message
  1466.  
  1467. ; TODO: split it out in parser.inc
  1468. get_hex_number:
  1469.         call    get_arg.skip_spaces
  1470.         xor     ecx, ecx
  1471.         xor     edx, edx
  1472.  
  1473.     @@:
  1474.         lodsb
  1475.         call    is_hex_digit
  1476.         jc      .ret
  1477.         shl     edx, 4
  1478.         or      dl, al
  1479.         inc     ecx
  1480.         jmp     @b
  1481.  
  1482.     .ret:
  1483.         dec     esi
  1484.         cmp     ecx, 1
  1485.         xchg    eax, edx
  1486.         ret
  1487.  
  1488. ;-----------------------------------------------------------------------------
  1489. ;                       Breakpoints list event
  1490.  
  1491. OnBl:
  1492.         mov     esi, [curarg]
  1493.         cmp     byte [esi], 0
  1494.         jz      .listall
  1495.         call    get_hex_number
  1496.         jc      .ret
  1497.         cmp     eax, breakpoints_n
  1498.         jae     .err
  1499.         push    eax
  1500.         add     eax, eax
  1501.         lea     edi, [breakpoints + eax + eax*2]
  1502.         pop     eax
  1503.         test    byte [edi+4], 1
  1504.         jz      .err
  1505.         call    show_break_info
  1506.  
  1507.     .ret:
  1508.         ret
  1509.  
  1510.     .err:
  1511.         mov     esi, aInvalidBreak
  1512.         jmp     put_message
  1513.  
  1514.     .listall:
  1515.         mov     edi, breakpoints
  1516.         xor     eax, eax
  1517.  
  1518.     @@:
  1519.         test    byte [edi+4], 1
  1520.         jz      .cont
  1521.         push    edi eax
  1522.         call    show_break_info
  1523.         pop     eax edi
  1524.  
  1525.     .cont:
  1526.         add     edi, 6
  1527.         inc     eax
  1528.         cmp     eax, breakpoints_n
  1529.         jb      @b
  1530.         ret
  1531.  
  1532. ;-----------------------------------------------------------------------------
  1533.  
  1534. show_break_info:
  1535.         push    edi
  1536.         test    byte [edi+4], 8
  1537.         jnz     .dr
  1538.         push    dword [edi]
  1539.         push    eax
  1540.         mov     esi, aBreakNum
  1541.         call    put_message_nodraw
  1542.         jmp     .cmn
  1543.  
  1544.     .dr:
  1545.         push    eax
  1546.         mov     esi, aMemBreak1
  1547.         call    put_message_nodraw
  1548.         pop     edi
  1549.         push    edi
  1550.         mov     esi, aMemBreak2
  1551.         test    byte [edi+5], 2
  1552.         jz      @f
  1553.         mov     esi, aMemBreak3
  1554.  
  1555.     @@:
  1556.         call    put_message_nodraw
  1557.         pop     edi
  1558.         push    edi
  1559.         mov     esi, aMemBreak6
  1560.         test    byte [edi+5], 8
  1561.         jnz     @f
  1562.         mov     esi, aMemBreak5
  1563.         test    byte [edi+5], 4
  1564.         jnz     @f
  1565.         mov     esi, aMemBreak4
  1566.  
  1567.     @@:
  1568.         call    put_message_nodraw
  1569.         pop     edi
  1570.         push    edi
  1571.         push    dword [edi]
  1572.         mov     esi, aMemBreak7
  1573.         call    put_message_nodraw
  1574.  
  1575.     .cmn:
  1576.         pop     edi
  1577.         test    byte [edi+4], 2
  1578.         jz      @f
  1579.         push    edi
  1580.         mov     esi, aDisabled
  1581.         call    put_message_nodraw
  1582.         pop     edi
  1583.  
  1584.     @@:
  1585.         test    byte [edi+4], 4
  1586.         jz      @f
  1587.         mov     esi, aOneShot
  1588.         call    put_message_nodraw
  1589.  
  1590.     @@:
  1591.         mov     esi, newline
  1592.         jmp     put_message
  1593.  
  1594. ;-----------------------------------------------------------------------------
  1595. ;                        Add breakpoint
  1596. ; in: EAX = address; BL = flags
  1597. ; out: CF = 1 => error
  1598. ;      CF = 0 and EAX = breakpoint number
  1599.  
  1600. add_breakpoint:
  1601.         xor     ecx, ecx
  1602.         mov     edi, breakpoints
  1603.  
  1604.     @@:
  1605.         test    byte [edi+4], 1
  1606.         jz      .found
  1607.         add     edi, 6
  1608.         inc     ecx
  1609.         cmp     ecx, breakpoints_n
  1610.         jb      @b
  1611.         stc
  1612.         ret
  1613.  
  1614.     .found:
  1615.         stosd
  1616.         xchg    eax, ecx
  1617.         mov     [edi], bl
  1618.         test    bl, 2
  1619.         jnz     @f
  1620.         or      byte [edi], 2
  1621.         push    eax
  1622.         call    enable_breakpoint
  1623.         pop     eax
  1624.  
  1625.     @@:
  1626.         clc
  1627.         ret
  1628.  
  1629. ;-----------------------------------------------------------------------------
  1630. ;                         Remove breakpoint
  1631.  
  1632. clear_breakpoint:
  1633.         cmp     eax, breakpoints_n
  1634.         jae     .ret
  1635.         mov     ecx, 4
  1636.         inc     eax
  1637.  
  1638.     .1:
  1639.         cmp     [drx_break-4+ecx*4], eax
  1640.         jnz     @f
  1641.         and     [drx_break-4+ecx*4], 0
  1642.  
  1643.     @@:
  1644.         loop    .1
  1645.         dec     eax
  1646.         push    eax
  1647.         add     eax, eax
  1648.         lea     edi, [breakpoints + eax + eax*2 + 4]
  1649.         test    byte [edi], 1
  1650.         pop     eax
  1651.         jz      .ret
  1652.         push    edi
  1653.         call    disable_breakpoint
  1654.         pop     edi
  1655.         mov     byte [edi], 0
  1656.  
  1657.     .ret:
  1658.         ret
  1659.  
  1660. ;-----------------------------------------------------------------------------
  1661. ;                          Disable breakpoint
  1662.  
  1663. disable_breakpoint:
  1664.         cmp     eax, breakpoints_n
  1665.         jae     .ret
  1666.         add     eax, eax
  1667.         lea     edi, [breakpoints + eax + eax*2 + 5]
  1668.         test    byte [edi-1], 1
  1669.         jz      .ret
  1670.         test    byte [edi-1], 2
  1671.         jnz     .ret
  1672.         or      byte [edi-1], 2
  1673.         test    byte [edi-1], 8
  1674.         jnz     .dr
  1675.         push    esi
  1676.         ;push    7
  1677.         ;pop     ebx
  1678.         ;push    69
  1679.         ;pop     eax
  1680.         ;mov     ecx, [debuggee_pid]
  1681.         ;xor     edx, edx
  1682.         ;inc     edx
  1683.         ;mov     esi, [edi-5]
  1684.         mcall    69, 7, [debuggee_pid], 1, [edi-5]
  1685.         pop     esi
  1686.  
  1687.     .ret:
  1688.         ret
  1689.  
  1690.     .dr:
  1691.         mov     dl, [edi]
  1692.         shr     dl, 6
  1693.         mov     dh, 80h
  1694.         ;push    69
  1695.         ;pop     eax
  1696.         ;push    9
  1697.         ;pop     ebx
  1698.         ;mov     ecx, [debuggee_pid]
  1699.         mcall    69, 9, [debuggee_pid]
  1700.         ret
  1701.  
  1702. ;-----------------------------------------------------------------------------
  1703. ;                           Enable breakpoint
  1704.  
  1705. enable_breakpoint:
  1706.         push    esi
  1707.         cmp     eax, breakpoints_n
  1708.         jae     .ret
  1709.         add     eax, eax
  1710.         lea     edi, [breakpoints + eax + eax*2 + 5]
  1711.         test    byte [edi-1], 1
  1712.         jz      .ret
  1713.         test    byte [edi-1], 2
  1714.         jz      .ret
  1715.         and     byte [edi-1], not 2
  1716.         test    byte [edi-1], 8
  1717.         jnz     .dr
  1718.         ;push    6
  1719.         ;pop     ebx
  1720.         ;push    69
  1721.         ;pop     eax
  1722.         ;mov     esi, [edi-5]
  1723.         ;mov     ecx, [debuggee_pid]
  1724.         ;xor     edx, edx
  1725.         ;inc     edx
  1726.         mcall    69, 6, [debuggee_pid], 1, [edi-5]
  1727.         dec     eax
  1728.         jnz     .err
  1729.         ;mov     al, 69
  1730.         push    0xCC
  1731.         mov     edi, esp
  1732.         inc     ebx
  1733.         mcall    69
  1734.         pop     eax
  1735.  
  1736.     .ret:
  1737.         pop     esi
  1738.         ret
  1739.  
  1740.     .err:
  1741.         or      byte [edi-1], 2
  1742.         mov     esi, aBreakErr
  1743.         call    put_message
  1744.         pop     esi
  1745.         ret
  1746.  
  1747.     .dr:
  1748.         ;push    9
  1749.         ;pop     ebx
  1750.         ;push    69
  1751.         ;pop     eax
  1752.         mov     esi, [edi-5]
  1753.         ;mov     ecx, [debuggee_pid]
  1754.         mov     dl, [edi]
  1755.         shr     dl, 6
  1756.         mov     dh, [edi]
  1757.         and     dh, 0xF
  1758.         mcall    69, 9, [debuggee_pid]
  1759.         test    eax, eax
  1760.         jnz     .err
  1761.         pop     esi
  1762.         ret
  1763.  
  1764. ;-----------------------------------------------------------------------------
  1765. ;                             Find breakpoint
  1766.  
  1767. find_breakpoint:
  1768.         xor     ecx, ecx
  1769.         xchg    eax, ecx
  1770.         mov     edi, breakpoints
  1771.  
  1772.     @@:
  1773.         test    byte [edi+4], 1
  1774.         jz      .cont
  1775.         test    byte [edi+4], 8
  1776.         jnz     .cont
  1777.         cmp     [edi], ecx
  1778.         jz      .found
  1779.  
  1780.     .cont:
  1781.         add     edi, 6
  1782.         inc     eax
  1783.         cmp     eax, breakpoints_n
  1784.         jb      @b
  1785.         or      eax, -1
  1786.  
  1787.     .found:
  1788.         ret
  1789.  
  1790. ;-----------------------------------------------------------------------------
  1791. ;
  1792.  
  1793. find_enabled_breakpoint:
  1794.         xor     ecx, ecx
  1795.         xchg    eax, ecx
  1796.         mov     edi, breakpoints
  1797.  
  1798.     @@:
  1799.         test    byte [edi+4], 1
  1800.         jz      .cont
  1801.         test    byte [edi+4], 2 or 8
  1802.         jnz     .cont
  1803.         cmp     [edi], ecx
  1804.         jz      .found
  1805.  
  1806.     .cont:
  1807.         add     edi, 6
  1808.         inc     eax
  1809.         cmp     eax, breakpoints_n
  1810.         jb      @b
  1811.         or      eax, -1
  1812.  
  1813.     .found:
  1814.         ret
  1815.  
  1816. ; TODO: add find_disabled_breakpoint
  1817.  
  1818. ;-----------------------------------------------------------------------------
  1819. ;                       Unpack executable event
  1820.  
  1821. OnUnpack:
  1822.     ; program must be loaded - checked when command was parsed
  1823.     ; program must be stopped
  1824.         mov     esi, aRunningErr
  1825.         cmp     [bSuspended], 0
  1826.         jz      put_message
  1827.    ; all breakpoints must be disabled
  1828.         mov     edi, breakpoints
  1829.  
  1830.     @@:
  1831.         test    byte [edi+4], 1
  1832.         jz      .cont
  1833.         test    byte [edi+4], 2
  1834.         jnz     .cont
  1835.         mov     esi, aEnabledBreakErr
  1836.         jmp     put_message
  1837.  
  1838.     .cont:
  1839.         add     edi, 6
  1840.         cmp     edi, breakpoints+breakpoints_n*6
  1841.         jb      @b
  1842.     ; ok, now do it
  1843.     ; set breakpoint on 0xC dword access
  1844.         push    9
  1845.         pop     ebx
  1846.         mov     ecx, [debuggee_pid]
  1847.         mov     dx, 1111b*256
  1848.         push    0xC
  1849.         pop     esi
  1850.  
  1851.     @@:
  1852.         ;push    69
  1853.         ;pop     eax
  1854.         mcall    69
  1855.         test    eax, eax
  1856.         jz      .breakok
  1857.         inc     edx
  1858.         cmp     dl, 4
  1859.         jb      @b
  1860.  
  1861.     .breakok:
  1862.         call    GoOn
  1863.  
  1864.     ; now wait for event
  1865.     .wait:
  1866.         ;push    10
  1867.         ;pop     eax
  1868.         mcall    10
  1869.         dec     eax
  1870.         jz      .redraw
  1871.         dec     eax
  1872.         jz      .key
  1873.         dec     eax
  1874.         jnz     .debug
  1875.     ; button; we have only one button, close
  1876.         or      eax, -1
  1877.         mcall
  1878.  
  1879.     .redraw:
  1880.         call    draw_window
  1881.         jmp     .wait
  1882.  
  1883.     .key:
  1884.         mov     al, 2
  1885.         mcall
  1886.         cmp     ah, 3   ; Ctrl+C
  1887.         jnz     .wait
  1888.  
  1889.     .userbreak:
  1890.         mov     esi, aInterrupted
  1891.  
  1892.     .x1:
  1893.         push    edx esi
  1894.         call    put_message
  1895.         pop     esi edx
  1896.         or      dh, 80h
  1897.         ;push    69
  1898.         ;pop     eax
  1899.         ;push    9
  1900.         ;pop     ebx
  1901.         ;mov     ecx, [debuggee_pid]
  1902.         mcall    69, 9, [debuggee_pid]
  1903.         cmp     esi, aUnpacked
  1904.         jnz     OnSuspend
  1905.         jmp     AfterSuspend
  1906.  
  1907.     .debug:
  1908.         cmp     [dbgbuflen], 4*3
  1909.         jnz     .notour
  1910.         cmp     dword [dbgbuf], 3
  1911.         jnz     .notour
  1912.         test    byte [dbgbuf+8], 1
  1913.         jnz     .our
  1914.  
  1915.     .notour:
  1916.         mov     esi, aInterrupted
  1917.         push    edx
  1918.         call    put_message
  1919.         pop     edx
  1920.         or      dh, 80h
  1921.         ;push    69
  1922.         ;pop     eax
  1923.         ;push    9
  1924.         ;pop     ebx
  1925.         ;mov     ecx, [debuggee_pid]
  1926.         mcall    69, 9, [debuggee_pid]
  1927.         jmp     debugmsg
  1928.  
  1929.     .our:
  1930.         and     [dbgbuflen], 0
  1931.         push    edx
  1932.         call    get_context
  1933.         push    eax
  1934.         ;mov     al, 69
  1935.         ;mov     bl, 6
  1936.         ;mov     ecx, [debuggee_pid]
  1937.         ;mov     edi, esp
  1938.         ;push    4
  1939.         ;pop     edx
  1940.         ;push    0xC
  1941.         ;pop     esi
  1942.         mcall    69, 6, [debuggee_pid], 4, 0xC, esp
  1943.         pop     eax
  1944.         pop     edx
  1945.         cmp     eax, [_eip]
  1946.         jz      .done
  1947.         call    DoResume
  1948.         jmp     .wait
  1949.  
  1950.     .done:
  1951.         mov     esi, aUnpacked
  1952.         jmp     .x1
  1953.  
  1954. ;-----------------------------------------------------------------------------
  1955. ;                            Include Symbol parser
  1956.  
  1957. include 'symbols.inc'
  1958.  
  1959. ;-----------------------------------------------------------------------------
  1960. ;                        Include disassembler engine
  1961.  
  1962. include 'disasm.inc'
  1963.  
  1964. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1965. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DATA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1966. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1967.  
  1968. caption_str db  'Kolibri Debugger',0
  1969.  
  1970. begin_str db    'Kolibri Debugger, version 0.35',10
  1971.         db      'Hint: type "help" for help, "quit" to quit'
  1972. newline db      10,0
  1973. prompt  db      '> ',0
  1974.  
  1975. help_groups:
  1976.         dd      aControl, 0, 0, help_control_msg
  1977.         db      0
  1978.         dd      aData, 0, 0, help_data_msg
  1979.         db      0
  1980.         dd      aBreakpoints, 0, 0, help_breaks_msg
  1981.         db      0
  1982.  
  1983. ;-----------------------------------------------------------------------------
  1984. ;                   Commands format definitions
  1985.  
  1986. ; TODO: make it with macros
  1987.  
  1988. ; flags field:
  1989. ; &1: command may be called without parameters
  1990. ; &2: command may be called with parameters
  1991. ; &4: command may be called without loaded program
  1992. ; &8: command may be called with loaded program
  1993. commands:
  1994.         dd      _aH, OnHelp, HelpSyntax, HelpHelp
  1995.         db      0Fh
  1996.         dd      aHelp, OnHelp, HelpSyntax, HelpHelp
  1997.         db      0Fh
  1998.         dd      aQuit, OnQuit, QuitSyntax, QuitHelp
  1999.         db      0Dh
  2000.         dd      aLoad, OnLoad, LoadSyntax, LoadHelp
  2001.         db      6
  2002.         dd      aReload, OnReload, ReloadSyntax, ReloadHelp
  2003.         db      0Dh
  2004.         dd      aTerminate, OnTerminate, TerminateSyntax, TerminateHelp
  2005.         db      9
  2006.         dd      aDetach, OnDetach, DetachSyntax, DetachHelp
  2007.         db      9
  2008.         dd      aSuspend, OnSuspend, SuspendSyntax, SuspendHelp
  2009.         db      9
  2010.         dd      aResume, OnResume, ResumeSyntax, ResumeHelp
  2011.         db      0Bh
  2012.         dd      aStep, OnStepMultiple, StepSyntax, StepHelp
  2013.         db      0Bh
  2014.         dd      aProceed, OnProceedMultiple, ProceedSyntax, ProceedHelp
  2015.         db      0Bh
  2016.         dd      aCalc, OnCalc, CalcSyntax, CalcHelp
  2017.         db      0Eh
  2018.         dd      aDump, OnDump, DumpSyntax, DumpHelp
  2019.         db      0Bh
  2020.         dd      aUnassemble, OnUnassemble, UnassembleSyntax, UnassembleHelp
  2021.         db      0Bh
  2022.         dd      aBp, OnBp, BpSyntax, BpHelp
  2023.         db      0Ah
  2024.         dd      aBpm, OnBpmb, BpmSyntax, BpmHelp
  2025.         db      0Ah
  2026.         dd      aBpmb, OnBpmb, BpmSyntax, BpmHelp
  2027.         db      0Ah
  2028.         dd      aBpmw, OnBpmw, BpmSyntax, BpmHelp
  2029.         db      0Ah
  2030.         dd      aBpmd, OnBpmd, BpmSyntax, BpmHelp
  2031.         db      0Ah
  2032.         dd      aBl, OnBl, BlSyntax, BlHelp
  2033.         db      0Bh
  2034.         dd      aBc, OnBc, BcSyntax, BcHelp
  2035.         db      0Ah
  2036.         dd      aBd, OnBd, BdSyntax, BdHelp
  2037.         db      0Ah
  2038.         dd      aBe, OnBe, BeSyntax, BeHelp
  2039.         db      0Ah
  2040.         dd      aReg, OnReg, RSyntax, RHelp
  2041.         db      0Ah
  2042.         dd      aUnpack, OnUnpack, UnpackSyntax, UnpackHelp
  2043.         db      9
  2044.         dd      aLoadSymbols, OnLoadSymbols, LoadSymbolsSyntax, LoadSymbolsHelp
  2045.         db      0Ah
  2046.         dd      0
  2047.  
  2048. ;-----------------------------------------------------------------------------
  2049. ;                   Help messages for commands groups
  2050.  
  2051. aHelp   db      5,'help',0
  2052. _aH     db      2,'h',0
  2053. HelpHelp db     'Help on specified function',10
  2054. HelpSyntax db   'Usage: h or help [group | command]',10,0
  2055.  
  2056. help_msg db     'List of known command groups:',10
  2057.         db      '"help control"     - display list of control commands',10
  2058.         db      '"help data"        - display list of commands concerning data',10
  2059.         db      '"help breakpoints" - display list of commands concerning breakpoints',10,0
  2060.  
  2061. ;               Control commands group
  2062.  
  2063. aControl db     8,'control',0
  2064. help_control_msg db     'List of control commands:',10
  2065.         db      'h = help             - help',10
  2066.         db      'quit                 - exit from debugger',10
  2067.         db      'load <name> [params] - load program for debugging',10
  2068.         db      'reload               - reload debugging program',10
  2069.         db      'load-symbols <name>  - load information on symbols for program',10
  2070.         db      'terminate            - terminate loaded program',10
  2071.         db      'detach               - detach from debugging program',10
  2072.         db      'stop                 - suspend execution of debugging program',10
  2073.         db      'g [<expression>]     - go on (resume execution of debugging program)',10
  2074.         db      's [<num>]            - program step, also <F7>',10
  2075.         db      'p [<num>]            - program wide step, also <F8>',10
  2076.         db      'unpack               - try to bypass unpacker code (heuristic)',10,0
  2077.  
  2078. ;               Data commands group
  2079.  
  2080. aData   db      5,'data',0
  2081. help_data_msg db        'List of data commands:',10
  2082.         db      '? <expression>       - calculate value of expression',10
  2083.         db      'd [<expression>]     - dump data at given address',10
  2084.         db      'u [<expression>]     - unassemble instructions at given address',10
  2085.         db      'r <register> <expression> or',10
  2086.         db      'r <register>=<expression> - set register value',10,0
  2087.  
  2088. ;               Breakpoints commands group
  2089.  
  2090. aBreakpoints db 12,'breakpoints',0
  2091. help_breaks_msg db      'List of breakpoints commands:',10
  2092.         db      'bp <expression>      - set breakpoint on execution',10
  2093.         db      'bpm[b|w|d] <type> <expression> - set breakpoint on memory access',10
  2094.         db      'bl [<number>]        - breakpoint(s) info',10
  2095.         db      'bc <number>...       - clear breakpoint',10
  2096.         db      'bd <number>...       - disable breakpoint',10
  2097.         db      'be <number>...       - enable breakpoint',10,0
  2098.  
  2099. ;-----------------------------------------------------------------------------
  2100. ;                    Individual command help messages
  2101.  
  2102. aQuit   db      5,'quit',0
  2103. QuitHelp db     'Quit from debugger',10
  2104. QuitSyntax db   'Usage: quit',10,0
  2105.  
  2106. aLoad   db      5,'load',0
  2107. LoadHelp db     'Load program for debugging',10
  2108. LoadSyntax db   'Usage: load <program-name> [parameters]',10,0
  2109.  
  2110. aReload db      7,'reload',0
  2111. ReloadHelp db   'Reload debugging program (restart debug session)',10
  2112. ReloadSyntax db 'Usage: reload',10,0
  2113.  
  2114. aTerminate db   10,'terminate',0
  2115. TerminateHelp db 'Terminate debugged program',10
  2116. TerminateSyntax db 'Usage: terminate',10,0
  2117.  
  2118. aDetach db      7,'detach',0
  2119. DetachHelp db   'Detach from debugged program',10
  2120. DetachSyntax db 'Usage: detach',10,0
  2121.  
  2122. aSuspend db     5,'stop',0
  2123. SuspendHelp db  'Suspend execution of debugged program',10
  2124. SuspendSyntax db 'Usage: stop',10,0
  2125.  
  2126. aResume db      2,'g',0
  2127. ResumeHelp db   'Go (resume execution of debugged program)',10
  2128. ResumeSyntax db 'Usage: g',10
  2129.         db      '   or: g <expression> - wait until specified address is reached',10,0
  2130.  
  2131. aStep   db      2,'s',0
  2132. StepHelp db     'Make step in debugged program',10
  2133. StepSyntax db   'Usage: s [<number>]',10,0
  2134.  
  2135. aProceed db     2,'p',0
  2136. ProceedHelp db  'Make wide step in debugged program (step over CALL, REPxx, LOOP)',10
  2137. ProceedSyntax db 'Usage: p [<number>]',10,0
  2138.  
  2139. aDump   db      2,'d',0
  2140. DumpHelp db     'Dump data of debugged program',10
  2141. DumpSyntax db   'Usage: d <expression> - dump data at specified address',10
  2142.         db      '   or: d              - continue current dump',10,0
  2143.  
  2144. aCalc   db      2,'?',0
  2145. CalcHelp db     'Calculate value of expression',10
  2146. CalcSyntax db   'Usage: ? <expression>',10,0
  2147.  
  2148. aUnassemble db  2,'u',0
  2149. UnassembleHelp db 'Unassemble',10
  2150. UnassembleSyntax db      'Usage: u <expression> - unassemble instructions at specified address',10
  2151.                  db      '   or: u              - continue current unassemble screen',10,0
  2152.  
  2153. aReg    db      2,'r',0
  2154. RHelp   db      'Set register value',10
  2155. RSyntax db      'Usage: r <register> <expression>',10
  2156.         db      '   or: r <register>=<expression> - set value of <register> to <expression>',10,0
  2157.  
  2158. aBp     db      3,'bp',0
  2159. BpHelp  db      'set BreakPoint on execution',10
  2160. BpSyntax db     'Usage: bp <expression>',10,0
  2161.  
  2162. aBpm    db      4,'bpm',0
  2163. aBpmb   db      5,'bpmb',0
  2164. aBpmw   db      5,'bpmw',0
  2165. aBpmd   db      5,'bpmd',0
  2166. BpmHelp db      'set BreakPoint on Memory access',10
  2167.         db      'Maximum 4 breakpoints of this type are allowed',10
  2168.         db      'Note that for this breaks debugger is activated after access',10
  2169. BpmSyntax db    'Usage: bpmb [w] <expression>',10
  2170.         db      '       bpmw [w] <expression>',10
  2171.         db      '       bpmd [w] <expression>',10
  2172.         db      '       bpm is synonym for bpmd',10
  2173.         db      '"w" means break only on writes (default is on read/write)',10,0
  2174.  
  2175. aBl     db      3,'bl',0
  2176. BlHelp  db      'Breakpoint List',10
  2177. BlSyntax db     'Usage: bl          - list all breakpoints',10
  2178.         db      '       bl <number> - display info on particular breakpoint',10,0
  2179.  
  2180. aBc     db      3,'bc',0
  2181. BcHelp  db      'Breakpoint Clear',10
  2182. BcSyntax db     'Usage: bc <number-list>',10
  2183.         db      'Examples: bc 2',10
  2184.         db      '          bc 1 3 4 A',10,0
  2185.  
  2186. aBd     db      3,'bd',0
  2187. BdHelp  db      'Breakpoint Disable',10
  2188. BdSyntax db     'Usage: bd <number-list>',10
  2189.         db      'Examples: bd 2',10
  2190.         db      '          bd 1 3 4 A',10,0
  2191.  
  2192. aBe     db      3,'be',0
  2193. BeHelp  db      'Breakpoint Enable',10
  2194. BeSyntax db     'Usage: be <number-list>',10
  2195.         db      'Examples: be 2',10
  2196.         db      '          be 1 3 4 A',10,0
  2197.  
  2198. aUnpack db      7,'unpack',0
  2199. UnpackHelp db   'Try to bypass unpacker code',10
  2200. UnpackSyntax db 'Usage: unpack',10,0
  2201.  
  2202. aLoadSymbols db 13,'load-symbols',0
  2203. LoadSymbolsHelp db 'Load symbolic information for executable',10
  2204. LoadSymbolsSyntax db 'Usage: load-symbols <symbols-file-name>',10,0
  2205.  
  2206. aUnknownCommand db 'Unknown command',10,0
  2207.  
  2208. ;-----------------------------------------------------------------------------
  2209. ;                             Error messages
  2210.  
  2211. load_err_msg    db      'Cannot load program. ',0
  2212. unk_err_msg     db      'Unknown error code -%4X',10,0
  2213. aCannotLoadFile db      'Cannot load file. ',0
  2214. unk_err_msg2    db      'Unknown error code %4X.',10,0
  2215. load_err_msgs:
  2216.         dd      .1, 0, .3, 0, .5, .6, 0, 0, .9, .A, 0, 0, 0, 0, 0, 0
  2217.         dd      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, .1E, .1F, .20
  2218. .1              db      'HD undefined.',10,0
  2219. .3              db      'Unknown FS.',10,0
  2220. .5              db      'File not found.',10,0
  2221. .6              db      'Unexpected EOF.',10,0
  2222. .9              db      'FAT table corrupted.',10,0
  2223. .A              db      'Access denied.',10,0
  2224. .1E             db      'No memory.',10,0
  2225. .1F             db      'Not Menuet/Kolibri executable.',10,0
  2226. .20             db      'Too many processes.',10,0
  2227. load_succ_msg   db      'Program loaded successfully! PID=%4X. Use "g" to run.',10,0
  2228. need_debuggee   db      'No program loaded. Use "load" command.',10,0
  2229. aAlreadyLoaded  db      'Program is already loaded. Use "terminate" or "detach" commands',10,0
  2230. terminated_msg  db      'Program terminated.',10,0
  2231. aException      db      'Debugged program caused an exception %2X. ', 0
  2232. msg_fault_sel   dd  aDivide, aDebug, aNonMask, aUndefined, aOverflow
  2233.                 dd  aBounds, aInvalid, aCoProcessorNA, aDoubleFault
  2234.                 dd  aUndefined, aInvalidTSS, aSegment, aStack
  2235.                 dd  aProtection, aPageFault, aUndefined, aCoProcessor
  2236. aDivide         db      '(Divide error)',10,0
  2237. aDebug          db      '(Single-step/debug exception)',10,0
  2238. aNonMask        db      '(Nonmaskable interrupt)',10,0
  2239. aOverflow       db      '(Overflow)',10,0
  2240. aBounds         db      '(Bounds check)',10,0
  2241. aInvalid        db      '(Invalid opcode)',10,0
  2242. aCoProcessorNA  db      '(Coprocessor not available)',10,0
  2243. aDoubleFault    db      '(Double fault)',10,0
  2244. aUndefined      db      '(Undefined fault)',10,0
  2245. aInvalidTSS     db      '(Invalid TSS)',10,0
  2246. aSegment        db      '(Segment not present)',10,0
  2247. aStack          db      '(Stack fault)',10,0
  2248. aProtection     db      '(General protection fault)',10,0
  2249. aPageFault      db      '(Page fault)',10,0
  2250. aCoProcessor    db      '(Coprocessor error)',10,0
  2251. aSuspended      db      'Suspended',10,0
  2252. aContinued      db      'Continuing',10,0
  2253. aRunningErr     db      'Program is running',10,0
  2254. read_mem_err    db      'ERROR: cannot read process memory!!!',10,0
  2255. aBreakpointLimitExceeded db 'Breakpoint limit exceeded',10,0
  2256. aBreakErr       db      'Cannot activate breakpoint, it will be disabled',10,0
  2257. aDuplicateBreakpoint db 'Duplicate breakpoint',10,0
  2258. aInvalidBreak   db      'Invalid breakpoint number',10,0
  2259. OnBeErrMsg      db      'There is already enabled breakpoint on this address',10,0
  2260. aBreakNum       db      '%2X: at %8X',0
  2261. aMemBreak1      db      '%2X: on ',0
  2262. aMemBreak2      db      'read from ',0
  2263. aMemBreak3      db      'access of ',0
  2264. aMemBreak4      db      'byte',0
  2265. aMemBreak5      db      'word',0
  2266. aMemBreak6      db      'dword',0
  2267. aMemBreak7      db      ' at %8X',0
  2268. aOneShot        db      ', one-shot',0
  2269. aDisabled       db      ', disabled',0
  2270. aBreakStop      db      'Breakpoint #%2X',10,0
  2271. aUserBreak      db      'int3 command at %8X',10,0
  2272. ;dbgmsg_str     db      'Debug message for process %4X.',10,0
  2273. aInvAddr        db      'Invalid address',10,0
  2274. NoPrgLoaded_str db      'No program loaded'
  2275. NoPrgLoaded_len = $ - NoPrgLoaded_str
  2276. aRunning        db      'Running'
  2277. aPaused         db      'Paused'
  2278.  
  2279. aFPU            db      '[ FPU ]'
  2280. aMMX            db      '[ MMX ]'
  2281. aSSE            db      '[SSE32]'
  2282. aSSE2           db      '[SSE64]'
  2283. aMMX128         db      '[MMX128]'
  2284.  
  2285. aAVX            db      '[ AVX ]'
  2286. aMSR            db      '[ MSR ]'
  2287. aPoint          db      0x1C
  2288. aMinus          db      '-'
  2289. aColon          db      ':'
  2290. aSpace          db      ' '
  2291. aQuests         db      '??'
  2292. aDots           db      '...'
  2293. aParseError     db      'Parse error',10,0
  2294. aDivByZero      db      'Division by 0',10,0
  2295. calc_string     db      '%8X',10,0
  2296. aNoMemory       db      'No memory',10,0
  2297. aSymbolsLoaded  db      'Symbols loaded',10,0
  2298. aUnaligned      db      'Unaligned address',10,0
  2299. aEnabledBreakErr db     'Enabled breakpoints are not allowed',10,0
  2300. aInterrupted    db      'Interrupted',10,0
  2301. aUnpacked       db      'Unpacked successful!',10,0
  2302. aPacked1        db      'Program is probably packed with ',0
  2303. aPacked2        db      '.',10,'Try to unpack automatically? [y/n]: ',0
  2304. aY_str          db      'y',10,0
  2305. aN_str          db      'n',10,0
  2306. mxp_nrv_name    db      'mxp_nrv',0
  2307. mxp_name        db      'mxp',0
  2308. mxp_lzo_name    db      'mxp_lzo',0
  2309. mtappack_name   db      'mtappack',0
  2310. flags           db      'CPAZSDO'
  2311. flags_bits      db      0,2,4,6,7,10,11
  2312.  
  2313. ;-----------------------------------------------------------------------------
  2314. ;                         Registers strings
  2315.  
  2316. regs_strs:
  2317.         db 'EAX='
  2318.         db 'EBX='
  2319.         db 'ECX='
  2320.         db 'EDX='
  2321.         db 'ESI='
  2322.         db 'EDI='
  2323.         db 'EBP='
  2324.         db 'ESP='
  2325.         db 'EIP='
  2326.         db 'EFLAGS='
  2327.  
  2328. sse_strs:
  2329.         db '-XMM0-'
  2330.         db '-XMM1-'
  2331.         db '-XMM2-'
  2332.         db '-XMM3-'
  2333.         db '-XMM4-'
  2334.         db '-XMM5-'
  2335.         db '-XMM6-'
  2336.         db '-XMM7-'
  2337. avx_strs:
  2338.         db '-YMM0-'
  2339.         db '-YMM1-'
  2340.         db '-YMM2-'
  2341.         db '-YMM3-'
  2342.         db '-YMM4-'
  2343.         db '-YMM5-'
  2344.         db '-YMM6-'
  2345.         db '-YMM7-'
  2346.  
  2347. align 4
  2348. n_digits        dd 10000000
  2349.  
  2350. btn2_tab        dd aFPU
  2351.                 dd aMMX
  2352. btn3_tab        dd aSSE2
  2353.                 dd aMMX128
  2354.                 dd aSSE
  2355.  
  2356. reg_mode        db 1
  2357.  
  2358.  
  2359. include 'disasm_tbl.inc'
  2360.  
  2361. reg_table:
  2362.         db 2,'al',0
  2363.         db 2,'cl',1
  2364.         db 2,'dl',2
  2365.         db 2,'bl',3
  2366.         db 2,'ah',4
  2367.         db 2,'ch',5
  2368.         db 2,'dh',6
  2369.         db 2,'bh',7
  2370.         db 2,'ax',8
  2371.         db 2,'cx',9
  2372.         db 2,'dx',10
  2373.         db 2,'bx',11
  2374.         db 2,'sp',12
  2375.         db 2,'bp',13
  2376.         db 2,'si',14
  2377.         db 2,'di',15
  2378.         db 3,'eax',16
  2379.         db 3,'ecx',17
  2380.         db 3,'edx',18
  2381.         db 3,'ebx',19
  2382.         db 3,'esp',20
  2383.         db 3,'ebp',21
  2384.         db 3,'esi',22
  2385.         db 3,'edi',23
  2386.         db 3,'eip',24
  2387.         db 0
  2388.  
  2389. IncludeIGlobals
  2390.  
  2391. fn70_read_block:
  2392.         dd 0
  2393.         dq 0
  2394.         dd ?
  2395.         dd ?
  2396.         db 0
  2397.         dd ?
  2398.  
  2399. fn70_attr_block:
  2400.         dd 5
  2401.         dd 0,0,0
  2402.         dd fileattr
  2403.         db 0
  2404.         dd ?
  2405.  
  2406. fn70_load_block:
  2407.         dd 7
  2408.         dd 1
  2409. load_params dd 0
  2410.         dd 0
  2411.         dd 0
  2412. i_end:
  2413. loadname:
  2414.         db 0
  2415.         rb 255
  2416.  
  2417. symbolsfile     rb 260
  2418.  
  2419. prgname_ptr dd ?
  2420. prgname_len dd ?
  2421.  
  2422. IncludeUGlobals
  2423.  
  2424. align 4
  2425. debuggee_pid    dd ?
  2426. dbgwnd          dd ?
  2427. temp_break      dd ?
  2428.  
  2429.  
  2430. fpu_mode        db ?
  2431. sse_mode        db ?
  2432. bSuspended      db ?
  2433. bAfterGo        db ?
  2434.  
  2435.  
  2436. messages_pos    dd ?
  2437. messages        rb messages_height*messages_width
  2438.  
  2439. cmdline         rb cmdline_width+1
  2440. cmdline_len     dd ?
  2441. cmdline_pos     dd ?
  2442. curarg          dd ?
  2443.  
  2444. cmdline_prev    rb cmdline_width+1
  2445.  
  2446. was_temp_break  db ?
  2447. symbol_section  db ?
  2448.  
  2449. dbgbufsize      dd ?
  2450. dbgbuflen       dd ?
  2451. dbgbuf          rb 256
  2452.  
  2453. fileattr        rb 40
  2454.  
  2455. ;keep aligned !!!
  2456. ;do not change layout !!!
  2457.  
  2458. align 16
  2459. needzerostart:
  2460. context:
  2461. _eip    dd ?
  2462. _eflags dd ?
  2463. _eax    dd ?
  2464. _ecx    dd ?
  2465. _edx    dd ?
  2466. _ebx    dd ?
  2467. _esp    dd ?
  2468. _ebp    dd ?
  2469. _esi    dd ?
  2470. _edi    dd ?
  2471.  
  2472. _ctx_flags:
  2473.         dd ?
  2474.         dd ?
  2475.  
  2476. _sse_flags:
  2477.  
  2478.  
  2479. _fcw    dw ?
  2480. _fsw    dw ?
  2481. _ftw    db ?
  2482.         db ?
  2483. _fop    dw ?
  2484. _fpu_ip dd ?
  2485.         dw ?
  2486.         dw ?
  2487.  
  2488.         dq ?
  2489.         dq ?
  2490.  
  2491. fpu_context:
  2492. mmx_context:
  2493. _st0:
  2494. _mm0:   rq 2
  2495. _st1:
  2496. _mm1:   rq 2
  2497. _st2:
  2498. _mm2:   rq 2
  2499. _st3:
  2500. _mm3:   rq 2
  2501. _st4:
  2502. _mm4:   rq 2
  2503. _st5:
  2504. _mm5:   rq 2
  2505. _st6:
  2506. _mm6:   rq 2
  2507. _st7:
  2508. _mm7:   rq 2
  2509.  
  2510. sse_context:
  2511. _xmm0   rq 2
  2512. _xmm1   rq 2
  2513. _xmm2   rq 2
  2514. _xmm3   rq 2
  2515. _xmm4   rq 2
  2516. _xmm5   rq 2
  2517. _xmm6   rq 2
  2518. _xmm7   rq 2
  2519. ctx_end:
  2520.  
  2521. oldcontext rb _ctx_flags-context
  2522.         rb 32
  2523.  
  2524. oldfpucontext:
  2525. oldmmxcontext: rb sse_context-fpu_context
  2526. oldssecontext: rb ctx_end-sse_context
  2527.  
  2528. if 0
  2529. avx_context:
  2530. _ymm0   dq 4 dup ?
  2531. _ymm1   dq 4 dup ?
  2532. _ymm2   dq 4 dup ?
  2533. _ymm3   dq 4 dup ?
  2534. _ymm4   dq 4 dup ?
  2535. _ymm5   dq 4 dup ?
  2536. _ymm6   dq 4 dup ?
  2537. _ymm7   dq 4 dup ?
  2538. oldavxcontext rb $-avx_context
  2539. end if
  2540.  
  2541.  
  2542. step_num dd ?
  2543. proc_num dd ?
  2544. dumpread dd ?
  2545. dumppos  dd ?
  2546. dumpdata rb dump_height*10h
  2547.  
  2548. ; breakpoint structure:
  2549. ; dword +0: address
  2550. ; byte +4: flags
  2551. ; bit 0: 1 <=> breakpoint valid
  2552. ; bit 1: 1 <=> breakpoint disabled
  2553. ; bit 2: 1 <=> one-shot breakpoint
  2554. ; bit 3: 1 <=> DRx breakpoint
  2555. ; byte +5: overwritten byte
  2556. ;          for DRx breaks: flags + (index shl 6)
  2557. breakpoints_n = 256
  2558. breakpoints     rb breakpoints_n*6
  2559. drx_break       rd 4
  2560.  
  2561. disasm_buf_size dd ?
  2562.  
  2563. symbols         dd ?
  2564. num_symbols     dd ?
  2565.  
  2566. bReload         db ?
  2567.  
  2568. needzeroend:
  2569.  
  2570. disasm_buffer           rb 256
  2571. disasm_start_pos        dd ?
  2572. disasm_cur_pos          dd ?
  2573. disasm_cur_str          dd ?
  2574. disasm_string           rb 256
  2575.  
  2576. thread_info             process_information
  2577.  
  2578. ;-----------------------------------------------------------------------------
  2579. ;                  Coordinates and sizes for GUI
  2580.  
  2581. data_x_size_dd          dd ?, ?
  2582. messages_x_size_dd      dd ?, ?
  2583. registers_x_pos_dd      dd ?, ?
  2584.  
  2585. disasm_height_dd        dd ?
  2586. disasm_y_size_dd        dd ?, ?
  2587. messages_y_pos_dd       dd ?, ?
  2588. cmdline_y_pos_dd        dd ?, ?
  2589. registers_y_size_dd     dd ?, ?
  2590.  
  2591. i_param         rb 256
  2592.  
  2593. ; stack
  2594.         align   400h
  2595.         rb      400h
  2596. used_mem:
  2597.  
  2598. ; vim: ft=fasm tabstop=4
  2599.  
  2600.