[Windows驱动开发](三)基础知识——驱动例程


一、NT式驱动的基本例程

1. 驱动入口函数——DriverEntry

// 驱动程序的一般性定义

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath);

// 

DriverEntry的主要工作是对驱动程序进行初始化。它由系统进程System调用的。

驱动被加载的时候会创建一个驱动对象,查询此驱动程序对应的注册表项。

DriverEntry被调用的时候会传进两个参数。他们分别是刚才创建的驱动对象的指针和指向设备服务键的键名字符串指针。这个字符串的内容一般是\RESGISTRY\MACHINE\SYSTEM\ControlSet\Services\[服务名]。在驱动程序中,字符串一般以UNICODE形式存在:

注:设备服务键的键名有时候需要保存下来,当函数返回的时候此值可能会被清空。

DriverEntry等内核函数的返回值一般是NTSTATUS类型的。使用宏NT_SUCCESS(NTSTATUS status)可检测返回状态是否成功。

在DriverEntry中,一般需要做一下几件事情:

a. 设置驱动卸载例程

b. IRP的派发函数

c. 创建设备对象

其中,驱动卸载例程与IRP派发函数都是对驱动对象设置的。设备对象中有一个MajorFunction数字,用来存放哥哥IRP派发函数的函数指针。

在NT式驱动中,创建设备对象可以调用IoCreateDevice:

// IoCreateDevice在WDK中的定义

NTKERNELAPI
NTSTATUS
IoCreateDevice(
    __in  PDRIVER_OBJECT DriverObject,
    __in  ULONG DeviceExtensionSize,
    __in_opt PUNICODE_STRING DeviceName,
    __in  DEVICE_TYPE DeviceType,
    __in  ULONG DeviceCharacteristics,
    __in  BOOLEAN Exclusive,
    __out
    __drv_out_deref(
        __drv_allocatesMem(Mem)
        __drv_when((((inFunctionClass$("DRIVER_INITIALIZE"))
             ||(inFunctionClass$("DRIVER_DISPATCH")))),
             __drv_aliasesMem)
        __on_failure(__null))
    PDEVICE_OBJECT *DeviceObject
    );

//

DriverObject:当前驱动对象指针。

DeviceExtensionSize:设备扩展的大小。IO管理器会根据这个大小在内存中创建设备扩展,并与驱动

  • 20
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值