VxD入门教程

原创 2001年10月25日 16:53:00

VxD入门教程

站长多次与丁凯联系,但邮件都被退回来了,可能他的邮箱不能用了罢。

 
1.背景知识
   为了看懂本篇所给的例子,需要C, 汇编及Windows 设备驱动程序的相关知识。
 
2.开发工具
   需要 Microsoft Visual C++ 2.0 以上版本,MASM 6.11C, 及Windows 95 DDK
   (以下采用 VC++ 6.0 为例)
3.目的
   利用以上所列的开发工具,编写一个动态装入的 VxD, 利用该VxD可以读取内存地址 0 
处的中断向量表。
4.开始
第一步:
   用 VC++ 新建一个工程,取名为 MiniVxd, 类型为 Win32 App 或 Console App
因为VC++不提供直接生成VxD的App Wizard,所以只好自己在以上两种App中选择一个,然后
再进行手工修改一下,需要修改的内容只有一处,即在 Link 的命令行上加上一个选项 
/VXD
第二步:
   新建一个空文件,在其中输入以下代码:
 
 
TITLE MINIVXD - By Ding Kai
    .386p
    include vmm.inc
MINIVXD_DYNAMIC EQU 1
; 定义设备驱动程序块 DDB, 由于是动态装入的,所以设备ID和装入顺序可以取未定义值.
DECLARE_VIRTUAL_DEVICE  MINIVXD, 1, 0, MsgDispatch,/
                                    UNDEFINED_DEVICE_ID, Undefined_Init_Order, 0, 0
 
VXD_LOCKED_CODE_SEG
; 定义消息派遣表,本例中只需要一条消息,即W32_DEVICEIOCONTROL,用于从Win32 App中利用
; DeviceIoControl API函数同本VxD进行通讯.
BeginProc MsgDispatch
    Control_Dispatch W32_DEVICEIOCONTROL,     W32DeviceIoControl, sCall, <ecx,ebx,esi>
    clc
    ret
EndProc MsgDispatch
VXD_LOCKED_CODE_ENDS
    END
 

将文件存盘,文件名取为 VxdStub.asm, 然后用下列命令编译该文件:
Aml -coff -W2 -DBLD_COFF -DIS_32 -c -Cx -DMASM6 -I/95DDK/INC32 VxdStub.asm
这将会生成 vxdstub.obj,将此OBJ文件加入到工程文件中。
 
第三步:
    创建一个 C 语言文件,文件名取为 MiniVxd.c,在文件中输入以下代码:
 
 
#define  WIN40SERVICES
#pragma warning (disable:4229)
#include <string.h>
#define WANTVXDWRAPS
#include <basedef.h>
#include <vmm.h>
#include <debug.h>
#include <vwin32.h>
#include <winerror.h>
#include <vxdwraps.h>
#include <ifs.h>
#include <shell.h>
#pragma intrinsic(memcpy)
#pragma VxD_LOCKED_DATA_SEG
// 此处可以定义任何在VxD中需要的全局变量.
char                AnyData[200];
#pragma VxD_LOCKED_CODE_SEG
///////////////////////////////////////////
DWORD __stdcall GetMemory( DWORD dwDDB, PDIOCPARAMETERS pD ) 
{
    BYTE    *p;
    // 此处忽略了参数检查,实际应用中切不可如此 !!
    p = (PBYTE)pD->lpvOutBuffer;
    memcpy(p, 0, 1024); // 读取中断向量表,共 1024 字节
    return 1024;
}
///////////////////////////////////////////////////////
/* Win32 interface */
///////////////////////////////////////////////////////
int __stdcall
W32DeviceIoControl( DWORD dwIoCtrlCode, /*ecx*/
                            DWORD dwDDB,        /*ebx*/
                            DWORD pDIOCParams ) /*esi*/
{
    PDIOCPARAMETERS      pD;
    pD = (PDIOCPARAMETERS)pDIOCParams;
    if ( dwIoCtrlCode == DIOC_OPEN ||
         dwIoCtrlCode == DIOC_CLOSEHANDLE)
        return 0L; 
    // Init returned value
    if (pD->lpcbBytesReturned)
        *(DWORD *)pD->lpcbBytesReturned = 0;
   if (dwIoCtrlCode==1) {   // 1 = DeviceIoControl代码
        GetMemory(dwDDB, pD);
    }
    else
        return ERROR_NOT_SUPPORTED;
    return 0;
}
 

将本文件加入到工程文件中.
第四步:
    创建一个模块定义文件,此文件将要定义最终生成的VxD文件的段属性并输出设备驱动程序块,
输入下面的代码,并将文件存为 MiniVxd.def,同时将其加入到工程文件中.
 
VXD             MINIVXD  DYNAMIC
DESCRIPTION     'Written by Ding Kai'
SEGMENTS
                _LTEXT      CLASS 'LCODE'   PRELOAD NONDISCARDABLE
                _LDATA      CLASS 'LCODE'   PRELOAD NONDISCARDABLE
                _TLS        CLASS 'LCODE'   PRELOAD NONDISCARDABLE
                _BSS        CLASS 'LCODE'   PRELOAD NONDISCARDABLE
                _ITEXT      CLASS 'ICODE'   DISCARDABLE
                _IDATA      CLASS 'ICODE'   DISCARDABLE
                _PTEXT      CLASS 'PCODE'   NONDISCARDABLE
                _PDATA      CLASS 'PDATA'   NONDISCARDABLE SHARED
HEAPSIZE        10240
STACKSIZE       40960
EXPORTS
                MINIVXD_DDB @1
 

当然,其中有些段在本程序中不存在,此处列出来是想将此文件做为一个模板以供以后使用。
第五步:
    加入本工程文件需要的最后一个,VxdWarps.clb, 这个文件是DDK的LIB目录中.
第六步:
    所需的四个文件已经全部加入完毕,它们是:
    vxdstub.obj
    minivxd.c
    minivxd.def
    vxdwarps.clb
    在进行make之前请检查一下文件路径, 在 Include 中一定要包含 DDK 目录中的 INC32 目录.
确认无误后可以按 F7 键进行 Make 了。
    结果会在 DEBUG 目录或 Release 目录 (依赖于工程文件的设置) 生成 MiniVxd.vxd 文件。
    至此,一个小小的Vxd文件生成完毕, 可以在程序中用下面的代码与本VxD进行通讯.
    BYTE   buffer[1024];
    DeviceIoControl(hVxd, 1, NULL, NULL, buffer, 1024, NULL, 0);
    结果,当前的中断向量表就会出现在 buffer 数组中。
 

    本文不再提供完整的测试程序,需要的话请与作者联系
 
5.小结
    本文用一个简单的示例介绍了如何在 Windows 95 下编写可动态安装的 VxD, 这种方法及用这种方法编写的
VxD在Windows 98 下同样适用。然而,在 Windows NT 不能采用这种方法,有兴趣的朋友请关注本主页的最新更
新或与本人联系.
 


 
  丁凯草书于一九九九年五月十六日

【一起学AngularJS】第一章、入门教程说明

同步更新自http://www.tbwood.cn/articles/2016/03/03/1456997889326.html
  • TBWood
  • TBWood
  • 2016年03月08日 19:06
  • 1859

mfc最详细入门教程

以下是我从其他网站中学的内容,后有相应的网站学习链接地址,可供学习 1.选择菜单项File->New->Project,弹出“New Project”对话框。  2.左侧面板中Instal...
  • wang18323834864
  • wang18323834864
  • 2017年11月24日 10:07
  • 305

HTML5 canvas 初级入门教程【转】

HTML5 canvas 初级入门教程【转】 原文:http://www.csser.com/dev/274.html HTML5 canvas 即HTML5画布,是一个现代浏览器都支持的HT...
  • autumn20080101
  • autumn20080101
  • 2013年03月10日 11:37
  • 659

unity自带寻路Navmesh入门教程(一)

unity自从3.5版本之后,增加了NavMesh寻路的功能。在此之前,unity用户只能通过第三方插件(如Astar寻路插件)等做寻路功能。阿赵我也使用过A*寻路插件,A*的原理并不复杂,有兴趣的朋...
  • wjlsxl_whb
  • wjlsxl_whb
  • 2016年11月16日 11:43
  • 528

CodeIgniter框架入门教程——第三课 URL及ajax

本文转载自:http://www.softeng.cn/?p=74 这节课讲一下CI框架的路由规则,以及如何在CI框架下实现ajax功能。 首先,先介绍CI框架的路由规则,因为CI框架是在PHP的...
  • whh306318848
  • whh306318848
  • 2014年03月11日 22:15
  • 1474

maven 简单入门教学

Maven那点事儿(Eclipse版) 前言:   由于最近工作学习,总是能碰到Maven的源码。虽然平时工作并不使用Maven,但是为了学习一些源码,还是必须要了解下。这篇文章不是一个...
  • maple980326
  • maple980326
  • 2016年08月03日 15:51
  • 4461

Jmeter 快速入门教程(二)--创建简单web测试

今天我们就来实际用Jmeter创建一个测试场景,并进行性能测试. 注:由于本人使用中文版本,使用英文版本的请注意具体的菜单及参数名称. 1. 添加线程组(相当于lr里的scenario 设置) ...
  • hualusiyu
  • hualusiyu
  • 2014年09月04日 11:05
  • 774

cocos2dx3.0 C++开发 零基础入门笔记

测试代码环境:   VS2013 + cocos 2d x 3.0 程序执行流程 1、AppDelegate::applicationDidFinishLaunch...
  • imxiangzi
  • imxiangzi
  • 2016年02月02日 12:19
  • 443

web前端小白入门教程

一小时学会写页面 作为一个懒癌晚期患者,总是习惯找各种简单的解决问题的方法,也习惯性把问题简单化,所以今天想分享给大家简单的web前端入门方法。 既然题目已经定了一个小时那么废话就不多说了,计时开...
  • coco510
  • coco510
  • 2016年05月06日 00:44
  • 955

Flume入门教程

1、数据流模型    Flume的核心是把数据从数据源收集过来,再送到目的地。为了保证输送一定成功,在送到目的地之前,会先缓存数据,待数据真正到达目的地后,删除自己缓存的数据。    Flume传输的...
  • silentwolfyh
  • silentwolfyh
  • 2016年04月15日 22:35
  • 763
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VxD入门教程
举报原因:
原因补充:

(最多只允许输入30个字)