WDK中出现的特殊代码

WDK中出现的特殊代码


    我们用本章的最后一个小节来介绍一些在WDK示例代码中见到的特殊形式编码。这些代码在Win32应用程序的编程中很少见到,读者需要首先熟悉一下。
    首先是参数说明宏。参数说明宏一般都是空宏,最常见的是IN和OUT。其实定义很简单,如下所示:
#define IN
#define OUT
    这样一来,IN和OUT就被定义成了空。无论出现在代码中的任何地方,对代码都不会有什么实质的影响。在WDK的代码中,用来作为函数的说明。IN表示这个参数用于输入;OUT表示这个参数用来返回结果。比如下面的例子:
NTSTATUS
  ZwQueryInformationFile(
    IN HANDLE  FileHandle,
    OUT PIO_STATUS_BLOCK  IoStatusBlock,
    OUT PVOID  FileInformation,
    IN ULONG  Length,
    IN FILE_INFORMATION_CLASS  FileInformationClass
    );
IN和OUT是比较传统的参数说明宏。在WDK中到处可见更复杂的参数说明宏,比如下面的例子:
VOID
NdisProtStatus(
    IN NDIS_HANDLE                          ProtocolBindingContext,
    IN NDIS_STATUS                          GeneralStatus,
    __in_bcount(StatusBufferSize) IN PVOID  StatusBuffer,
    IN UINT                                 StatusBufferSize
    )
    其中的__in_bcount不但说明参数StatusBuffer是一个输入参数,而且说明了StatusBuffer作为一个缓冲区,它的字节长度被另一个参数StatusBufferSize所指定。读者再见到类似的说明宏,就以字面意思理解即可。
然后是指定函数位置的预编译指令。比如下面的例子:
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(PAGE, NdisProtUnload)
#pragma alloc_text(PAGE, NdisProtOpen)
#pragma alloc_text(PAGE, NdisProtClose)
    #pragma alloc_text这个宏仅仅用来指定某个函数的可执行代码在编译出来后在sys文件中的位置。内核模块编译出来之后是一个PE格式的sys文件,这个 文件的代码段(text段)中有不同的节(Section),不同的节被加载到内存中之后处理情况不同。读者需要关心的主要是3种节:INIT节的特点是 在初始化完毕之后就被释放。也就是说,就不再占用内存空间了。PAGE节的特点是位于可以进行分页交换的内存空间,这些空间在内存紧张时可以被交换到硬盘 上以节省内存。如果未用上述的预编译指令处理,则代码默认位于PAGELK节,加载后位于不可分页交换的内存空间中。
    函数DriverEntry显然只需要在初始化阶段执行一次,因此这个函数一般都用#pragma alloc_text(INIT, DriverEntry)使之位于初始化后立刻释放的空间内。为了节约内存,可以把很多函数放在PAGE节中。但是要注意:放在PAGE节中的函数不可以 在Dispatch级调用,因为这种函数的调用可能诱发缺页中断。但是缺页中断处理不能在Dispatch级完成。为此,一般都用一个宏 PAGED_CODE()进行测试。如果发现当前中断级为Dispatch级,则程序直接报异常,让程序员及早发现。示例如下:
#pragma alloc_text(PAGE, SfAttachToMountedDevice)
……
NTSTATUS
SfAttachToMountedDevice (
    IN PDEVICE_OBJECT DeviceObject,
    IN PDEVICE_OBJECT SFilterDeviceObject
    )
{       
    PSFILTER_DEVICE_EXTENSION newDevExt =
         SFilterDeviceObject->DeviceExtension;
    NTSTATUS status;
    ULONG i;

    PAGED_CODE();
    …

 

 

更多精彩资源:

     web开发专栏:http://blog.csdn.net/broadviewwebdev
     数据库开发专栏:http://blog.csdn.net/broadviewdatabase
     程序设计专栏:http://blog.csdn.net/broadviewprograming
     嵌入式专栏:http://blog.mcuol.com/Broadview/index.htm

 

转载于:https://www.cnblogs.com/broadview/archive/2009/06/09/1499306.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

局域网lan设置_4G工业路由器的WAN、LAN组网方式

4G工业路由器组网通常是通过WAN口、LAN口来实现,计讯带大家详细了解关于4G工业路由器WAN、LAN组网方式。1、WAN口加4G组网方式该组网方式同时拥有两个可以连接到广域网的接口(以太网口的WAN口和M2M网络的4G口),两路通道形成互补及备份,同时接…

LeetCode 894. 所有可能的满二叉树(递归)

1. 题目 满二叉树是一类二叉树&#xff0c;其中每个结点恰好有 0 或 2 个子结点。 返回包含 N &#xff08;1 < N < 20&#xff09;个结点的所有可能满二叉树的列表。 答案的每个元素都是一个可能树的根结点。 答案中每个树的每个结点都必须有 node.val0。 你可以按任…

论文阅读笔记(四)【ACL 2021】FEW-NERD: A Few-shot Named Entity Recognition Dataset

摘要 过去的难点&#xff1a; 过去的都是粗粒度的&#xff1b; Few-NERD&#xff1a; 一个大规模的人类注释的小样本NERD数据集&#xff0c;它具有8种粗粒度和66种细粒度实体类型的层次结构。Few-NERD由来自维基百科的188238个句子组成&#xff0c;包含4601160个单词&#xff…

Exchange2003启用web页面登陆(表单型身份验证)

一、 owa中启用表单验证 在Exchange server 2003中配置OWA启用基于表单的身份验证(忽略SSL): o 在服务器&#xff0d;协议&#xff0d;HTTP&#xff0d;HTTP虚拟服务器右键&#xff0d;勾选"启用基于表单的身份验证"&#xff0c;出现提示要求SSL&a…

LeetCode 241. 为运算表达式设计优先级(动态规划)

1. 解题 给定一个含有数字和运算符的字符串&#xff0c;为表达式添加括号&#xff0c;改变其运算优先级以求出不同的结果。 你需要给出所有可能的组合的结果。有效的运算符号包含 , - 以及 * 。 示例 1: 输入: "2-1-1" 输出: [0, 2] 解释: ((2-1)-1) 0 (2-(1-1)…

python具体应用过程_python公开课|Python for循环的具体应用就是python流程控制的核心,想学会就来看看...

【摘要】在这个科学技术高速发展的时代&#xff0c;越来越多的人都开始选择学习编程软件&#xff0c;那么首先被大家选择的编程软件就是python&#xff0c;也用在各行各业之中&#xff0c;并被大家所熟知&#xff0c;所以也有越来越多的python学习者关注python问题&#xff0c;…

知识图谱入门知识(三)词性标注

学习内容 基本大多数的问题都可以转为词性标注问题&#xff01; 这里只做记录&#xff0c;都是别人的回答&#xff01; 常用的概念 什么是token tokenization就是通常所说的分词&#xff0c;分出的每一个词语我们把它称为token。 链接 词性标注参考一 自然语言处理之序列标…

sql 查讯本日 本周 本月

sql 查询本周本月问题---求相差天数 select datediff(day,2004-01-01,getdate()) --1.一个月第一天的 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) --2.本周的星期一 SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) sel…

python爬虫入门必备正则_python 爬虫入门之正则表达式 一

python 正则表达式知识点正则 常用符号. : 匹配任意字符&#xff0c;换行符除外* &#xff1a; 匹配前一个字符 0 次或者无限次&#xff1f; &#xff1a; 匹配前一个字符 0次或者1次.* &#xff1a; 贪心算法.*&#xff1f; &#xff1a;非贪心算法()&#xff1a; 括号内的数…

李宏毅机器学习(三)Word Embedding

学习内容 前情提要 使用一个vector来表示一个word&#xff0c;怎么做&#xff1f; 1-of-N Encoding 维度就是所有单词的量 缺点&#xff1a; dog 和 cat是不能归为一类的&#xff0c;只能单独的表示&#xff1b; Word CLass 将同类别的归为一类&#xff1b; 但是更高层的tok…

IBM T61 键盘没有反映。

出现这个问题不是一次两次了&#xff0c;就是启动后&#xff0c;键盘所有按键&#xff0c;小红帽都不能用&#xff0c;必须重启好几次才能用。 有时候键盘能用&#xff0c;但是打开 dw ,复制不能用&#xff0c;真是懊恼。 今天又出现这个情况&#xff0c;我偶然想到是不是和昨天…

LeetCode 680. 验证回文字符串 Ⅱ

1. 题目 给定一个非空字符串 s&#xff0c;最多删除一个字符。判断是否能成为回文字符串。 示例 1: 输入: "aba" 输出: True示例 2: 输入: "abca" 输出: True 解释: 你可以删除c字符。 注意: 字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。来…

python的序列类型及其特点_Fluent Python 笔记——序列类型及其丰富的操作

序列的分类Python 标准库用 C 语言实现了丰富的序列类型的数据结构&#xff0c;如&#xff1a;容器序列(能存放不同类型的数据)&#xff1a;list、tuple、collections.deque 等扁平序列(只容纳同一类型的数据)&#xff1a;str、bytes、bytearray、memoryview、array.array>&…

论文阅读翻译(全)【一直更新】

学习内容 这里面包含了阅读中翻译的概述&#xff01; CNN is not invariant to scaling and rotation&#xff1b; invariant&#xff1a; 不变的&#xff1b; not invariant&#xff1a; 不是不变的 CNN是变化的&#xff01; 不和不消除&#xff01; 1. 词语 1.1 词形 泛…

精选15个国外CSS框架

下面一起来了解一下各种不同的CSS框架吧: 1.960 Grid System 960网格系统是一个通过提供通常使用的尺寸简化网站开发流程的努力的结果&#xff0c;基于960像素的页面宽度。它有两种类型&#xff0c;12和16列&#xff0c;他们可以独立使用或是协同使用。 2.WYMstyle CSS Framewo…

LeetCode 682. 棒球比赛

1. 题目 你现在是棒球比赛记录员。 给定一个字符串列表&#xff0c;每个字符串可以是以下四种类型之一&#xff1a; 1.整数&#xff08;一轮的得分&#xff09;&#xff1a;直接表示您在本轮中获得的积分数。 2. ""&#xff08;一轮的得分&#xff09;&#xff1a;…

Lighttpd 的安装配置(web服务器软件)

Lighttpd 的安装配置2006-07-16 01:06lighttpd(http://lighttpd.net/)和apache一样是开源的&#xff0c;与apache相比&#xff0c;虽然功能不及apache完善&#xff0c;稳定性也不如apache&#xff0c;但是&#xff0c;不管是服务静态页面&#xff0c;还是服务动态内容(CGI&…

苹果企业证书_IOS福利9月15日苹果企业证书已更新!重新下载即可!

(视频素材来源于网上)支持系统&#xff1a;苹果上一期你可能错过的&#xff1a;全网短视频免费去水印&#xff0c;还支持解析VIP影视&#xff01;最近众号修改推送的机制&#xff0c;请大家一定要把公众号&#xff1a;玩转网络科技&#xff0c;设置成“星标⭐”&#xff0c;再点…

LeetCode 697. 数组的度

1. 题目 给定一个非空且只包含非负数的整数数组 nums 数组的度的定义是指数组里任一元素出现频数的最大值 你的任务是找到与 nums 拥有相同大小的度的最短连续子数组&#xff0c;返回其长度。 示例 1: 输入: [1, 2, 2, 3, 1] 输出: 2 解释: 输入数组的度是2&#xff0c;因为…

李宏毅机器学习(四)Spatial Transformer Layer

学习内容 架构&#xff1b; 目的就是克服CNN的旋转和缩放不变性的缺点的&#xff01; 前情提要 CNN is not invariant to scaling and rotation&#xff1b; CNN对缩放和旋转不是不变的&#xff1b;也就是说CNN是变化的&#xff0c;不具有旋转和缩放不变性&#xff1b; 因为…