我是靠谱客的博主 冷静彩虹,最近开发中收集的这篇文章主要介绍WDM驱动加载的实现(1),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


1 WDM驱动加载方式

WDM是Windows DriverModal的简写,叫做Windows驱动模型。该驱动的加载需要通过INF文件实现。INF文件指的是后缀名是INF的文件,该文件叫做安装信息文件,是Windows系统支持的一种存放安装信息的文件。

可以通过“控制面板->添加硬件”实现手动加载驱动。但是手动加载驱动操作繁琐而且容易出错,而通过软件实现驱动的一键自动加载相比手动加载要方便的多。实现一键自动加载的软件有EzDriverInstaller和InstDrv等。本文通过Windows XP +VS2008+WDK7600.16385.1实现一键自动加载WDM驱动程序。

相关链接1:手动加载WDM驱动的操作流程

2自动加载的实现

要实现驱动程序的加载,必须为该驱动程序创建一个对应的设备。Windows为连接的所有设备创建了一棵设备树,每个设备都是树上的一个节点。要实现驱动程序的加载,必须在设备树中注册该驱动对应的设备,方式是通过设备硬件ID进行注册,因此还需要设置新创建设备的硬件ID。而设备的注册是通过设备信息列表和设备信息元素实现的。


2.1 从INF文件中获取设备类名称和GUID

通过SetupDiGetINFClass()函数获取INF文件中的设备类名称和GUID。

2.1.1 函数格式

WINSETUPAPI BOOL WINAPI
  SetupDiGetINFClass(
    IN PCTSTR  InfName,
    OUT LPGUID  ClassGuid,
    OUT PTSTR  ClassName,
    IN DWORD  ClassNameSize,
    OUT PDWORD  RequiredSize  OPTIONAL,
    );

其中,InfName表示INF文件的绝对路径;ClassGuid保存从INF文件中得到的设备的GUID;ClassName保存从INF文件中得到的设备类名称;ClassNameSize表示ClassName的大小;RequiredSize表示设备类名称的真实长度,该参数可以设置为NULL。

2.1.2 调用代码

通过以下代码可以获取INF文件中的设备类名称和GUID。

GUID guid = {0};

TCHAR className[64] = {0};

SetupDiGetINFClass(lpStrInfFileName,&guid, className, 64, NULL)

其中,lpStrInfFileName是INF文件的绝对路径。INF中的[Version]节中包含了Class项和ClassGUID项,如下格式

[Version]

Class=MyDevice

ClassID= {EF2962F0-0D55-4bff-B8AA-2221EE8A79B0

通过调用SetupDiGetINFClass(),className的值是MyDevice,guid的值是{EF2962F0-0D55-4bff-B8AA-2221EE8A79B0}。

相关链接2:INF文件格式解析;

相关链接3:GUID是Global Unique Identifier的简称,全局唯一标识符。指定了接口对象、管理器入口点和类对象。GUID是一个128比特即16个字节的值。其格式为8个16进制数(4字节),接下来是3组4个16进制数(共6字节),最后1组是12个16进制数(6字节)。使用GUID结构来表示该值,GUID结构的格式是

typedef struct _GUID {
  DWORD Data1;
  WORD Data2;
  WORD Data3;
  BYTE Data4[8];

} GUID;

最后

以上就是冷静彩虹为你收集整理的WDM驱动加载的实现(1)的全部内容,希望文章能够帮你解决WDM驱动加载的实现(1)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部