RundownProtect这个字段相信只要是读过WRK源码的都会看过这个东西,这个字段在进程和线程的结构中都存在。最典型的例子就是对进程要进行什么操作的时候会先引用这个字段进行加保护,等操作结束后再进行解保护。但是一直没搞懂这个到底在保护什么和保护是怎么实现的。这里正好来看一下,首先是结构

    EX_RUNDOWN_REF RundownProtect;

这是ETHREAD的一部分,可见是一个EX_RUNDOWN_REF结构。我们来看一下EX_RUNDOWN_REF是什么样子的。

typedef struct _EX_RUNDOWN_REF
{
union
{
ULONG Count;
PVOID Ptr;
};
} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;

这里结构都是基于Vista内核的。看的出来,所谓的EX_RUNDOWN_REF结构其实就是一个整数而已。关键是怎么使用的这个结构,想知道这一点得看一下ExAcquireRundownProtection()函数,这个函数是经常调用来给进程加保护的。我在WRK找到了这个函数的代码,如下

 NTKERNELAPI
BOOLEAN
FORCEINLINE
FASTCALL
ExAcquireRundownProtection (
__inout PEX_RUNDOWN_REF RunRef
)
{
ULONG_PTR Value, NewValue; Value = ReadForWriteAccess(&RunRef->Count) & ~EX_RUNDOWN_ACTIVE;
NewValue = Value + EX_RUNDOWN_COUNT_INC;
NewValue = (ULONG_PTR) InterlockedCompareExchangePointerAcquire (&RunRef->Ptr,
(PVOID) NewValue,
(PVOID) Value);
if (NewValue == Value) {
return TRUE;
} else {
return ExfAcquireRundownProtection (RunRef);
}
}

下面是ExfAcquireRundownProtection的代码

 NTKERNELAPI
BOOLEAN
FASTCALL
ExfAcquireRundownProtection (
__inout PEX_RUNDOWN_REF RunRef
)
/*++ Routine Description: Reference a rundown block preventing rundown occurring if it hasn't already started
This routine is NON-PAGED because it is being called on the paging path. Arguments: RunRef - Rundown block to be referenced Return Value: BOOLEAN - TRUE - rundown protection was acquired, FALSE - rundown is active or completed --*/
{
ULONG_PTR Value, NewValue; Value = RunRef->Count;
do {
//
// If rundown has started return with an error
//
if (Value & EX_RUNDOWN_ACTIVE) {
return FALSE;
} //
// Rundown hasn't started yet so attempt to increment the unsage count.
//
NewValue = Value + EX_RUNDOWN_COUNT_INC; NewValue = (ULONG_PTR) InterlockedCompareExchangePointer (&RunRef->Ptr,
(PVOID) NewValue,
(PVOID) Value);
if (NewValue == Value) {
return TRUE;
}
//
// somebody else changed the variable before we did. Either a protection call came and went or rundown was
// initiated. We just repeat the whole loop again.
//
Value = NewValue;
} while (TRUE);
}

关于RundownProtect到底是什么东西的更多相关文章

  1. CPU到底是什么东西?它为什么能够执行数学运算?

    CPU到底是什么东西?它为什么能够执行数学运算? 本文地址http://yangjianyong.cn/?p=20转载无需经过作者本人授权 简单的物理电路 先来看一张初中学过的物理电路图: 从图中我们 ...

  2. JS事件处理函数中return false到底是什么东西

    在<JS DOM编程艺术>一书中,用return false来阻止事件默认行为,可是js高程3里没有这种用法,那这到底是什么呢. 先看一下知乎的一个解释 就此问题,首先要纠正两个观点: 1 ...

  3. ESB企业服务总线到底是什么东西呢?

    顾名思义,企业服务总线(ESB)就是一条企业架构的总线,所有的企业服务都挂接到该总线上对外公布,企业服务总线负责管理服务目录,解析服务请求者的请求方法.消息格式,并对服务提供者进行寻址,转发服务请求. ...

  4. php单元测试到底是什么东西呢?

    前言: 真正写php代码也有3年时间了,勉强算是一个php程序员, 但是,心底却一直没有底气. 都说测试驱动开发,可我连程序开发中什么是单元测试?这种基本的程序员的素养都 还不是很清楚,痛定思痛,决定 ...

  5. WmS详解(一)之token到底是什么?基于Android7.0源码

    做Android有些年头了,Framework层三大核心View系统,WmS.AmS最近在研究中,这三大块,每一块都够写一个小册子来介绍,其中View系统的介绍,我之前有一个系列的博客(不过由于时间原 ...

  6. JavaScript里面的arguments到底是个啥?

    类数组对象:arguments 总所周知,js是一门相当灵活的语言.当我们在js中在调用一个函数的时候,我们经常会给这个函数传递一些参数,js把传入到这个函数的全部参数存储在一个叫做arguments ...

  7. js的arguments到底是什么?

    类数组对象:arguments 总所周知,js是一门相当灵活的语言.当我们在js中在调用一个函数的时候,我们经常会给这个函数传递一些参数,js把传入到这个函数的全部参数存储在一个叫做arguments ...

  8. 关于 sql server 数据库权限乱七八糟的一些东西

    研究权限这些东西主要是因为今天正好在折腾数据库备份相关的东西,备份好说,备份完了就完了. 但是恢复备份的时候,需要先让数据库脱机,然后恢复,然后再联机,嗯,问题就出在联机上了. 根据 MSDN 的说法 ...

  9. “过时”的SpringMVC我们到底在用什么?深入分析DispatchServlet源码

    之前已经分析过了Spring的IOC(<零基础带你看Spring源码--IOC控制反转>)与AOP(<从源码入手,一文带你读懂Spring AOP面向切面编程>)的源码,本次就 ...

随机推荐

  1. OpenJudge1001Exponentiation

    问题描述 Problems involving the computation of exact values of very large magnitude and precision are co ...

  2. EChart介绍和使用

    一.简单介绍 Echart是百度研发团队开发的一款报表视图JS插件,功能十分强大,使用内容做简单记录:(EChart下载地址 http://echarts.baidu.com/download.htm ...

  3. 科学计算三维可视化---TraitsUI(控件)

    一:文本编辑器 from traits.api import HasTraits,Int,Str,Password from traitsui.api import View,Item,Group,M ...

  4. Linux之find查找命令

    Linux中find常见用法示例 [root@localhost ~]# find  [PATH]  [option]  [action] 参数: 1. 与时间有关的参数:共有-atime.-ctim ...

  5. bzoj千题计划173:bzoj1257: [CQOI2007]余数之和sum

    http://www.lydsy.com/JudgeOnline/problem.php?id=1257 k%i=k-int(k/i)*i 除法分块,对于相同的k/i用等差序列求和来做 #includ ...

  6. bzoj千题计划159:bzoj2055: 80人环游世界(有源汇上下界可行最小费用流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2055 某个国家必须经过vi次, 可以转化为上下界都为vi的边 对这张图做有源汇上下界可行最小费用流 ...

  7. 哈密顿图 哈密顿回路 哈密顿通路(Hamilton)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5452580.html 概念: 哈密顿图:图G的一个回路,若它通过图的每一个节点一次,且仅一次,就是哈密顿回路.存在哈密顿回 ...

  8. HDU 5928 DP 凸包graham

    给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...

  9. Table of Contents - Python 2.x

    异常 异常类的继承关系 日志 标准日志模块 Hello World Logging Configuration

  10. vbs 解析 html 文档

    关于VBS采集,网上流行比较多的方法都是正则,其实 htmlfile 可以解析 html 代码,但如果 designMode 没开启的话,有时候会包安全提示信息.但是开启 designMode (@预 ...