📄 cvxdctrl.asm
字号:
;******************************************************************************
TITLE CONTROL - ControlDispatch for VxD in C
;******************************************************************************
;
.386p
;******************************************************************************
; I N C L U D E S
;******************************************************************************
IFSFN_DELETE Equ 31
IFSFN_OPEN Equ 36
IFSFN_READ Equ 0
.xlist
include vmm.inc
include debug.inc
include ifsmgr.inc
include vwin32.inc
; include ifs.inc
public _strlen, _strcpy, _strcat, _strcmp, _SystemBox
; the following equate makes the VXD dynamically loadable.
CVXDSAMP_DYNAMIC EQU 1
;============================================================================
; V I R T U A L D E V I C E D E C L A R A T I O N
;============================================================================
DECLARE_VIRTUAL_DEVICE ANTIVIRU, 1, 0, CVXD_Control, UNDEFINED_DEVICE_ID, \
UNDEFINED_INIT_ORDER
VxD_LOCKED_CODE_SEG
;===========================================================================
;
; PROCEDURE: CVXD_Control
;
; DESCRIPTION:
; Device control procedure for the CVXD VxD
;
; ENTRY:
; EAX = Control call ID
;
; EXIT:
; If carry clear then
; Successful
; else
; Control call failed
;
; USES:
; 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, <ecx, ebx, edx, esi>
clc
ret
EndProc CVXD_Control
; *************************************************************************
; this routine handles api calls made from V86 mode programs. For the
; purpose of this examples it is assumed that the function number is passed
; in eax and any additional parameters are passed in ebx and ecx.
; The C code will do a SWITCH on the eax value to determine which routine to
; call and what parameters to pass. It is assumed that all functions return
; a value in eax.
;BeginProc CVXD_VM
; scall CVXD_VMAPI, <[ebp].Client_EAX, [ebp].Client_EBX, [ebp].Client_ECX>
; mov [ebp].Client_EAX,eax ; put return code
; ret
;EndProc CVXD_VM
; *************************************************************************
; this routine handles api calls made from protected mode programs. For the
; purpose of this examples it is assumed that the function number is passed
; in eax and any additional parameters are passed in ebx and ecx.
; The C code will do a SWITCH on the eax value to determine which routine to
; call and what parameters to pass. It is assumed that all functions return
; a value in eax.
;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_CODE_SEG
BeginProc _strlen
PUSH EBP
MOV EBP, ESP
MOV EDI, [EBP+8]
XOR EAX, EAX
CLD
LoopAgain:
SCASB
JNE LoopAgain
SUB EDI, [EBP+8]
DEC EDI
MOV EAX, EDI
POP EBP
RET
EndProc _strlen
BeginProc _strcpy
PUSH EBP
MOV EBP, ESP
MOV ESI, [EBP+0Ch]
MOV EDI, [EBP+8]
CLD
LoopCopy:
LODSB
STOSB
CMP AL, 0
JNE LoopCopy
POP EBP
RET
EndProc _strcpy
BeginProc _strcat
PUSH EBP
MOV EBP, ESP
MOV ESI, [EBP+0Ch]
MOV EDI, [EBP+8]
CLD
PUSH EDI
CALL _strlen
POP EDI
ADD EDI, EAX
LoopCopy1:
LODSB
STOSB
CMP AL, 0
JNE LoopCopy1
POP EBP
RET
EndProc _strcat
BeginProc _strcmp
PUSH EBP
MOV EBP, ESP
MOV ESI, [EBP+0Ch]
MOV EDI, [EBP+8]
CLD
PUSH EDI
CALL _strlen
POP EDI
MOV ECX, EAX
INC ECX
MOV EAX, 1
REPE CMPSB
JNE NotEqual
XOR EAX, EAX
NotEqual:
POP EBP
RET
EndProc _strcmp
BeginProc _SystemBox
PUSH EBP
MOV EBP, ESP
MOV EBX, [EBP+8]
VxDCall VWIN32_SysErrorBox
POP EBP
RET
EndProc _SystemBox
; *************************************************************************
VxD_CODE_ENDS
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -