#pragma alloc_text

编译时控制分页能力

有时,驱动程序的某些部分必须驻留内存而另一些可以被分页,这就需要一种能控制代码和数据是否分页的方法。通过指导编译器的段分配可以实现这个目的。在运行时,装入器通过检查驱动程序中的段名, 把段放到你指定的内存池中。此外在运行时调用内存管理器的例程也能实现这个目的。

需要注意的是:
-------------------------------------------------------------------------------- 
(1) Win32 执行文件,包括内核模式驱动程序,在内部都是由一个或多个段组合而成。段可以包含代码或数据,通常还会有诸如可读性、可写性、共享性、执行性,等等附加属性。段是指定分页能力的最小单元。当装载一个驱动程序映像时,操作系统把以“page”或“.eda(.edata)”为段名开头的段放到分页池中,除非 HKLM/System/CurrentControlSet/Control/Session Manager/Memory Management中的DisablePagingExecutive值被设置(在这种情况下,驱动程序占用的内存不被分页)。

(2) 在Windows 2000中运行Soft-ICE需要用这种方式禁止内核分页。但这使得把驱动程序代码或数据误放到分页池中所造成的错误特别难以查找。如果你使用这种调试器,我推荐你最好使用PAGED_CODE宏和驱动程序检查器。

(3) 使编译器把代码放到特定段的传统方法是使用alloc_text编译指示。但不是每种编译器都支持这个编译指示,判断DDK中是否定义了ALLOC_PRAGMA可以帮助决定能否使用alloc_text编译指示。这个编译指示可以把驱动程序的单独例程放到特定段中:

#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, AddDevice)
#pragma alloc_text(PAGE, DispatchPnp)
...
#endif

上面语句把AddDevice和DispatchPnp函数的代码放到分页池中。

(4) 如果某些代码在驱动程序完成初始化后不再需要,可以直接把它插入到INIT段。例如:

#pragma alloc_text(INIT, DriverEntry)

加个头无非就是说明该函数是分在 分页内存 非分页内存,初始内存等等...

例如:

 #pragma alloc_text(PAGE, a)
#pragma alloc_text(PAGE, b)

表示函数a和b都运行在分页内存中,就是有可能被交换到分页池中,程序中一些高等级,例如dispatch 级别的代码当然不能运行在分页内存,这样往往出现BSOD

另外#pragma alloc_text(INIT, DriverEntry) 
像入口函数代码在驱动程序完成初始化后往往不再需要,可以直接把它插入到INIT段。

ps.Microsoft的C/C++编译器在alloc_text的使用上加了两个限制:

1、该编译指示必须跟在函数声明后面而不能在前面。你可以把驱动程序中的所有函数集中到一个头文件中,并在包含该头文件的源文件中,在#include语句的后面使用alloc_text。 
2、该编译指示仅能用于有C连接形式的函数。即,它不能用于类成员函数或 C++源文件中未用extern "C"声明的函数

#pragma alloc_text的更多相关文章

  1. #pragma alloc_text 与 ALLOC_PRAGMA

    百度标题中的两部分,可以找到很多文章,现将收集到的其中两篇整理如下: 转载链接:http://hi.baidu.com/billbeggar/item/c378e2ea39a5daeffa42bada ...

  2. #pragma详解

    在#Pragma是预处理指令它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C ++语言完全兼容的情况下,给出主机或操作系统专有 ...

  3. #pragma详细解释(一)

    #pragma详细解释 #pragma详细解释(一) 2010-04-18 14:21:00|  分类: 默认分类 |  标签: |字号大中小订阅     在#Pragma是预处理指令它的作用是设定编 ...

  4. 83.#pragma详解

    创建数据段 //创建数据段 #pragma data_seg("fangfangdata") ; #pragma data_seg() 与数据段连接,实现数据通信,分享 //实现数 ...

  5. #pragma命令详解

    每种C和C++的实现支持对其宿主机或操作系统唯一的功能.例如,一些程序需要精确控制超出数据所在的储存空间,或着控制特定函数接受参数的方式.#pragma指示使每个编译程序在保留C和C++语言的整体兼容 ...

  6. [转]C/C++ 实现文件透明加解密

    今日遇见一个开超市的朋友,真没想到在高校开超市一个月可以达到月净利润50K,相比起我们程序员的工资,真是不可同日而语,这个世道啊,真是做程序员不如经商开超市, 我们高科技的从业者,真是造原子弹不如卖茶 ...

  7. 动态监控驱动、dll、exe加载

    /* windows2003 x86/x64 window7 x86 windows2008 R2 x64测试通过 */ #include <ntddk.h> #include " ...

  8. 基于WDF的PCI/PCIe接口卡Windows驱动程序(4)- 驱动程序代码(源文件)

    原文出处:http://www.cnblogs.com/jacklu/p/4687325.html 本篇文章将对PCIe驱动程序的源文件代码作详细解释与说明.整个WDF驱动程序工程共包含4个头文件(已 ...

  9. WDK编程的一些特殊点

    函数的多线程安全性在内核编程中比用户态应用程序的编程更常见. 调用源 运行环境 原因 driverEntry,DriverUnload 单线程 这两个函数由系统进程的单一线程调用,不会出现多线程同时调 ...

随机推荐

  1. hdu 4223 Dynamic Programming? (dp)

    //连续的和的绝对值最小 # include <stdio.h> # include <string.h> # include <algorithm> # incl ...

  2. 【转】java平台的编码问题 getByte()所用编码

    java平台的编码问题 getByte()所用编码 2013-09-30 11:31:22|  分类: java |  标签:java  编码  getbytes()  |字号 订阅     众所周知 ...

  3. 转 MySQL问题排查工具介绍

    原文链接: http://mrchenatu.com/2017/03/24/mysql-tool/ 本总结来自美团内部分享,屏蔽了内部数据与工具 知识准备 索引 索引是存储引擎用于快速找到记录的一种数 ...

  4. U811.1接口EAI系列之四--委外订单生成--VB语言

    委外订单主细表.子个构成需求.具体代码与参数说明. 下面调用的通用方法在: http://www.cnblogs.com/spring_wang/p/3393147.html 作者:王春天 2013- ...

  5. 在Spring Boot中使用Spring-data-jpa实现分页查询(转)

    在我们平时的工作中,查询列表在我们的系统中基本随处可见,那么我们如何使用jpa进行多条件查询以及查询列表分页呢?下面我将介绍两种多条件查询方式. 1.引入起步依赖  2.对thymeleaf和jpa进 ...

  6. java类中serialversionuid 作用 是什么?举个例子说明(转)

    serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...

  7. Outlook 如何初始化邮箱

    首先我们找到邮箱的安装位置,我们可以右键Outlook,然后看其属性.找到其安装位置,复制下来,比如说 "C:\Program Files\Microsoft Office\root\Off ...

  8. MariaDB/MySql 服务消失无法启动

    今天启动电脑打开数据库发现这么一个错误:  2003 can't connect to mysql server on localhost 10038  无奈去查看了服务,发现mysql服务消失了,猜 ...

  9. [na]tcp&udp层各协议小结

    TCP和UDP 传输层功能: 可靠性:序列号.确认号&flag位 有效性:win滑动窗口 这篇目录索引: Tcp可靠性 Tcp流控 Tcp拥塞控制 Tcp运输连接管理 TCP的可靠性和流控 为 ...

  10. 【Unity】5.1 3D坐标系基础知识

    分类:Unity.C#.VS2015 创建日期:2016-04-20 一.简介 在虚拟的游戏世界中,与3D有关的数学知识决定了游戏引擎如何计算和模拟出开发者以及玩家看到的每一帧画面.学习或者回想一下基 ...