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 + -
显示快捷键?