Windows的驱动程序安装,也就是将已经编译好的**.sys文件“嵌入”到Windows操作系统的内核层。以下介绍几种我所知道的常见方法。
注意:以下几种方法中,除inf安装外,适合一般的NT驱动,并不能安装Minifilter(微过滤驱动)。对于Minifilter的安装,我们将在以后的文章中谈到。
一、借助相关工具
网上有很多牛人写的工具,对**.sys文件的安装很管用。在这里介绍笔者用过的小工具——SRVINSTW.EXE(亦即srvinstw.exe),这个工具有汉化版本,操作很简单。以下两个链接都可以下载到。(还有其他很多网站上都能下载到此工具,在网上所搜一下就OK了。)
http://www.downxia.com/downinfo/22769.html
http://d.download.csdn.net/detail/netwolf712/3409182
二、代码实现
主要是OpenSCManager,CreateService,CloseServiceHandle等函数的运用。
//功能:安装**.sys文件。
#include <windows.h>
#include <winsvc.h>
#include <stdio.h>
void main()
{
char name[3]="zx"; //服务名
char info[200]="sfok16"; // 服务描述
char path[300]="sfok16.sys"; //程序路径 (此处默认为在同一文件夹内)
SC_HANDLE manager=NULL;
SC_HANDLE service=NULL;
if((manager=OpenSCManager(NULL,NULL,SC_MANAGER_CREATE_SERVICE))==NULL)
{
printf("OpenSCManager Error");
}
service=CreateService(
manager,name,info,
SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, path,0,0,0,0,0);
if(service)
printf("服务创建成功\n\n");
else
printf("服务创建失败\n\n");
CloseServiceHandle(service);
}
三、通过.inf文件实现
inf文件,Microsoft公司为硬件设备制造商发布其驱动程序推出的一种文件格式,INF文件中包含硬件设备的信息或j脚本以控制硬件操作。在INF文件中指明了硬件驱动该如何安装到系统中,源文件在哪里、安装到哪一个文件夹中、怎样在注册表中加入自身相关信息等。
inf文件才创建可以通过txt文件直接修改后缀名即可,如将编辑好的txt文件名直接改为“***.inf”(前提是已经将需要的代码已经写好),然后单击“右键”,选择“安装”。最难的是inf文件内部的内容(代码)如何书写。以下以一个名为zhang.sys的驱动加载到Windows内核中。(在实际操作中,可以找一个现有的inf文件,打开直接修改)
[Version]
signature = "$Windows NT$"
Class = "ActivityMonitor" ;This is determined by the work this filter driver does
ClassGuid = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2} ;This value is determined by the Class
Provider = %Msft%
DriverVer = 07/24/2012,1.0.0.3
CatalogFile = zhang.cat
[DestinationDirs]
DefaultDestDir = 12
MiniFilter.DriverFiles = 12 ;%windir%\system32\drivers
;; Default install sections
[DefaultInstall]
OptionDesc = %ServiceDescription%
CopyFiles = MiniFilter.DriverFiles
[DefaultInstall.Services]
AddService = %ServiceName%,,MiniFilter.Service
;;
;; Default uninstall sections
;;
[DefaultUninstall]
DelFiles = MiniFilter.DriverFiles
[DefaultUninstall.Services]
DelService = zhang,0x200 ;Ensure service is stopped before deleting
; Services Section
[MiniFilter.Service]
DisplayName = %ServiceName%
Description = %ServiceDescription%
ServiceBinary = %12%\%DriverName%.sys ;%windir%\system32\drivers\
Dependencies = "FltMgr"
ServiceType = 2 ;SERVICE_FILE_SYSTEM_DRIVER
StartType = 3 ;SERVICE_DEMAND_START
ErrorControl = 1 ;SERVICE_ERROR_NORMAL
LoadOrderGroup = "FSFilter Encryption"
AddReg = MiniFilter.AddRegistry
; Registry Modifications
[MiniFilter.AddRegistry]
HKR,"Instances","DefaultInstance",0x00000000,%Instance1.Name%
HKR,"Instances\"%Instance1.Name%,"Altitude",0x00000000,%Instance1.Altitude%
HKR,"Instances\"%Instance1.Name%,"Flags",0x00010001,%Instance1.Flags%
; Copy Files
[MiniFilter.DriverFiles]
%DriverName%.sys
[SourceDisksFiles]
zhang.sys = 1,,
[SourceDisksNames]
1 = %DiskId1%,,,
;; String Section
[Strings]
Msft = "Microsoft Corporation"
ServiceDescription = "encryption engine minfilter Driver"
ServiceName = "zhang"
DriverName = "zhang"
DiskId1 = "zhang Device Installation Disk"
;Instances specific information.
Instance1.Name = "zhang Instance"
Instance1.Altitude = "141000"
Instance1.Flags = 0x0 ; allow automatic attachments
四、“曲线救国”方法
不需要手动加载inf文件,代码调用inf文件即可。笔者运用的方法比较笨,找没找到代码直接调用inf文件的,采用了一种间接的方法。
写一个bat(批处理),在批处理里调用inf,而bat很容易从代码调用。
bat文件的语句:
RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 C:\Windows\engine.inf
其中,C:\Windows\engine.inf是inf文件的路径。
C/C++语言调用bat文件:
#include <windows.h>
WinExec("C:\\Windows\\AddService.bat", SW_SHOW);
其中, C:\\Windows\\AddService.bat是bat的路径。记得包含头文件windows.h