wdebug.asm
来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 1,810 行 · 第 1/5 页
ASM
1,810 行
;*****************************************************************************
;*
;* Open Watcom Project
;*
;* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
;*
;* ========================================================================
;*
;* This file contains Original Code and/or Modifications of Original
;* Code as defined in and that are subject to the Sybase Open Watcom
;* Public License version 1.0 (the 'License'). You may not use this file
;* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
;* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
;* provided with the Original Code and Modifications, and is also
;* available at www.sybase.com/developer/opensource.
;*
;* The Original Code and all software distributed under the License are
;* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
;* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
;* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
;* NON-INFRINGEMENT. Please see the License for the specific language
;* governing rights and limitations under the License.
;*
;* ========================================================================
;*
;* Description: DEBUG - Windows 3.x/9x Virtual Device Driver
;*
;*
;*****************************************************************************
;****************************************************************************
;*** ***
;*** WGOD.ASM - Ring 0 multi-purpose windows thingme ***
;*** (like God, only better) ***
;*** ***
;****************************************************************************
.386p
.387
INCLUDE win30vxd.inc
INCLUDE wdebug.inc
MAX_EMU_REG equ 32
SAMPLE_SIZE equ 6
Sample_struct struc
SampleEIP dd ?
SampleCS dw ?
Sample_struct ends
EMU_SIZE equ 2*2+2*4
EMU_struct struc
E_CS dw ?
E_NULL dw ?
E_8087 dd ?
E_ID dd ?
EMU_struct ends
MAX_SERVER_NAME equ 16
MAX_CONVS equ 64
CONV_SIZE equ 5*4+4*2+8+MAX_SERVER_NAME
Conv_struct struc
C_MyID dd ?
C_WhoBlocked dd ?
C_ServerID dd ?
C_Regs dd ?
C_TimerHandle dd ?
C_Seg dw ?
C_Off dw ?
C_Bytes dw ?
C_ConvCount dw ?
C_AckConv db ?
C_StartedConv db ?
C_GetBlocked db ?
C_PutBlocked db ?
C_IsPM db ?
C_IsServer db ?
C_InUse db ?
C_PutPending db ?
C_ServerName db MAX_SERVER_NAME dup(?)
Conv_struct ends
Interrupt_struct struc
I_SaveEAX dd ?
I_SaveEBX dd ?
I_SaveECX dd ?
I_SaveEDX dd ?
I_SaveEDI dd ?
I_SaveESI dd ?
I_SaveEFLAGS dd ?
I_SaveEBP dd ?
I_SaveEIP dd ?
I_SaveESP dd ?
I_SaveSS dw ?
I_SaveCS dw ?
I_SaveDS dw ?
I_SaveES dw ?
I_SaveFS dw ?
I_SaveGS dw ?
I_InterruptNumber dw ?
Interrupt_struct ends
;Declare_Virtual_Device WDEBUG, 3, 0, WGod_Control, Debug_Device_ID, 0f0000000h
Declare_Watcom_Debug_Virtual_Device 3, 0, WGod_Control, Debug_Device_ID, 00000001h
extrn __Win387_emulator:PROC
;*
;*** initialization data
;*
VxD_IDATA_SEG
VxD_IDATA_ENDS
;*
;*** local data
;*
VxD_DATA_SEG
CallTable LABEL DWORD
dd OFFSET SVC_GetVersion ; request 00
dd OFFSET SVC_CopyMemory ; request 01
dd OFFSET SVC_GetDescriptor ; request 02
dd OFFSET SVC_GetLimit ; request 03
dd OFFSET SVC_GetDR ; request 04
dd OFFSET SVC_SetDR ; request 05
dd OFFSET SVC_InitSampler ; request 06
dd OFFSET SVC_QuitSampler ; request 07
dd OFFSET SVC_StartSampler ; request 08
dd OFFSET SVC_StopSampler ; request 09
dd OFFSET SVC_GetCurrTick ; request 0a
dd OFFSET SVC_SetTimerRate ; request 0b
dd OFFSET SVC_GetTimerRate ; request 0c
dd OFFSET SVC_GetCurrCount ; request 0d
dd OFFSET SVC_GetSample0Tick ; request 0e
dd OFFSET SVC_RegisterName ; request 0f
dd OFFSET SVC_AccessName ; request 10
dd OFFSET SVC_UnregisterName ; request 11
dd OFFSET SVC_UnaccessName ; request 12
dd OFFSET SVC_StartConv ; request 13
dd OFFSET SVC_LookForConv ; request 14
dd OFFSET SVC_EndConv ; request 15
dd OFFSET SVC_ConvGet ; request 16
dd OFFSET SVC_ConvPut ; request 17
dd OFFSET SVC_IsConvAck ; request 18
dd OFFSET SVC_MyID ; request 19
dd OFFSET SVC_SetExecutionFocus ; request 1a
dd OFFSET SVC_WhatHappened ; request 1b
dd OFFSET SVC_ConvGetTimeout ; request 1c
dd OFFSET SVC_ConvPutTimeout ; request 1d
dd OFFSET SVC_EMUInit ; request 1e
dd OFFSET SVC_EMUShutdown ; request 1f
dd OFFSET SVC_EMURegister ; request 20
dd OFFSET SVC_EMUUnRegister ; request 21
dd OFFSET SVC_FPUPresent ; request 22
dd OFFSET SVC_EMUSaveRestore ; request 23
dd OFFSET SVC_PauseSampler ; request 24
dd OFFSET SVC_UnPauseSampler ; request 25
dd OFFSET SVC_EGAWrite ; request 26
dd OFFSET SVC_VGARead ; request 27
dd OFFSET SVC_DisableVideo ; request 28
dd OFFSET SVC_RegisterInterruptCallback ; request 29
dd OFFSET SVC_UnRegisterInterruptCallback ; request 2a
dd OFFSET SVC_GetInterruptCallback ; request 2b
dd OFFSET SVC_RestartFromInterrupt; request 2c
dd OFFSET SVC_Is32BitSel ; request 2d
dd OFFSET SVC_GetVMId ; request 2e
dd OFFSET SVC_HookIDT ; request 2f
dd OFFSET SVC_IDTFini ; request 30
dd OFFSET SVC_IDTInit ; request 31
dd OFFSET SVC_ConvPutPending ; request 32
dd OFFSET SVC_UseHotKey ; request 33
dd OFFSET SVC_RaiseInterruptInVM ; request 34
MaxAPI equ ($-CallTable)/4
PM_Int2FNextCS dd 0
PM_Int2FNextEIP dd 0
PageTableBuf dd 0
StartTime dd 0
TimerHandle dd 0
VMHandle dd 0
WinVMHandle dd 0
SampleUserSel dd 0
SampleUserOff dd 0
SampleUserVM dd 0
SampleOffset dd 0
CurrTick dd 0
SampleCount dd 0
StopSamples dd 1
MaxSamples dd 0
TimeOutTime dd 0
DataTimeOut dd 0
IntPeriod dd 0
Sample0Tick dd 0
StringAddr dd 0
IDAddr dd 0
OtherIDAddr dd 0
SaveServer dd 0
ServerID dd 0
IsEMUInit dd 0
OldCR0 dd 0
TaskSwitcherActive dd 0
WasHotKey dd 0
HotEventHandle dd 0
UseHotKey dd 0
IDTIsInit dd 0
RealSS dw 0
RealCS dw 0
RealESP dd 0
RealEIP dd 0
RealEFlags dd 0
RealFault dw 0
ReflectToCS dw 0
ReflectToEIP dd 0
IDTAddr dd 0
EMUList db MAX_EMU_REG*EMU_SIZE dup(0)
Convs db MAX_CONVS*CONV_SIZE dup(0)
Idt01 db 8 dup(0)
Idt03 db 8 dup(0)
Descriptor LABEL WORD
Desc1 dw 0
Desc2 dw 0
Desc3 dw 0
Desc4 dw 0
IsPM dw 0
MapSeg dw 0
MapOff dw 0
HasFPU dw 0
InUse db 0
IsServer db 0
IsGet db 0
VxD_DATA_ENDS
VxD_LOCKED_DATA_SEG
Old00Handler dd 0
Old06Handler dd 0
Old07Handler dd 0
Old0DHandler dd 0
ICCodeFlat dd 0
ICDataFlat dd 0
ICVM dd 0ffffffffh
FaultType dw 0ffffh
ICCodeSeg dw 0
ICCodeOff dw 0
ICDataSeg dw 0
ICDataOff dw 0
ICStackSeg dw 0
ICStackOff dw 0
VxD_LOCKED_DATA_ENDS
VxD_ICODE_SEG
;**************************************************************
;*** ***
;*** WGod_Sys_Critical_Init - hook int 2f here, for PM apps ***
;*** ***
;**************************************************************
BeginProc WGod_Sys_Critical_Init
;*
;*** hook PM int 2f
;*
mov eax, 2Fh
VxDcall Get_PM_Int_Vector
mov [PM_Int2FNextCS], ecx
mov [PM_Int2FNextEIP], edx
mov esi, OFFSET WDebugPM_Int2F
VxDcall Allocate_PM_Call_Back
movzx edx, ax ;eax has cs:ip
mov ecx, eax
shr ecx, 16
mov eax, 2Fh
VxDcall Set_PM_Int_Vector
;*
;*** hook gp fault
;*
mov eax,0dh
mov esi,OFFSET Fault0DHandler
VxDcall Hook_PM_Fault
cmp esi,0
jne short aretd
mov esi,OFFSET JustReturn
aretd:
mov Old0DHandler,esi
;*
;*** find out if there is an FPU
;*
mov HasFPU,0 ; assume no FPU
push eax ; allocate space for control word
fninit ; initialize math coprocessor
fnstcw word ptr [esp] ; store control word in memory
pop eax ; get control word
cmp ah,03h ; upper byte is 03 if 8087 is present
jne short nofpu
mov HasFPU,1 ; got an FPU
nofpu:
clc
ret
EndProc WGod_Sys_Critical_Init
VxD_ICODE_ENDS
;*
;** locked code
;*
VxD_LOCKED_CODE_SEG
BeginProc WGod_Control
Control_Dispatch Sys_Critical_Init, WGod_Sys_Critical_Init
Control_Dispatch Device_Init, WGod_Device_Init
Control_Dispatch VM_Suspend, WGod_Suspend
Control_Dispatch VM_Resume, WGod_Resume
clc
ret
EndProc WGod_Control
;*
;*** ReflectTo16Bit - pass state to 16-bit application
;*
ReflectTo16Bit PROC near
mov edx,ICDataFlat
call IDTFini ; we want int 3 as normal
cmp RealFault,0 ; did an int1/int3 occur?
je short not_special ; nope, go get data from CRS
mov ax,RealFault ; was int1/int3, use Real...
mov FaultType,ax
cmp ax,257
jne short no_cancel
push edx
VxDcall Get_Sys_VM_Handle
mov esi,HotEventHandle
VxDcall Cancel_VM_Event
pop edx
no_cancel:
mov RealFault,0
mov eax,RealESP
mov [edx.I_SaveESP],eax
mov eax,RealEIP
mov [edx.I_SaveEIP],eax
mov eax,RealEFlags
mov [edx.I_SaveEFLAGS],eax
mov ax,RealCS
mov [edx.I_SaveCS],ax
mov ax,RealSS
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?