第八章 -内核设置进程创建/退出回调函数

641 阅读2分钟

<Windows内核编程> Pavel Yosifovich 第八章 -内核设置进程创建/退出回调函数 主要函数是 NTSTATUS PsSetCreateProcessNotifyRoutineEx( [in] PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine, [in] BOOLEAN Remove ); MSDN API解释 docs.microsoft.com/en-us/windo…

这个demo的难点在于 难点一:内核中设置的回调函数,是放在进程创建/退出时,第一个/最后一个线程来执行的; 附上作者原话"对进程创建来说,驱动程序的回调例程由正在被创建的线程执行。对进程结束来说,则是由退出该进程的最后一个线程执行。在这两种情况下,回调例程都在一个关键区内部执行(普通内核APC被禁止)" 也就意味着,如果在驱动层获取这些数据,是需要考虑并发,即考虑到一个进程马上被创建,另一个进程又马上被销毁,而正在写入内核内存的 被创建的进程的线程执行回调函数时,这个时候也许被销毁的进程的线程也同时访问内核内存. 解决起来很简单,利用请求互斥量,即拥有互斥量的线程可以完成向内核写入数据的操作,而没有互斥量的线程只能堵塞中等待互斥量为有信号状态.

难点二:驱动程序有了数据之后,要为应用层client服务,获取到这些数据需要写一个client客户端程序. 这个客户端需要以读请求来向驱动发送一个缓存区地址,因为驱动是以DIRECT_IO的方式来通信.所以在驱动中要考虑MDL(Memory Descriptor List)转换问题(大概是因为应用层提供的缓存区是虚拟内存,但是驱动要访问的时候找不到这个地址,所以没法直接写入,需要系统的介入,将虚拟内存映射过来).

难点三:对于C++提供的RALL机制不了解

附上我的驱动源代码与未签名sys,与作者附带的client端源代码 链接:pan.baidu.com/s/1shk4Sy6f… 提取码:ooj6