1.HelloDDK 的入口函数

和普通的应用程序不同,Windows 驱动程序的入口函数不是main 函数,而是一个叫

做DriverEntry 的函数,代码将在下面列出。DriverEntry 函数由内核中的I/O 管理器负责调

用,其函数有两个参数:pDriverObject 和pRegistryPath。其中,pDriverObject 是I/O 管理

器传递进来的驱动对象,pRegistryPath 是一个Unicode 字符串,指向此驱动负责的注册表。

#001 /************************************************************************
#002 * 文件名称:Driver.cpp
#003 * 作 者:张帆
#004 * 完成日期:2007-11-1
#005 *************************************************************************/
#006
#007 #include "Driver.h"
#008
#009 /************************************************************************
#010 * 函数名称:DriverEntry
#011 * 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
#012 * 参数列表:
#013 pDriverObject:从I/O 管理器中传进来的驱动对象
#014 pRegistryPath:驱动程序在注册表的中的路径
#015 * 返回值:返回初始化驱动状态
#016 *************************************************************************/
#017 #pragma INITCODE
#018 extern "C" NTSTATUS DriverEntry (
#019 IN PDRIVER_OBJECT pDriverObject,
#020 IN PUNICODE_STRING pRegistryPath )
#021 {
#022 NTSTATUS status;
#023 KdPrint(("Enter DriverEntry\n"));
#024
#025 //注册其他驱动调用函数入口
#026 pDriverObject->DriverUnload = HelloDDKUnload;
#027 pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;
#028 pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;
#029 pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
#030 pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;
#031
#032 //创建驱动设备对象
#033 status = CreateDevice(pDriverObject);
#034
#035 KdPrint(("DriverEntry end\n"));
#036 return status;
#037 }

代码 17 行,用#pragma 指明此函数是加载到INIT 内存区域中,即成功卸载后,可

以退出内存。

代码 18 行,标志DriverEntry 函数的开始。注意此处在函数体的前面用extern "C"修

饰,这样在编译的时候会编译成_DriverEntry@8 的符号。如果不加入此修饰符号,

编译器会自动按照C++的符号名编译,导致错误链接。

代码 23 行,打印一行调试信息。KdPrint 其实是一个宏,在调试版本(Checked 版)

中,会用DbgPrint 代替。而在发行版(Free 版)中,则不执行任何操作,其功能

类似于MFC 中的TRACE 宏。由于驱动程序是运行在Windows 的核心态,没有用

户界面,所以查看调试信息有别于Win32 程序。关于查看调试信息的讲解将在第3

章论述。

代码 26~30 行,驱动程序向Windows 的I/O 管理器注册一些回调函数。回调函数

是由程序员定义的函数,这些函数不是由驱动程序本身负责调用,而是由操作系

统负责调用。程序员将这些函数的入口地址告诉操作系统,操作系统会在适当的

时候调用这些函数。在这个例子中,这几个回调函数基本是自解释型的,读者可

以根据函数名分析出其作用。当驱动被卸载时,调用HelloDDKUnload。当驱动程

序处理创建、关闭和读写相关的IRP 时,调用HelloDDKDispatchRoutine(这里只

是将处理函数简化为一个函数,实际情况要比这个复杂)。

原文链接: https://www.cnblogs.com/BxWlboke/p/4999534.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/225045

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午12:40
下一篇 2023年2月13日 下午12:40

相关推荐