阅读:1705回复:9
如何让驱动永远不会被移出系统内存(物理内存)?
正常情况下,驱动永远是在系统内存里边的(除了特别指明alloc_text编译指示以外)。但是最近我碰到的蓝屏却比较奇怪,在DriverEntry()里边下段点,看那个例程,代码是正常的。但是出蓝屏之后,Softice弹出来后,我再查看那个例程的代码,全部是?????????INVALID。我想应该就是这个例程被移出系统内存了。
但是我又没有指明alloc_text,怪了。 另外说明: 1、我是在XP SP2上加载的驱动。 2、我在DriverEntry()中调用KeWaitForSingoeObject()之后才出现蓝屏。 3、这个驱动代码在2K SP4上完全正常。 |
|
沙发#
发布于:2007-01-16 13:42
代码贴上来看看,嘿嘿......
|
|
|
板凳#
发布于:2007-01-16 15:13
代码很简单的,就是在一个驱动1中加载另外一个驱动2,但是驱动1出现蓝屏。
NTSTATUS DriverEntry ( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { // // 加载驱动 // PLOAD_DRIVER pLoadDriver; pLoadDriver = (PLOAD_DRIVER)ExAllocatePool(NonPagedPool,sizeof(LOAD_DRIVER)); // Init pLoadDriver... KeInitializeEvent(&pLoadDriver->LoadCompleteEvent,SynchronizationEvent,false); KlCreateWorkerThread(LoadDriverThread,pLoadDriver); KeWaitForSingleObject( &pLoadDriver->LoadCompleteEvent, Executive, KernelMode, false, NULL ); // // 没有执行到这里,只要从上面的KeWaitForSingleObject()返回之后,系统就挂了,这个时候整个驱动的代码全部是???INVALID // ExFreePool(pLoadDriver); return STATUS_SUCCESS; } // // 出现蓝屏时,Softice停止在线程代码的入口点,全部是????INVALID // void __stdcall LoadDriverThread( IN PLOAD_DRIVER LoadDriver ) { KdPrint(("Enter LoadDriverThread()...")); __try { // ... do something here } __except(EXCEPTION_EXECUTE_HANDLER) { } } |
|
地板#
发布于:2007-01-17 09:04
driverentry默认是INIT段,也就是说,加载后自动卸载,所以你必须自己修改段属性,嘿嘿......
|
|
|
地下室#
发布于:2007-01-17 09:19
不是init段,有时候也可能不在内存里~~
|
|
|
5楼#
发布于:2007-01-17 11:00
好像默认都是在非分页内存里的,除非你显式指定了其他值。
|
|
6楼#
发布于:2007-01-17 11:01
KlCreateWorkerThread是干嘛的
|
|
7楼#
发布于:2007-01-17 11:21
蓝苹后的dump信息是什么?
|
|
|
8楼#
发布于:2007-01-17 11:57
建议用IDA分析下,看DRIVERENTRY到底在哪个段里?
|
|
|
9楼#
发布于:2007-01-17 12:09
答:
1、KlCreateWorkerThread()只是简单PsCreateSystemThread()的。 2、蓝屏后是Page Fault(0004),就是执行了非法的代码,都??INVALID,当然是非法了。 疑问: 1、不管DriverEntry()执行在那个段,我想都应该等到DriverEntry()返回之后才移出吧?我现在还没有返回啊。 另:DriverEntry()在.TEXT段(OFFSTE:0x103D0),INIT段在:0x1088B-0x10980。 2、不是init段,有时候也可能不在内存里~~ -------------------- 那怎么让它在永远内存里边啊? |
|