阅读:1147回复:4
请问怎么样把一个函数放到NonPagedPool中?用户被禁言,该主题自动屏蔽! |
|
沙发#
发布于:2007-09-26 16:07
默认就是NonPagedPool,除非你 #pragma alloc_text(PAGE, 函数)
|
|
|
板凳#
发布于:2007-09-26 16:17
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2007-09-26 21:07
FileSpy里面有用到
我都没考虑过这个问题,惭愧 |
|
地下室#
发布于:2007-09-29 17:07
默认情况下,内核加载器会加载所有的代码部分和全局数据到非分页内存中。而且,加载器是一次加载整个驱动的可执行文件,包括相关的DLL。加载后,内核加载器关闭驱动程序文件,甚至你可以删除当前正在执行的驱动文件。
但是,你可以告诉加载器你希望驱动的哪部分是可分页,所谓可分页,就是可能会被换页出内存(Page out)。可以使用下面的指令来实现: #define ALLOC_PRAGMA #pragma alloc_text(PAGE, function_name1) #pragma alloc_text(PAGE, function_name2) #endif 由 function_namex 指定的函数代码将被放置于可分页内存中。 使数据段可分页,使用下面的编译指令: #ifdef ALLOC_PRAGMA #pragma data_seg(PAGE) // define your pageeble data section module here. #pragma data_seg() 要注意,绝不能让可能在高的IRQL级别被调用的例程被换出页面。 可以调用MmLockPageableCodeSection 和 MmLockPageableCodeSection- ByHandle 来锁定被标志为可分页的代码段。 可以调用MmLockPageableDataSection 和 MmLockPageableDataSectionB- yHandle 来锁定被标志为可分页的数据段 可以调用MmUnlockPageableImageSection 来解除被上面列出的函数锁定的代码 或数据段。 可以调用MmPageEntireDriver 使整个驱动程序可分页,覆盖使用编译指令修饰的段的页面属性。 可以调用MmResetDriverPaging 把页面属性重设回最初描述的属性。 最后,把那些驱动初始化后不再需要的代码自动丢弃可以使用这些编译指令: #ifdef ALLOC_PRAGMA #pragma alloc_text(INIT, DriverEntry) #pragma alloc_text(INIT, function_name) // function called by driverEntry #endif 驱动程序在执行时可能需要动态分配内存空间,这时你要决定需要的是可分页还是不可分页的内存。如果你的驱动在运行中访问内存的时候能够经受页错误,那么尽量使用可分页内存。 注意:大多数低层磁盘和网络驱动通常不能使用可分页内存,因为他们的代码常常在较高的IRQL等级执行而不允许页错误。但是,文件系统(通常比磁盘驱动占用更大,更多资源)有时候可从可分页池中分配一些内存 |
|