首页
社区
课程
招聘
[原创]NT 5.1 内核引入的Run-down Protection
发表于: 2013-6-17 15:55 14677

[原创]NT 5.1 内核引入的Run-down Protection

2013-6-17 15:55
14677

XP以后的windows内核,引用了一种新的同步技术,微软叫它: Run-down Protection。这种同步技术至今还很神密,连很多搞内核和驱动很有经验的朋友,和他们讨论起来的时候,了解的人也不多。所以今天我写篇短文简单介绍一下。

我们知道对象的删除在并行系统中是一个问题,如果一个对象一个执行流在使用对象,而另一个执行流却在删除对象,就会出现问题。解决这个问题的一个办法就是引用计数。我们今天介绍的 Run-down Protection 其实也就是引用计数,不过它还做了一些额外的工作。

Drivers can use run-down protection to safely access objects in shared system memory that are created and deleted by another kernel-mode driver.

这句话是微软MSDN里的介绍。简单点说,就是为了保护对象的安全的删除。现在XP中,主要用它来保护内核中进程对象和线程对象的删除。

我这里主要介绍它的四个例程  ExfInitializeRundownProtection,ExfAcquireRundownProtection, ExfReleaseRundownProtection,ExfWaitForRundownProtectionRelease

指出一下,在内核导出时,为这几个函数使用了别名, Exf的前缀换成了Ex。 例如 ExfInitializeRundownProtection 变成了 ExInitializeRundownProtection。

下面我一一介绍。 先说一下功能,顺便说一下原理。


typedef struct _EX_RUNDOWN_REF {

#define EX_RUNDOWN_ACTIVE      0x1
#define EX_RUNDOWN_COUNT_SHIFT 0x1
#define EX_RUNDOWN_COUNT_INC   (1<<EX_RUNDOWN_COUNT_SHIFT)
    union {
        ULONG_PTR Count;
        PVOID Ptr;
    };
} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;

NTKERNELAPI
VOID
FASTCALL
ExfReInitializeRundownProtection (
     __out PEX_RUNDOWN_REF RunRef
     )。 
NTKERNELAPI
BOOLEAN
FASTCALL
ExfAcquireRundownProtection (
     __inout PEX_RUNDOWN_REF RunRef
     )

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 5
支持
分享
最新回复 (15)
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是不是好帖,顶起来再说
2013-6-17 18:39
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
好帖
2013-6-17 18:54
0
雪    币: 2284
活跃值: (2170)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
4
EPROCESS 和 ETHREAD 结构体中就有这个字段,微软操作进程对象和线程对象时都会用这个做同步
2013-6-18 11:55
0
雪    币: 219
活跃值: (773)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
5
拿走了~
2013-6-18 13:02
0
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
看不懂啊。
2013-6-18 22:10
0
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mark  有用
2013-6-18 23:05
0
雪    币: 11026
活跃值: (17530)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
虽然看不懂,来支持再说
2013-6-19 08:54
0
雪    币: 437
活跃值: (78)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
能用到,mark
2013-6-19 10:12
0
雪    币: 43
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
怎么看着跟GC似的
2013-6-19 10:24
0
雪    币: 124
活跃值: (469)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
看不懂内核,暑假期间开始内核之旅。。虽然看不懂,mark一下
2013-6-19 17:01
0
雪    币: 74
活跃值: (748)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了,感谢分享
2013-6-19 21:10
0
雪    币: 110
活跃值: (34)
能力值: (RANK:50 )
在线值:
发帖
回帖
粉丝
13
好东西,mark之
2013-6-20 01:01
0
雪    币: 541
活跃值: (654)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
14
这个技术不神秘吧,另外这个文章我好像在哪看过。。。
2013-6-25 13:09
0
雪    币: 334
活跃值: (78)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15


在哪?我没在别的地方发过

2013-6-26 14:17
0
雪    币: 147
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
ExfWaitForRundownProtectionRelease貌似这个函数不能用于多线程,即等待删除对象的线程只有一个,而获取ExfAcquireRundownProtection和释放ExfReleaseRundownProtection可以多线程
2014-1-18 12:25
0
游客
登录 | 注册 方可回帖
返回
//