惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - 博得一笑

Bode's Online Judge Core Engine Bate2 Publish! 在线评测系统核心引擎测试二版发布! Bode's Online Judge Core Engine (Judge Engine Dynamic Link Library) 在线评测系统核心引擎 来介绍个网游:英语情境教学网游——《乌龙学院》 近期任务 维基百科中的上师大条目中发现的严重纰漏!!! 《Windows核心编程》读书笔记(二) 看了一下MD5加密算法的介绍,然后顺手把C实现改成了个C++类。 伊拉克通俗演义——关于大国霸权的思考 学思湖怪超COOL文字生成器II黄金特别版——华丽登场!!! GCC研究使用笔记 感谢LILY为学思湖怪设计的漂亮封面! ^o^ 学思湖怪超COOL文字生成器2正式版 发布啦!!! 关于[学思湖怪超COOL文字生成器2_Beta2]发布的一些说明 ^c^ 新版本“学思湖怪”文字生成器开始测试! 上机时的无聊之作。。。 博得写博客整整一年了…… 圆梦时分 ——写在自制游戏推出半年后 - 博得一笑 博客笑将要添加的一个功能。 C#中如何打开一个未知编码的文本文件。
《Windows核心编程》读书笔记(一)
博得一笑 · 2007-01-30 · via 博客园 - 博得一笑

    昨天深夜整理了一下Judge的需求和存在的bug,发现自己在Judge这个泥潭里已经越陷越深,很多问题都不是用一种查阅式的阅读所能解决,所以决定仔细的读一读《Windows核心编程》,来深刻领悟一下Windows相关的编程知识。

一:3.2.2 关闭内核对象

如果将一个无效句柄传递给CloseHandle,将会出现两种情况之一。如果进程运行正常,CloseHandle 返回FALSE ,而GetLastError 则返回ERROR_INVALID_HANDLE。如果进程正在排除错误,系统将通知调试程序,以便能排除它的错误。 

这个说明或许可以解释我Judge中现在存在的某个Bug:那个Bug仅在Debug模式下出现。

二:9.1等待函数

用WaitForMultipleObjects改写我的Judge,使得中止线程时,可以让线程自己中止,而不是由其他线程杀。这样可以解决另一Bug。

三:17.1.2 在可执行文件或DLL的多个实例之间共享静态数据

我可以创建一个称为“S h a r e d”的节,它包含单个L O N G值,如下所示:

#pragma data_seg(
"Shared")
LONG g_lInstanceCount 
= 0;
#pragma data_seg()
当编译器对这个代码进行编译时,它创建一个新节,称为S h a r e d,并将它在编译指示后面看到的所有已经初始化(i n i t i a l i z e d)的数据变量放入这个新节中。在上面这个例子中,变量放入S h a r e d节中。该变量后面的#pragma dataseg()一行告诉编译器停止将已经初始化的变量放入S h a r e d节,并且开始将它们放回到默认数据节中。需要记住的是,编译器只将已经初始化的变量放入新节中。例如,如果我从前面的代码段中删除初始化变量(如下面的代码所示),那么编译器将把该变量放入S h a r e d节以外的节中。

#pragma data_seg(
"Shared")
LONG g_lInstanceCount;
#pragma data_seg()
Microsoft 的Visual C
++编译器提供了一个A l l o c a t e说明符,使你可以将未经初始化的数据放入你希望的任何节中。请看下面的代码:

// Create Shared section & have compiler place initialized data in it.
#pragma data_seg("Shared")

// Initialized, in Shared section
int a = 0;

// Uninitialized, not in Shared section
int b;

// Have compiler stop placing initialized data in Shared section.
#pragma data_seg()

// Initialized, in Shared section
__declspec(allocate("Shared")) int c = 0;

// Uninitialized, in Shared section
__declspec(allocate("Shared")) int d;

// Initialized, not in Shared section
int e = 0;

// Uninitialized, not in Shared section
int f;        
上面的注释清楚地指明了指定的变量将被放入哪一节。若要使A l l o c a t e声明的规则正确地起作用,那么首先必须创建节。如果删除前面这个代码中的第一行#pragma data_seg,上面的代码将不进行编译。
之所以将变量放入它们自己的节中,最常见的原因也许是要在. e x e或D L L文件的多个映像之间共享这些变量。按照默认设置, . e x e或D L L文件的每个映像都有它自己的一组变量。然而,可以将你想在该模块的所有映像之间共享的任何变量组合到它自己的节中去。当给变量分组时,系统并不为. e x e或D L L文件的每个映像创建新实例。

仅仅告诉编译器将某些变量放入它们自己的节中,是不足以实现对这些变量的共享的。还必须告诉链接程序,某个节中的变量是需要加以共享的。若要进行这项操作,可以使用链接程序的命令行上的
/ S E C T I O N开关:


/SECTION:name,attributes
在冒号的后面,放入你想要改变其属性的节的名字。在我们的例子中,我们想要改变S h a r e d节的属性。因此应该创建下面的链接程序开关:

/SECTION:Shared,RWS
在逗号的后面,我们设定了需要的属性。用R代表R E A D ,W代表W E I T E,E代表E X E C U T E,S代表S H A R E D。上面的开关用于指明位于S h a r e d节中的数据是可以读取、写入和共享的数据。如果想要改变多个节的属性,必须多次设定
/ S E C T I O N开关,也就是为你要改变属性的每个节设定一个/ S E C T I O N开关。
也可以使用下面的句法将链接程序开关嵌入你的源代码中:


#pragma comment(linker, 
"/SECTION:Shared,RWS")
这一行代码告诉编译器将上面的字符串嵌入名字为“ . d r e c t v e”的节。当链接程序将所有的. o b j模块组合在一起时,链接程序就要查看每个. o b j模块的“ . d r e c t v e”节,并且规定所有的字符串均作为命令行参数传递给该链接程序。我一直使用这种方法,因为它非常方便。如果将源代码文件移植到一个新项目中,不必记住在Visual C
++的Project Settings(项目设置)对话框中设置链接程序开关。
虽然可以创建共享节,但是,由于两个原因, M i c r o s o f t并不鼓励你使用共享节。第一,用这种方法共享内存有可能破坏系统的安全。第二,共享变量意味着一个应用程序中的错误可能影响另一个应用程序的运行,因为它没有办法防止某个应用程序将数据随机写入一个数据块。