Subversion Repositories Kolibri OS

Rev

Rev 4914 | Rev 5460 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4901 Serge 1
;COLOR_THEME fix BLACK_ON_WHITE
2
COLOR_THEME fix MOVIEOS
4591 hidnplayr 3
 
4
format binary as ""
542 diamond 5
include '../../macros.inc'
205 heavyiron 6
use32
3675 GerdtR 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
205 heavyiron 15
 
3675 GerdtR 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
 
205 heavyiron 73
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3675 GerdtR 74
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DEBUGGING ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
205 heavyiron 75
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
76
 
3675 GerdtR 77
;-----------------------------------------------------------------------------
78
;                                 Help event
205 heavyiron 79
 
3675 GerdtR 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]
205 heavyiron 89
 
3675 GerdtR 90
    .x:
91
        jmp     put_message
205 heavyiron 92
 
3675 GerdtR 93
    .nocmd:
94
        mov     esi, aUnknownCommand
95
        jmp     .x
205 heavyiron 96
 
3675 GerdtR 97
;-----------------------------------------------------------------------------
98
;                                Quit event
99
OnQuit:
100
        mcall  -1
205 heavyiron 101
 
3675 GerdtR 102
;-----------------------------------------------------------------------------
103
;                        Working with debug context
205 heavyiron 104
 
3675 GerdtR 105
get_new_context:
106
        mov     esi, context
107
        mov     edi, oldcontext
4893 Serge 108
        mov     ecx, (ctx_end-context)/4
3675 GerdtR 109
        rep movsd
205 heavyiron 110
 
3675 GerdtR 111
get_context:
4893 Serge 112
        mcall   69, 1, [debuggee_pid], ctx_end-context, context
3675 GerdtR 113
        ret
205 heavyiron 114
 
3675 GerdtR 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
205 heavyiron 126
 
3675 GerdtR 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
205 heavyiron 146
 
3675 GerdtR 147
    @@:
148
        mov     [edi-8], eax
149
;       call    restore_from_breaks
150
;       ret
205 heavyiron 151
 
3675 GerdtR 152
; in: edi=buffer,eax=size,esi=address
153
restore_from_breaks:
154
        mov     ebx, breakpoints
205 heavyiron 155
 
3675 GerdtR 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
205 heavyiron 167
 
3675 GerdtR 168
    .cont:
169
        add     ebx, 6
170
        cmp     ebx, breakpoints+breakpoints_n*6
171
        jb      @b
172
        ret
205 heavyiron 173
 
3675 GerdtR 174
;-----------------------------------------------------------------------------
175
;                           Load executable event
205 heavyiron 176
 
3675 GerdtR 177
OnLoad:
178
        mov     esi, [curarg]
205 heavyiron 179
 
3675 GerdtR 180
OnLoadInit:
181
        mov     edi, loadname
182
        or      [prgname_len], -1
183
        mov     [prgname_ptr], edi
205 heavyiron 184
 
3675 GerdtR 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
205 heavyiron 193
 
3675 GerdtR 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
205 heavyiron 204
 
3675 GerdtR 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
205 heavyiron 212
 
3675 GerdtR 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
205 heavyiron 228
 
3675 GerdtR 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
205 heavyiron 240
 
3675 GerdtR 241
    .unk_err:
242
        mov     esi, unk_err_msg
243
        inc     eax
244
        push    eax
245
        call    put_message_nodraw
246
        jmp     draw_messages
205 heavyiron 247
 
3675 GerdtR 248
    .load_ok:
249
        mov     [debuggee_pid], eax
250
        mov     [bSuspended], 1
251
        push    ecx
252
        call    get_context
253
        mov     edi, oldcontext
4893 Serge 254
        mov     ecx, (ctx_end-context)/4
3675 GerdtR 255
        rep movsd
205 heavyiron 256
 
3675 GerdtR 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
205 heavyiron 277
 
3675 GerdtR 278
    @@:
279
        lodsb
280
        stosb
281
        test    al, al
282
        jnz     @b
283
        lea     ecx, [edi-1]
205 heavyiron 284
 
3675 GerdtR 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
205 heavyiron 294
 
3675 GerdtR 295
    @@:
4886 hidnplayr 296
        mov     dword[ecx], '.dbg'
297
        mov     byte[ecx+4], 0
3675 GerdtR 298
        pop     esi
299
        mov     ebp, esi
4886 hidnplayr 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
3675 GerdtR 307
        call    OnLoadSymbols.silent
4886 hidnplayr 308
    @@:
309
 
3675 GerdtR 310
    ; now test for packed progs
311
        cmp     [disasm_buf_size], 100h
312
        jz      @f
313
        ret
205 heavyiron 314
 
3675 GerdtR 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
205 heavyiron 328
 
3675 GerdtR 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
205 heavyiron 336
 
3675 GerdtR 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
205 heavyiron 354
 
3675 GerdtR 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
 
205 heavyiron 457
mxp_nrv_sig:
3675 GerdtR 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
 
205 heavyiron 472
mxp_nrv_sig_size = $ - mxp_nrv_sig
473
 
474
mxp_sig:
3675 GerdtR 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
 
205 heavyiron 491
mxp_sig_size = $ - mxp_sig
492
 
493
mxp_lzo_sig1:
3675 GerdtR 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
 
205 heavyiron 511
mxp_lzo_sig1_size = $ - mxp_lzo_sig1
3675 GerdtR 512
 
205 heavyiron 513
mxp_lzo_sig2:
3675 GerdtR 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
 
205 heavyiron 527
mxp_lzo_sig2_size = $ - mxp_lzo_sig2
528
 
3675 GerdtR 529
;-----------------------------------------------------------------------------
530
;                         Reload executable event
531
 
205 heavyiron 532
OnReload:
3675 GerdtR 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
205 heavyiron 541
terminate_reload:
3675 GerdtR 542
        mov     [bReload], 1
543
 
544
;-----------------------------------------------------------------------------
545
;                        Terminate process event
546
 
205 heavyiron 547
OnTerminate:
3675 GerdtR 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
205 heavyiron 557
 
558
AfterSuspend:
3675 GerdtR 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
205 heavyiron 567
 
568
OnSuspend:
3675 GerdtR 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
 
205 heavyiron 582
DoResume:
3675 GerdtR 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
 
205 heavyiron 592
OnResume:
3675 GerdtR 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
 
205 heavyiron 612
GoOn:
3675 GerdtR 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
 
205 heavyiron 640
OnDetach:
3675 GerdtR 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
205 heavyiron 654
 
655
after_go_exception:
3675 GerdtR 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
205 heavyiron 676
 
3675 GerdtR 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
205 heavyiron 702
debugmsg:
3675 GerdtR 703
        neg     [dbgbufsize]
704
        mov     esi, dbgbuf
705
 
706
; TODO: make it local
205 heavyiron 707
dbgmsgstart:
3675 GerdtR 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
205 heavyiron 757
terminated:
3675 GerdtR 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
 
205 heavyiron 774
exception:
3675 GerdtR 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
        ;push    69
796
        ;pop     eax
797
        ;push    6
798
        ;pop     ebx
799
        ;mov     ecx, [debuggee_pid]
800
        ;mov     edi, esp
801
        ;mov     esi, [_eip]
802
        ;push    1
803
        ;pop     edx
804
        mcall    69, 6, [debuggee_pid], 1, [_eip], esp
805
        pop     eax
806
        cmp     al, 0xCC
807
        jnz     .notdbg
808
    ; this is either dbg breakpoint or int3 cmd in debuggee
809
        mov     eax, [_eip]
810
        call    find_enabled_breakpoint
811
        jnz     .user_int3
812
    ; dbg breakpoint; clear if one-shot
813
        pop     ecx
814
        push    eax
815
        mov     esi, aBreakStop
816
        test    byte [edi+4], 4
817
        jz      .put_msg_eax
818
        pop     ecx
819
        call    clear_breakpoint
820
        jmp     .done
821
 
822
    .user_int3:
823
        mov     eax, [_eip]
824
        inc     [_eip]
825
        pop     ecx
826
        push    eax
827
        call    set_context
828
        mov     esi, aUserBreak
829
        jmp     .put_msg_eax
830
 
831
    .notdbg:
832
        mov     esi, aException
833
 
834
    .put_msg_eax:
835
        call    put_message_nodraw
836
 
837
    .done_draw:
838
        call    draw_messages
839
 
840
    .done:
841
        ;push    18
842
        ;pop     eax
843
        ;push    3
844
        ;pop     ebx
845
        ;mov     ecx, [dbgwnd]
846
        mcall    18, 3, [dbgwnd]    ; activate dbg window
847
        call    redraw_title
848
        call    draw_registers.redraw
849
        call    draw_dump.redraw
850
        call    update_disasm_eip
851
 
205 heavyiron 852
dbgmsgend:
3675 GerdtR 853
        pop     esi
854
        mov     ecx, [dbgbuflen]
855
        add     ecx, dbgbuf
856
        cmp     esi, ecx
857
        jnz     dbgmsgstart
858
        and     [dbgbuflen], 0
859
        neg     [dbgbufsize]
860
        cmp     [bReload], 2
861
        jnz     @f
862
        mov     [bReload], 0
863
        call    do_reload
205 heavyiron 864
 
3675 GerdtR 865
    @@:
866
        jmp     waitevent
867
 
868
; TODO: make it local
4590 clevermous 869
F7:
3675 GerdtR 870
        cmp     [debuggee_pid], 0
871
        jz      .no
872
        call    OnStep
873
 
874
    .no:
875
        jmp     waitevent
876
 
877
; TODO: make it local
4590 clevermous 878
F8:
3675 GerdtR 879
        cmp     [debuggee_pid], 0
4590 clevermous 880
        jz      F7.no
3675 GerdtR 881
        call    OnProceed
4590 clevermous 882
        jmp     F7.no
205 heavyiron 883
 
3675 GerdtR 884
;-----------------------------------------------------------------------------
885
;                       Step execution event
886
 
887
;Here we get [] argument at do step  times
4443 clevermous 888
OnStepMultiple:
3675 GerdtR 889
        cmp     [bSuspended], 0
4443 clevermous 890
        jz      OnStep.running
891
        mov     [step_num], 1
3675 GerdtR 892
        mov     esi, [curarg]
4443 clevermous 893
        test    esi, esi
894
        jz      .do
3675 GerdtR 895
        cmp     byte [esi], 0
4443 clevermous 896
        jz      .do
3675 GerdtR 897
        call    get_hex_number
898
        jc      .ret
899
        cmp     eax, 0 ; check if lesser or equal than 0
900
        jle     .ret
901
        mov     [step_num], eax
4443 clevermous 902
.do:
903
        call    OnStep
904
        dec     [step_num]
905
        jnz     .do
906
.ret:
907
        ret
205 heavyiron 908
 
4443 clevermous 909
OnStep:
910
        cmp     [bSuspended], 0
911
        jz      .running
3675 GerdtR 912
        call    get_context
913
        or      byte [_eflags+1], 1             ; set TF
914
        call    set_context
915
        and     byte [_eflags+1], not 1
916
    ; if instruction at eip is "int xx", set one-shot breakpoint immediately after
917
        mov     eax, [_eip]
918
        call    find_enabled_breakpoint
919
        jnz     @f
920
        cmp     byte [edi+5], 0xCD
921
        jz      .int
922
 
923
     @@:
924
        push    0
925
        ;push    69
926
        ;pop     eax
927
        ;push    6
928
        ;pop     ebx
929
        ;mov     ecx, [debuggee_pid]
930
        ;push    3
931
        ;pop     edx
932
        ;mov     edi, esp
933
        ;mov     esi, [_eip]
934
        mcall    69, 6, [debuggee_pid], 3, [_eip], esp
935
        cmp     eax, edx
936
        pop     eax
937
        jnz     .doit
938
        cmp     al, 0xCD
939
        jz      .int
940
        cmp     ax, 0x050F
941
        jz      .syscall
942
        cmp     ax, 0x340F
943
        jz      .sysenter
944
 
945
    ; resume process
946
    .doit:
947
        call    GoOn
948
        cmp     [bAfterGo], 0
949
        jz      @f
950
        mov     [bAfterGo], 2
951
 
952
    @@:
953
        ret
954
 
955
    ; return address is [ebp-4]
956
    .sysenter:
957
        push    0
958
        ;push    69
959
        ;pop     eax
960
        inc     edx     ; read 4 bytes
961
        mov     esi, [_ebp]
962
        sub     esi, 4
963
        mcall    69
964
        cmp     eax, edx
965
        pop     eax
966
        jnz     .syscall
967
        push    eax
968
        and     byte [_eflags+1], not 1
969
        call    set_context
970
        pop     eax
971
        jmp     @f
972
 
973
    .syscall:
974
        and     byte [_eflags+1], not 1 ; clear TF - avoid system halt (!)
975
        call    set_context
976
 
977
    .int:
978
        mov     eax, [_eip]
979
        inc     eax
980
        inc     eax
981
 
982
    @@:
983
        push    eax
984
        call    find_enabled_breakpoint
985
        pop     eax
986
        jz      .doit
987
    ; there is no enabled breakpoint yet; set temporary breakpoint
988
        mov     bl, 5
989
        call    add_breakpoint
990
        jmp     .doit
991
 
992
    .running:
993
        mov     esi, aRunningErr
994
        jmp     put_message
995
 
996
;-----------------------------------------------------------------------------
997
;                       Proceed process event
5206 clevermous 998
;Here we get [] argument at do step  times
999
OnProceedMultiple:
3675 GerdtR 1000
        cmp     [bSuspended], 0
1001
        jz      OnStep.running
5206 clevermous 1002
        mov     [proc_num], 1
3675 GerdtR 1003
        mov     esi, [curarg]
5206 clevermous 1004
        test    esi, esi
1005
        jz      .do
3675 GerdtR 1006
        cmp     byte [esi], 0
5206 clevermous 1007
        jz      .do
3675 GerdtR 1008
        call    get_hex_number
1009
        jc      .ret
5206 clevermous 1010
        cmp     eax, 0 ; check if lesser or equal than 0
3675 GerdtR 1011
        jle     .ret
1012
        mov     [proc_num], eax
1013
        mov     [curarg], 0
5206 clevermous 1014
.do:
1015
        call    OnProceed
1016
        dec     [proc_num]
1017
        jnz     .do
1018
.ret:
1019
        ret
205 heavyiron 1020
 
5206 clevermous 1021
 
1022
OnProceed:
1023
        cmp     [bSuspended], 0
1024
        jz      OnStep.running
3675 GerdtR 1025
        mov     esi, [_eip]
205 heavyiron 1026
 
3675 GerdtR 1027
    @@:
1028
        call    get_byte_nobreak
4443 clevermous 1029
        jc      OnStep
3675 GerdtR 1030
        inc     esi
1031
    ; skip prefixes
1032
        call    is_prefix
1033
        jz      @b
1034
        cmp     al, 0xE8        ; call
1035
        jnz     @f
1036
        add     esi, 4
1037
        jmp     .doit
205 heavyiron 1038
 
3675 GerdtR 1039
    ; A4,A5 = movs; A6,A7 = cmps
1040
    @@:
1041
        cmp     al, 0xA4
1042
        jb      @f
1043
        cmp     al, 0xA8
1044
        jb      .doit
205 heavyiron 1045
 
3675 GerdtR 1046
    ; AA,AB = stos; AC,AD = lods; AE,AF = scas
1047
    @@:
1048
        cmp     al, 0xAA
1049
        jb      @f
1050
        cmp     al, 0xB0
1051
        jb      .doit
205 heavyiron 1052
 
3675 GerdtR 1053
    ; E0 = loopnz; E1 = loopz; E2 = loop
1054
    @@:
1055
        cmp     al, 0xE0
1056
        jb      .noloop
1057
        cmp     al, 0xE2
1058
        ja      .noloop
1059
        inc     esi
1060
        jmp     .doit
205 heavyiron 1061
 
3675 GerdtR 1062
    ; FF /2 = call
1063
    .noloop:
1064
        cmp     al, 0xFF
4443 clevermous 1065
        jnz     OnStep
3675 GerdtR 1066
        call    get_byte_nobreak
4443 clevermous 1067
        jc      OnStep
3675 GerdtR 1068
        inc     esi
1069
        mov     cl, al
1070
        and     al, 00111000b
1071
        cmp     al, 00010000b
4443 clevermous 1072
        jnz     OnStep
3675 GerdtR 1073
    ; skip instruction
1074
        mov     al, cl
1075
        and     eax, 7
1076
        shr     cl, 6
1077
        jz      .mod0
1078
        jp      .doit
1079
        cmp     al, 4
1080
        jnz     @f
1081
        inc     esi
205 heavyiron 1082
 
3675 GerdtR 1083
    @@:
1084
        inc     esi
1085
        dec     cl
1086
        jz      @f
1087
        add     esi, 3
205 heavyiron 1088
 
3675 GerdtR 1089
    @@:
1090
        jmp     .doit
205 heavyiron 1091
 
3675 GerdtR 1092
    .mod0:
1093
        cmp     al, 4
1094
        jnz     @f
1095
        call    get_byte_nobreak
4443 clevermous 1096
        jc      OnStep
3675 GerdtR 1097
        inc     esi
1098
        and     al, 7
205 heavyiron 1099
 
3675 GerdtR 1100
    @@:
1101
        cmp     al, 5
1102
        jnz     .doit
1103
        add     esi, 4
205 heavyiron 1104
 
3675 GerdtR 1105
    .doit:
1106
    ; insert one-shot breakpoint at esi and resume
1107
        call    get_byte_nobreak
4443 clevermous 1108
        jc      OnStep
3675 GerdtR 1109
        mov     eax, esi
1110
        call    find_enabled_breakpoint
1111
        jz      @f
1112
        mov     eax, esi
1113
        mov     bl, 5
1114
        call    add_breakpoint
1115
        jmp     OnStep.doit
1116
 
1117
    @@:
1118
        ret
1119
 
1120
;-----------------------------------------------------------------------------
1121
;                        Read next byte of machine code
1122
 
1123
get_byte_nobreak:
1124
        mov     eax, esi
1125
        call    find_enabled_breakpoint
1126
        jnz     .nobreak
1127
        mov     al, [edi+5]
1128
        clc
1129
        ret
4893 Serge 1130
 
3675 GerdtR 1131
    .nobreak:
1132
        ;push    69
1133
        ;pop     eax
1134
        ;push    6
1135
        ;pop     ebx
1136
        ;mov     ecx, [debuggee_pid]
1137
        xor     edx, edx
1138
        push    edx
1139
        inc     edx
1140
        mov     edi, esp
1141
        mcall    69, 6, [debuggee_pid]
1142
        dec     eax
1143
        clc
1144
        jz      @f
1145
        stc
4893 Serge 1146
 
3675 GerdtR 1147
    @@:
1148
        pop     eax
1149
        ret
1150
 
1151
include 'parser.inc'
1152
 
1153
;-----------------------------------------------------------------------------
1154
;                        Calculate expression event
1155
 
205 heavyiron 1156
OnCalc:
3675 GerdtR 1157
        mov     esi, [curarg]
1158
        call    calc_expression
1159
        jc      .ret
1160
        push    ebp
1161
        mov     esi, calc_string
1162
        call    put_message_nodraw
1163
        jmp     draw_messages
4893 Serge 1164
 
3675 GerdtR 1165
    .ret:
1166
        ret
205 heavyiron 1167
 
3675 GerdtR 1168
;-----------------------------------------------------------------------------
1169
;                            Dump memory event
1170
 
205 heavyiron 1171
OnDump:
3675 GerdtR 1172
        mov     esi, [curarg]
1173
        cmp     byte [esi], 0
1174
        jnz     .param
1175
        add     [dumppos], dump_height*10h
1176
        jmp     .doit
4893 Serge 1177
 
3675 GerdtR 1178
    .param:
1179
        call    calc_expression
1180
        jc      .ret
1181
        mov     [dumppos], ebp
205 heavyiron 1182
 
3675 GerdtR 1183
    .doit:
1184
        call    get_dump
1185
        call    draw_dump.redraw
1186
 
1187
    .ret:
1188
        ret
1189
 
1190
;-----------------------------------------------------------------------------
1191
;                   Dissassemble block of executable event
1192
 
205 heavyiron 1193
OnUnassemble:
3675 GerdtR 1194
        mov     esi, [curarg]
1195
        cmp     byte [esi], 0
1196
        jnz     .param
1197
        mov     eax, [disasm_start_pos]
4908 hidnplayr 1198
        mov     ecx, [disasm_height_dd]
3675 GerdtR 1199
        mov     [disasm_cur_pos], eax
205 heavyiron 1200
 
3675 GerdtR 1201
    .l:
1202
        mov     eax, [disasm_cur_pos]
1203
        call    find_symbol
1204
        jc      @f
1205
        dec     ecx
1206
        jz      .m
1207
 
1208
    @@:
1209
        push    ecx
1210
        call    disasm_instr
1211
        pop     ecx
1212
        jc      .err
1213
        loop    .l
1214
 
1215
    .m:
1216
        mov     eax, [disasm_cur_pos]
1217
        jmp     .doit
1218
 
1219
    .param:
1220
        call    calc_expression
1221
        jc      .ret
1222
        mov     eax, ebp
1223
 
1224
    .doit:
1225
        push    eax
1226
        push    [disasm_start_pos]
1227
        mov     [disasm_start_pos], eax
1228
        call    update_disasm
1229
        pop     [disasm_start_pos]
1230
        pop     eax
1231
        cmp     [disasm_cur_str], 0
1232
        jz      @f
1233
        mov     [disasm_start_pos], eax
1234
 
1235
    .ret:
1236
        ret
1237
 
1238
    @@:
1239
        call    update_disasm
1240
 
1241
    .err:
1242
        mov     esi, aInvAddr
1243
        jmp     put_message
1244
 
1245
;-----------------------------------------------------------------------------
1246
;                       Access to register value event
1247
 
205 heavyiron 1248
OnReg:
3675 GerdtR 1249
        mov     esi, [curarg]
1250
        call    get_arg.skip_spaces
1251
        call    find_reg
1252
        jnc     @f
205 heavyiron 1253
 
3675 GerdtR 1254
    .err:
1255
        mov     esi, RSyntax
1256
        jmp     put_message
1257
 
1258
    @@:
1259
        call    get_arg.skip_spaces
1260
        test    al, al
1261
        jz      .err
1262
        cmp     al, '='
1263
        jnz     @f
1264
        inc     esi
1265
        call    get_arg.skip_spaces
1266
        test    al, al
1267
        jz      .err
1268
 
1269
    @@:
1270
        push    edi
1271
        call    calc_expression
1272
        pop     edi
1273
        jc      .ret
1274
    ; now edi=register id, ebp=value
1275
        cmp     [bSuspended], 0
1276
        mov     esi, aRunningErr
1277
        jz      put_message
1278
        xchg    eax, ebp
1279
        cmp     edi, 24
1280
        jz      .eip
1281
        sub     edi, 4
1282
        jb      .8lo
1283
        sub     edi, 4
1284
        jb      .8hi
1285
        sub     edi, 8
1286
        jb      .16
1287
        mov     [_eax+edi*4], eax
1288
        jmp     .ret
1289
 
1290
    .16:
1291
        mov     word [_eax+(edi+8)*4], ax
1292
        jmp     .ret
1293
 
1294
    .8lo:
1295
        mov     byte [_eax+(edi+4)*4], al
1296
        jmp     .ret
1297
 
1298
    .8hi:
1299
        mov     byte [_eax+(edi+4)*4+1], al
1300
        jmp     .ret
1301
 
1302
    .eip:
1303
        mov     [_eip], eax
1304
        call    update_disasm_eip
1305
 
1306
    .ret:
1307
        call    set_context
1308
        jmp     draw_registers.redraw
1309
 
1310
;-----------------------------------------------------------------------------
1311
;                        Breakpoints manipulation
205 heavyiron 1312
OnBp:
3675 GerdtR 1313
        mov     esi, [curarg]
1314
        call    calc_expression
1315
        jc      .ret
1316
        xchg    eax, ebp
1317
        push    eax
1318
        call    find_breakpoint
1319
        inc     eax
1320
        pop     eax
1321
        jz      .notfound
1322
        mov     esi, aDuplicateBreakpoint
1323
        jmp     .sayerr
205 heavyiron 1324
 
3675 GerdtR 1325
    .notfound:
1326
        mov     bl, 1
1327
        call    add_breakpoint
1328
        jnc     .ret
1329
        mov     esi, aBreakpointLimitExceeded
1330
 
1331
    .sayerr:
1332
        call    put_message
1333
 
1334
    .ret:
4890 hidnplayr 1335
        jmp     draw_disasm
3675 GerdtR 1336
 
205 heavyiron 1337
OnBpmb:
3675 GerdtR 1338
        mov     dh, 0011b
1339
        jmp     DoBpm
1340
 
205 heavyiron 1341
OnBpmw:
3675 GerdtR 1342
        mov     dh, 0111b
1343
        jmp     DoBpm
1344
 
205 heavyiron 1345
OnBpmd:
3675 GerdtR 1346
        mov     dh, 1111b
1347
 
205 heavyiron 1348
DoBpm:
3675 GerdtR 1349
        mov     esi, [curarg]
1350
        cmp     byte [esi], 'w'
1351
        jnz     @f
1352
        and     dh, not 2
1353
        inc     esi
205 heavyiron 1354
 
3675 GerdtR 1355
    @@:
1356
        push    edx
1357
        call    calc_expression
1358
        pop     edx
1359
        jnc     @f
1360
        ret
1361
 
1362
    ; ebp = expression, dh = flags
1363
    @@:
1364
        movzx   eax, dh
1365
        shr     eax, 2
1366
        test    ebp, eax
1367
        jz      @f
1368
        mov     esi, aUnaligned
1369
        jmp     put_message
1370
 
1371
    @@:
1372
        mov     eax, ebp
1373
        mov     bl, 0Bh
1374
        call    add_breakpoint
1375
        jnc     @f
1376
        mov     esi, aBreakpointLimitExceeded
1377
        jmp     put_message
1378
 
1379
    ; now find index
1380
    @@:
1381
        push    eax
1382
        xor     ecx, ecx
1383
 
1384
    .l1:
1385
        cmp     [drx_break+ecx*4], 0
1386
        jnz     .l2
1387
        ;push    69
1388
        ;pop     eax
1389
        push    ecx
1390
        mov     dl, cl
1391
        ;mov     ecx, [debuggee_pid]
1392
        mov     esi, ebp
1393
        ;push    9
1394
        ;pop     ebx
1395
        mcall    69, 9, [debuggee_pid]
1396
        test    eax, eax
1397
        jz      .ok
1398
        pop     ecx
1399
 
1400
    .l2:
1401
        inc     ecx
1402
        cmp     ecx, 4
1403
        jb      .l1
1404
        pop     eax
1405
        call    clear_breakpoint
1406
        mov     esi, aBreakpointLimitExceeded
1407
        jmp     put_message
1408
 
1409
    .ok:
1410
        pop     ecx
1411
        pop     eax
1412
        and     byte [edi], not 2       ; breakpoint is enabled
1413
        shl     dl, 6
1414
        or      dl, dh
1415
        mov     byte [edi+1], dl
1416
        inc     eax
1417
        mov     [drx_break+ecx*4], eax
1418
        ret
1419
 
205 heavyiron 1420
OnBc:
3675 GerdtR 1421
        mov     esi, [curarg]
205 heavyiron 1422
 
3675 GerdtR 1423
    @@:
1424
        call    get_hex_number
1425
        jc      OnBp.ret
1426
        call    clear_breakpoint
1427
        jmp     @b
1428
 
205 heavyiron 1429
OnBd:
3675 GerdtR 1430
        mov     esi, [curarg]
205 heavyiron 1431
 
3675 GerdtR 1432
    @@:
1433
        call    get_hex_number
1434
        jc      OnBp.ret
1435
        call    disable_breakpoint
1436
        jmp     @b
1437
 
205 heavyiron 1438
OnBe:
3675 GerdtR 1439
        mov     esi, [curarg]
205 heavyiron 1440
 
3675 GerdtR 1441
    @@:
1442
        call    get_hex_number
1443
        jc      OnBp.ret
1444
        push    eax
1445
        call    find_enabled_breakpoint
1446
        pop     eax
1447
        jz      .err
1448
        call    enable_breakpoint
1449
        jmp     @b
1450
 
1451
    .err:
1452
        mov     esi, OnBeErrMsg
1453
        jmp     put_message
1454
 
1455
; TODO: split it out in parser.inc
205 heavyiron 1456
get_hex_number:
3675 GerdtR 1457
        call    get_arg.skip_spaces
1458
        xor     ecx, ecx
1459
        xor     edx, edx
205 heavyiron 1460
 
3675 GerdtR 1461
    @@:
1462
        lodsb
1463
        call    is_hex_digit
1464
        jc      .ret
1465
        shl     edx, 4
1466
        or      dl, al
1467
        inc     ecx
1468
        jmp     @b
1469
 
1470
    .ret:
1471
        dec     esi
1472
        cmp     ecx, 1
1473
        xchg    eax, edx
1474
        ret
1475
 
1476
;-----------------------------------------------------------------------------
1477
;                       Breakpoints list event
1478
 
205 heavyiron 1479
OnBl:
3675 GerdtR 1480
        mov     esi, [curarg]
1481
        cmp     byte [esi], 0
1482
        jz      .listall
1483
        call    get_hex_number
1484
        jc      .ret
1485
        cmp     eax, breakpoints_n
1486
        jae     .err
1487
        push    eax
1488
        add     eax, eax
1489
        lea     edi, [breakpoints + eax + eax*2]
1490
        pop     eax
1491
        test    byte [edi+4], 1
1492
        jz      .err
1493
        call    show_break_info
205 heavyiron 1494
 
3675 GerdtR 1495
    .ret:
1496
        ret
1497
 
1498
    .err:
1499
        mov     esi, aInvalidBreak
1500
        jmp     put_message
1501
 
1502
    .listall:
1503
        mov     edi, breakpoints
1504
        xor     eax, eax
1505
 
1506
    @@:
1507
        test    byte [edi+4], 1
1508
        jz      .cont
1509
        push    edi eax
1510
        call    show_break_info
1511
        pop     eax edi
1512
 
1513
    .cont:
1514
        add     edi, 6
1515
        inc     eax
1516
        cmp     eax, breakpoints_n
1517
        jb      @b
1518
        ret
1519
 
1520
;-----------------------------------------------------------------------------
4893 Serge 1521
 
205 heavyiron 1522
show_break_info:
3675 GerdtR 1523
        push    edi
1524
        test    byte [edi+4], 8
1525
        jnz     .dr
1526
        push    dword [edi]
1527
        push    eax
1528
        mov     esi, aBreakNum
1529
        call    put_message_nodraw
1530
        jmp     .cmn
205 heavyiron 1531
 
3675 GerdtR 1532
    .dr:
1533
        push    eax
1534
        mov     esi, aMemBreak1
1535
        call    put_message_nodraw
1536
        pop     edi
1537
        push    edi
1538
        mov     esi, aMemBreak2
1539
        test    byte [edi+5], 2
1540
        jz      @f
1541
        mov     esi, aMemBreak3
1542
 
1543
    @@:
1544
        call    put_message_nodraw
1545
        pop     edi
1546
        push    edi
1547
        mov     esi, aMemBreak6
1548
        test    byte [edi+5], 8
1549
        jnz     @f
1550
        mov     esi, aMemBreak5
1551
        test    byte [edi+5], 4
1552
        jnz     @f
1553
        mov     esi, aMemBreak4
1554
 
1555
    @@:
1556
        call    put_message_nodraw
1557
        pop     edi
1558
        push    edi
1559
        push    dword [edi]
1560
        mov     esi, aMemBreak7
1561
        call    put_message_nodraw
1562
 
1563
    .cmn:
1564
        pop     edi
1565
        test    byte [edi+4], 2
1566
        jz      @f
1567
        push    edi
1568
        mov     esi, aDisabled
1569
        call    put_message_nodraw
1570
        pop     edi
1571
 
1572
    @@:
1573
        test    byte [edi+4], 4
1574
        jz      @f
1575
        mov     esi, aOneShot
1576
        call    put_message_nodraw
1577
 
1578
    @@:
1579
        mov     esi, newline
1580
        jmp     put_message
1581
 
1582
;-----------------------------------------------------------------------------
1583
;                        Add breakpoint
1584
; in: EAX = address; BL = flags
1585
; out: CF = 1 => error
1586
;      CF = 0 and EAX = breakpoint number
1587
 
205 heavyiron 1588
add_breakpoint:
3675 GerdtR 1589
        xor     ecx, ecx
1590
        mov     edi, breakpoints
205 heavyiron 1591
 
3675 GerdtR 1592
    @@:
1593
        test    byte [edi+4], 1
1594
        jz      .found
1595
        add     edi, 6
1596
        inc     ecx
1597
        cmp     ecx, breakpoints_n
1598
        jb      @b
1599
        stc
1600
        ret
1601
 
1602
    .found:
1603
        stosd
1604
        xchg    eax, ecx
1605
        mov     [edi], bl
1606
        test    bl, 2
1607
        jnz     @f
1608
        or      byte [edi], 2
1609
        push    eax
1610
        call    enable_breakpoint
1611
        pop     eax
1612
 
1613
    @@:
1614
        clc
1615
        ret
1616
 
1617
;-----------------------------------------------------------------------------
1618
;                         Remove breakpoint
1619
 
205 heavyiron 1620
clear_breakpoint:
3675 GerdtR 1621
        cmp     eax, breakpoints_n
1622
        jae     .ret
1623
        mov     ecx, 4
1624
        inc     eax
205 heavyiron 1625
 
3675 GerdtR 1626
    .1:
1627
        cmp     [drx_break-4+ecx*4], eax
1628
        jnz     @f
1629
        and     [drx_break-4+ecx*4], 0
1630
 
1631
    @@:
1632
        loop    .1
1633
        dec     eax
1634
        push    eax
1635
        add     eax, eax
1636
        lea     edi, [breakpoints + eax + eax*2 + 4]
1637
        test    byte [edi], 1
1638
        pop     eax
1639
        jz      .ret
1640
        push    edi
1641
        call    disable_breakpoint
1642
        pop     edi
1643
        mov     byte [edi], 0
1644
 
1645
    .ret:
1646
        ret
1647
 
1648
;-----------------------------------------------------------------------------
1649
;                          Disable breakpoint
1650
 
205 heavyiron 1651
disable_breakpoint:
3675 GerdtR 1652
        cmp     eax, breakpoints_n
1653
        jae     .ret
1654
        add     eax, eax
1655
        lea     edi, [breakpoints + eax + eax*2 + 5]
1656
        test    byte [edi-1], 1
1657
        jz      .ret
1658
        test    byte [edi-1], 2
1659
        jnz     .ret
1660
        or      byte [edi-1], 2
1661
        test    byte [edi-1], 8
1662
        jnz     .dr
1663
        push    esi
1664
        ;push    7
1665
        ;pop     ebx
1666
        ;push    69
1667
        ;pop     eax
1668
        ;mov     ecx, [debuggee_pid]
1669
        ;xor     edx, edx
1670
        ;inc     edx
1671
        ;mov     esi, [edi-5]
1672
        mcall    69, 7, [debuggee_pid], 1, [edi-5]
1673
        pop     esi
205 heavyiron 1674
 
3675 GerdtR 1675
    .ret:
1676
        ret
1677
 
1678
    .dr:
1679
        mov     dl, [edi]
1680
        shr     dl, 6
1681
        mov     dh, 80h
1682
        ;push    69
1683
        ;pop     eax
1684
        ;push    9
1685
        ;pop     ebx
1686
        ;mov     ecx, [debuggee_pid]
1687
        mcall    69, 9, [debuggee_pid]
1688
        ret
1689
 
1690
;-----------------------------------------------------------------------------
1691
;                           Enable breakpoint
1692
 
205 heavyiron 1693
enable_breakpoint:
3675 GerdtR 1694
        push    esi
1695
        cmp     eax, breakpoints_n
1696
        jae     .ret
1697
        add     eax, eax
1698
        lea     edi, [breakpoints + eax + eax*2 + 5]
1699
        test    byte [edi-1], 1
1700
        jz      .ret
1701
        test    byte [edi-1], 2
1702
        jz      .ret
1703
        and     byte [edi-1], not 2
1704
        test    byte [edi-1], 8
1705
        jnz     .dr
1706
        ;push    6
1707
        ;pop     ebx
1708
        ;push    69
1709
        ;pop     eax
1710
        ;mov     esi, [edi-5]
1711
        ;mov     ecx, [debuggee_pid]
1712
        ;xor     edx, edx
1713
        ;inc     edx
1714
        mcall    69, 6, [debuggee_pid], 1, [edi-5]
1715
        dec     eax
1716
        jnz     .err
1717
        ;mov     al, 69
1718
        push    0xCC
1719
        mov     edi, esp
1720
        inc     ebx
1721
        mcall    69
1722
        pop     eax
205 heavyiron 1723
 
3675 GerdtR 1724
    .ret:
1725
        pop     esi
1726
        ret
205 heavyiron 1727
 
3675 GerdtR 1728
    .err:
1729
        or      byte [edi-1], 2
1730
        mov     esi, aBreakErr
1731
        call    put_message
1732
        pop     esi
1733
        ret
205 heavyiron 1734
 
3675 GerdtR 1735
    .dr:
1736
        ;push    9
1737
        ;pop     ebx
1738
        ;push    69
1739
        ;pop     eax
1740
        mov     esi, [edi-5]
1741
        ;mov     ecx, [debuggee_pid]
1742
        mov     dl, [edi]
1743
        shr     dl, 6
1744
        mov     dh, [edi]
1745
        and     dh, 0xF
1746
        mcall    69, 9, [debuggee_pid]
1747
        test    eax, eax
1748
        jnz     .err
1749
        pop     esi
1750
        ret
205 heavyiron 1751
 
3675 GerdtR 1752
;-----------------------------------------------------------------------------
1753
;                             Find breakpoint
542 diamond 1754
 
3675 GerdtR 1755
find_breakpoint:
1756
        xor     ecx, ecx
1757
        xchg    eax, ecx
1758
        mov     edi, breakpoints
542 diamond 1759
 
3675 GerdtR 1760
    @@:
1761
        test    byte [edi+4], 1
1762
        jz      .cont
1763
        test    byte [edi+4], 8
1764
        jnz     .cont
1765
        cmp     [edi], ecx
1766
        jz      .found
542 diamond 1767
 
3675 GerdtR 1768
    .cont:
1769
        add     edi, 6
1770
        inc     eax
1771
        cmp     eax, breakpoints_n
1772
        jb      @b
1773
        or      eax, -1
542 diamond 1774
 
3675 GerdtR 1775
    .found:
1776
        ret
542 diamond 1777
 
3675 GerdtR 1778
;-----------------------------------------------------------------------------
1779
;
542 diamond 1780
 
3675 GerdtR 1781
find_enabled_breakpoint:
1782
        xor     ecx, ecx
1783
        xchg    eax, ecx
1784
        mov     edi, breakpoints
542 diamond 1785
 
3675 GerdtR 1786
    @@:
1787
        test    byte [edi+4], 1
1788
        jz      .cont
1789
        test    byte [edi+4], 2 or 8
1790
        jnz     .cont
1791
        cmp     [edi], ecx
1792
        jz      .found
542 diamond 1793
 
3675 GerdtR 1794
    .cont:
1795
        add     edi, 6
1796
        inc     eax
1797
        cmp     eax, breakpoints_n
1798
        jb      @b
1799
        or      eax, -1
205 heavyiron 1800
 
3675 GerdtR 1801
    .found:
1802
        ret
205 heavyiron 1803
 
3675 GerdtR 1804
; TODO: add find_disabled_breakpoint
205 heavyiron 1805
 
3675 GerdtR 1806
;-----------------------------------------------------------------------------
1807
;                       Unpack executable event
205 heavyiron 1808
 
3675 GerdtR 1809
OnUnpack:
1810
    ; program must be loaded - checked when command was parsed
1811
    ; program must be stopped
1812
        mov     esi, aRunningErr
1813
        cmp     [bSuspended], 0
1814
        jz      put_message
1815
   ; all breakpoints must be disabled
1816
        mov     edi, breakpoints
205 heavyiron 1817
 
3675 GerdtR 1818
    @@:
1819
        test    byte [edi+4], 1
1820
        jz      .cont
1821
        test    byte [edi+4], 2
1822
        jnz     .cont
1823
        mov     esi, aEnabledBreakErr
1824
        jmp     put_message
205 heavyiron 1825
 
3675 GerdtR 1826
    .cont:
1827
        add     edi, 6
1828
        cmp     edi, breakpoints+breakpoints_n*6
1829
        jb      @b
1830
    ; ok, now do it
1831
    ; set breakpoint on 0xC dword access
1832
        push    9
1833
        pop     ebx
1834
        mov     ecx, [debuggee_pid]
1835
        mov     dx, 1111b*256
1836
        push    0xC
1837
        pop     esi
205 heavyiron 1838
 
3675 GerdtR 1839
    @@:
1840
        ;push    69
1841
        ;pop     eax
1842
        mcall    69
1843
        test    eax, eax
1844
        jz      .breakok
1845
        inc     edx
1846
        cmp     dl, 4
1847
        jb      @b
809 diamond 1848
 
3675 GerdtR 1849
    .breakok:
1850
        call    GoOn
809 diamond 1851
 
3675 GerdtR 1852
    ; now wait for event
1853
    .wait:
1854
        ;push    10
1855
        ;pop     eax
1856
        mcall    10
1857
        dec     eax
1858
        jz      .redraw
1859
        dec     eax
1860
        jz      .key
1861
        dec     eax
1862
        jnz     .debug
1863
    ; button; we have only one button, close
1864
        or      eax, -1
1865
        mcall
205 heavyiron 1866
 
3675 GerdtR 1867
    .redraw:
1868
        call    draw_window
1869
        jmp     .wait
205 heavyiron 1870
 
3675 GerdtR 1871
    .key:
1872
        mov     al, 2
1873
        mcall
1874
        cmp     ah, 3   ; Ctrl+C
1875
        jnz     .wait
205 heavyiron 1876
 
3675 GerdtR 1877
    .userbreak:
1878
        mov     esi, aInterrupted
205 heavyiron 1879
 
3675 GerdtR 1880
    .x1:
1881
        push    edx esi
1882
        call    put_message
1883
        pop     esi edx
1884
        or      dh, 80h
1885
        ;push    69
1886
        ;pop     eax
1887
        ;push    9
1888
        ;pop     ebx
1889
        ;mov     ecx, [debuggee_pid]
1890
        mcall    69, 9, [debuggee_pid]
1891
        cmp     esi, aUnpacked
1892
        jnz     OnSuspend
1893
        jmp     AfterSuspend
205 heavyiron 1894
 
3675 GerdtR 1895
    .debug:
1896
        cmp     [dbgbuflen], 4*3
1897
        jnz     .notour
1898
        cmp     dword [dbgbuf], 3
1899
        jnz     .notour
1900
        test    byte [dbgbuf+8], 1
1901
        jnz     .our
205 heavyiron 1902
 
3675 GerdtR 1903
    .notour:
1904
        mov     esi, aInterrupted
1905
        push    edx
1906
        call    put_message
1907
        pop     edx
1908
        or      dh, 80h
1909
        ;push    69
1910
        ;pop     eax
1911
        ;push    9
1912
        ;pop     ebx
1913
        ;mov     ecx, [debuggee_pid]
1914
        mcall    69, 9, [debuggee_pid]
1915
        jmp     debugmsg
205 heavyiron 1916
 
3675 GerdtR 1917
    .our:
1918
        and     [dbgbuflen], 0
1919
        push    edx
1920
        call    get_context
1921
        push    eax
1922
        ;mov     al, 69
1923
        ;mov     bl, 6
1924
        ;mov     ecx, [debuggee_pid]
1925
        ;mov     edi, esp
1926
        ;push    4
1927
        ;pop     edx
1928
        ;push    0xC
1929
        ;pop     esi
1930
        mcall    69, 6, [debuggee_pid], 4, 0xC, esp
1931
        pop     eax
1932
        pop     edx
1933
        cmp     eax, [_eip]
1934
        jz      .done
1935
        call    DoResume
1936
        jmp     .wait
205 heavyiron 1937
 
3675 GerdtR 1938
    .done:
1939
        mov     esi, aUnpacked
1940
        jmp     .x1
809 diamond 1941
 
3675 GerdtR 1942
;-----------------------------------------------------------------------------
4886 hidnplayr 1943
;                            Include Symbol parser
205 heavyiron 1944
 
4886 hidnplayr 1945
include 'symbols.inc'
205 heavyiron 1946
 
3675 GerdtR 1947
;-----------------------------------------------------------------------------
1948
;                        Include disassembler engine
1949
 
1950
include 'disasm.inc'
1951
 
205 heavyiron 1952
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1953
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DATA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1954
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1955
 
4886 hidnplayr 1956
caption_str db  'Kolibri Debugger',0
205 heavyiron 1957
 
4913 hidnplayr 1958
begin_str db    'Kolibri Debugger, version 0.35',10
4591 hidnplayr 1959
        db      'Hint: type "help" for help, "quit" to quit'
3675 GerdtR 1960
newline db      10,0
1961
prompt  db      '> ',0
1962
 
205 heavyiron 1963
help_groups:
3675 GerdtR 1964
        dd      aControl, 0, 0, help_control_msg
1965
        db      0
1966
        dd      aData, 0, 0, help_data_msg
1967
        db      0
1968
        dd      aBreakpoints, 0, 0, help_breaks_msg
1969
        db      0
1970
 
1971
;-----------------------------------------------------------------------------
1972
;                   Commands format definitions
1973
 
1974
; TODO: make it with macros
1975
 
205 heavyiron 1976
; flags field:
1977
; &1: command may be called without parameters
1978
; &2: command may be called with parameters
1979
; &4: command may be called without loaded program
1980
; &8: command may be called with loaded program
1981
commands:
3675 GerdtR 1982
        dd      _aH, OnHelp, HelpSyntax, HelpHelp
1983
        db      0Fh
1984
        dd      aHelp, OnHelp, HelpSyntax, HelpHelp
1985
        db      0Fh
1986
        dd      aQuit, OnQuit, QuitSyntax, QuitHelp
1987
        db      0Dh
1988
        dd      aLoad, OnLoad, LoadSyntax, LoadHelp
1989
        db      6
1990
        dd      aReload, OnReload, ReloadSyntax, ReloadHelp
1991
        db      0Dh
1992
        dd      aTerminate, OnTerminate, TerminateSyntax, TerminateHelp
1993
        db      9
1994
        dd      aDetach, OnDetach, DetachSyntax, DetachHelp
1995
        db      9
1996
        dd      aSuspend, OnSuspend, SuspendSyntax, SuspendHelp
1997
        db      9
1998
        dd      aResume, OnResume, ResumeSyntax, ResumeHelp
1999
        db      0Bh
4443 clevermous 2000
        dd      aStep, OnStepMultiple, StepSyntax, StepHelp
3675 GerdtR 2001
        db      0Bh
5206 clevermous 2002
        dd      aProceed, OnProceedMultiple, ProceedSyntax, ProceedHelp
3675 GerdtR 2003
        db      0Bh
2004
        dd      aCalc, OnCalc, CalcSyntax, CalcHelp
2005
        db      0Eh
2006
        dd      aDump, OnDump, DumpSyntax, DumpHelp
2007
        db      0Bh
2008
        dd      aUnassemble, OnUnassemble, UnassembleSyntax, UnassembleHelp
2009
        db      0Bh
2010
        dd      aBp, OnBp, BpSyntax, BpHelp
2011
        db      0Ah
2012
        dd      aBpm, OnBpmb, BpmSyntax, BpmHelp
2013
        db      0Ah
2014
        dd      aBpmb, OnBpmb, BpmSyntax, BpmHelp
2015
        db      0Ah
2016
        dd      aBpmw, OnBpmw, BpmSyntax, BpmHelp
2017
        db      0Ah
2018
        dd      aBpmd, OnBpmd, BpmSyntax, BpmHelp
2019
        db      0Ah
2020
        dd      aBl, OnBl, BlSyntax, BlHelp
2021
        db      0Bh
2022
        dd      aBc, OnBc, BcSyntax, BcHelp
2023
        db      0Ah
2024
        dd      aBd, OnBd, BdSyntax, BdHelp
2025
        db      0Ah
2026
        dd      aBe, OnBe, BeSyntax, BeHelp
2027
        db      0Ah
2028
        dd      aReg, OnReg, RSyntax, RHelp
2029
        db      0Ah
2030
        dd      aUnpack, OnUnpack, UnpackSyntax, UnpackHelp
2031
        db      9
2032
        dd      aLoadSymbols, OnLoadSymbols, LoadSymbolsSyntax, LoadSymbolsHelp
2033
        db      0Ah
2034
        dd      0
205 heavyiron 2035
 
3675 GerdtR 2036
;-----------------------------------------------------------------------------
2037
;                   Help messages for commands groups
2038
 
2039
aHelp   db      5,'help',0
2040
_aH     db      2,'h',0
2041
HelpHelp db     'Help on specified function',10
2042
HelpSyntax db   'Usage: h or help [group | command]',10,0
2043
 
2044
help_msg db     'List of known command groups:',10
2045
        db      '"help control"     - display list of control commands',10
2046
        db      '"help data"        - display list of commands concerning data',10
2047
        db      '"help breakpoints" - display list of commands concerning breakpoints',10,0
2048
 
2049
;               Control commands group
2050
 
2051
aControl db     8,'control',0
2052
help_control_msg db     'List of control commands:',10
2053
        db      'h = help             - help',10
2054
        db      'quit                 - exit from debugger',10
2055
        db      'load  [params] - load program for debugging',10
2056
        db      'reload               - reload debugging program',10
2057
        db      'load-symbols   - load information on symbols for program',10
2058
        db      'terminate            - terminate loaded program',10
2059
        db      'detach               - detach from debugging program',10
2060
        db      'stop                 - suspend execution of debugging program',10
2061
        db      'g []     - go on (resume execution of debugging program)',10
4590 clevermous 2062
        db      's []            - program step, also ',10
2063
        db      'p []            - program wide step, also ',10
3675 GerdtR 2064
        db      'unpack               - try to bypass unpacker code (heuristic)',10,0
2065
 
2066
;               Data commands group
2067
 
2068
aData   db      5,'data',0
2069
help_data_msg db        'List of data commands:',10
2070
        db      '?        - calculate value of expression',10
2071
        db      'd []     - dump data at given address',10
2072
        db      'u []     - unassemble instructions at given address',10
2073
        db      'r   or',10
2074
        db      'r = - set register value',10,0
4893 Serge 2075
 
3675 GerdtR 2076
;               Breakpoints commands group
2077
 
205 heavyiron 2078
aBreakpoints db 12,'breakpoints',0
3675 GerdtR 2079
help_breaks_msg db      'List of breakpoints commands:',10
2080
        db      'bp       - set breakpoint on execution',10
2081
        db      'bpm[b|w|d]   - set breakpoint on memory access',10
2082
        db      'bl []        - breakpoint(s) info',10
2083
        db      'bc ...       - clear breakpoint',10
2084
        db      'bd ...       - disable breakpoint',10
2085
        db      'be ...       - enable breakpoint',10,0
205 heavyiron 2086
 
3675 GerdtR 2087
;-----------------------------------------------------------------------------
2088
;                    Individual command help messages
205 heavyiron 2089
 
3675 GerdtR 2090
aQuit   db      5,'quit',0
2091
QuitHelp db     'Quit from debugger',10
2092
QuitSyntax db   'Usage: quit',10,0
205 heavyiron 2093
 
3675 GerdtR 2094
aLoad   db      5,'load',0
2095
LoadHelp db     'Load program for debugging',10
2096
LoadSyntax db   'Usage: load  [parameters]',10,0
205 heavyiron 2097
 
3675 GerdtR 2098
aReload db      7,'reload',0
2099
ReloadHelp db   'Reload debugging program (restart debug session)',10
2100
ReloadSyntax db 'Usage: reload',10,0
2101
 
2102
aTerminate db   10,'terminate',0
205 heavyiron 2103
TerminateHelp db 'Terminate debugged program',10
2104
TerminateSyntax db 'Usage: terminate',10,0
2105
 
3675 GerdtR 2106
aDetach db      7,'detach',0
2107
DetachHelp db   'Detach from debugged program',10
2108
DetachSyntax db 'Usage: detach',10,0
205 heavyiron 2109
 
3675 GerdtR 2110
aSuspend db     5,'stop',0
2111
SuspendHelp db  'Suspend execution of debugged program',10
205 heavyiron 2112
SuspendSyntax db 'Usage: stop',10,0
2113
 
3675 GerdtR 2114
aResume db      2,'g',0
2115
ResumeHelp db   'Go (resume execution of debugged program)',10
2116
ResumeSyntax db 'Usage: g',10
2117
        db      '   or: g  - wait until specified address is reached',10,0
205 heavyiron 2118
 
3675 GerdtR 2119
aStep   db      2,'s',0
2120
StepHelp db     'Make step in debugged program',10
2121
StepSyntax db   'Usage: s []',10,0
205 heavyiron 2122
 
3675 GerdtR 2123
aProceed db     2,'p',0
2124
ProceedHelp db  'Make wide step in debugged program (step over CALL, REPxx, LOOP)',10
2125
ProceedSyntax db 'Usage: p []',10,0
205 heavyiron 2126
 
3675 GerdtR 2127
aDump   db      2,'d',0
2128
DumpHelp db     'Dump data of debugged program',10
2129
DumpSyntax db   'Usage: d  - dump data at specified address',10
2130
        db      '   or: d              - continue current dump',10,0
205 heavyiron 2131
 
3675 GerdtR 2132
aCalc   db      2,'?',0
2133
CalcHelp db     'Calculate value of expression',10
2134
CalcSyntax db   'Usage: ? ',10,0
205 heavyiron 2135
 
3675 GerdtR 2136
aUnassemble db  2,'u',0
205 heavyiron 2137
UnassembleHelp db 'Unassemble',10
3675 GerdtR 2138
UnassembleSyntax db      'Usage: u  - unassemble instructions at specified address',10
2139
                 db      '   or: u              - continue current unassemble screen',10,0
205 heavyiron 2140
 
3675 GerdtR 2141
aReg    db      2,'r',0
2142
RHelp   db      'Set register value',10
2143
RSyntax db      'Usage: r  ',10
2144
        db      '   or: r = - set value of  to ',10,0
205 heavyiron 2145
 
3675 GerdtR 2146
aBp     db      3,'bp',0
2147
BpHelp  db      'set BreakPoint on execution',10
2148
BpSyntax db     'Usage: bp ',10,0
205 heavyiron 2149
 
3675 GerdtR 2150
aBpm    db      4,'bpm',0
2151
aBpmb   db      5,'bpmb',0
2152
aBpmw   db      5,'bpmw',0
2153
aBpmd   db      5,'bpmd',0
2154
BpmHelp db      'set BreakPoint on Memory access',10
2155
        db      'Maximum 4 breakpoints of this type are allowed',10
2156
        db      'Note that for this breaks debugger is activated after access',10
2157
BpmSyntax db    'Usage: bpmb [w] ',10
2158
        db      '       bpmw [w] ',10
2159
        db      '       bpmd [w] ',10
2160
        db      '       bpm is synonym for bpmd',10
2161
        db      '"w" means break only on writes (default is on read/write)',10,0
205 heavyiron 2162
 
3675 GerdtR 2163
aBl     db      3,'bl',0
2164
BlHelp  db      'Breakpoint List',10
2165
BlSyntax db     'Usage: bl          - list all breakpoints',10
2166
        db      '       bl  - display info on particular breakpoint',10,0
205 heavyiron 2167
 
3675 GerdtR 2168
aBc     db      3,'bc',0
2169
BcHelp  db      'Breakpoint Clear',10
2170
BcSyntax db     'Usage: bc ',10
2171
        db      'Examples: bc 2',10
2172
        db      '          bc 1 3 4 A',10,0
205 heavyiron 2173
 
3675 GerdtR 2174
aBd     db      3,'bd',0
2175
BdHelp  db      'Breakpoint Disable',10
2176
BdSyntax db     'Usage: bd ',10
2177
        db      'Examples: bd 2',10
2178
        db      '          bd 1 3 4 A',10,0
205 heavyiron 2179
 
3675 GerdtR 2180
aBe     db      3,'be',0
2181
BeHelp  db      'Breakpoint Enable',10
2182
BeSyntax db     'Usage: be ',10
2183
        db      'Examples: be 2',10
2184
        db      '          be 1 3 4 A',10,0
205 heavyiron 2185
 
3675 GerdtR 2186
aUnpack db      7,'unpack',0
2187
UnpackHelp db   'Try to bypass unpacker code',10
2188
UnpackSyntax db 'Usage: unpack',10,0
205 heavyiron 2189
 
3675 GerdtR 2190
aLoadSymbols db 13,'load-symbols',0
542 diamond 2191
LoadSymbolsHelp db 'Load symbolic information for executable',10
2192
LoadSymbolsSyntax db 'Usage: load-symbols ',10,0
2193
 
205 heavyiron 2194
aUnknownCommand db 'Unknown command',10,0
2195
 
3675 GerdtR 2196
;-----------------------------------------------------------------------------
2197
;                             Error messages
2198
 
2199
load_err_msg    db      'Cannot load program. ',0
2200
unk_err_msg     db      'Unknown error code -%4X',10,0
2201
aCannotLoadFile db      'Cannot load file. ',0
2202
unk_err_msg2    db      'Unknown error code %4X.',10,0
205 heavyiron 2203
load_err_msgs:
3675 GerdtR 2204
        dd      .1, 0, .3, 0, .5, .6, 0, 0, .9, .A, 0, 0, 0, 0, 0, 0
2205
        dd      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, .1E, .1F, .20
2206
.1              db      'HD undefined.',10,0
2207
.3              db      'Unknown FS.',10,0
2208
.5              db      'File not found.',10,0
2209
.6              db      'Unexpected EOF.',10,0
2210
.9              db      'FAT table corrupted.',10,0
2211
.A              db      'Access denied.',10,0
2212
.1E             db      'No memory.',10,0
2213
.1F             db      'Not Menuet/Kolibri executable.',10,0
2214
.20             db      'Too many processes.',10,0
2215
load_succ_msg   db      'Program loaded successfully! PID=%4X. Use "g" to run.',10,0
2216
need_debuggee   db      'No program loaded. Use "load" command.',10,0
2217
aAlreadyLoaded  db      'Program is already loaded. Use "terminate" or "detach" commands',10,0
2218
terminated_msg  db      'Program terminated.',10,0
2219
aException      db      'Debugged program caused an exception %2X. '
2220
aSuspended      db      'Suspended',10,0
2221
aContinued      db      'Continuing',10,0
2222
aRunningErr     db      'Program is running',10,0
2223
read_mem_err    db      'ERROR: cannot read process memory!!!',10,0
205 heavyiron 2224
aBreakpointLimitExceeded db 'Breakpoint limit exceeded',10,0
3675 GerdtR 2225
aBreakErr       db      'Cannot activate breakpoint, it will be disabled',10,0
2226
aDuplicateBreakpoint db 'Duplicate breakpoint',10,0
2227
aInvalidBreak   db      'Invalid breakpoint number',10,0
2228
OnBeErrMsg      db      'There is already enabled breakpoint on this address',10,0
2229
aBreakNum       db      '%2X: at %8X',0
2230
aMemBreak1      db      '%2X: on ',0
2231
aMemBreak2      db      'read from ',0
2232
aMemBreak3      db      'access of ',0
2233
aMemBreak4      db      'byte',0
2234
aMemBreak5      db      'word',0
2235
aMemBreak6      db      'dword',0
2236
aMemBreak7      db      ' at %8X',0
2237
aOneShot        db      ', one-shot',0
2238
aDisabled       db      ', disabled',0
2239
aBreakStop      db      'Breakpoint #%2X',10,0
2240
aUserBreak      db      'int3 command at %8X',10,0
2241
;dbgmsg_str     db      'Debug message for process %4X.',10,0
2242
aInvAddr        db      'Invalid address',10,0
2243
NoPrgLoaded_str db      'No program loaded'
205 heavyiron 2244
NoPrgLoaded_len = $ - NoPrgLoaded_str
3675 GerdtR 2245
aRunning        db      'Running'
2246
aPaused         db      'Paused'
4914 Serge 2247
 
2248
aFPU            db      '[ FPU ]'
2249
aMMX            db      '[ MMX ]'
2250
aSSE            db      '[ SSE-32 ]'
2251
aSSE2           db      '[ SSE-64 ]'
2252
aMMX128         db      '[ MMX128 ]'
2253
 
4591 hidnplayr 2254
aAVX            db      '[ AVX ]'
2255
aMSR            db      '[ MSR ]'
3675 GerdtR 2256
aPoint          db      0x1C
2257
aMinus          db      '-'
2258
aColon          db      ':'
2259
aSpace          db      ' '
2260
aQuests         db      '??'
2261
aDots           db      '...'
2262
aParseError     db      'Parse error',10,0
2263
aDivByZero      db      'Division by 0',10,0
2264
calc_string     db      '%8X',10,0
2265
aNoMemory       db      'No memory',10,0
2266
aSymbolsLoaded  db      'Symbols loaded',10,0
2267
aUnaligned      db      'Unaligned address',10,0
2268
aEnabledBreakErr db     'Enabled breakpoints are not allowed',10,0
2269
aInterrupted    db      'Interrupted',10,0
2270
aUnpacked       db      'Unpacked successful!',10,0
2271
aPacked1        db      'Program is probably packed with ',0
2272
aPacked2        db      '.',10,'Try to unpack automatically? [y/n]: ',0
2273
aY_str          db      'y',10,0
2274
aN_str          db      'n',10,0
2275
mxp_nrv_name    db      'mxp_nrv',0
2276
mxp_name        db      'mxp',0
2277
mxp_lzo_name    db      'mxp_lzo',0
2278
mtappack_name   db      'mtappack',0
2279
flags           db      'CPAZSDO'
2280
flags_bits      db      0,2,4,6,7,10,11
2281
 
2282
;-----------------------------------------------------------------------------
2283
;                         Registers strings
2284
 
205 heavyiron 2285
regs_strs:
4886 hidnplayr 2286
        db 'EAX='
2287
        db 'EBX='
2288
        db 'ECX='
2289
        db 'EDX='
2290
        db 'ESI='
2291
        db 'EDI='
2292
        db 'EBP='
2293
        db 'ESP='
2294
        db 'EIP='
2295
        db 'EFLAGS='
2296
 
3675 GerdtR 2297
sse_strs:
4886 hidnplayr 2298
        db '-XMM0-'
2299
        db '-XMM1-'
2300
        db '-XMM2-'
2301
        db '-XMM3-'
2302
        db '-XMM4-'
2303
        db '-XMM5-'
2304
        db '-XMM6-'
2305
        db '-XMM7-'
3675 GerdtR 2306
avx_strs:
4886 hidnplayr 2307
        db '-YMM0-'
2308
        db '-YMM1-'
2309
        db '-YMM2-'
2310
        db '-YMM3-'
2311
        db '-YMM4-'
2312
        db '-YMM5-'
2313
        db '-YMM6-'
2314
        db '-YMM7-'
205 heavyiron 2315
 
4910 Serge 2316
align 4
4912 Serge 2317
n_digits        dd 10000000
4914 Serge 2318
 
2319
btn2_tab        dd aFPU
2320
                dd aMMX
2321
btn3_tab        dd aSSE2
2322
                dd aMMX128
2323
                dd aSSE
2324
 
4886 hidnplayr 2325
reg_mode        db 1
205 heavyiron 2326
 
4909 Serge 2327
 
3675 GerdtR 2328
include 'disasm_tbl.inc'
205 heavyiron 2329
 
2330
reg_table:
4886 hidnplayr 2331
        db 2,'al',0
2332
        db 2,'cl',1
2333
        db 2,'dl',2
2334
        db 2,'bl',3
2335
        db 2,'ah',4
2336
        db 2,'ch',5
2337
        db 2,'dh',6
2338
        db 2,'bh',7
2339
        db 2,'ax',8
2340
        db 2,'cx',9
2341
        db 2,'dx',10
2342
        db 2,'bx',11
2343
        db 2,'sp',12
2344
        db 2,'bp',13
2345
        db 2,'si',14
2346
        db 2,'di',15
2347
        db 3,'eax',16
2348
        db 3,'ecx',17
2349
        db 3,'edx',18
2350
        db 3,'ebx',19
2351
        db 3,'esp',20
2352
        db 3,'ebp',21
2353
        db 3,'esi',22
2354
        db 3,'edi',23
2355
        db 3,'eip',24
2356
        db 0
205 heavyiron 2357
 
542 diamond 2358
IncludeIGlobals
2359
 
2360
fn70_read_block:
4886 hidnplayr 2361
        dd 0
2362
        dq 0
2363
        dd ?
2364
        dd ?
2365
        db 0
2366
        dd ?
542 diamond 2367
 
2368
fn70_attr_block:
4886 hidnplayr 2369
        dd 5
2370
        dd 0,0,0
2371
        dd fileattr
2372
        db 0
2373
        dd ?
542 diamond 2374
 
205 heavyiron 2375
fn70_load_block:
4886 hidnplayr 2376
        dd 7
2377
        dd 1
2378
load_params dd 0
2379
        dd 0
2380
        dd 0
205 heavyiron 2381
i_end:
2382
loadname:
4886 hidnplayr 2383
        db 0
2384
        rb 255
205 heavyiron 2385
 
4886 hidnplayr 2386
symbolsfile     rb 260
542 diamond 2387
 
205 heavyiron 2388
prgname_ptr dd ?
2389
prgname_len dd ?
2390
 
542 diamond 2391
IncludeUGlobals
2392
 
4914 Serge 2393
align 4
2394
debuggee_pid    dd ?
4886 hidnplayr 2395
dbgwnd          dd ?
4914 Serge 2396
temp_break      dd ?
205 heavyiron 2397
 
4914 Serge 2398
 
2399
fpu_mode        db ?
2400
sse_mode        db ?
2401
bSuspended      db ?
2402
bAfterGo        db ?
2403
 
2404
 
2405
messages_pos    dd ?
4886 hidnplayr 2406
messages        rb messages_height*messages_width
205 heavyiron 2407
 
4886 hidnplayr 2408
cmdline         rb cmdline_width+1
2409
cmdline_len     dd ?
2410
cmdline_pos     dd ?
2411
curarg          dd ?
205 heavyiron 2412
 
4886 hidnplayr 2413
cmdline_prev    rb cmdline_width+1
205 heavyiron 2414
 
4886 hidnplayr 2415
was_temp_break  db ?
2416
symbol_section  db ?
205 heavyiron 2417
 
4886 hidnplayr 2418
dbgbufsize      dd ?
2419
dbgbuflen       dd ?
2420
dbgbuf          rb 256
542 diamond 2421
 
4886 hidnplayr 2422
fileattr        rb 40
3675 GerdtR 2423
 
4893 Serge 2424
;keep aligned !!!
2425
;do not change layout !!!
2426
 
2427
align 16
205 heavyiron 2428
needzerostart:
2429
context:
4886 hidnplayr 2430
_eip    dd ?
2431
_eflags dd ?
2432
_eax    dd ?
2433
_ecx    dd ?
2434
_edx    dd ?
2435
_ebx    dd ?
2436
_esp    dd ?
2437
_ebp    dd ?
2438
_esi    dd ?
2439
_edi    dd ?
205 heavyiron 2440
 
4893 Serge 2441
_ctx_flags:
4908 hidnplayr 2442
        dd ?
2443
        dd ?
205 heavyiron 2444
 
4893 Serge 2445
_sse_flags:
4900 Serge 2446
 
2447
 
2448
_fcw    dw ?
2449
_fsw    dw ?
2450
_ftw    db ?
2451
        db ?
2452
_fop    dw ?
2453
_fpu_ip dd ?
2454
        dw ?
2455
        dw ?
2456
 
4908 hidnplayr 2457
        dq ?
2458
        dq ?
4893 Serge 2459
 
3675 GerdtR 2460
fpu_context:
4893 Serge 2461
mmx_context:
2462
_st0:
2463
_mm0:   rq 2
2464
_st1:
2465
_mm1:   rq 2
2466
_st2:
2467
_mm2:   rq 2
2468
_st3:
2469
_mm3:   rq 2
2470
_st4:
2471
_mm4:   rq 2
2472
_st5:
2473
_mm5:   rq 2
2474
_st6:
2475
_mm6:   rq 2
2476
_st7:
2477
_mm7:   rq 2
3675 GerdtR 2478
 
2479
sse_context:
4893 Serge 2480
_xmm0   rq 2
2481
_xmm1   rq 2
2482
_xmm2   rq 2
2483
_xmm3   rq 2
2484
_xmm4   rq 2
2485
_xmm5   rq 2
2486
_xmm6   rq 2
2487
_xmm7   rq 2
2488
ctx_end:
3675 GerdtR 2489
 
4893 Serge 2490
oldcontext rb _ctx_flags-context
4901 Serge 2491
        rb 32
4893 Serge 2492
 
2493
oldfpucontext:
2494
oldmmxcontext: rb sse_context-fpu_context
2495
oldssecontext: rb ctx_end-sse_context
2496
 
2497
if 0
3675 GerdtR 2498
avx_context:
4886 hidnplayr 2499
_ymm0   dq 4 dup ?
2500
_ymm1   dq 4 dup ?
2501
_ymm2   dq 4 dup ?
2502
_ymm3   dq 4 dup ?
2503
_ymm4   dq 4 dup ?
2504
_ymm5   dq 4 dup ?
2505
_ymm6   dq 4 dup ?
2506
_ymm7   dq 4 dup ?
3675 GerdtR 2507
oldavxcontext rb $-avx_context
4893 Serge 2508
end if
3675 GerdtR 2509
 
4893 Serge 2510
 
4906 Serge 2511
step_num dd ?
2512
proc_num dd ?
4886 hidnplayr 2513
dumpread dd ?
2514
dumppos  dd ?
2515
dumpdata rb dump_height*10h
3675 GerdtR 2516
 
205 heavyiron 2517
; breakpoint structure:
2518
; dword +0: address
2519
; byte +4: flags
2520
; bit 0: 1 <=> breakpoint valid
2521
; bit 1: 1 <=> breakpoint disabled
2522
; bit 2: 1 <=> one-shot breakpoint
2523
; bit 3: 1 <=> DRx breakpoint
2524
; byte +5: overwritten byte
2525
;          for DRx breaks: flags + (index shl 6)
2526
breakpoints_n = 256
4886 hidnplayr 2527
breakpoints     rb breakpoints_n*6
2528
drx_break       rd 4
205 heavyiron 2529
 
4886 hidnplayr 2530
disasm_buf_size dd ?
205 heavyiron 2531
 
4886 hidnplayr 2532
symbols         dd ?
2533
num_symbols     dd ?
542 diamond 2534
 
4886 hidnplayr 2535
bReload         db ?
205 heavyiron 2536
 
2537
needzeroend:
2538
 
4886 hidnplayr 2539
disasm_buffer           rb 256
2540
disasm_start_pos        dd ?
2541
disasm_cur_pos          dd ?
2542
disasm_cur_str          dd ?
2543
disasm_string           rb 256
205 heavyiron 2544
 
4913 hidnplayr 2545
thread_info             process_information
4908 hidnplayr 2546
 
4913 hidnplayr 2547
;-----------------------------------------------------------------------------
2548
;                  Coordinates and sizes for GUI
2549
 
2550
data_x_size_dd          dd ?, ?
2551
messages_x_size_dd      dd ?, ?
2552
registers_x_pos_dd      dd ?, ?
2553
 
2554
disasm_height_dd        dd ?
2555
disasm_y_size_dd        dd ?, ?
2556
messages_y_pos_dd       dd ?, ?
2557
cmdline_y_pos_dd        dd ?, ?
2558
registers_y_size_dd     dd ?, ?
2559
 
4886 hidnplayr 2560
i_param         rb 256
205 heavyiron 2561
 
2562
; stack
3675 GerdtR 2563
        align   400h
2564
        rb      400h
205 heavyiron 2565
used_mem:
3675 GerdtR 2566
 
2567
; vim: ft=fasm tabstop=4
2568