gutian98
禁止发言
禁止发言
  • 注册日期2003-01-12
  • 最后登录2016-12-11
  • 粉丝4
  • 关注2
  • 积分760分
  • 威望8026点
  • 贡献值1点
  • 好评度364点
  • 原创分0分
  • 专家分21分
  • 金点子奖
  • 社区居民
阅读:1147回复:4

请问怎么样把一个函数放到NonPagedPool中?

楼主#
更多 发布于:2007-09-26 15:56
用户被禁言,该主题自动屏蔽!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-09-26 16:07
默认就是NonPagedPool,除非你 #pragma alloc_text(PAGE, 函数)
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
gutian98
禁止发言
禁止发言
  • 注册日期2003-01-12
  • 最后登录2016-12-11
  • 粉丝4
  • 关注2
  • 积分760分
  • 威望8026点
  • 贡献值1点
  • 好评度364点
  • 原创分0分
  • 专家分21分
  • 金点子奖
  • 社区居民
板凳#
发布于:2007-09-26 16:17
用户被禁言,该主题自动屏蔽!
wanfustudio
驱动牛犊
驱动牛犊
  • 注册日期2006-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分720分
  • 威望73点
  • 贡献值0点
  • 好评度72点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-09-26 21:07
FileSpy里面有用到
我都没考虑过这个问题,惭愧
wanfustudio
驱动牛犊
驱动牛犊
  • 注册日期2006-08-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分720分
  • 威望73点
  • 贡献值0点
  • 好评度72点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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等级执行而不允许页错误。但是,文件系统(通常比磁盘驱动占用更大,更多资源)有时候可从可分页池中分配一些内存
游客

返回顶部