01-驱动入口函数

驱动入口函数
同应用层的Winmain函数入口一样,驱动程序也有自己的函数入口,函数名叫DriverEntry,函数原型如下:
NTSTATUS DriverEntry(PDRIVER_OBJECT pdriver, PUNICODE_STRING reg)

参数一为pdriver,表示一个驱动对象的指针,此参数有系统调用系统自动传入,这个指针,指向名为DRIVER_OBJECT的结构体,里面记录了驱动的详细信息。
typedef struct _DRIVER_OBJECT {
CSHORT Type;
CSHORT Size;
PDEVICE_OBJECT DeviceObject;
ULONG Flags;
PVOID DriverStart;
ULONG DriverSize;
PVOID DriverSection;
PDRIVER_EXTENSION DriverExtension;
UNICODE_STRING DriverName;
PUNICODE_STRING HardwareDatabase;
PFAST_IO_DISPATCH FastIoDispatch;
PDRIVER_INITIALIZE DriverInit;
PDRIVER_STARTIO DriverStartIo;
PDRIVER_UNLOAD DriverUnload;
PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT;

PDEVICE_OBJECT DeciveObject:
【驱动程序】创建的指向【设备对象】的指针。当驱动成功调用IoCreateDevice时,这个成员变量会自动更新。驱动程序可以使用这个成员变量和DEVICE_OBJECT的成员变量NextDevice逐步访问当前驱动程序创建的【设备对象】列表。

PDRIVER_EXTENSION DriverExtension:
指向【Driver Extension】的指针。【Driver Extension】的唯一的一个可以访问的成员变量是DriverExtension->AddDevice,驱动程序的【DriverEntry例程】存储在驱动程序的【AddDevice例程】中。

PUNICODE_STRING HardwareDatabase:
指向【\Registry\Machine\Hardware】路径的指针,他是注册表的硬件配置信息;

PFASE_IO_DISPATCH FastIoDispatch:
指向【驱动的 FAST I/O入口点】的结构体的指针。只有FSDs和网络传输驱动使用这个成员变量。

PDRIVER_INITIALIZE DriverInit:
【DriverEntry】例程的入口点,被【I/O管理器】调用;

PDRIVER_STARTIO DriverStartIo:
驱动程序的【StartIo例程】的入口点。如果有【StartIo例程】,他是在驱动程序初始化时被【DriverEntry例程】设置。如果没有,这个成员变量被设置为NULL.

PDRIVER_UNLOAD DriverUnload:
驱动程序的【Unload 例程】的入口点。如果有【Unload 例程】,他是在驱动程序初始化时被【DriverEntry例程】设置。如果没有,这个成员变量被设置为NULL.

PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION+1]:
由驱动程序的【DispatchXxx 例程的入口点】集合构成的数组 组成的派遣表。这个数组的索引值是IRP_MJ_Xxx ,【IRP_MJ_Xxx】描述每一个【IRP主功能代码】。每个驱动必须为当前驱动程序所处理的IRP_MJ_Xxx在这个IRP_MJ_Xxx数组中设置入口点。

IRP_MJ_CLEANUP:在关闭设备时,取消挂起的IRP,CloseHandle
IRP_MJ_CLOSE:关闭文件句柄CloseHandle
IRP_MJ_CREATE:打开设备CreateFile
IRP_MJ_DEVICE_CONTROL:对用户模式或内核模式客户程序可用的控制操作
IRP_MJ_FILE_SYSTEM_CONTROL:文件系统控制
IRP_MJ_FLUSH_BUFFERS:写输入缓冲区或丢弃输入缓冲区
IRP_MJ_INTERNAL_DEVICE_CONTROL:只对内核模式客户程序可用的控制操作
IRP_MJ_PNP:即插即用管理
IRP_MJ_POWER:电源管理
IRP_MJ_QUERY_INFORMATION:得到信息
IRP_MJ_READ:读取数据
IRP_MJ_SET_INFORMATION:设置信息
IRP_MJ_SHUTDOWN:系统关闭
IRP_MJ_SYSTEM_CONTROL:系统管理与测试
IRP_MJ_WRITE:写数据

参数二reg是一个UNICODE_STRING类型的指针,表示当前驱动所对应的注册表位置。
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
USHORT * Buffer;
PWCH Buffer;
} UNICODE_STRING;
Length是字符串的所占的字节数
MaximumLength是字符串所能占的最大字节数
Buffer则是字符串的地址,也即指针

返回值NTSTATUS 实际上是一个ULONG类型,window系统规定DriverEntry返回STATUS_SUCCESS表示成功,返回其他值表示失败,不同的值代表不同的失败含义。如果在驱动入口函数返回失败,表示驱动初始化失败,系统将把驱动从内核中移除。
下面给出一个最简单的驱动例子:
#include <ntddk.h>
VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
if (DriverObject != NULL)
{
DbgPrint("[%ws]驱动卸载:%p\n", FUNCTIONW, DriverObject);
}
return;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
DbgPrint("[%ws]驱动加载\n", FUNCTIONW);
if (RegistryPath != NULL)
{
DbgPrint("[%ws]驱动注册表路径:%wZ\n", FUNCTIONW, RegistryPath);
}
if (DriverObject != NULL)
{
DbgPrint("[%ws]驱动对象地址:%p\n", FUNCTIONW, DriverObject);
DriverObject->DriverUnload = DriverUnload;
}
return STATUS_SUCCESS;
}
下面是运行结果:
在这里插入图片描述
__FUNCTIONW__表示当前函数名字,是一个UNICODE类型的字符串对应的格式化为%ws
RegistryPath是一个UNICODE_STRING类型的字符串,格式化输出为%wZ
DriverUnload是DriverObject结构中的一个成员,是驱动对象结构体内的一个函数指针,在驱动发生卸载事件时,有系统自动调用,但必须由自己完成这个函数。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值