Subversion Repositories Kolibri OS

Rev

Rev 5460 | Rev 6344 | 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
5460 hidnplayr 795
        mcall   69, 6, [debuggee_pid], 1, [_eip], esp
3675 GerdtR 796
        pop     eax
797
        cmp     al, 0xCC
5460 hidnplayr 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:
3675 GerdtR 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]
5460 hidnplayr 828
    .user_int3_:
3675 GerdtR 829
        pop     ecx
830
        push    eax
831
        call    set_context
832
        mov     esi, aUserBreak
833
        jmp     .put_msg_eax
834
 
835
    .notdbg:
5461 hidnplayr 836
        pop     eax
837
        push    eax
838
        push    eax
3675 GerdtR 839
        mov     esi, aException
5461 hidnplayr 840
        call    put_message_nodraw
841
        pop     eax
3675 GerdtR 842
 
5461 hidnplayr 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
 
3675 GerdtR 851
    .put_msg_eax:
852
        call    put_message_nodraw
853
 
854
    .done_draw:
855
        call    draw_messages
856
 
857
    .done:
5461 hidnplayr 858
        mcall   18, 3, [dbgwnd]    ; activate dbg window
3675 GerdtR 859
        call    redraw_title
860
        call    draw_registers.redraw
861
        call    draw_dump.redraw
862
        call    update_disasm_eip
863
 
205 heavyiron 864
dbgmsgend:
3675 GerdtR 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
205 heavyiron 876
 
3675 GerdtR 877
    @@:
878
        jmp     waitevent
879
 
880
; TODO: make it local
4590 clevermous 881
F7:
3675 GerdtR 882
        cmp     [debuggee_pid], 0
883
        jz      .no
884
        call    OnStep
885
 
886
    .no:
887
        jmp     waitevent
888
 
889
; TODO: make it local
4590 clevermous 890
F8:
3675 GerdtR 891
        cmp     [debuggee_pid], 0
4590 clevermous 892
        jz      F7.no
3675 GerdtR 893
        call    OnProceed
4590 clevermous 894
        jmp     F7.no
205 heavyiron 895
 
3675 GerdtR 896
;-----------------------------------------------------------------------------
897
;                       Step execution event
898
 
899
;Here we get [] argument at do step  times
4443 clevermous 900
OnStepMultiple:
3675 GerdtR 901
        cmp     [bSuspended], 0
4443 clevermous 902
        jz      OnStep.running
903
        mov     [step_num], 1
3675 GerdtR 904
        mov     esi, [curarg]
4443 clevermous 905
        test    esi, esi
906
        jz      .do
3675 GerdtR 907
        cmp     byte [esi], 0
4443 clevermous 908
        jz      .do
3675 GerdtR 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
4443 clevermous 914
.do:
915
        call    OnStep
916
        dec     [step_num]
917
        jnz     .do
918
.ret:
919
        ret
205 heavyiron 920
 
4443 clevermous 921
OnStep:
922
        cmp     [bSuspended], 0
923
        jz      .running
3675 GerdtR 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
5206 clevermous 1010
;Here we get [] argument at do step  times
1011
OnProceedMultiple:
3675 GerdtR 1012
        cmp     [bSuspended], 0
1013
        jz      OnStep.running
5206 clevermous 1014
        mov     [proc_num], 1
3675 GerdtR 1015
        mov     esi, [curarg]
5206 clevermous 1016
        test    esi, esi
1017
        jz      .do
3675 GerdtR 1018
        cmp     byte [esi], 0
5206 clevermous 1019
        jz      .do
3675 GerdtR 1020
        call    get_hex_number
1021
        jc      .ret
5206 clevermous 1022
        cmp     eax, 0 ; check if lesser or equal than 0
3675 GerdtR 1023
        jle     .ret
1024
        mov     [proc_num], eax
1025
        mov     [curarg], 0
5206 clevermous 1026
.do:
1027
        call    OnProceed
1028
        dec     [proc_num]
1029
        jnz     .do
1030
.ret:
1031
        ret
205 heavyiron 1032
 
5206 clevermous 1033
 
1034
OnProceed:
1035
        cmp     [bSuspended], 0
1036
        jz      OnStep.running
3675 GerdtR 1037
        mov     esi, [_eip]
205 heavyiron 1038
 
3675 GerdtR 1039
    @@:
1040
        call    get_byte_nobreak
4443 clevermous 1041
        jc      OnStep
3675 GerdtR 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
205 heavyiron 1050
 
3675 GerdtR 1051
    ; A4,A5 = movs; A6,A7 = cmps
1052
    @@:
1053
        cmp     al, 0xA4
1054
        jb      @f
1055
        cmp     al, 0xA8
1056
        jb      .doit
205 heavyiron 1057
 
3675 GerdtR 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
205 heavyiron 1064
 
3675 GerdtR 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
205 heavyiron 1073
 
3675 GerdtR 1074
    ; FF /2 = call
1075
    .noloop:
1076
        cmp     al, 0xFF
4443 clevermous 1077
        jnz     OnStep
3675 GerdtR 1078
        call    get_byte_nobreak
4443 clevermous 1079
        jc      OnStep
3675 GerdtR 1080
        inc     esi
1081
        mov     cl, al
1082
        and     al, 00111000b
1083
        cmp     al, 00010000b
4443 clevermous 1084
        jnz     OnStep
3675 GerdtR 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
205 heavyiron 1094
 
3675 GerdtR 1095
    @@:
1096
        inc     esi
1097
        dec     cl
1098
        jz      @f
1099
        add     esi, 3
205 heavyiron 1100
 
3675 GerdtR 1101
    @@:
1102
        jmp     .doit
205 heavyiron 1103
 
3675 GerdtR 1104
    .mod0:
1105
        cmp     al, 4
1106
        jnz     @f
1107
        call    get_byte_nobreak
4443 clevermous 1108
        jc      OnStep
3675 GerdtR 1109
        inc     esi
1110
        and     al, 7
205 heavyiron 1111
 
3675 GerdtR 1112
    @@:
1113
        cmp     al, 5
1114
        jnz     .doit
1115
        add     esi, 4
205 heavyiron 1116
 
3675 GerdtR 1117
    .doit:
1118
    ; insert one-shot breakpoint at esi and resume
1119
        call    get_byte_nobreak
4443 clevermous 1120
        jc      OnStep
3675 GerdtR 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
4893 Serge 1142
 
3675 GerdtR 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
4893 Serge 1158
 
3675 GerdtR 1159
    @@:
1160
        pop     eax
1161
        ret
1162
 
1163
include 'parser.inc'
1164
 
1165
;-----------------------------------------------------------------------------
1166
;                        Calculate expression event
1167
 
205 heavyiron 1168
OnCalc:
3675 GerdtR 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
4893 Serge 1176
 
3675 GerdtR 1177
    .ret:
1178
        ret
205 heavyiron 1179
 
3675 GerdtR 1180
;-----------------------------------------------------------------------------
1181
;                            Dump memory event
1182
 
205 heavyiron 1183
OnDump:
3675 GerdtR 1184
        mov     esi, [curarg]
1185
        cmp     byte [esi], 0
1186
        jnz     .param
1187
        add     [dumppos], dump_height*10h
1188
        jmp     .doit
4893 Serge 1189
 
3675 GerdtR 1190
    .param:
1191
        call    calc_expression
1192
        jc      .ret
1193
        mov     [dumppos], ebp
205 heavyiron 1194
 
3675 GerdtR 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
 
205 heavyiron 1205
OnUnassemble:
3675 GerdtR 1206
        mov     esi, [curarg]
1207
        cmp     byte [esi], 0
1208
        jnz     .param
1209
        mov     eax, [disasm_start_pos]
4908 hidnplayr 1210
        mov     ecx, [disasm_height_dd]
3675 GerdtR 1211
        mov     [disasm_cur_pos], eax
205 heavyiron 1212
 
3675 GerdtR 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
 
205 heavyiron 1260
OnReg:
3675 GerdtR 1261
        mov     esi, [curarg]
1262
        call    get_arg.skip_spaces
1263
        call    find_reg
1264
        jnc     @f
205 heavyiron 1265
 
3675 GerdtR 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
205 heavyiron 1324
OnBp:
3675 GerdtR 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
205 heavyiron 1336
 
3675 GerdtR 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:
4890 hidnplayr 1347
        jmp     draw_disasm
3675 GerdtR 1348
 
205 heavyiron 1349
OnBpmb:
3675 GerdtR 1350
        mov     dh, 0011b
1351
        jmp     DoBpm
1352
 
205 heavyiron 1353
OnBpmw:
3675 GerdtR 1354
        mov     dh, 0111b
1355
        jmp     DoBpm
1356
 
205 heavyiron 1357
OnBpmd:
3675 GerdtR 1358
        mov     dh, 1111b
1359
 
205 heavyiron 1360
DoBpm:
3675 GerdtR 1361
        mov     esi, [curarg]
1362
        cmp     byte [esi], 'w'
1363
        jnz     @f
1364
        and     dh, not 2
1365
        inc     esi
205 heavyiron 1366
 
3675 GerdtR 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
 
205 heavyiron 1432
OnBc:
3675 GerdtR 1433
        mov     esi, [curarg]
205 heavyiron 1434
 
3675 GerdtR 1435
    @@:
1436
        call    get_hex_number
1437
        jc      OnBp.ret
1438
        call    clear_breakpoint
1439
        jmp     @b
1440
 
205 heavyiron 1441
OnBd:
3675 GerdtR 1442
        mov     esi, [curarg]
205 heavyiron 1443
 
3675 GerdtR 1444
    @@:
1445
        call    get_hex_number
1446
        jc      OnBp.ret
1447
        call    disable_breakpoint
1448
        jmp     @b
1449
 
205 heavyiron 1450
OnBe:
3675 GerdtR 1451
        mov     esi, [curarg]
205 heavyiron 1452
 
3675 GerdtR 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
205 heavyiron 1468
get_hex_number:
3675 GerdtR 1469
        call    get_arg.skip_spaces
1470
        xor     ecx, ecx
1471
        xor     edx, edx
205 heavyiron 1472
 
3675 GerdtR 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
 
205 heavyiron 1491
OnBl:
3675 GerdtR 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
205 heavyiron 1506
 
3675 GerdtR 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
;-----------------------------------------------------------------------------
4893 Serge 1533
 
205 heavyiron 1534
show_break_info:
3675 GerdtR 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
205 heavyiron 1543
 
3675 GerdtR 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
 
205 heavyiron 1600
add_breakpoint:
3675 GerdtR 1601
        xor     ecx, ecx
1602
        mov     edi, breakpoints
205 heavyiron 1603
 
3675 GerdtR 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
 
205 heavyiron 1632
clear_breakpoint:
3675 GerdtR 1633
        cmp     eax, breakpoints_n
1634
        jae     .ret
1635
        mov     ecx, 4
1636
        inc     eax
205 heavyiron 1637
 
3675 GerdtR 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
 
205 heavyiron 1663
disable_breakpoint:
3675 GerdtR 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
205 heavyiron 1686
 
3675 GerdtR 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
 
205 heavyiron 1705
enable_breakpoint:
3675 GerdtR 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
205 heavyiron 1735
 
3675 GerdtR 1736
    .ret:
1737
        pop     esi
1738
        ret
205 heavyiron 1739
 
3675 GerdtR 1740
    .err:
1741
        or      byte [edi-1], 2
1742
        mov     esi, aBreakErr
1743
        call    put_message
1744
        pop     esi
1745
        ret
205 heavyiron 1746
 
3675 GerdtR 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
205 heavyiron 1763
 
3675 GerdtR 1764
;-----------------------------------------------------------------------------
1765
;                             Find breakpoint
542 diamond 1766
 
3675 GerdtR 1767
find_breakpoint:
1768
        xor     ecx, ecx
1769
        xchg    eax, ecx
1770
        mov     edi, breakpoints
542 diamond 1771
 
3675 GerdtR 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
542 diamond 1779
 
3675 GerdtR 1780
    .cont:
1781
        add     edi, 6
1782
        inc     eax
1783
        cmp     eax, breakpoints_n
1784
        jb      @b
1785
        or      eax, -1
542 diamond 1786
 
3675 GerdtR 1787
    .found:
1788
        ret
542 diamond 1789
 
3675 GerdtR 1790
;-----------------------------------------------------------------------------
1791
;
542 diamond 1792
 
3675 GerdtR 1793
find_enabled_breakpoint:
1794
        xor     ecx, ecx
1795
        xchg    eax, ecx
1796
        mov     edi, breakpoints
542 diamond 1797
 
3675 GerdtR 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
542 diamond 1805
 
3675 GerdtR 1806
    .cont:
1807
        add     edi, 6
1808
        inc     eax
1809
        cmp     eax, breakpoints_n
1810
        jb      @b
1811
        or      eax, -1
205 heavyiron 1812
 
3675 GerdtR 1813
    .found:
1814
        ret
205 heavyiron 1815
 
3675 GerdtR 1816
; TODO: add find_disabled_breakpoint
205 heavyiron 1817
 
3675 GerdtR 1818
;-----------------------------------------------------------------------------
1819
;                       Unpack executable event
205 heavyiron 1820
 
3675 GerdtR 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
205 heavyiron 1829
 
3675 GerdtR 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
205 heavyiron 1837
 
3675 GerdtR 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
205 heavyiron 1850
 
3675 GerdtR 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
809 diamond 1860
 
3675 GerdtR 1861
    .breakok:
1862
        call    GoOn
809 diamond 1863
 
3675 GerdtR 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
205 heavyiron 1878
 
3675 GerdtR 1879
    .redraw:
1880
        call    draw_window
1881
        jmp     .wait
205 heavyiron 1882
 
3675 GerdtR 1883
    .key:
1884
        mov     al, 2
1885
        mcall
1886
        cmp     ah, 3   ; Ctrl+C
1887
        jnz     .wait
205 heavyiron 1888
 
3675 GerdtR 1889
    .userbreak:
1890
        mov     esi, aInterrupted
205 heavyiron 1891
 
3675 GerdtR 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
205 heavyiron 1906
 
3675 GerdtR 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
205 heavyiron 1914
 
3675 GerdtR 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
205 heavyiron 1928
 
3675 GerdtR 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
205 heavyiron 1949
 
3675 GerdtR 1950
    .done:
1951
        mov     esi, aUnpacked
1952
        jmp     .x1
809 diamond 1953
 
3675 GerdtR 1954
;-----------------------------------------------------------------------------
4886 hidnplayr 1955
;                            Include Symbol parser
205 heavyiron 1956
 
4886 hidnplayr 1957
include 'symbols.inc'
205 heavyiron 1958
 
3675 GerdtR 1959
;-----------------------------------------------------------------------------
1960
;                        Include disassembler engine
1961
 
1962
include 'disasm.inc'
1963
 
205 heavyiron 1964
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1965
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DATA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1966
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1967
 
4886 hidnplayr 1968
caption_str db  'Kolibri Debugger',0
205 heavyiron 1969
 
4913 hidnplayr 1970
begin_str db    'Kolibri Debugger, version 0.35',10
4591 hidnplayr 1971
        db      'Hint: type "help" for help, "quit" to quit'
3675 GerdtR 1972
newline db      10,0
1973
prompt  db      '> ',0
1974
 
205 heavyiron 1975
help_groups:
3675 GerdtR 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
 
205 heavyiron 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:
3675 GerdtR 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
4443 clevermous 2012
        dd      aStep, OnStepMultiple, StepSyntax, StepHelp
3675 GerdtR 2013
        db      0Bh
5206 clevermous 2014
        dd      aProceed, OnProceedMultiple, ProceedSyntax, ProceedHelp
3675 GerdtR 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
205 heavyiron 2047
 
3675 GerdtR 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  [params] - load program for debugging',10
2068
        db      'reload               - reload debugging program',10
2069
        db      'load-symbols   - 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 []     - go on (resume execution of debugging program)',10
4590 clevermous 2074
        db      's []            - program step, also ',10
2075
        db      'p []            - program wide step, also ',10
3675 GerdtR 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      '?        - calculate value of expression',10
2083
        db      'd []     - dump data at given address',10
2084
        db      'u []     - unassemble instructions at given address',10
2085
        db      'r   or',10
2086
        db      'r = - set register value',10,0
4893 Serge 2087
 
3675 GerdtR 2088
;               Breakpoints commands group
2089
 
205 heavyiron 2090
aBreakpoints db 12,'breakpoints',0
3675 GerdtR 2091
help_breaks_msg db      'List of breakpoints commands:',10
2092
        db      'bp       - set breakpoint on execution',10
2093
        db      'bpm[b|w|d]   - set breakpoint on memory access',10
2094
        db      'bl []        - breakpoint(s) info',10
2095
        db      'bc ...       - clear breakpoint',10
2096
        db      'bd ...       - disable breakpoint',10
2097
        db      'be ...       - enable breakpoint',10,0
205 heavyiron 2098
 
3675 GerdtR 2099
;-----------------------------------------------------------------------------
2100
;                    Individual command help messages
205 heavyiron 2101
 
3675 GerdtR 2102
aQuit   db      5,'quit',0
2103
QuitHelp db     'Quit from debugger',10
2104
QuitSyntax db   'Usage: quit',10,0
205 heavyiron 2105
 
3675 GerdtR 2106
aLoad   db      5,'load',0
2107
LoadHelp db     'Load program for debugging',10
2108
LoadSyntax db   'Usage: load  [parameters]',10,0
205 heavyiron 2109
 
3675 GerdtR 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
205 heavyiron 2115
TerminateHelp db 'Terminate debugged program',10
2116
TerminateSyntax db 'Usage: terminate',10,0
2117
 
3675 GerdtR 2118
aDetach db      7,'detach',0
2119
DetachHelp db   'Detach from debugged program',10
2120
DetachSyntax db 'Usage: detach',10,0
205 heavyiron 2121
 
3675 GerdtR 2122
aSuspend db     5,'stop',0
2123
SuspendHelp db  'Suspend execution of debugged program',10
205 heavyiron 2124
SuspendSyntax db 'Usage: stop',10,0
2125
 
3675 GerdtR 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  - wait until specified address is reached',10,0
205 heavyiron 2130
 
3675 GerdtR 2131
aStep   db      2,'s',0
2132
StepHelp db     'Make step in debugged program',10
2133
StepSyntax db   'Usage: s []',10,0
205 heavyiron 2134
 
3675 GerdtR 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 []',10,0
205 heavyiron 2138
 
3675 GerdtR 2139
aDump   db      2,'d',0
2140
DumpHelp db     'Dump data of debugged program',10
2141
DumpSyntax db   'Usage: d  - dump data at specified address',10
2142
        db      '   or: d              - continue current dump',10,0
205 heavyiron 2143
 
3675 GerdtR 2144
aCalc   db      2,'?',0
2145
CalcHelp db     'Calculate value of expression',10
2146
CalcSyntax db   'Usage: ? ',10,0
205 heavyiron 2147
 
3675 GerdtR 2148
aUnassemble db  2,'u',0
205 heavyiron 2149
UnassembleHelp db 'Unassemble',10
3675 GerdtR 2150
UnassembleSyntax db      'Usage: u  - unassemble instructions at specified address',10
2151
                 db      '   or: u              - continue current unassemble screen',10,0
205 heavyiron 2152
 
3675 GerdtR 2153
aReg    db      2,'r',0
2154
RHelp   db      'Set register value',10
2155
RSyntax db      'Usage: r  ',10
2156
        db      '   or: r = - set value of  to ',10,0
205 heavyiron 2157
 
3675 GerdtR 2158
aBp     db      3,'bp',0
2159
BpHelp  db      'set BreakPoint on execution',10
2160
BpSyntax db     'Usage: bp ',10,0
205 heavyiron 2161
 
3675 GerdtR 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] ',10
2170
        db      '       bpmw [w] ',10
2171
        db      '       bpmd [w] ',10
2172
        db      '       bpm is synonym for bpmd',10
2173
        db      '"w" means break only on writes (default is on read/write)',10,0
205 heavyiron 2174
 
3675 GerdtR 2175
aBl     db      3,'bl',0
2176
BlHelp  db      'Breakpoint List',10
2177
BlSyntax db     'Usage: bl          - list all breakpoints',10
2178
        db      '       bl  - display info on particular breakpoint',10,0
205 heavyiron 2179
 
3675 GerdtR 2180
aBc     db      3,'bc',0
2181
BcHelp  db      'Breakpoint Clear',10
2182
BcSyntax db     'Usage: bc ',10
2183
        db      'Examples: bc 2',10
2184
        db      '          bc 1 3 4 A',10,0
205 heavyiron 2185
 
3675 GerdtR 2186
aBd     db      3,'bd',0
2187
BdHelp  db      'Breakpoint Disable',10
2188
BdSyntax db     'Usage: bd ',10
2189
        db      'Examples: bd 2',10
2190
        db      '          bd 1 3 4 A',10,0
205 heavyiron 2191
 
3675 GerdtR 2192
aBe     db      3,'be',0
2193
BeHelp  db      'Breakpoint Enable',10
2194
BeSyntax db     'Usage: be ',10
2195
        db      'Examples: be 2',10
2196
        db      '          be 1 3 4 A',10,0
205 heavyiron 2197
 
3675 GerdtR 2198
aUnpack db      7,'unpack',0
2199
UnpackHelp db   'Try to bypass unpacker code',10
2200
UnpackSyntax db 'Usage: unpack',10,0
205 heavyiron 2201
 
3675 GerdtR 2202
aLoadSymbols db 13,'load-symbols',0
542 diamond 2203
LoadSymbolsHelp db 'Load symbolic information for executable',10
2204
LoadSymbolsSyntax db 'Usage: load-symbols ',10,0
2205
 
205 heavyiron 2206
aUnknownCommand db 'Unknown command',10,0
2207
 
3675 GerdtR 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
205 heavyiron 2215
load_err_msgs:
3675 GerdtR 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
5461 hidnplayr 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
3675 GerdtR 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
205 heavyiron 2255
aBreakpointLimitExceeded db 'Breakpoint limit exceeded',10,0
3675 GerdtR 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'
205 heavyiron 2275
NoPrgLoaded_len = $ - NoPrgLoaded_str
3675 GerdtR 2276
aRunning        db      'Running'
2277
aPaused         db      'Paused'
4914 Serge 2278
 
2279
aFPU            db      '[ FPU ]'
2280
aMMX            db      '[ MMX ]'
5460 hidnplayr 2281
aSSE            db      '[SSE32]'
2282
aSSE2           db      '[SSE64]'
2283
aMMX128         db      '[MMX128]'
4914 Serge 2284
 
4591 hidnplayr 2285
aAVX            db      '[ AVX ]'
2286
aMSR            db      '[ MSR ]'
3675 GerdtR 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
 
205 heavyiron 2316
regs_strs:
4886 hidnplayr 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
 
3675 GerdtR 2328
sse_strs:
4886 hidnplayr 2329
        db '-XMM0-'
2330
        db '-XMM1-'
2331
        db '-XMM2-'
2332
        db '-XMM3-'
2333
        db '-XMM4-'
2334
        db '-XMM5-'
2335
        db '-XMM6-'
2336
        db '-XMM7-'
3675 GerdtR 2337
avx_strs:
4886 hidnplayr 2338
        db '-YMM0-'
2339
        db '-YMM1-'
2340
        db '-YMM2-'
2341
        db '-YMM3-'
2342
        db '-YMM4-'
2343
        db '-YMM5-'
2344
        db '-YMM6-'
2345
        db '-YMM7-'
205 heavyiron 2346
 
4910 Serge 2347
align 4
4912 Serge 2348
n_digits        dd 10000000
4914 Serge 2349
 
2350
btn2_tab        dd aFPU
2351
                dd aMMX
2352
btn3_tab        dd aSSE2
2353
                dd aMMX128
2354
                dd aSSE
2355
 
4886 hidnplayr 2356
reg_mode        db 1
205 heavyiron 2357
 
4909 Serge 2358
 
3675 GerdtR 2359
include 'disasm_tbl.inc'
205 heavyiron 2360
 
2361
reg_table:
4886 hidnplayr 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
205 heavyiron 2388
 
542 diamond 2389
IncludeIGlobals
2390
 
2391
fn70_read_block:
4886 hidnplayr 2392
        dd 0
2393
        dq 0
2394
        dd ?
2395
        dd ?
2396
        db 0
2397
        dd ?
542 diamond 2398
 
2399
fn70_attr_block:
4886 hidnplayr 2400
        dd 5
2401
        dd 0,0,0
2402
        dd fileattr
2403
        db 0
2404
        dd ?
542 diamond 2405
 
205 heavyiron 2406
fn70_load_block:
4886 hidnplayr 2407
        dd 7
2408
        dd 1
2409
load_params dd 0
2410
        dd 0
2411
        dd 0
205 heavyiron 2412
i_end:
2413
loadname:
4886 hidnplayr 2414
        db 0
2415
        rb 255
205 heavyiron 2416
 
4886 hidnplayr 2417
symbolsfile     rb 260
542 diamond 2418
 
205 heavyiron 2419
prgname_ptr dd ?
2420
prgname_len dd ?
2421
 
542 diamond 2422
IncludeUGlobals
2423
 
4914 Serge 2424
align 4
2425
debuggee_pid    dd ?
4886 hidnplayr 2426
dbgwnd          dd ?
4914 Serge 2427
temp_break      dd ?
205 heavyiron 2428
 
4914 Serge 2429
 
2430
fpu_mode        db ?
2431
sse_mode        db ?
2432
bSuspended      db ?
2433
bAfterGo        db ?
2434
 
2435
 
2436
messages_pos    dd ?
4886 hidnplayr 2437
messages        rb messages_height*messages_width
205 heavyiron 2438
 
4886 hidnplayr 2439
cmdline         rb cmdline_width+1
2440
cmdline_len     dd ?
2441
cmdline_pos     dd ?
2442
curarg          dd ?
205 heavyiron 2443
 
4886 hidnplayr 2444
cmdline_prev    rb cmdline_width+1
205 heavyiron 2445
 
4886 hidnplayr 2446
was_temp_break  db ?
2447
symbol_section  db ?
205 heavyiron 2448
 
4886 hidnplayr 2449
dbgbufsize      dd ?
2450
dbgbuflen       dd ?
2451
dbgbuf          rb 256
542 diamond 2452
 
4886 hidnplayr 2453
fileattr        rb 40
3675 GerdtR 2454
 
4893 Serge 2455
;keep aligned !!!
2456
;do not change layout !!!
2457
 
2458
align 16
205 heavyiron 2459
needzerostart:
2460
context:
4886 hidnplayr 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 ?
205 heavyiron 2471
 
4893 Serge 2472
_ctx_flags:
4908 hidnplayr 2473
        dd ?
2474
        dd ?
205 heavyiron 2475
 
4893 Serge 2476
_sse_flags:
4900 Serge 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
 
4908 hidnplayr 2488
        dq ?
2489
        dq ?
4893 Serge 2490
 
3675 GerdtR 2491
fpu_context:
4893 Serge 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
3675 GerdtR 2509
 
2510
sse_context:
4893 Serge 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:
3675 GerdtR 2520
 
4893 Serge 2521
oldcontext rb _ctx_flags-context
4901 Serge 2522
        rb 32
4893 Serge 2523
 
2524
oldfpucontext:
2525
oldmmxcontext: rb sse_context-fpu_context
2526
oldssecontext: rb ctx_end-sse_context
2527
 
2528
if 0
3675 GerdtR 2529
avx_context:
4886 hidnplayr 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 ?
3675 GerdtR 2538
oldavxcontext rb $-avx_context
4893 Serge 2539
end if
3675 GerdtR 2540
 
4893 Serge 2541
 
4906 Serge 2542
step_num dd ?
2543
proc_num dd ?
4886 hidnplayr 2544
dumpread dd ?
2545
dumppos  dd ?
2546
dumpdata rb dump_height*10h
3675 GerdtR 2547
 
205 heavyiron 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
4886 hidnplayr 2558
breakpoints     rb breakpoints_n*6
2559
drx_break       rd 4
205 heavyiron 2560
 
4886 hidnplayr 2561
disasm_buf_size dd ?
205 heavyiron 2562
 
4886 hidnplayr 2563
symbols         dd ?
2564
num_symbols     dd ?
542 diamond 2565
 
4886 hidnplayr 2566
bReload         db ?
205 heavyiron 2567
 
2568
needzeroend:
2569
 
4886 hidnplayr 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
205 heavyiron 2575
 
4913 hidnplayr 2576
thread_info             process_information
4908 hidnplayr 2577
 
4913 hidnplayr 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
 
4886 hidnplayr 2591
i_param         rb 256
205 heavyiron 2592
 
2593
; stack
3675 GerdtR 2594
        align   400h
2595
        rb      400h
205 heavyiron 2596
used_mem:
3675 GerdtR 2597
 
2598
; vim: ft=fasm tabstop=4
2599