Windows驱动程序的安装(一)

时间:2022-04-29 05:54:11

     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