C++实现预装驱动功能

C++实现预装驱动功能

         工作中遇到的一个需求:需要在项目中打包一个硬件设备的驱动安装程序,提供了驱动安装包文件。

         微软的WDK有提供API实现这个功能。所以,需要先下载WDK。WDK下载地址:http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=11800

WDK中 函数DriverPackageInstall就是实现这个功能的!  

SetupCopyOEMInf这个函数很好,可以预装驱动,也就是在设备插入之前运行这个函数。那么当设备插入电脑的时候,系统就可以自动安装驱动。

BOOL WINAPI SetupCopyOEMInf(
 PCTSTR SourceInfFileName,
PCTSTR OEMSourceMediaLocation,
DWORD OEMSourceMediaType,
DWORD CopyStyle,
PTSTR DestinationInfFileName,
DWORD DestinationInfFileNameSize,
PDWORD RequiredSize,
PTSTR DestinationInfFileNameComponent
); 

参数介绍

SourceInfFileName,就是驱动inf的全路径。 

OEMSourceMediaLocation,这个也是路径,但是其具体含义有后面的参数来制定(windows的参数很多就是这样。连个参数。一个是类型,一个是内容。内容又类型来决定)。 

OEMSourceMediaType。SPOST_NONE:忽略OEMSourceMediaLocation的内容。SPOST_PATH:代表OEMSourceMediaLocation为真正驱动文件的地址,一般为驱动文件sys的地址。(如果你的sys文件跟inf在一个地方,那么OEMSourceMediaLocation可以为NULL),SPOST_URL,这个代表OEMSourceMediaLocation为一个网址,即驱动在internet上。 

 

CopyStyle:这个很重要,但是一般我们用到的就SP_COPY_REPLACEONLY,替换,一般是升级时用。SP_COPY_NOOVERWRITE,系统是否已经预存了inf文件。SP_COPY_NEWER_OR_SAME,inf文件比系统的inf新或者一样时进行更新。 

 

DestinationInfFileName,一般inf文件系统为例保证不冲突,会进行改名字,所以,这个是系统最终的inf的名字,也就是系统改完名字后,的inf的名字一般为oemXX.inf。 

 

DestinationInfFileNameSize,DestinationInfFileName这个文件的大小。 

 

RequiredSize,输出。 

 

DestinationInfFileNameComponent,输出。 

 

使用方法

SetupCopyOEMInf(inffilename, NULL,SPOST_PATH, SP_COPY_NEWER_OR_SAME,NULL, 0, NULL,NULL); 

 

一个inffilename的路径,copy就用SP_COPY_NEWER_OR_SAME。 

 

错误示例

在传递参数CopyStyle时,用的SP_COPY_NOOVERWRITE,考虑到如果有驱动那么就不去copy了,本来是好心,但是发现在vista上出现了问题。 因为,我在卸载驱动时,是在设备管理里面卸载驱动,同时选择上了。如下图中的删除此设备的驱动程序软件。 这样一来导致系统把驱动的相关sys文件删掉了。但是inf没有删掉,还是存在的。 所以下一次安装时,SetupCopyOEMInf返回false。也就是不拷贝inf,因为已经有了inf。所以导致驱动无法安装上。 现在我把这个参数CopyStyle改为SP_COPY_NEWER_OR_SAME,就可以,因为这个函数是会拷贝inf的,就算系统已经有了inf。


 示例

完整的VS工程源码请参考:http://download.csdn.net/detail/shufac/9831852

 

 

0.基础的基础 |-学习WIN64驱动开发的硬件准备 |-配置驱动开发环境 ------------------------------ 1.驱动级HelloWorld |-配置驱动测试环境 |-编译和加载内核HelloWorld ------------------------------ 2.内核编程基础 |-WIN64内核编程的基本规则 |-驱动程序与应用程序通信 |-内核里使用内存 |-内核里操作字符串 |-内核里操作文件 |-内核里操作注册表 |-内核里操作进线程 |-驱动里的其它常用代码 ------------------------------ 3.内核HOOK与UNHOOK |-系统调用、WOW64与兼容模式 |-编程实现突破WIN7的PatchGuard |-系统服务描述表结构详解 |-SSDT HOOK和UNHOOK |-SHADOW SSDT HOOK和UNHOOK |-INLINE HOOK和UNHOOK ------------------------------ 4.无HOOK监控技术 |-无HOOK监控进线程启动和退出 |-无HOOK监控模块加载 |-无HOOK监控注册表操作 |-无HOOK监控文件操作 |-无HOOK监控进线程句柄操作 |-使用对象回调监视文件访问 |-无HOOK监控网络访问 |-无HOOK监视修改时间 ------------------------------ 5.零散内容 |-驱动实现内嵌汇编 |-DKOM隐藏进程+保护进程 |-枚举和隐藏内核模块 |-强制结束进程 |-强制读写进程内存 |-枚举消息钩子 |-强制解锁文件 |-初步探索PE32+格式文件 ------------------------------ 6.用户态HOOK与UNHOOK |-RING3注射DLL到系统进程 |-RING3的INLINE HOOK和UNHOOK |-RING3的EAT HOOK和IAT HOOK ------------------------------ 7.反回调 |-枚举与删除创建进线程回调 |-枚举与删除加载映像回调 |-枚举与删除注册表回调 |-枚举与对抗MiniFilter |-枚举与删除对象回调
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法哥2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值