VxD编程入门教程
2006-07-19 11:35:47 来源:WEB开发网该VxD在设备控制过程(VxD_Control过程)中处理了3个系统控制消息,分别是SYS_DYNAMIC_DEVICE_INIT(动态VxD初始化)、SYS_DYNAMIC_DEVICE_EXIT(动态VxD退出)和W32_DEVICEIOCONTROL(设备I/O控制),对应的消息处理过程分别是VxD_Device_Init、VxD_Device_Exit和VxD_IOCTL。其中VxD_Device_Init过程和VxD_Device_Exit过程只清除进位标志返回(表示成功),VxD_IOCTL过程是Windows 95/98应用程序与VxD通信的接口,完成文件系统API钩子的安装和移去工作,[esi.dwIOControlCode]中是设备I/O控制代码,该控制代码为1时安装文件系统API钩子,为2时移去文件系统API钩子。File_System_Api_Hook是文件系统API钩子过程,这里作为一个简单的实例,钩子过程判断是否是打开文件操作,如果是则显示一个简单的消息框,然后跳转到上一个文件钩子(相当于旧的文件系统API入口)。如果需要扩充功能,可以在该过程中增加代码。汇编连接VxD需要一个模块定义文件和一个NMAKE文件(手工汇编连接当然也可以)。这两个文件都可以直接用DDK中的GENERIC实例中的模块定义文件和NMAKE文件修改而成,模块定义文件(FILEHOOK.DEF)如下:
VXD FILEHOOK DYNAMIC
DESCRIPTION ''File System API Hook Program''
SEGMENTS
_LPTEXT CLASS ''LCODE'' PRELOAD NONDISCARDABLE
_LTEXT CLASS ''LCODE'' PRELOAD NONDISCARDABLE
_LDATA CLASS ''LCODE'' PRELOAD NONDISCARDABLE
_TEXT CLASS ''LCODE'' PRELOAD NONDISCARDABLE
_DATA CLASS ''LCODE'' PRELOAD NONDISCARDABLE
CONST CLASS ''LCODE'' PRELOAD NONDISCARDABLE
_TLS CLASS ''LCODE'' PRELOAD NONDISCARDABLE
_BSS CLASS ''LCODE'' PRELOAD NONDISCARDABLE
_LMSGTABLE CLASS ''MCODE'' PRELOAD NONDISCARDABLE IOPL
_LMSGDATA CLASS ''MCODE'' PRELOAD NONDISCARDABLE IOPL
_IMSGTABLE CLASS ''MCODE'' PRELOAD DISCARDABLE IOPL
_IMSGDATA CLASS ''MCODE'' PRELOAD DISCARDABLE IOPL
_ITEXT CLASS ''ICODE'' DISCARDABLE
_IDATA CLASS ''ICODE'' DISCARDABLE
_PTEXT CLASS ''PCODE'' NONDISCARDABLE
_PMSGTABLE CLASS ''MCODE'' NONDISCARDABLE IOPL
_PMSGDATA CLASS ''MCODE'' NONDISCARDABLE IOPL
_PDATA CLASS ''PDATA'' NONDISCARDABLE SHARED
_STEXT CLASS ''SCODE'' RESIDENT
_SDATA CLASS ''SCODE'' RESIDENT
_DBOSTART CLASS ''DBOCODE'' PRELOAD NONDISCARDABLE CONFORMING
_DBOCODE CLASS ''DBOCODE'' PRELOAD NONDISCARDABLE CONFORMING
_DBODATA CLASS ''DBOCODE'' PRELOAD NONDISCARDABLE CONFORMING
_16ICODE CLASS ''16ICODE'' PRELOAD DISCARDABLE
_RCODE CLASS ''RCODE''
EXPORTS
FILEHOOK_DDB @1
NMAKE文件(MAKEFILE)如下:
!ifdef MASTER_MAKE
BUILD_BITS=32
BUILD_TYPE=base
!INCLUDE $(DDKROOT)\master.mk
!endif
NAME = filehook
# supply the location of a 16-bit linker
LINK =
# Definitions for the debug level
!ifdef DEBUG
DDEBUG =-DDEBLEVEL=1 -DDEBUG
!else
DDEBUG =-DDEBLEVEL=0
!endif
# Definitions for MASM 6 Assembler
ASM = ml
AFLAGS = -coff -DBLD_COFF -DIS_32 -W2 -c -Cx -Zm -DMASM6 $(DDEBUG)
ASMENV = ML
LFLAGS = /VXD /NOD
# MASM 6 only inference rules
.asm.obj:
set $(ASMENV)=$(AFLAGS)
$(ASM) -Fo$*.obj $<
all : $(NAME).VXD
OBJS = filehook.obj
filehook.obj: filehook.asm
$(NAME).vxd: $(NAME).def $(OBJS)
link @<<$(NAME).lnk
$(LFLAGS)
/OUT:$(NAME).vxd
/MAP:$(NAME).map
/DEF:$(NAME).def
$(OBJS)
<<
mapsym -s -o $(NAME).sym $(NAME).map
clean:
-@del *.obj
-@del *.vxd
-@del *.exp
-@del *.lib
-@del *.map
-@del *.sym
更多精彩
赞助商链接