5.1 驱动程序中的初始化函数DriverEntry
和编写普通的应用程序一样,驱动程序同样有个入口函数,也就是首先被执行的函数。该函数通常命名为DriverEntry,其原型如下:
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath);
5.1.1 DriverEntry函数的工作流程
DriverEntry函数由系统进程调用,主要是对驱动程序进行初始化工作。在Windows中有个特殊的进程称为系统进程(System),打开进程管理器,可见里面有名为System的进程,这就是系统进程,如图5-2所示。在系统启动的时候,系统进程就已经被创建了。
图 5-2 System进程
驱动加载时,系统进程会启动新线程,调用对象管理器,创建一个驱动对象。该驱动对象是DRIVER_OBJECT结构体的一个实例。此外,系统进程会调用配置管理程序,查询此驱动程序在注册表中的对应项。
系统进程在调用驱动程序中的DriverEntry函数时,要输入pDriverobject和pRegistryPath两个指针类型参数。其中,第一个参数指向刚被创建的驱动对象,第二个参数指向设备服务键的键名称字符串。
为了和NDIS库建立通信,驱动程序的DriverEntry函数必须调用NdisRegisterProtocol函数注册协议驱动程序。
DriverEntry函数的返回值是NTSTATUS类型的数据。在驱动程序开发过程中,习惯用NTSTATUS返回状态,NTSTATUS被定义为32位无符号长整型。DriverEntry函数如果返回成功,意味着加载驱动成功,否则加载驱动失败,同时它会调用对象管理程序销毁驱动对象。如果加载驱动成功,返回STATUS_SUCCESS,否则返回一个在ntstatus.h文件中定义的错误状态码。STATUS_SUCCESS与STATUS_UNSUCCESSFUL的具体定义如下: