Posted on 2009-10-25 01:14
S.l.e!ep.¢% 阅读(247)
评论(0) 编辑 收藏 引用 所属分类:
RootKit
[资料]
http://www.cppblog.com/sleepwom/archive/2009/10/24/99375.html- //========================驱动入口函数
- extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
- {
- DbgPrint("Entry Hook Function!\n");
- pDriverObject->DriverUnload = Unload;
-
- Hook();
-
- DbgPrint("Leave DriverEntry!\n");
-
- return STATUS_SUCCESS;
-
- }
DriverEntry() 只有当第一次加载驱动时会被调用,此时 执行Hook();
DriverEntry is the first routine called after a driver is loaded, and is responsible for initializing the driver
DriverUnload (PDRIVER_UNLOAD) :指向DriverUnload入口函数的指针.在驱动程序被从内存中卸载时,DriverUnload入口函数会被操作系统调用,你应该在该函数内部做一些与DriverEntry向对应的资源清除工作.
此时执行 UnHook();
DriverUnload函数的主要工作
删除以链表形式挂接在驱动对象上的一个或多个 设备对象.(只针对NT型驱动)
进行与DriverEntry函数中相对应的反初始化工作.例如如果在DriverEntry函数中申请了堆内存,那么在DriverUnload函数中应该释放该堆内存.
PDRIVER_OBJECT 成员
DriverStartIo (PDRIVER_STARTIO) : 指向StartIO入口函数的指针.
DriverUnload (PDRIVER_UNLOAD) :指向DriverUnload入口函数的指针.在驱动程序被从内存中卸载时,DriverUnload入口函数会被操作系统调用,你应该在该函数内部做一些与DriverEntry向对应的资源清除工作.
MajorFunction (一个数组,数组中每一元素又是一个指向函数的指针 PDRIVER_DISPATCH):数组中每一个指针指向一个入口函数.在接收到不同的请求包(IRP)时,OS会调用不同的入口函数.
驱动对象的一些关键字段(二)
DeviceObject (PDEVICE_OBJECT) : 指向一个链表的指针,该链表中每一个节点都存储了一个FDO对象.每一个FDO都代表一个由该驱动维护的硬件设备实例.在WDM模型中,该链表由OS自动维护.
DriverExtension (PDRIVER_EXTENSION) :指向另外一个结构体,该结构体中唯一有用的字段为 AddDevice .AddDevice字段指向一个入口函数.在操作系统发现一个新的设备实例时,它会自动调用AddDevice函数,你应该在该函数中做一些与设备实例相关的初始化工作.