概述
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)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复