能力值:
( LV2,RANK:10 )
2 楼
IoRegisterBootDriverReinitialization,还有一个函数IoRegisterDriverReinitialization,两者的区别,看看名字,却别在于一个有"boot",一个没有"boot",所谓有boot的那个函数是什么意思,那就要先说一说windows的启动原理。windows启动时,先由 ntldr加载驱动程序,每个驱动程序,在其注册表内都有一项注册表项的值,即
start=x?x可以是0,1,2,3等等。如果是start=0,那么说明这个驱动程序要在第一时间加载进入内存,这个是由ntldr加载到内存的,如果start=1,2,3等等,那么不需要在第一时间加载内存。那么就是在ntldr把start=0的驱动加载进入内存后,再运行一系列的初始化程序,并且进入的win32的模式,然后由ntoskrnl核心程序继续加载start=1,2,3的驱动程序。所以IoRegisterBootDriverReinitialization,就是在加载完start=0的驱动程序,并且完成这些驱动程序的初始化工作以后,再调用由IoRegisterBootDriverReinitialization注册的回调函数。
而IoRegisterDriverReinitialization,则是在加载完start=1,2,3的所有驱动程序以后,再调用由IoRegisterDriverReinitialization注册的回调函数。所以有"boot"的要在没有"boot"的回调函数之前调用,这是一个先后顺序,开发这一定要清楚。而且,有"boot"的回调函数,如果要用到start=1,2,3的某些驱动程序的功能,那是不可能的,只会无尽的等待或者返回错误。因为start=1,2,3的驱动程序还没有开始载入和初始化,所以要注意,有"boot"的回调函数,其能使用的功能是非常有限的,不能使用到系统完全载入后的所有功能。还要注意,这个回调函数,系统只会回调一次,所以,回调你登记的这个函数的时候,如果你执行完了,返回错误,那么系统不会再次调用你这个登记的函数。如果想再执行的时候,发现执行条件不满足,想继续等待一段时间,再被系统调用,那么就只能在这个函数睡眠之前,重新调用IoRegisterBootDriverReinitialization再次登记一下本函数自身,那么系统就会在等待一段时间以后,再次调用这个登记的函数,如果条件仍不满足,就继续再登记,系统再调用,登记一次,调用一次,当然本函数自身不能无限制的登记,那样系统就会无限制的调用这个回调函数而造成系统无法进行后续的启动过程。
能力值:
( LV3,RANK:35 )
3 楼
非常感谢您的回复!之前忽略了一句话
The IoRegisterBootDriverReinitialization routines is called by boot driver...
只有boot类型的驱动才能成功调用,其他驱动注册的虽然pchunter看得到有回调,但是这个回调不会执行...