📄 cvxdctrl.asm
字号:
;****************************************************************************
; 动态VXD *
; *
; Copyright 1996-2002 *
; All Rights Reserved. *
; 梁肇新 *
; 北京豪杰计算机技术有限公司 *
;****************************************************************************
PAGE 58,132
;******************************************************************************
TITLE CONTROL - ControlDispatch for VxD in C
;******************************************************************************
;
.586p
;******************************************************************************
; 包含头
;******************************************************************************
.xlist
include vmm.inc
include debug.inc
.list
;编译成动态VXD
SthVXD_DYNAMIC EQU 1
;VXD的ID号
CVXD_DEVICE_ID EQU 0ABCH
ifdef _VXD_SERVICES
;定义可以被其他VXD调用的接口函数
Create_CVXD_Service_Table = 1
;可以被其他VXD调用的接口函数表
Begin_Service_Table CVXD
CVXD_Service _CVXD_Get_Version, VxD_LOCKED_CODE
End_Service_Table CVXD
endif
;============================================================================
; VXD设备说明
;============================================================================
DECLARE_VIRTUAL_DEVICE SthVXD, 5, 0, CVXD_Control, CVXD_DEVICE_ID, \
UNDEFINED_INIT_ORDER, CVXD_V86, CVXD_PM
VxD_LOCKED_CODE_SEG
ifdef _VXD_SERVICES
extrn _CVXD_Get_Version:near
endif
extrn _CVXD_V86API@12:near
extrn _CVXD_PMAPI@12: near
extrn C EnableHlt: dword
;===========================================================================
;
; VXD控制函数
;
; 入口:
; EAX = ID
;
; 出口:
; 成功:标记清零
; 失败:标记置位
;
; 使用:
; EAX, EBX, ECX, EDX, ESI, EDI, Flags
;
;============================================================================
BeginProc CVXD_Control
Control_Dispatch SYS_DYNAMIC_DEVICE_INIT, CVXD_Dynamic_Init, sCall
Control_Dispatch SYS_DYNAMIC_DEVICE_EXIT, CVXD_Dynamic_Exit, sCall
Control_Dispatch W32_DEVICEIOCONTROL, CVXD_W32_DeviceIOControl, sCall, <ebp, ecx, ebx, edx, esi>
clc
ret
EndProc CVXD_Control
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; 内核空闲(IDLE)时调用此函数
;;
;; 使用HLT指令可以降低CPU的温度
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BeginProc _IDLEHandleProc
mov eax,[EnableHlt]
test eax,eax
jnz NEXT
stc
ret
NEXT:
sti ;必须允许中断, 否则就变成了死机
hlt ;CPU停机, 以便降低温度
stc
ret
EndProc _IDLEHandleProc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; 安装内核空闲(IDLE)时调用的函数
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BeginProc _InstallIDLEProc
push esi
lea esi,[_IDLEHandleProc]
VMMCall Call_When_Idle
pop esi
mov eax,0
setnc al
ret
EndProc _InstallIDLEProc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; 取消安装内核空闲(IDLE)时调用的函数
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BeginProc _UnInstallIDLEProc
push esi
lea esi,[_IDLEHandleProc]
VMMCall Cancel_Call_When_Idle
pop esi
mov eax,0
setnc al
ret
EndProc _UnInstallIDLEProc
; *************************************************************************
; V86模式调用的入口
;
; 把调用转变成对C函数的调用, 以便于开发功能强大的处理能力
;
; *************************************************************************
BeginProc CVXD_V86
scall CVXD_V86API, <[ebp].Client_EAX, [ebp].Client_EBX, [ebp].Client_ECX>
mov [ebp].Client_EAX,eax ; put return code
ret
EndProc CVXD_V86
; *************************************************************************
; 保护模式调用的入口
;
; 把调用转变成对C函数的调用, 以便于开发功能强大的处理能力
;
; *************************************************************************
BeginProc CVXD_PM
scall CVXD_PMAPI, <[ebp].Client_EAX, [ebp].Client_EBX, [ebp].Client_ECX>
mov [ebp].Client_EAX,eax
ret
EndProc CVXD_PM
VxD_LOCKED_CODE_ENDS
; *************************************************************************
;
; 不是动态的VXD时在Window启动时会被实模式调用
;
; *************************************************************************
VxD_REAL_INIT_SEG
BeginProc CVXD_Real_Init
xor bx, bx
xor si, si
xor edx, edx
mov ax, Device_Load_Ok
ret
EndProc CVXD_Real_Init
VxD_REAL_INIT_ENDS
END CVXD_Real_Init
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -