<?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>Google Stop Blog - Make a change &#187; Windows</title>
	<atom:link href="http://googlestop.com/blog/tag/windows/feed/" rel="self" type="application/rss+xml" />
	<link>http://googlestop.com/blog</link>
	<description>Just another weblog of Charry</description>
	<lastBuildDate>Sat, 07 Jan 2012 09:51:13 +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>Vista Sidebar Gadgets</title>
		<link>http://googlestop.com/blog/2008/02/vista-sidebar-gadgets/</link>
		<comments>http://googlestop.com/blog/2008/02/vista-sidebar-gadgets/#comments</comments>
		<pubDate>Fri, 22 Feb 2008 15:48:20 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Gadgets]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/2008/02/22/vista-sidebar-gadgets/</guid>
		<description><![CDATA[Vista Gadgets是随Windows Vista一同发布的一个附属应用，它给用户提供了一个方便的扩展系统的机会。我们可以根据自己的需要来编写相应的Gadgets程序。它其实就是在Sidebar容器内部运行的一系列基于HTML和脚本的迷你WEB应用程序。 比如，公司运营常根据工作周(Workweek)来度量，而我们通常习惯于记日期，所以我们可以编写个简单的取得当前的Workweek的小应用。下面是该例子的下载链接： AMD Calendar Gadget 更多信息，请参考：http://msdn2.microsoft.com/en-us/library/aa965850(VS.85).aspx]]></description>
			<content:encoded><![CDATA[<p>Vista Gadgets是随Windows Vista一同发布的一个附属应用，它给用户提供了一个方便的扩展系统的机会。我们可以根据自己的需要来编写相应的Gadgets程序。它其实就是在Sidebar容器内部运行的一系列基于HTML和脚本的迷你WEB应用程序。</p>
<p>比如，公司运营常根据工作周(Workweek)来度量，而我们通常习惯于记日期，所以我们可以编写个简单的取得当前的Workweek的小应用。下面是该例子的下载链接：</p>
<p><a href="http://www.googlestop.com/download/AMDCal.gadget">AMD Calendar Gadget</a></p>
<p>更多信息，请参考：<a title="http://msdn2.microsoft.com/en-us/library/aa965850(VS.85).aspx" href="http://msdn2.microsoft.com/en-us/library/aa965850(VS.85).aspx">http://msdn2.microsoft.com/en-us/library/aa965850(VS.85).aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2008/02/vista-sidebar-gadgets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Who is Rebecca?</title>
		<link>http://googlestop.com/blog/2007/08/who-is-rebecca/</link>
		<comments>http://googlestop.com/blog/2007/08/who-is-rebecca/#comments</comments>
		<pubDate>Tue, 07 Aug 2007 07:28:44 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[Entertainment]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/2007/08/07/who-is-rebecca/</guid>
		<description><![CDATA[今天帮朋友安装一个Windows XP(EN)，用户名本来打算取为Rebecca，奇怪的是Windows禁止使用这个名字。 Rebecca何许人?]]></description>
			<content:encoded><![CDATA[<p>今天帮朋友安装一个Windows XP(EN)，用户名本来打算取为Rebecca，奇怪的是Windows禁止使用这个名字。</p>
<p>Rebecca何许人?</p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2007/08/who-is-rebecca/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>为什么不用SEH</title>
		<link>http://googlestop.com/blog/2007/07/%e4%b8%ba%e4%bb%80%e4%b9%88%e4%b8%8d%e7%94%a8seh/</link>
		<comments>http://googlestop.com/blog/2007/07/%e4%b8%ba%e4%bb%80%e4%b9%88%e4%b8%8d%e7%94%a8seh/#comments</comments>
		<pubDate>Tue, 17 Jul 2007 01:55:35 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[VC]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/2007/07/16/%e4%b8%ba%e4%bb%80%e4%b9%88%e4%b8%8d%e7%94%a8seh/</guid>
		<description><![CDATA[前些时候，在论坛上看到一个朋友说SEH怎么怎么不好，一定不要用它。其实存在即合理。就像GOTO，不能因为它破坏了程序的流程，就不用它，适当的使用，还是可以事半功倍的。 大家知道SEH是Windows操作系统提供的一种异常处理机制，它和C++无关。在Compiler编译的时候，就把这个机制加入了我们的程序中。在VC下可以用__try, __finally, __except, __leave等关键字来标识。由于SEH可以捕获硬件异常(Hardware Exception)和软件异常(Software Exception)，它比C++的异常机制能捕获更多的异常，所以有朋友不喜欢这点，认为它掩盖了错误。其实这种说法是也是合情合理的，毕竟掩盖错误不是最好的解决方案，找出问题的所在才是我们应该做的。可是在现实中，我们不可能找到所有的bug，或者由于时间的关系，来不及修补这个bug，不如先用SEH挡一挡，何尝不可。 就像我之前的一个项目，程序在一个地方偶尔会Crash掉，而且这个地方如果不能正常执行丝毫不影响整个程序的运作，不会对用户造成损失，在找出问题真正的原因之前，我们完全可以用SEH捕获异常。  下面的例子也是一个SEH优势的体现 BOOL SafeDiv(INT32 dividend, INT32 divisor, INT32 *pResult) {     __try     {         *pResult = dividend / divisor;     }     __except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ?              EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)     {         return FALSE;     }     return TRUE; } SafeDiv用来做除法操作，它的返回值指出函数是否执行成功。pResult指向最终的结果，如果不用SEH，这类Hardware Exception会导致程序Crash，这里引入了SEH，我们在发现有除零错误的时候，让函数返回FALSE，调用处通过检查函数的返回值就可以判断除法运算是否成功，没必要就因为一个除零错误导致程序Crash掉。 由于SEH是Windows操作系统特有的机制，所以它不适合用在那些跨平台的代码，这种情况不用也罢，既然SEH是一个Windows的一个很好的异常处理机制，我们虽不能滥用它，适当的、合理的使用还是值得推荐的。 P.S. For details [...]]]></description>
			<content:encoded><![CDATA[<p>前些时候，在论坛上看到一个朋友说SEH怎么怎么不好，一定不要用它。其实存在即合理。就像GOTO，不能因为它破坏了程序的流程，就不用它，适当的使用，还是可以事半功倍的。</p>
<p>大家知道SEH是Windows操作系统提供的一种异常处理机制，它和C++无关。在Compiler编译的时候，就把这个机制加入了我们的程序中。在VC下可以用__try, __finally, __except, __leave等关键字来标识。由于SEH可以捕获硬件异常(Hardware Exception)和软件异常(Software Exception)，它比C++的异常机制能捕获更多的异常，所以有朋友不喜欢这点，认为它掩盖了错误。其实这种说法是也是合情合理的，毕竟掩盖错误不是最好的解决方案，找出问题的所在才是我们应该做的。可是在现实中，我们不可能找到所有的bug，或者由于时间的关系，来不及修补这个bug，不如先用SEH挡一挡，何尝不可。</p>
<p>就像我之前的一个项目，程序在一个地方偶尔会Crash掉，而且这个地方如果不能正常执行丝毫不影响整个程序的运作，不会对用户造成损失，在找出问题真正的原因之前，我们完全可以用SEH捕获异常。</p>
<p> 下面的例子也是一个SEH优势的体现</p>
<p>BOOL SafeDiv(INT32 dividend, INT32 divisor, INT32 *pResult)<br />
{<br />
    __try<br />
    {<br />
        *pResult = dividend / divisor;<br />
    }<br />
    __except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ?<br />
             EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)<br />
    {<br />
        return FALSE;<br />
    }<br />
    return TRUE;<br />
}</p>
<p>SafeDiv用来做除法操作，它的返回值指出函数是否执行成功。pResult指向最终的结果，如果不用SEH，这类Hardware Exception会导致程序Crash，这里引入了SEH，我们在发现有除零错误的时候，让函数返回FALSE，调用处通过检查函数的返回值就可以判断除法运算是否成功，没必要就因为一个除零错误导致程序Crash掉。</p>
<p>由于SEH是Windows操作系统特有的机制，所以它不适合用在那些跨平台的代码，这种情况不用也罢，既然SEH是一个Windows的一个很好的异常处理机制，我们虽不能滥用它，适当的、合理的使用还是值得推荐的。</p>
<p>P.S.<br />
For details about SEH, check this: <a href="http://www.google.com/search?hl=en&amp;q=Programming+Applications+for+Microsoft+Windows">http://www.google.com/search?hl=en&amp;q=Programming+Applications+for+Microsoft+Windows</a></p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2007/07/%e4%b8%ba%e4%bb%80%e4%b9%88%e4%b8%8d%e7%94%a8seh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>API Hook的问题，卡住了:(</title>
		<link>http://googlestop.com/blog/2007/07/api-hook%e7%9a%84%e9%97%ae%e9%a2%98%ef%bc%8c%e5%8d%a1%e4%bd%8f%e4%ba%86/</link>
		<comments>http://googlestop.com/blog/2007/07/api-hook%e7%9a%84%e9%97%ae%e9%a2%98%ef%bc%8c%e5%8d%a1%e4%bd%8f%e4%ba%86/#comments</comments>
		<pubDate>Fri, 06 Jul 2007 16:25:14 +0000</pubDate>
		<dc:creator>Charry</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Windows Programming]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Network Programming]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://googlestop.com/blog/2007/07/06/api-hook%e7%9a%84%e9%97%ae%e9%a2%98%ef%bc%8c%e5%8d%a1%e4%bd%8f%e4%ba%86/</guid>
		<description><![CDATA[这两天研究如何在我自己的进程中，获取IE或者FireFox中的网页内容，也就是监视用户上网信息。需要通过API Hook的方式拦截IE(拦截FireFox也是一个道理)用的API。  刚开始的思路是，我想Hook MSHTML.dll 中的API，用Depends看了一下，发现只有寥寥几个导出函数，诸如ShowHTMLDialog(), 这些都不能获取网页内容。那么再换个DLL呢，于是Depends一下，ShDocVw.dll，导出函数倒是不少，大部分名字都是N/A，只有几个如OpenURL(), AddUrlToFavorites()，对我也没什么用。 上面的方法不行，我只能再向底层靠了，准备Hook Ws2_32.dll，Depends这个DLL，你可以看到，N多导出函数，让人赏心悦目，其中recv就是我要Hook的API，写了一个Demo程序，然后打开IE，运行这个Demo，发现毫无反应，我开始怀疑是我的API Hook的方式不对，后来我用同样的方法，发现可以拦截住user32.dll的MessageBoxA，百思不得其解。Google一下，发现有人和我遇到类似的问题： Hook MSN Messenger之socket通訊的鳥事 于是这次我挂到wsock32.dll，果然，这次有反应了。总算前进了一小步，离我要获得网页内容还有很多距离呢，我的recv函数中也就是my_recv内容如下： int PASCAL FAR my_recv (SOCKET s, char FAR * buf, int len, int flags) {         OutputDebugString(_T(&#8220;In my_recv&#8221;));           OutputDebugString(buf);         SaveLog(buf, len);         int nReturn = 0;         myJmp.SetHookOff();         nReturn = recv(s, buf, len, flags);         myJmp.SetHookOn();         [...]]]></description>
			<content:encoded><![CDATA[<p>这两天研究如何在我自己的进程中，获取IE或者FireFox中的网页内容，也就是监视用户上网信息。需要通过API Hook的方式拦截IE(拦截FireFox也是一个道理)用的API。</p>
<p> 刚开始的思路是，我想Hook MSHTML.dll 中的API，用Depends看了一下，发现只有寥寥几个导出函数，诸如ShowHTMLDialog(), 这些都不能获取网页内容。那么再换个DLL呢，于是Depends一下，ShDocVw.dll，导出函数倒是不少，大部分名字都是N/A，只有几个如OpenURL(), AddUrlToFavorites()，对我也没什么用。</p>
<p>上面的方法不行，我只能再向底层靠了，准备Hook Ws2_32.dll，Depends这个DLL，你可以看到，N多导出函数，让人赏心悦目，其中recv就是我要Hook的API，写了一个Demo程序，然后打开IE，运行这个Demo，发现毫无反应，我开始怀疑是我的API Hook的方式不对，后来我用同样的方法，发现可以拦截住user32.dll的MessageBoxA，百思不得其解。Google一下，发现有人和我遇到类似的问题：</p>
<p><strong><a href="http://www.javaworld.com.tw/roller/page/qing?entry=2007_3_26_hook_msn_messenger%E4%B9%8Bsocket%E9%80%9A%E8%A8%8A%E7%9A%84%E9%B3%A5%E4%BA%8B" target="_blank">Hook MSN Messenger之socket通訊的鳥事</a></strong></p>
<p>于是这次我挂到wsock32.dll，果然，这次有反应了。总算前进了一小步，离我要获得网页内容还有很多距离呢，我的recv函数中也就是my_recv内容如下：</p>
<p>int PASCAL FAR my_recv (SOCKET s, char FAR * buf, int len, int flags)<br />
{<br />
        OutputDebugString(_T(&#8220;In my_recv&#8221;));<br />
 <br />
        OutputDebugString(buf);</p>
<p>        SaveLog(buf, len);</p>
<p>        int nReturn = 0;<br />
        myJmp.SetHookOff();<br />
        nReturn = recv(s, buf, len, flags);<br />
        myJmp.SetHookOn();</p>
<p>        return (nReturn);<br />
}</p>
<p>打印出buf的内容，用DebugView可以看到，很多都是乱码。不知道别人都怎么分析recv到的数据流的，怎么才能从中获取文本内容。接下来，保存也是一个问题，SaveLog的第二个参数是buf的长度，我觉得应该填recv的返回值，它是实际返回的数据的长度。但是把SaveLog放到recv后面，就不能保存到文件中，放到前面就可以，没办法，这里我只能用len。</p>
<p>打开文件如下图：</p>
<p><a title="2007-07-07_00-14-02.jpg" rel="lightbox" href="http://googlestop.com/blog/wp-content/uploads/2007/07/2007-07-07_00-14-021.jpg"><img src="http://googlestop.com/blog/wp-content/uploads/2007/07/2007-07-07_00-14-021-150x150.jpg" alt="2007-07-07_00-14-02.jpg" /></a></p>
<p>最后还有个问题是：卸载这个钩子的时候，偶尔会让IE崩溃。下面是我的一个demo，有兴趣的可以帮忙调试看看上面的若干个问题该怎么解决。写的仓促，代码很乱，我也没去测试Release是否有问题，暂且这么着吧。</p>
<p><a href="http://googlestop.com/download/APIHookTest.zip">Downlaod Demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://googlestop.com/blog/2007/07/api-hook%e7%9a%84%e9%97%ae%e9%a2%98%ef%bc%8c%e5%8d%a1%e4%bd%8f%e4%ba%86/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

