HOOK SSDT Hide Process (二)

[资料] http://www.cppblog.com/sleepwom/archive/2009/10/24/99375.html
继 HOOK SSDT Hide Process (一)

从 DriverEntry 看起

  1. //========================驱动入口函数
  2. extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT  pDriverObject, IN PUNICODE_STRING  pRegistryPath)
  3. {
  4.   DbgPrint("Entry Hook Function!\n");
  5.         pDriverObject->DriverUnload = Unload;
  6.        
  7.         Hook();
  8.   
  9.   DbgPrint("Leave DriverEntry!\n");
  10.   
  11.         return STATUS_SUCCESS;
  12.   
  13. }

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函数,你应该在该函数中做一些与设备实例相关的初始化工作.

你可能感兴趣的:(HOOK SSDT Hide Process (二))