📄 windbg.asm
字号:
page 78,132
title Windows debugging monitor
.sall
?PLM = 0
?WIN = 0
.xlist
include cmacros.inc
.list
.model small
.code
.data
InitSeg segment byte public
InitSeg ends
DGroup group _TEXT,_DATA,InitSeg
.code
assume cs:DGroup,ds:DGroup,es:DGroup,ss:DGroup
extrn Monitor:near,PrintMes:near,OutCh:near,Out16:near,Hex:near
extrn CrLf:near
WinMsg db "WinMsg"," "+80H
LoadMsg db " Load"," "+80H
LoadLabs db " Ordinal", " "+80H
db " Segment", " "+80H
db " Instance", " "+80H
MoveLabs db " Segment moving from", " "+80H
db " to", " "+80H
DiscardMsg db " Discard segment", " "+80H
InitHeapMsg db " Heap initialized to", " "+80H
PrintMsg db " String:", " "+80H
StartProgMsg db " Start program Id", " "+80H
EndProgMsg db " End program Id", " "+80H
EndFocusMsg db " End", " "+80H
StartFocusMsg db " Start", " "+80H
FocusMsg db "focus DGroup", " "+80H
db " Id", " "+80H
UnknownMsg db " Use unknown", " "+80H
WinSig label byte
db 0E9H ;near JMP
dw WinMessage - (100H - 2)
org WinSig + 5
db "SEGDEBUG",0
cbWinSig = $ - WinSig
tWinDisp label word
dw WinMsg0
dw WinMsg1
dw WinMsg2
dw WinMsg3
dw WinMsg4
dw WinMsg5
dw WinMsg6
dw WinMsg7
dw WinMsg8
dw WinMsg9
dw WinMsg10
dw WinMsg11
dw WinMsg12
dw WinMsg13
dw WinMsg14
LastMsg = ($ - tWinDisp)/2
dw WinMsg15 ;Unused
cProc WinMessage <FAR>,<ds,si,di>
ParmW Action
ParmW p1
ParmW p2
ParmW Ordinal
ParmW SegVal
ParmW Instance
cBegin
mov ax,[Action]
push cs
pop ds
push cs
pop es
mov si,offset DGroup:WinMsg
call PrintMes
mov ax,[Action]
mov bx,ax
cmp ax,10 ;Two digit number?
jb OneDigit
aam ;Convert to unpacked BCD
xchg al,ah
or al,"0"
call OutCh
xchg al,ah
OneDigit:
or al,"0"
call OutCh
cmp bx,LastMsg ;Bigger than our table?
jbe MsgOk
mov bx,LastMsg+1 ;Limit to end of table
MsgOk:
shl bx,1 ;Index into table
jmp [bx].tWinDisp
WinMsg0:
;Load new segment
mov si,offset DGroup:LoadMsg
call PrintMes
lds si,dword ptr [p1] ;First arg is pointer to name
PrintName:
lodsb
or al,al
jz NameDone
call OutCh
jmp PrintName
;SymDeb handles messages 0 - 9. Here's labels for the rest in case we figure
;out what they're for.
WinMsg5:
WinMsg6:
WinMsg7:
WinMsg8:
WinMsg9:
WinMsg10:
WinMsg15:
;A message we don't understand
mov si,offset DGroup:UnknownMsg
call PrintMes
;Print two word arguments
mov dx,[p1]
call Out16
mov al,","
call OutCh
mov dx,[p2]
call Out16
WinMessageExit:
call CrLf
NoMessage:
cEnd WinMessage
NameDone:
push cs
pop ds
mov si,offset DGroup:LoadLabs
call PrintMes ;Print label
mov ax,[Ordinal]
call Hex ;Print 2 hex digits
call PrintMes
mov dx,[SegVal]
call Out16
call PrintMes
mov ax,[Instance]
call Hex
jmp WinMessageExit
WinMsg1:
;Memory movement
cmp [p2],0 ;Is destination zero?
jz WinMsg2 ;Same as Msg 2, Discard
mov si,offset DGroup:MoveLabs
call PrintMes
mov dx,[p1] ;First arg is old location
call Out16
call PrintMes
mov dx,[p2]
call Out16
jmp WinMessageExit
WinMsg2:
;Discard segment
mov si,offset DGroup:DiscardMsg
call PrintMes
mov dx,[p1] ;First arg is segment
call Out16
jmp WinMessageExit
WinMsg3:
;Heap initialization
mov si,offset DGroup:InitHeapMsg
call PrintMes
mov dx,[p1] ;First arg is pGlobalHeap
call Out16
jmp WinMessageExit
WinMsg4:
;Print message
mov si,offset DGroup:PrintMsg
call PrintMes
lds si,dword ptr [p1]
mov cx,[Ordinal]
jcxz WinMessageExit
PrintLoop:
lodsb
call OutCh
loop PrintLoop
push cs
pop ds
jmp WinMessageExit
WinMsg11:
;Start program
mov si,offset DGroup:StartProgMsg
jmp short ProgMsg
WinMsg12:
;End program
mov si,offset DGroup:EndProgMsg
ProgMsg:
call PrintMes
mov ax,[p1] ;First arg is ordinal
call Hex
jmp WinMessageExit
WinMsg13:
;End focus
mov si,offset DGroup:EndFocusMsg
call PrintMes
mov si,offset DGroup:FocusMsg
jmp short NewFocus
WinMsg14:
;Start focus
mov si,offset DGroup:StartFocusMsg
call PrintMes
NewFocus:
call PrintMes
mov dx,[p1] ;First arg is DGroup
call Out16
call PrintMes
mov ax,[p2] ;Second arg is ID
call Hex
jmp WinMessageExit
;************************************************************
InitSeg segment
assume cs:DGroup,ds:Dgroup
push cs
pop es
mov di,offset DGroup:Monitor - 5 ;Start of signature area
mov si,offset DGroup:WinSig
mov cx,cbWinSig
rep movsb
;Will now fall into next module's init code
InitSeg ends
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -