<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Free2000fly&#039;s Official Blog &#187; 枚举</title>
	<atom:link href="http://blog.tinybrowser.net/archives/tag/%e6%9e%9a%e4%b8%be/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.tinybrowser.net</link>
	<description>Free2000fly 个人博客</description>
	<lastBuildDate>Fri, 06 Jan 2012 21:12:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>枚举全局钩子</title>
		<link>http://blog.tinybrowser.net/archives/1600</link>
		<comments>http://blog.tinybrowser.net/archives/1600#comments</comments>
		<pubDate>Tue, 16 Mar 2010 23:53:54 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[内核编程]]></category>
		<category><![CDATA[全局钩子]]></category>
		<category><![CDATA[枚举]]></category>
		<category><![CDATA[钩子]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=1600</guid>
		<description><![CDATA[标 题: 枚举全局钩子 作 者: 一块三毛钱 邮箱: zhongts@163.com 时 间: 2005-06-19,21:23:16 链 接: http://bbs.pediy.com/showthread.php?t=14600 首先强调一点，本文给出的代码只在 WinXP+SP2 下测试通过，使用其他系统的朋友最好看懂代码，然后调试运行。如果不巧系统蓝屏可不要找我哦。:) 鼠标钩子、键盘钩子等大家一定是耳熟能详，在 Windows 环境下编程的朋友们肯定都和他们打过交道，比如说截获密码什么的都可以用到他们。本文将介绍一种办法可以枚举所有的全局钩子，找到到底是什么动态库创建了钩子（大部分全局钩子都需要通过动态库来实现）。 下图是程序运行后显示的所有的全局钩子，包括钩子函数在那个动态库中，也就是创建钩子的动态库。图中显示的钩子句柄是指得在当前进程中的句柄，不是系统范围的。比如说 MouseHook 添加了一个全局的鼠标钩子，那么在 explorer 中这个钩子的句柄和在 word 中的句柄是不同的（这一点我是通过 Icesword 观察到的），但都是 MouseHook 添加的钩子都在 mousehook.dll 动态库中。如果想获得 Icesword 一样的结果可以针对每一个进程枚举全局钩子（没试过）。l另外，如果鼠标钩子和键盘钩子不能够显示动态库，可以先动一动鼠标，摁几下键盘再刷新应该就可以显示。 之所以会写这篇文章是因为在编程板块中有一个主题说判断全局钩子的调用者，所以才想着能不能枚举出所有的全局钩子。但那个主题好像说的是钩子的调用者，又好像全局钩子指得是 Hook API 类型的钩子，没搞懂。在那个主题下 zworm 大侠好像说可以通过一个钩子链的东东来枚举钩子，不过大侠没有细说，我自己也没有在符号文件中找到有关钩子链的符号（我只会这一种办法找系统内部变量，比如活动进程链就可以通过这种办法找到位置），所以准备从 CallNextHookEx 函数慢慢往下追希望能够找到系统是怎么找到下一个钩子函数的。本文介绍的方法就是这样来的（另外有一个很重要的一点会在文章的最后提到）。 上面给出的就是核心代码，先找到线程的 Win32Thread 结构，通过这个结构就可以调用 win32k.sys 的内部函数 _PhkFirstValid 找到第一个钩子函数。然后再通过 _PhkNextValid 函数枚举所有的钩子函数。因为每个系统中这两个函数的地址不同，所以我把反汇编后的代码直接提取出来使用。这样可以避免因为系统不同的原因而出错。不过我只在 WinXP+SP2 下运行过，没有在其他的系统下测试，如果大家不能正确运行只好自己修改源代码啦。 _PhkFirstValid [...]]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/1600/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++ 枚举类型的思考(转帖)</title>
		<link>http://blog.tinybrowser.net/archives/450</link>
		<comments>http://blog.tinybrowser.net/archives/450#comments</comments>
		<pubDate>Thu, 29 Nov 2007 05:32:32 +0000</pubDate>
		<dc:creator>free2000fly</dc:creator>
				<category><![CDATA[技术心得]]></category>
		<category><![CDATA[枚举]]></category>

		<guid isPermaLink="false">http://blog.tinybrowser.net/?p=450</guid>
		<description><![CDATA[原文网址: http://blog.csdn.net/classfactory/archive/2004/08/29/87749.aspx C++ 中的枚举类型继承于 C 语言。就像其他从 C 语言继承过来的很多特性一样，C++ 枚举也有缺点，这其中最显著的莫过于作用域问题——在枚举类型中定义的常量，属于定义枚举的作用域，而不属于这个枚举类型。例如下面的示例： C++枚举的这个特点对于习惯面向对象和作用域概念的人来说是不可接受的。首先，FileAccess::Read 显然更加符合程序员的直觉，因为上面的枚举定义理应等价于如下的定义（实际上，.NET 中的枚举类型便是如此实现的）： 其次，这导致我们无法在同一个作用域中定义两个同样名称的枚举值。也就是说，以下的代码是编译错误： 如果这一点没有让你恼怒过的话，你可能还没写过多少 C++ 代码 。实际上，在最新的 C++0x 标准草案中有关于枚举作用域问题的提案，但最终的解决方案会是怎样的就无法未卜先知了，毕竟对于象 C++ 这样使用广泛的语言来说，任何特性的增删和修改都必须十分小心谨慎。 当然，我们可以使用一些迂回的方法来解决这个问题（C++ 总是能给我们很多惊喜和意外）。例如，我们可以把枚举值放在一个结构里，并使用运算符重载来逼近枚举的特性： 我们现在可以按照希望的方式使用这个枚举类型： 并且，因为我们提供了到 int 类型的转换运算符，因此在需要 int 的地方都可以使用它，例如 switch 语句： 当然我们不愿意每次都手工编写这样的结构。通过使用宏，我们可以很容易做到这一点： 我们现在可以按如下的方式定义前面的枚举，并且不比直接写 enum 复杂多少。]]></description>
		<wfw:commentRss>http://blog.tinybrowser.net/archives/450/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

