内核理论基础 || 内核驱动模块

     Windows内核驱动模块是内核的重要组成部分,既有微软自己开发的内核驱动,也有第三方开发的内核驱动;既有硬件的驱动,也有软件的驱动。内核驱动在磁盘上是一个扩展名为.sys的文件,遵守PE格式规范,能被系统加载运行。

      一个简单的驱动模块 “Hello  world” 的代码如下。

      

#include<ntddk.h>
/*驱动卸载函数,在驱动卸载的时候被调用*/
VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{
     DbgPrintf("Goodbye  world !\n");
}

/*DriverEntry()是驱动入口函数,相当于应用层main()函数,在驱动被加载的时候执行,用于完成一些初始化工作*/
NTSTATUS  DriverEntry(
 IN PDRIVER_OBJECT pDriverObject,
 IN PUNICODE_STRING pRegistryPath)
{
     DbgPrint(Hello,world\n);
     pDriverObject->DriverUnload = DriverUnload;
     return STATUS_SUCCESS;
}

然后,利用微软提供的WDK驱动开发工具包来编译,生成一个.sys文件,并将它加载到系统中运行。当然,这是最简单的内核驱动,真正的内核驱动还需要提供特定的分发派遣函数的实现,利用各种Hook技术或者过滤技术,回调技术框架来完成对应的功能。

那么,编译好的驱动是如何在系统中被加载并执行的呢?

  1. 创建一个服务(注册表)。在注册表的Services键下建立一个与驱动名称相关的服务键(例如SrvName),即HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\SrvName。这个服务键规定了驱动的一些属性,例如启动GROUP与StartType决定了驱动加载的先后,StartType为0的比StartType为1的先启动。
  2. 对象管理生成驱动对象(DriverObject)并传递给DriverEntry()函数。执行DriverEntry()函数。执行DriverEntry()函数(它是驱动执行的入口函数,也就是驱动执行的第一个函数,类似于R3程序中的main()函数)。
  3. 创建控制设备对象。
  4. 创建控制设备符号链接(R3级可见)。
  5. 如果是过滤驱动,则创建过滤设备对象并绑定。
  6. 注册特定的分发派遣函数。
  7. 其他初始化动作,例如Hook、过滤(文件系统过滤、网络防火墙过滤)、回调框架(注册表回调等)等的注册和初始化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值