1.1k likes | 1.46k Views
Windows XP 驱动程序编写方法 ——Step by Step. VS.NET+WIN XP DDK+DriverStudio3.2 开发环境版. 东南大学计算机科学与工程学院 杨全胜. 1. 驱动程序的开发环境. 本电子讲义可以作为几年前本人所写的 《 驱动开发 》 上、下电子讲义的后续篇,主要是将开发平台从 Windows98/2000 , DriverStudio 2.7 升级到以下环境:. Windows XP SP2 Visual Studio .NET(VC++.NET 2002) 简体中文版 * Windows XP DDK **
E N D
Windows XP驱动程序编写方法 ——Step by Step VS.NET+WIN XP DDK+DriverStudio3.2开发环境版 东南大学计算机科学与工程学院 杨全胜
1. 驱动程序的开发环境 本电子讲义可以作为几年前本人所写的《驱动开发》上、下电子讲义的后续篇,主要是将开发平台从Windows98/2000,DriverStudio 2.7升级到以下环境: • Windows XP SP2 • Visual Studio .NET(VC++.NET 2002) 简体中文版* • Windows XP DDK** • Driver Studio 3.2 以上四项中,前3项为Microsoft公司产品,可以只用2,3来开发驱动程序。为了方便起见,也可以使用第三方的开发工具Driver Studio ,它将DDK的内容封装成类,而且提供一个快速方便地生成驱动框架的工具。3.2版本可能是Compuware公司推出的最后一个版本。
*本电子讲义假设大家已经会VC++编程及熟悉VS IDE的使用。 **通常,开发不同操作系统下的驱动程序需要不同的DDK做支持: • Windows 2000 DDK适合开发Windows 2000/98/Me的WDM驱动程序,Windows 2000下NT4型驱动程序。 • Windows XP DDK适合开发IA64下的驱动程序或Windows XP/2000/Me的WDM驱动程序,Windows XP下NT4型驱动程序。 • Windows 2003 DDK适合开发AMD64/IA64下的驱动程序或Windows 2003/XP/2000/Me的WDM驱动程序,Windows 2003/XP/2000下NT4型驱动程序。
2. 驱动程序开发工具包DriverStudio 2.1 DriverStudio 3.2所包含的工具 • DriverWorks DriverWorks提供针对Windows NT 4和Win32驱动模型(WDM)的设备驱动程序开发的完全支持。DriverWorks中包含一个非常完善的源代码生成工具(DriverWizard) 以及相应的类库和驱动程序样本,它提供了在C++下进行设备驱动程序开发的支持。它可以集成到msvc6和msvc.net中,还需要最新的Windows DDK的支持。 • VToolsD VToolsD 是一个用来开发针对Win9X (Windows 95 和Windows 98)操作系统下设备驱动程序(VxD)的工具。VToolsD 中包括生成驱动程序源代码的工具,run-time 和interface 库,以及一些可以用来作为各种类型的设备驱动程序基础的驱动程序样本。
DriverNetworks DriverNetworks 是针对Windows网络驱动开发人员的一个模块。它的核心部分,是一个针对NDIS drivers 和TDI clients (DriverSockets)的C++ 的类库。DriverNetworks 中也有Quick Miniport Wizard 用来直接开始一个NDIS Miniport ,Intermediate 或协议驱动程序工程。它可以让你在采用DriverNetworks C++ 类库编写NDIS驱动程序的时候,快速的生成编译、安装和调试所需要的所有文件 。它可以集成到msvc6和msvc.net中,还需要最新的Windows DDK的支持。
SoftICE系列调试器SoftICE 系列调试器包含了可以调试各种代码的多种工具。它可以调试诸如BIOS代码、中断例程以及系统I/O。这些工具与强大的硬件调试板一起支持符号级调试,可以显示源码、全局或局部数据。其中: • SoftICE 是单机调试器,调试本机代码。 • Visual SoftICE是双机调试器,支持64位和32位平台上的微软操作系统。
DriverMonitor DriverMonitor不仅可以显示WDM和VxD在操作系统核心层次输出的调试语句,还可以装载和卸载VxD驱动和NT4系统的驱动程序。DriverMonitor DriverMonitor不仅可以显示WDM和VxD在操作系统核心层次输出的调试语句,还可以装载和卸载VxD驱动和NT4系统的驱动程序。 • EZDriverInstaller这是一个无需经过设备管理器或“添加新硬件”功能就能为Windows 2000/XP动态加载和卸载WDM驱动程序的小实用程序。 • SetDDKGo用来设置设备驱动程序创建的环境。当我们用Visual Studio(VC++)编译驱动程序源程序的时候,需要用SetDDKGo来设置环境变量,之后SetDDKGo会自动启动Visual Studio(VC++)编译环境。
DriverWorkbench这是DriverStudio以及用户工具的集成环境和宿主。DS的大多数工具全部被集成到这个开发环境中。DriverWorkbench这是DriverStudio以及用户工具的集成环境和宿主。DS的大多数工具全部被集成到这个开发环境中。 • BoundsChecker Driver Edition它提供了参数验证和系统测试来检测和跟踪不同的设备驱动程序与其他操作系统模块之间的交互。配置 • TrueTime Driver Edition这是一个能让Windows NT/2000/XP设备驱动程序的编写者确定驱动程序性能瓶颈的性能分析工具。对于编写设备驱动程序或核心代码的程序员,这很有用。 • TrueCoverage Driver Edition它能帮助程序员检测其代码的哪部分被测试过,哪部分还需要测试。可帮助程序员提高程序的稳定性。
2.2 DriverStudio 3.2的安装 安装需要的软硬件环境 • Intel x86兼容系统或X64系统(包含IA64和AMD64以及Itanium) • Windows XP • 内存: 最少256MB,推荐使用512 MB • 硬盘:完全安装需要大约182 MB • 针对SoftICE的远程调试: NE2000-兼容网卡或3Com 网卡 • 针对DriverWorks: Microsoft XP DDK,Visual C++.NET
安装步骤: 在安装DriverWorks之前,首先要保证你的计算机上已经安装了Microsoft Visual C++.NET以及Windows XP DDK。 所有这些包括DriverStudio的安装都必须以系统管理员身份启动系统。并且要按照下面的顺序安装。
第一步: 安装Visual Studio C++.NET 第二步: 安装Windows XP DDK(Driver Development Kits)。 注意: 1)在安装DDK的时候请选择完全安装。 2)安装中,不需要安装64BIT IA64Binaries 3)安装好后,对于 XP DDK不需要手动配置环境变量,只需在开始菜单中点击Checked Build Envirment 则DDK会自动调用setenv配置环境变量,并监测相应的SDK以及Visual Studio.NET IDE 第三步: 安装DriverStudio 3.2(按照安装提示安装)。
Driver Studio 3.2支持单机调试或双机调试两种模式。在安装的时候也有Host和Target两种模式。 • 单机调试需要在同一个机器中将Host和Target两种模式都安装 • 双机调试的时候需要在一个机器上安装Host模式,在另一个机器上安装Target模式。
DriverStudio安装后的设置: 1)使用DDK Build Setting工具定义BASEDIR环境变量并启动MSVC.NET,
2)打开下列地址上的建立库文件工程VdwLibs2002.sln2)打开下列地址上的建立库文件工程VdwLibs2002.sln 如果是VS.NET2003, 则打开 VdwLibs2003.sln
3)选择“生成->批生成”,打开下面的窗口,从中选则需要编译的配置。3)选择“生成->批生成”,打开下面的窗口,从中选则需要编译的配置。 Checked是调试版本,Free是发布版本
4)点击“重新生成”编译所选择的库文件。 注意:库文件只需在安装完成后第一次使用前编译一次即可。以后要使用DriverWorks,只需通过SetDDKGo进入MSVC.NET即可。 或者直接从MSVC.NET中启动DriverWorks。
3.Driver Works的使用 1)生成简单框架(VS.NET中启动DriverWizard)
工程文件名 工程文件目录
选择驱动类型 选择框架类型
创建功能驱动程序 创建过滤器驱动程序
本例不驱动硬件 选择相应总线
设备类 驱动类 队列管理类
驱动类文件 设备类文件 队列管理类 驱动安装指导文件 测试用的控制台程序文件
此时已经具备了一个驱动程序以及做测试用的应用程序的基本框架,我们可以在VC集成环境下修改有关程序,增加相关的具体操作代码,然后就可以编译和调试了。此时已经具备了一个驱动程序以及做测试用的应用程序的基本框架,我们可以在VC集成环境下修改有关程序,增加相关的具体操作代码,然后就可以编译和调试了。
该驱动程序框架包含了几个最基本的类,这些类是:该驱动程序框架包含了几个最基本的类,这些类是: class SampleDriver : public KDriver // 驱动程序类,用于初始化驱动程序 { SAFE_DESTRUCTORS public: // 以下成员函数注意和WDM中有关例程联系起来看 virtual NTSTATUS DriverEntry(PUNICODE_STRING RegistryPath); virtual NTSTATUS AddDevice(PDEVICE_OBJECT Pdo); virtual VOID Unload(VOID); void LoadRegistryParameters(PUNICODE_STRING RegistryPath); protected: // 成员数据 int m_Unit; };
class SampleDevice : public KPnpDevice // 是设备类KDvice的派生类,用于在WDM环境下支持即插即用设备 { // Constructors public: SAFE_DESTRUCTORS; SampleDevice(PDEVICE_OBJECT Pdo, ULONG Unit); ~SampleDevice(); VOID Invalidate(void); // Member Functions 注意和PNP的次功能代码联系起来看 DEVMEMBER_DISPATCHERS virtual NTSTATUS OnStartDevice(KIrp I); virtual NTSTATUS OnStopDevice(KIrp I); virtual NTSTATUS OnRemoveDevice(KIrp I); virtual NTSTATUS OnDevicePowerUp(KIrp I); virtual NTSTATUS OnDeviceSleep(KIrp I); virtual NTSTATUS DefaultPnp(KIrp I); virtual NTSTATUS DefaultPower(KIrp I); void LoadRegistryParameters();// 取注册表信息
void SerialRead(KIrp I); void SerialWrite(KIrp I); NTSTATUS SAMPLE_IOCTL_Read_Handler(KIrp I); NTSTATUS SAMPLE_IOCTL_Write_Handler(KIrp I); NTSTATUS SAMPLE_IOCTL_ReadWrite_Handler(KIrp I); protected:// Member Data KPnpLowerDevice m_Lower; sampleQueue ReadQueue; // Driver managed IRP queue sampleQueue WriteQueue; // Driver managed IRP queue #ifdef __COMMENT_ONLY virtual NTSTATUS Create(KIrp I); // COMMENT_ONLY virtual NTSTATUS Close(KIrp I); // COMMENT_ONLY virtual NTSTATUS Read(KIrp I); // COMMENT_ONLY virtual NTSTATUS Write(KIrp I); // COMMENT_ONLY virtual NTSTATUS DeviceControl(KIrp I);// COMMENT_ONLY virtual NTSTATUS SystemControl(KIrp I);//COMMENT_ONLY #endif //__COMMENT_ONLY };
由于一个可能是DriverStudio 3.2中的BUG,所以及时生成的一个空工程项目也无法编译通过,需要对生成的工程文件做以下手工修改: 把sample项目中的sources文件中的:TARGETLIBS=$ (DDK_LIB_PATH)\ntstrsafe.lib $ (DDK_LIB_PATH)\csq.lib这一行去掉就可以编译通过了
下面我们讲解编译、执行和调试这个驱动程序。下面我们讲解编译、执行和调试这个驱动程序。 先编译驱动程序工程 生成目标文件 在VS2002的集成环境中
再编译测试应用程序工程 生成目标文件 在VS2002的集成环境中
下面使用DriverStudio带的工具加载驱动程序和查看调试信息。下面使用DriverStudio带的工具加载驱动程序和查看调试信息。 驱动程序监视,可实时看到驱动程序发出的调试输出语句 驱动程序装载器,可动态调用驱动程序