<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[LYSoft]]></title>
  <subtitle type="html"><![CDATA[powered by LiuYang]]></subtitle>
  <id>http://lysoft.g4soft.net/</id>
  <link rel="alternate" type="text/html" href="http://lysoft.g4soft.net/" /> 
  <link rel="self" type="application/atom+xml" href="http://lysoft.g4soft.net/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.8">PJBlog3</generator> 
  <updated>2008-10-06T10:35:01+08:00</updated>

  <entry>
	  <title type="html"><![CDATA[LYSoft出品之QQ去广告+本地会员+显示IP外挂原理]]></title>
	  <author>
		 <name>lysoft</name>
		 <uri>http://lysoft.g4soft.net/</uri>
		 <email>LY_LiuYang_LY@21cn.com</email>
	  </author>
	  <category term="" scheme="http://lysoft.g4soft.net/default.asp?cateID=3" label="Tech" /> 
	  <updated>2008-10-06T10:35:01+08:00</updated>
	  <published>2008-10-06T10:35:01+08:00</published>
		  <summary type="html"><![CDATA[<a href="http://lysoft.7u7.net" target="_blank">LYSoft</a>出品之QQ去广告+本地会员+显示IP外挂原理<br/><br/>采用自动代码分析,支持QQ2007和QQ2008的全部版本,目前尚未支持采用全新架构的QQ2009<br/><a target="_blank" href="http://lysoft.g4soft.net//lysoft/QQExt.rar" rel="external">下载 v81003+ IP数据库 81005</a><br/><br/>[本文针对QQ2007而写]<br/><br/>主要技术原理:<br/><br/>做IPQQ,那么这几个必备工具是不可缺的:OllyDbg,PEExplorer,DASM32,MFCSpy2<br/>QQ是基于接口调用架构的,这为窥探其内部提供了方便之门<br/><br/>0)&#160;&#160;&#160;&#160;经过分析,获知QQ获取IP信息是通过接口调用实现的,其步骤为<br/>IQQCore-&gt;IQQData-&gt;IQQUserDynData-&gt;dwIP方法<br/><br/>1)&#160;&#160;&#160;&#160;获得IQQCore.要获得此全局描述接口的方法有很多,最好的就是通过QQHelperDll.dll的 ?IsLogin@@YAHPAUIQQCore@@@Z方法获得,函数表达为int __cdecl IsLogin (struct IQQCore **).因为这个IsLogIn方法被QQ频繁调用,于是Hook这个函数,便能轻易获得IQQCore了<br/><br/>function IsLogin(pQQCore: Pointer): Integer; cdecl;<br/>begin<br/>&nbsp;&nbsp;Result := Call o&#114;iginal Func;&nbsp;&nbsp;调用原函数<br/>&nbsp;&nbsp;pIQQCore := pQQCore;&nbsp;&nbsp;获得IQQCore<br/>end;<br/><br/>2)&#160;&#160;&#160;&#160;从IQQCore获得IQQData.这个事情好办,QQ的BasicCtrlDll.dll的?GetFriendQQData@@YAHPAUIQQCore@@KPAPAUIQQData@@@Z方法,就是从IQQCore和UIN获得IQQData,函数表达为int __cdecl GetFriendQQData(struct IQQCore *,unsigned long,struct IQQData * *)<br/><br/>asm<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// int __cdecl GetFriendQQData(struct IQQCore *,unsigned long,struct IQQData * *)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov eax, pIQQCore<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov edx, UIN&nbsp;&nbsp;// QQ Uin (QQ number)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lea ecx, Result&nbsp;&nbsp;// return = pIQQData<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push ecx<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push edx<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push eax<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call GetFriendQQData<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add esp, $C&nbsp;&nbsp;// fix call stack<br/>end;<br/><br/>3)&#160;&#160;&#160;&#160;从IQQData获得IQQUserDynData.很不幸,QQ没有直接提供该方法,只好DASM QQ的内部,来模拟此过程的调用.<br/>const<br/>&nbsp;&nbsp;szQQUSER_DYNAMIC_DATA : PChar = &#39;QQUSER_DYNAMIC_DATA&#39;;<br/>&nbsp;&nbsp;clsid_IQQData : TGUID = &#39;{BA863A1E-C979-498A-975C-C501C4F310A3}&#39;;<br/>asm<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// pIQQData = Pointer(IQQData);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov ecx, pIQQData<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov ecx, [ecx]&nbsp;&nbsp;// ecx = IQQData.vtbl<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov eax, pIQQData&nbsp;&nbsp;// this pIQQData<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lea edx, Result&nbsp;&nbsp;// return = pIQQUDD<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push edx<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lea edx, clsid_IQQData&nbsp;&nbsp;// clsid_IQQData<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push edx<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push szQQUSER_DYNAMIC_DATA<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push eax<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call [ecx + $54]&nbsp;&nbsp;// IQQData.vf_54h QQUSER_DYNAMIC_DATA proc entry<br/>end;<br/><br/>4)&#160;&#160;&#160;&#160;从IQQUserDynData获得IP信息.<br/>const<br/>&nbsp;&nbsp;szdwIP : PChar = &#39;dwIP&#39;;<br/>&nbsp;&nbsp;szwPort : PChar = &#39;wPort&#39;;<br/>asm<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// get Uin info<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov eax, pIQQUDD<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov ecx, [eax]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lea edx, dwIP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push edx<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push szdwIP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push eax　　　<br/>&nbsp;&nbsp;&nbsp;&nbsp; call [ecx + $34]&nbsp;&nbsp;// IQQUDD.vf_34h<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov eax, pIQQUDD<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov ecx, [eax]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lea edx, wPort<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push edx<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push szwPort<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push eax　　　<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call [ecx + $30]&nbsp;&nbsp;// IQQUDD.vf_30h<br/>end;<br/><br/>上面的代码,懂ASM的人很容易就能理解的,其实这些代码也是来自QQ的DASM工程.<br/>注意一下接口调用和Cdecl就行了,因为用Delphi写的,所以不好直接支持C++的thiscall,故采用BASM方式来调用~<br/><br/>至于去广告,把目录AD下全部文件和Dat下Ad.gif删除了,广告就不会出来了.<br/>可是这样QQ还是会下载新的广告的,怎么办呢?只好修改QQ内部了,这是属于破解的范畴,做起来也并不复杂.<br/><br/>DASM分析QQ.EXE即可查询到&#34;广告&#34;和&#34;下载逻辑&#34;的文本常量和OD查找字符串常量&#34;Download_Start&#34;,它的上面是&#34;SECTION_AD&#34;,然后把相关的地方NOP了就能使QQ不再下载广告.不同的版本要修改的地方不一样,这里就仅以QQ2007II Beta1为例<br/><br/>004E9D49&nbsp;&nbsp;|.&nbsp;&nbsp;57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;edi<br/>004E9D4A&nbsp;&nbsp;|.&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;eax<br/>004E9D4B&nbsp;&nbsp;|.&nbsp;&nbsp;57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;edi<br/>004E9D4C&nbsp;&nbsp;|.&nbsp;&nbsp;53&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;ebx<br/>004E9D4D&nbsp;&nbsp;|.&nbsp;&nbsp;68 EFB14E00&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;004EB1EF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;&nbsp;&nbsp;Entry address <br/> ^ 这里是广告下载过程入口,到入口改为retn直接返回就OK了<br/>004E9D52&nbsp;&nbsp;|.&nbsp;&nbsp;E8 DE4EF2FF&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;0040EC35<br/>004E9D57&nbsp;&nbsp;|.&nbsp;&nbsp;83C4 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esp, 14<br/>004E9D5A&nbsp;&nbsp;|.&nbsp;&nbsp;BF 7CF55A00&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 005AF57C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;ASCII &#34;C:\config_asam.ini&#34;<br/>004E9D5F&nbsp;&nbsp;|.&nbsp;&nbsp;C745 10 60EA0&gt;mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp+10], 0EA60<br/>004E9D66&nbsp;&nbsp;|.&nbsp;&nbsp;57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; /FileName =&gt; &#34;C:\config_asam.ini&#34;<br/>004E9D67&nbsp;&nbsp;|.&nbsp;&nbsp;FF15 E0035400 call&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [&lt;&amp;KERNEL32.GetFileAtt&gt;; \GetFileAttributesA<br/>004E9D6D&nbsp;&nbsp;|.&nbsp;&nbsp;83F8 FF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, -1<br/>004E9D70&nbsp;&nbsp;|.&nbsp;&nbsp;74 64&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short 004E9DD6<br/>004E9D72&nbsp;&nbsp;|.&nbsp;&nbsp;A8 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test&nbsp;&nbsp;&nbsp;&nbsp;al, 10<br/>004E9D74&nbsp;&nbsp;|.&nbsp;&nbsp;75 60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jnz&nbsp;&nbsp;&nbsp;&nbsp; short 004E9DD6<br/>004E9D76&nbsp;&nbsp;|.&nbsp;&nbsp;57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;edi<br/>004E9D77&nbsp;&nbsp;|.&nbsp;&nbsp;8D4D B8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [ebp-48]<br/>004E9D7A&nbsp;&nbsp;|.&nbsp;&nbsp;E8 657BFAFF&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&lt;jmp.&amp;MFC42.#537_CString::CStrin&gt;<br/>004E9D7F&nbsp;&nbsp;|.&nbsp;&nbsp;BF 84DB5500&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 0055DB84<br/>004E9D84&nbsp;&nbsp;|.&nbsp;&nbsp;C645 FC 0C&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebp-4], 0C<br/>004E9D88&nbsp;&nbsp;|.&nbsp;&nbsp;897D B4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-4C], edi<br/>004E9D8B&nbsp;&nbsp;|.&nbsp;&nbsp;B8 70F55A00&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, 005AF570&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;ASCII &#34;SECTION_AD&#34;<br/>004E9D90&nbsp;&nbsp;|.&nbsp;&nbsp;C645 FC 0D&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebp-4], 0D<br/>004E9D94&nbsp;&nbsp;|.&nbsp;&nbsp;8BC8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, eax<br/>004E9D96&nbsp;&nbsp;|.&nbsp;&nbsp;85C9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test&nbsp;&nbsp;&nbsp;&nbsp;ecx, ecx<br/>004E9D98&nbsp;&nbsp;|.&nbsp;&nbsp;74 1A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short 004E9DB4<br/>004E9D9A&nbsp;&nbsp;|.&nbsp;&nbsp;B9 60F55A00&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, 005AF560&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;ASCII &#34;Download_Start&#34;<br/>004E9D9F&nbsp;&nbsp;|.&nbsp;&nbsp;8BD1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; edx, ecx<br/>004E9DA1&nbsp;&nbsp;|.&nbsp;&nbsp;85D2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test&nbsp;&nbsp;&nbsp;&nbsp;edx, edx<br/>004E9DA3&nbsp;&nbsp;|.&nbsp;&nbsp;74 0F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short 004E9DB4<br/>004E9DA5&nbsp;&nbsp;|.&nbsp;&nbsp;FF75 B8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [ebp-48]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; /IniFileName<br/>004E9DA8&nbsp;&nbsp;|.&nbsp;&nbsp;6A 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; |Default = 0<br/>004E9DAA&nbsp;&nbsp;|.&nbsp;&nbsp;51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; |Key =&gt; &#34;Download_Start&#34;<br/>004E9DAB&nbsp;&nbsp;|.&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; |Section =&gt; &#34;SECTION_AD&#34;<br/>004E9DAC&nbsp;&nbsp;|.&nbsp;&nbsp;FF15 3C035400 call&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [&lt;&amp;KERNEL32.GetPrivate&gt;; \GetPrivateProfileIntA<br/>004E9DB2&nbsp;&nbsp;|.&nbsp;&nbsp;EB 02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp;&nbsp;&nbsp; short 004E9DB6<br/>004E9DB4&nbsp;&nbsp;|&gt;&nbsp;&nbsp;33C0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp; eax, eax<br/>004E9DB6&nbsp;&nbsp;|&gt;&nbsp;&nbsp;85C0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test&nbsp;&nbsp;&nbsp;&nbsp;eax, eax<br/>004E9DB8&nbsp;&nbsp;|.&nbsp;&nbsp;74 09&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short 004E9DC3<br/>004E9DBA&nbsp;&nbsp;|.&nbsp;&nbsp;69C0 E8030000 imul&nbsp;&nbsp;&nbsp;&nbsp;eax, eax, 3E8<br/>004E9DC0&nbsp;&nbsp;|.&nbsp;&nbsp;8945 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp+10], eax<br/>004E9DC3&nbsp;&nbsp;|&gt;&nbsp;&nbsp;C645 FC 0B&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebp-4], 0B<br/>004E9DC7&nbsp;&nbsp;|.&nbsp;&nbsp;897D B4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-4C], edi<br/>004E9DCA&nbsp;&nbsp;|.&nbsp;&nbsp;8D4D B8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [ebp-48]<br/>004E9DCD&nbsp;&nbsp;|.&nbsp;&nbsp;C645 FC 0B&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebp-4], 0B<br/>004E9DD1&nbsp;&nbsp;|.&nbsp;&nbsp;E8 D679FAFF&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&lt;jmp.&amp;MFC42.#800_CString::~CStri&gt;<br/>004E9DD6&nbsp;&nbsp;|&gt;&nbsp;&nbsp;68 A0F45A00&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;005AF4A0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;&nbsp;&nbsp;ASCII <br/><br/>&#34;D:\QQ\qqbuilder_QQ2007IIbeta1Proj_int\Basic_QQ_VOB\QQ\QQMainApp\QQCSCenterSubApp.cpp&#34;<br/>004E9DDB&nbsp;&nbsp;|.&nbsp;&nbsp;B9 886C5B00&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, 005B6C88<br/>004E9DE0&nbsp;&nbsp;|.&nbsp;&nbsp;E8 997AFAFF&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&lt;jmp.&amp;MFC42.#860_CString::operat&gt;<br/>004E9DE5&nbsp;&nbsp;|.&nbsp;&nbsp;BF 906C5B00&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 005B6C90<br/>004E9DEA&nbsp;&nbsp;|.&nbsp;&nbsp;68 40165400&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;00541640<br/>004E9DEF&nbsp;&nbsp;|.&nbsp;&nbsp;8BCF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, edi<br/>004E9DF1&nbsp;&nbsp;|.&nbsp;&nbsp;C705 8C6C5B00&gt;mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [5B6C8C], 470<br/>004E9DFB&nbsp;&nbsp;|.&nbsp;&nbsp;E8 7E7AFAFF&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&lt;jmp.&amp;MFC42.#860_CString::operat&gt;<br/>004E9E00&nbsp;&nbsp;|.&nbsp;&nbsp;8B45 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [ebp+10]<br/>004E9E03&nbsp;&nbsp;|.&nbsp;&nbsp;33D2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp; edx, edx<br/>004E9E05&nbsp;&nbsp;|.&nbsp;&nbsp;B9 E8030000&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, 3E8<br/>004E9E0A&nbsp;&nbsp;|.&nbsp;&nbsp;F7F1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div&nbsp;&nbsp;&nbsp;&nbsp; ecx<br/>004E9E0C&nbsp;&nbsp;|.&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;eax<br/>004E9E0D&nbsp;&nbsp;|.&nbsp;&nbsp;68 40F55A00&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;005AF540<br/>004E9E12&nbsp;&nbsp;|.&nbsp;&nbsp;68 38F55A00&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;005AF538&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;&nbsp;&nbsp;ASCII &#34;AD|asam&#34;<br/>004E9E17&nbsp;&nbsp;|.&nbsp;&nbsp;E8 AE78F1FF&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;004016CA<br/>004E9E1C&nbsp;&nbsp;|.&nbsp;&nbsp;83C4 0C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esp, 0C<br/>004E9E1F&nbsp;&nbsp;|.&nbsp;&nbsp;837D EC 00&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-14], 0<br/>004E9E23&nbsp;&nbsp;|.&nbsp;&nbsp;74 17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short 004E9E3C<br/>004E9E25&nbsp;&nbsp;|.&nbsp;&nbsp;6A FF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;-1<br/>004E9E27&nbsp;&nbsp;|.&nbsp;&nbsp;FF75 EC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [ebp-14]<br/>004E9E2A&nbsp;&nbsp;|.&nbsp;&nbsp;56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;esi<br/>004E9E2B&nbsp;&nbsp;|.&nbsp;&nbsp;FF75 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [ebp+10]<br/>004E9E2E&nbsp;&nbsp;|.&nbsp;&nbsp;6A 0B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;0B<br/>004E9E30&nbsp;&nbsp;|.&nbsp;&nbsp;E8 ED4CF2FF&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;0040EB22<br/>004E9E35&nbsp;&nbsp;|.&nbsp;&nbsp;83C4 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esp, 14<br/>004E9E38&nbsp;&nbsp;|.&nbsp;&nbsp;85C0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test&nbsp;&nbsp;&nbsp;&nbsp;eax, eax<br/>004E9E3A&nbsp;&nbsp;|.&nbsp;&nbsp;74 3D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short 004E9E79<br/> ^ 这里是判断广告是否要下载, 直接JMP就可以跳过广告下载了<br/>004E9E3C&nbsp;&nbsp;|&gt;&nbsp;&nbsp;68 A0F45A00&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;005AF4A0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;&nbsp;&nbsp;ASCII <br/><br/>&#34;D:\QQ\qqbuilder_QQ2007IIbeta1Proj_int\Basic_QQ_VOB\QQ\QQMainApp\QQCSCenterSubApp.cpp&#34;<br/>004E9E41&nbsp;&nbsp;|.&nbsp;&nbsp;B9 886C5B00&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, 005B6C88<br/>004E9E46&nbsp;&nbsp;|.&nbsp;&nbsp;E8 337AFAFF&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&lt;jmp.&amp;MFC42.#860_CString::operat&gt;<br/>004E9E4B&nbsp;&nbsp;|.&nbsp;&nbsp;68 40165400&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;00541640<br/>004E9E50&nbsp;&nbsp;|.&nbsp;&nbsp;8BCF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, edi<br/>004E9E52&nbsp;&nbsp;|.&nbsp;&nbsp;C705 8C6C5B00&gt;mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [5B6C8C], 476<br/>004E9E5C&nbsp;&nbsp;|.&nbsp;&nbsp;E8 1D7AFAFF&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&lt;jmp.&amp;MFC42.#860_CString::operat&gt;<br/>004E9E61&nbsp;&nbsp;|.&nbsp;&nbsp;68 18F55A00&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;005AF518<br/>004E9E66&nbsp;&nbsp;|.&nbsp;&nbsp;68 38F55A00&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;005AF538&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;&nbsp;&nbsp;ASCII &#34;AD|asam&#34;<br/>004E9E6B&nbsp;&nbsp;|.&nbsp;&nbsp;E8 5A78F1FF&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;004016CA<br/>004E9E70&nbsp;&nbsp;|.&nbsp;&nbsp;59&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; ecx<br/>004E9E71&nbsp;&nbsp;|.&nbsp;&nbsp;59&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; ecx<br/>004E9E72&nbsp;&nbsp;|.&nbsp;&nbsp;8BCB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br/>004E9E74&nbsp;&nbsp;|.&nbsp;&nbsp;E8 76130000&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;004EB1EF<br/>004E9E79&nbsp;&nbsp;|&gt;&nbsp;&nbsp;8B45 EC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [ebp-14]<br/>004E9E7C&nbsp;&nbsp;|.&nbsp;&nbsp;33FF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp; edi, edi<br/>004E9E7E&nbsp;&nbsp;|.&nbsp;&nbsp;3BC7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, edi<br/>004E9E80&nbsp;&nbsp;|.&nbsp;&nbsp;74 09&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short 004E9E8B<br/><br/>可是广告窗口还是照样存在的,而且点击了仍旧会有响应的.这就靠外挂才好处理的.要找到QQ聊天窗口中任意一个WinControl的Handle就能轻松用代码干掉广告窗口的.<br/><br/>procedure DisableQQAd(Wnd: LongInt);<br/>label DoNext;<br/>var<br/>&nbsp;&nbsp;h, t: THandle;<br/>&nbsp;&nbsp;cn: array [0..254] of Char;<br/>&nbsp;&nbsp;function RemoveAdLabel(hStatic: THandle): Boolean;<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;Result := False;<br/>&nbsp;&nbsp;&nbsp;&nbsp;GetClassName(hStatic, @cn, SizeOf(cn));<br/>&nbsp;&nbsp;&nbsp;&nbsp;if cn = &#39;Static&#39; then&nbsp;&nbsp;// class name should be &#34;Static&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if GetWindowText(hStatic, @cn, SizeOf(cn)) &gt; 0 then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if Trim(cn) &lt;&gt; &#39;&#39; then&nbsp;&nbsp;// if Static control contain any Text<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DestroyWindow(hStatic);&nbsp;&nbsp;// remove it!<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := True;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br/>&nbsp;&nbsp;end;<br/>begin<br/>&nbsp;&nbsp;// get root Win control<br/>&nbsp;&nbsp;while GetParent(Wnd) &gt; 0 do Wnd := GetParent(Wnd);<br/>&nbsp;&nbsp;// remove QQ Ad url label<br/>&nbsp;&nbsp;h := GetWindow(Wnd, GW_CHILD o&#114; GW_HWNDFIRST);<br/>&nbsp;&nbsp;while h &gt; 0 do<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin&nbsp;&nbsp;// search child controls in chat dialog root<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cn := &#39;&#39;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// for QQ 2008 final o&#114; above<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if RemoveAdLabel(h) then goto DoNext;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// for QQ 2007 II to 2008 beta<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if cn = &#39;#32770&#39; then&nbsp;&nbsp;// QQ frame<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin&nbsp;&nbsp;// searh child controls in frame control &#34;#32770&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h := GetWindow(h, GW_CHILD o&#114; GW_HWNDFIRST);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while h &gt; 0 do<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if RemoveAdLabel(h) then goto DoNext;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h := GetWindow(h, GW_HWNDNEXT);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h := GetWindow(h, GW_HWNDNEXT);<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;DoNext:<br/>&nbsp;&nbsp;// remove QQ AD panel<br/>&nbsp;&nbsp;h := GetWindow(Wnd, GW_CHILD o&#114; GW_HWNDFIRST);<br/>&nbsp;&nbsp;while h &gt; 0 do<br/>&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cn := &#39;&#39;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetClassName(h, @cn, SizeOf(cn));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if cn = &#39;#32770&#39; then&nbsp;&nbsp;// QQ frame<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h := GetWindow(h, GW_CHILD o&#114; GW_HWNDFIRST);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while h &gt; 0 do<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t := GetWindow(h, GW_CHILD o&#114; GW_HWNDFIRST);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if t &gt; 0 then&nbsp;&nbsp;// has child control<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetClassName(h, @cn, SizeOf(cn));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if cn = &#39;Static&#39; then&nbsp;&nbsp;// found!<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DestroyWindow(t);&nbsp;&nbsp;// destroy Ad window&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>{ Cr&#101;ateWindow(&#39;Static&#39;, &#39;Hello world!!!&#39;, // 这里可以做什么?<br/>// 创建一个Form,用SetParent让你的Form附着在上面的,<br/>// 这样可以用你自己的窗口替换QQ的广告栏,TX一定会非常生气的,<br/>// 为了避免麻烦,最好还是不要做此类事情啦.这里只是讨论方法而已.<br/>// 如果要添加自己的Form,那么你还得用SetWindowLong来Hook WndProc过程,<br/>// 以用来处理WM_CLOSE,确保关闭聊天窗口时能释放你的Form. <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WS_VISIBLE o&#114; WS_CHILD o&#114; SS_LEFT,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0, 0, 242, 36, h, 0, h, nil); }<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h := GetWindow(h, GW_HWNDNEXT);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h := GetWindow(h, GW_HWNDNEXT);<br/>&nbsp;&nbsp;&nbsp;&nbsp;end;<br/>end;<br/><br/>问题是如何找到QQ聊天窗口中的任意个对象的Handle?<br/>方法可以是EnumWindows列举窗口,从标题栏入手,但是这个方法不保险.最好的做法就是<br/>Hook QQBaseClassInDll.dll中的函数,<br/>QQ2007为?SetUin@CAllInOneStatusBar@@QAEX_JH@Z<br/>QQ2007II Beta为?SetUin@CAllInOneStatusBar@@QAEX_JKH@Z<br/>这个函数用于设置QQ聊天窗口中对方号码的信息用的,调用此函数必定传递一个Handle,这个Handle必定在聊天窗口中的,于是一切好办,剩下要注意的就是Delphi不支持thiscall的,所以Hook这个函数必须用assembler方式.<br/>至于Handle在那里,用MFCSpy2分析就知道,在+0x20那里嘛~<br/>另外此函数同时传递对方的QQ号码,也是目前很多在窗口上现实IP显示的外挂所喜欢Hook的函数之一.<br/><br/>到此时,就显IP+去广告上一切OK了,花了俺2天功夫,大功告成!!<br/><br/>顺便公开另外一个去除广告的方法,此方法不必给QQ程序中打硬补丁,而且兼容性更理想,但是QQ广告下载还是必须Nop掉, 不然广告会照样下载而只是不显示而已.<br/>这就是BasicCtrlDll中的?IsVIP@@YAHPAUIQQCore@@@Z其原型为int __cdecl IsVIP(struct IQQCore *)<br/>和QQHelperDll.dll中的?GetSysBoolData@@YAHPBDAAHH@Z.<br/>OD分析QQAllInOne有:<br/><br/>03605EFF&nbsp;&nbsp;&nbsp;&nbsp;FF15 38506C03&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [&lt;&amp;BasicCtrlDll.IsVIP&gt;] ; BasicCtr.IsVIP<br/>* ^判断当前登陆的QQ是否为VIP,因为VIP用户是可以关闭QQ广告的<br/>03605F05&nbsp;&nbsp;&nbsp;&nbsp;8365 FC 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-4], 0<br/>03605F09&nbsp;&nbsp;&nbsp;&nbsp;8BF0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp; esi, eax<br/>03605F0B&nbsp;&nbsp;&nbsp;&nbsp;8D45 FC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [ebp-4]<br/>03605F0E&nbsp;&nbsp;&nbsp;&nbsp;6A 01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;1<br/>03605F10&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;eax<br/>03605F11&nbsp;&nbsp;&nbsp;&nbsp;68 E8A76D03&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;036DA7E8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; ASCII &#34;m_bMemberDisableAD&#34;<br/>03605F16&nbsp;&nbsp;&nbsp;&nbsp;FF15 206D6C03&nbsp;&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [&lt;&amp;QQHelperDll.GetSysBoolData&#39;&gt;; QQHelper.GetSysBoolData<br/>* ^获取广告显示设置<br/>03605F1C&nbsp;&nbsp;&nbsp;&nbsp;83C4 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esp, 10<br/>03605F1F&nbsp;&nbsp;&nbsp;&nbsp;85F6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test&nbsp;&nbsp;&nbsp;&nbsp;esi, esi<br/>03605F21&nbsp;&nbsp;&nbsp;&nbsp;5E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br/>03605F22&nbsp;&nbsp;&nbsp;&nbsp;74 0B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short 03605F2F<br/>* ^关键!!! 不是VIP就跳的,所以把这个NOP了<br/>03605F24&nbsp;&nbsp;&nbsp;&nbsp;837D FC 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ebp-4], 0<br/>03605F28&nbsp;&nbsp;&nbsp;&nbsp;74 05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; je&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short 03605F2F<br/>* ^关键!!! 没关闭AD就跳,所以再把这个NOP了<br/>03605F2A&nbsp;&nbsp;&nbsp;&nbsp;6A 01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;1<br/>03605F2C&nbsp;&nbsp;&nbsp;&nbsp;58&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp; eax<br/>这样,就实现了去AD了<br/><br/>具体可以使直接NOP代码,或者采用Hook方法:<br/>function IsVIP(pQQCore: Pointer): Integer; cdecl;<br/>begin<br/>&nbsp;&nbsp;Result := 1;<br/>end;<br/><br/>function GetSysBoolData(AText: PChar; p: Pointer; bIsVIP: Boolean): Integer; cdecl;<br/>// int __cdecl GetSysBoolData(char const *,int &amp;,int)<br/>begin<br/>&nbsp;&nbsp;if AText = &#39;m_bMemberDisableAD&#39; then<br/>&nbsp;&nbsp;&nbsp;&nbsp; begin<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer(p^) := 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Result := 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit;<br/>&nbsp;&nbsp;&nbsp;&nbsp; end;&nbsp;&nbsp;<br/>&nbsp;&nbsp;Result := Call o&#114;iginal Func;&nbsp;&nbsp;调用原函数<br/>end;<br/><br/>说到这里,肯定有人会说,如果实现了本地会员,那就不用这么麻烦了嘛?!<br/>显然,这是个捷径,实现起来也不难,关键是找到突破口<br/>经过DASM分析,QQHelperDll是个入手点<br/>用PEExplorer认真查找看看,果然有发现,那就是IsVipUser@qdatCurrentUser@@QAEHXZ<br/>一个无参数函数,Hook了,并让其返回EAX=1,嘿嘿,果然成了本地VIP,这个本地VIP可以享受QQ2007II的涂鸦表情哦~<br/>可是到了这里却仍旧发现QQ的设置上,还是说你是&#34;非会员&#34;,不能屏蔽广告,咋办?<br/>显然的是QQQSettingCtrl.dll并没有调用qdatCurrentUser::IsVipUser来判断.那它调用了那个函数呢?<br/>继续努力...N小时后发现!原来是IsQQServiceEnable@@YAHI@Z<br/>这是一个unsigned int入口的函数,估计是服务功能号,由此函数判断当前登录QQ用户可用的服务,于是Hook了,不管三七二十一,一律返回EAX=1,再测试...一切OK!<br/><br/>至此,QQ外挂可告一段落也~~]]></summary>
	  <link rel="alternate" type="text/html" href="http://lysoft.g4soft.net/article.asp?id=44" /> 
	  <id>http://lysoft.g4soft.net/default.asp?id=44</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Max internel clock speed about LPC901]]></title>
	  <author>
		 <name>lysoft</name>
		 <uri>http://lysoft.g4soft.net/</uri>
		 <email>LY_LiuYang_LY@21cn.com</email>
	  </author>
	  <category term="" scheme="http://lysoft.g4soft.net/default.asp?cateID=3" label="Tech" /> 
	  <updated>2008-09-23T22:19:07+08:00</updated>
	  <published>2008-09-23T22:19:07+08:00</published>
		  <summary type="html"><![CDATA[LPC901是NXP的8 Pins 8位单片机,有6个IO,128 Bytes RAM, 1K Flash,便宜得很,才3快多<br/>当使用内部RC振荡器的时候,通常主频就是7.x MHz,速度不够快<br/>这其实是可以通过修改TRIM实现12MHz的频率而无需使用外部晶振的<br/>0就最快,大于0就逐渐慢下来的<br/><br/>// set RC CLK speed to about 12MHz-, 5:0 = 0 max speed about 12MHz+<br/>TRIM = 0x7;&nbsp;&nbsp;大约12MHz<br/><br/>TRIM |= 0x40; while (1); // debug for output CLK/2 调试输出1/2主频]]></summary>
	  <link rel="alternate" type="text/html" href="http://lysoft.g4soft.net/article.asp?id=51" /> 
	  <id>http://lysoft.g4soft.net/default.asp?id=51</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[LY FTP Explorer (LYFTP)  80317/81005]]></title>
	  <author>
		 <name>lysoft</name>
		 <uri>http://lysoft.g4soft.net/</uri>
		 <email>LY_LiuYang_LY@21cn.com</email>
	  </author>
	  <category term="" scheme="http://lysoft.g4soft.net/default.asp?cateID=4" label="Download" /> 
	  <updated>2008-09-18T15:13:03+08:00</updated>
	  <published>2008-09-18T15:13:03+08:00</published>
		  <summary type="html"><![CDATA[<img src="http://lysoft.g4soft.net/lyftp/lyftp.PNG" border="0" alt=""/><br/><br/>Download LYFTP: <br/><a target="_blank" href="http://lysoft.g4soft.net/lyftp/lyftp.rar" rel="external">beta build 81005 (Win32 English Version). (with Unicode support) </a><br/>此Beta版本为测试版,有部分已知的Bug,但总的来说不影响使用,采用新的架构重新设计的,功能上进行了不少调整,无再需要依赖Indy版本的OpenSSL库.<br/><br/>下载LYFTP旧版本v80317<br/><span style="color:Purple">(please rename lyftp.exe.rar to lyftp.exe after download 下载后请把后序名改为.EXE再执行安装)</span><br/><a target="_blank" href="http://lysoft.g4soft.net/lyftp/lyftp.exe.rar" rel="external">Win32 platform with both Chinese and&nbsp;&nbsp;English GUI support. (中英文双语支持) </a><br/>下载LYFTP旧版OpenSSL支持库:<br/>LY FTP Explorer OpenSSL Support Library <a target="_blank" href="http://lysoft.g4soft.net/lyftp/lyftpssl.rar" rel="external">0.9.8g</a> <a target="_blank" href="http://lysoft.g4soft.net/lyftp/lyftpssl097.rar" rel="external">0.9.7i</a><br/><br/>LY FTP Explorer is *FREEWARE*! Running for 2000/XP/2003/Vista o&#114; above<br/>(might not support Windows 98/ME)<br/><br/>LYFTP支持MODE Z压缩传输，能节省您的传输时间。(如使用中出现问题，请关闭MODE Z功能)<br/><br/>LYFTP作为<a href="http://lysoft.7u7.net" target="_blank">LYSoft</a>的重要软件，我在上面花费了大量精力，虽然同类软件有N种，LYFTP依然有其特色。在这个软件的开发过程中，对我本人的技术水平的提高起了极其重要的作用，ou之所以有今天的成绩，完全离不开LYFTP在其中的贡献。LYFTP在2001年9月的第一个版本至今已近3年多了，回忆在2002年2月的时候，作为全球除CuteFTP外，首个支持SSL over FTP的传输技术，事隔快有半年后，Serv-U才宣布支持SSL，FXP就更迟了，在那个时候，LYFTP是国产FTP软件的佼佼者，而且LYFTP从头到尾都是我一个人独立开发完成的！<br/><br/>***** About LYFTP ********<br/>What is LYFTP? <a target="_blank" href="http://lysoft.g4soft.net/lyftp/Readme.htm" rel="external">Click here to know more about LYFTP</a><br/><br/>下载LYFTP的中文帮助文件40124版(<a target="_blank" href="http://lysoft.g4soft.net/lyftp/LYFTP-CHS-Help.rar" rel="external">DOC格式</a>) (<a target="_blank" href="http://lysoft.g4soft.net/lyftp/FTPExplorer.chm" rel="external">CHM格式</a>)<br/><br/><a target="_blank" href="http://lysoft.g4soft.net/lyftp/sounds.rar" rel="external">Download sounds collection for event notify</a><br/><br/>****** Purchase LYFTP *****<br/><a target="_blank" href="http://lysoft.g4soft.net/lyftp/lyftpFreeKey.rar" rel="external">我要获取免费许可(随时更新) Get free license key here (200 days free license from date 2008.11.10)</a><br/><br/><a target="_blank" href="http://lysoft.g4soft.net/lysoft/Order.htm" rel="external">中国国内用户点击这里捐赠购买LYFTP</a><br/><br/><a target="_blank" href="http://lysoft.g4soft.net/lysoft/OrderEn.htm" rel="external">International user (non-Chinese user) click here to donate LYFTP</a>]]></summary>
	  <link rel="alternate" type="text/html" href="http://lysoft.g4soft.net/article.asp?id=22" /> 
	  <id>http://lysoft.g4soft.net/default.asp?id=22</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[LY Proxy Server v80918]]></title>
	  <author>
		 <name>lysoft</name>
		 <uri>http://lysoft.g4soft.net/</uri>
		 <email>LY_LiuYang_LY@21cn.com</email>
	  </author>
	  <category term="" scheme="http://lysoft.g4soft.net/default.asp?cateID=4" label="Download" /> 
	  <updated>2008-09-18T15:10:02+08:00</updated>
	  <published>2008-09-18T15:10:02+08:00</published>
		  <summary type="html"><![CDATA[LY Proxy Server v80918<br/><br/><img src="http://lysoft.g4soft.net//LYProxy/main.PNG" border="0" alt=""/><br/><br/>LY Proxy Server is a free HTTP, Tunnel and Socks 5 TCP Proxy Server (support Socks2HTTP). It includes a build-in small web server and web proxy server.<br/><br/>多年没有更新了,最近有空,也就维护了一下,优化了HTTP代理连接,并更新到D2009.<br/><br/>这就是偶当年的毕业设计啦.它获得2003年广州大学毕业论文创新一等奖，就因为LY Proxy是仅使用一个线程就能处理多个用户并发访问的服务器,虽然效能不是很高,也毕竟是一种思路的尝试^_^<br/><a target="_blank" href="http://lysoft.g4soft.net//LYProxy/LY%20Proxy%20Server.doc" rel="external">下载LYProxy的论文</a><br/><br/><a target="_blank" href="http://lysoft.g4soft.net/lyproxy/HTTPProxyServer.rar" rel="external">马上下载 Download here</a><br/><br/>LY Proxy Server Command Manual / LY Proxy的管理命令说明如下<br/><br/>Params List:<br/>addlist=(Admin IP Address) 添加管理员IP，它将不受限制地访问所有代理服务 <br/>dellist=(Admin IP Address) 删除管理员IP <br/>clearlist 清空管理员IP列表 <br/>logout 管理员注销 <br/>viewlist 查看目前管理员登陆IP列表 <br/>socks5=[true/false] 启用/关闭Socks 5 TCP代理服务 <br/>tunnel=[true/false] 启用/关闭Tunnel代理服务 <br/>webserver=[true/false] 启用/关闭内建Web服务 <br/>webproxy=[true/false] 启用/关闭Web Proxy代理服务 <br/>status 查看当前服务器使用的上级代理信息 <br/>appvisible=[true/false] 显示/隐藏服务程序界面<br/><br/>服务器管理入口:<br/>LY Proxy Server Admin URL: <a href="http://LYProxyHostAddress:ProxyPort/admin?Command=Params" target="_blank" rel="external">http://LYProxyHostAddress:ProxyPort/admin?Command=Params</a><br/>LY Proxy Server Info URL: <a href="http://LYProxyHostAddress:ProxyPort/info" target="_blank" rel="external">http://LYProxyHostAddress:ProxyPort/info</a><br/>LY Proxy Server Web Proxy URL: <a href="http://LYProxyHostAddress:ProxyPort/webproxy?url=URL" target="_blank" rel="external">http://LYProxyHostAddress:ProxyPort/webproxy?url=URL</a><br/>LY Proxy Server Web Server URL: <a href="http://LYProxyHostAddress:ProxyPort/" target="_blank" rel="external">http://LYProxyHostAddress:ProxyPort/</a><br/><br/>嘿嘿，使用移动CMWAP GPRS/EDGE/CDMA 1X互动视界包月上网的朋友有福气了。只要使用LYProxy就可以让你的PC通过代理上Web页了。<br/><br/>让你的PC通过LYProxy使用CMWAP之上网秘笈:<br/>首先,你需要有一个支持GPRS/EDGE的手机,并使用中国移动CMWAP GPRS包月上网,或者CDMA 1X的手机,并开通中国联通WAP包月上网<br/><br/>1）手机连接到PC<br/><br/>2）建立拨号系统，根据手机附带的软件操作<br/><br/>3）使用CMWAP上网的接入号码为＊99＃，不需要用户名和密码（如果是SmartPhone/PPC，则使用手机软件包中的USB Modem拨号，输入接入点为CMWAP），需要设置Modem的初始化命令参数为AT+CGDCONT=1,&#34;IP&#34;,&#34;CMWAP&#34;,&#34;&#34;<br/><br/>&nbsp;&nbsp; 使用CDMA 1X上网的接入号码为＃777，用户名和密码均为WAP<br/><br/>4）设置LYProxy，详见下图：<br/><img src="http://lysoft.g4soft.net//LYProxy/opt.PNG" border="0" alt=""/><br/><br/>选择Override as <a href="http://lysoft.7u7.net" target="_blank">LYSoft</a>，并注意用Save保存设置<br/><br/>填写Proxy Address为10.0.0.172:80(CMWAP GPRS)/10.0.0.200:80(CDMA 1X WAP)<br/><br/>点击Start Server启动代理服务，最小化程序，这时，LYProxy就在系统中运行了：<br/><img src="http://lysoft.g4soft.net//LYProxy/tray.PNG" border="0" alt=""/><br/><br/>5）在IE中填写（可能需要在Modem_USB等连接Modem上，根据所使用的手机而定）：<br/><img src="http://lysoft.g4soft.net//LYProxy/ie.PNG" border="0" alt=""/><br/><br/>FlashGet为：<br/><img src="http://lysoft.g4soft.net//LYProxy/fg.PNG" border="0" alt=""/><br/><br/>注意：采用该方法可以上到大部分网页，并不是所有网站和服务都可用，因为CMWAP只能允许你使用HTTP服务，而且有部分使用Script的站点（例如ASP，APSX，PHP，CGI等）是无法正常浏览，服务器返回502 Bad Gateway的错误的。但上QQ（HTTP Connect Tunnel代理方式）就完全没有任何问题。<br/>以上内容在广东移动/联通服务范围内测试通过。<br/><br/><a target="_blank" href="http://lysoft.g4soft.net/LYProxy" rel="external">查看旧版说明</a>]]></summary>
	  <link rel="alternate" type="text/html" href="http://lysoft.g4soft.net/article.asp?id=20" /> 
	  <id>http://lysoft.g4soft.net/default.asp?id=20</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[LYSoft QQ Message Explorer QQ聊天记录浏览器]]></title>
	  <author>
		 <name>lysoft</name>
		 <uri>http://lysoft.g4soft.net/</uri>
		 <email>LY_LiuYang_LY@21cn.com</email>
	  </author>
	  <category term="" scheme="http://lysoft.g4soft.net/default.asp?cateID=4" label="Download" /> 
	  <updated>2008-08-12T15:55:54+08:00</updated>
	  <published>2008-08-12T15:55:54+08:00</published>
		  <summary type="html"><![CDATA[<a href="http://lysoft.7u7.net" target="_blank">LYSoft</a> QQ Message Explorer QQ聊天记录浏览器 v80812修正版<br/><a target="_blank" href="http://lysoft.g4soft.net//lysoft/QQMsgEx.rar" rel="external">Download Demo version</a> --- 业界唯一的QQ记录修复软件!<br/><br/>花了一周的时间,终于推出<a href="http://lysoft.7u7.net" target="_blank">LYSoft</a> QQ Message Explorer QQ聊天记录浏览器,这个工具原本是为了修复我丢失的QQ聊天记录而写的.<br/><br/><a href="http://lysoft.7u7.net" target="_blank">LYSoft</a> QQ Message Explorer支持以下功能:<br/>1)直接浏览QQ聊天记录文件MsgEx.db和好友记录文件User.db,导出复合文档的内部数据<br/>2)可以对QQ聊天记录文件MsgEx.db和其它任何复合文档进行压缩<br/>3)任意编辑,新加,复制,移动,删除QQ聊天记录<br/>4)修正QQ聊天记录中的错误<br/>5)按日期排序聊天记录<br/><br/>目前尚不支持带本地密码的记录修复和浏览.<br/><br/>如果你的QQ聊天记录导出的时侯出现&#34;导出消息失败,可能所选区域没有消息&#34;或者导出文本方式数据很少,那就是QQ聊天记录出现损坏的.<br/><br/>必须注意的是:使用QQ打开浏览损坏的记录文件,一旦浏览到损坏点,则QQ会自行截除修复,导致记录永久丢失!<br/><br/>声明: 使用此软件之前请好好备份您的聊天记录.本人不对任何使用该软件导致的数据损坏负责!!!<br/><br/>现在推出的是Demo版本,不能全面自动修复,对记录的修改有次数限制.<br/>如果你需要这些功能,你就要购买注册版:<br/><br/>售价150RMB. 请先下载个人识别码<a target="_blank" href="http://lysoft.g4soft.net//lysoft/GetPN.rar" rel="external">GetPN</a>,注册版需提交此识别码.<br/>支付方式为支付宝,共享软件注册中心,或者直接网银转帐,具体请与本人联系.<br/><br/>定价是高一点,也是提供有这方面需要的人使用的,如果你仅是浏览和修复小量数据,则无须购买注册版.]]></summary>
	  <link rel="alternate" type="text/html" href="http://lysoft.g4soft.net/article.asp?id=50" /> 
	  <id>http://lysoft.g4soft.net/default.asp?id=50</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[移植uCOS到STR9的一些心得]]></title>
	  <author>
		 <name>lysoft</name>
		 <uri>http://lysoft.g4soft.net/</uri>
		 <email>LY_LiuYang_LY@21cn.com</email>
	  </author>
	  <category term="" scheme="http://lysoft.g4soft.net/default.asp?cateID=3" label="Tech" /> 
	  <updated>2008-07-13T12:31:39+08:00</updated>
	  <published>2008-07-13T12:31:39+08:00</published>
		  <summary type="html"><![CDATA[玩STR9一个星期的,我用的是STR912FW44,属于STR91x系列中,档次较高的那个,有512K Flash和96K SRAM,96MHz的主频,足以全面取代普通单片机的.<br/><br/>比较有趣的是STR9的指令集是兼容ARM7的,所以无怪乎称为ARM7的加强版.<br/>玩ARM9也不难的,都是Firmware调用,有点类似API,比起单片机直接操作寄存器方便多的.<br/>不过ARM9的资源就是多呢,玩着就是功能强大,有USB2和MAC,使得做微型网络服务器成为事实.<br/><br/>STR9是不带MMU的,虽然能Run ucLinux,但没有Porting,也就只好玩uCOS的.<br/>在网上搜索了几下,终于找到了最新的uCOS2.86,下载之,再去官方网站找到ARM Port,放进去Compile,N个Error -_#!<br/>咋回事?原来Porting只是OS部分,还得要BootLoader的支持,不论是ST官方的BootLoader还是Keil ReadView MDK的,都是不适用的,郁闷,只好自己动手丰衣足食的.<br/><br/>我用的是Keil,因为Keil的ULINK2算是便宜(4600大元2个加MDK正版,其实也不便宜的,比起IAR的JLINK就算便宜啦),而且不喜欢IAR,个人认为IAR那个IDE还停留在Win2000年代的界面,没有Keil uVision的好用,而且以前玩过C51,那是Keil的世界,所以还是觉得Keil的更亲切.<br/><br/>说完的题外话,现在言归正传.<br/>都看过MDK和ST的BootLoader后,决定对ST官方版本的BootLoader进行修改,以支持uCOS.<br/>还没见网上有任何uCOS2.8x的STR9移植版本是好用的,所以还得翻阅uCOS官方的文档.<br/>我以前从来没用过uCOS的,花了两天功夫,搞清楚来龙去脉,这下就心里有底的.<br/><br/>关键在于BootLoader的Exception Hander需要由uCOS接管,于是修改向量入口.<br/>Run一下,系统不能进入?Debug也是无效??找找资料,噢~原来连接器需要设置代码位置.<br/>因为ARM需要从0x0启动,增加连接选项&#34;--first 91x_vect.o(Reset)&#34;把BootLoader的Reset如后置为0x0地址即可.<br/>再Run之,系统能进入了,但是任务调度无效,怎么回事?认真Debug发现CPU出现Abort错误,再次阅读BootLoader部分代码,汗,原来默认用了USR Mode,当然出现异常的,因为uCOS用的必须是SVC Mode,改了BootLoader后,一切OK.<br/><br/>事后却发现,只要掉电,系统就再也动不起来的,怎么回事??Try一下别的工程,怎么没此问题?!<br/>郁闷啦~做了一天的研究居然没找到头绪,汗啊.<br/>突然想起是不是代码限制呢?偶用的可是正版,没此限制的哦.不管,观察看看,在线Debug,系统报错是:0x8000地址错误!!这恰好是32KB啊!!不是吧??正版会这样???肯定不是的,一定是那个连接器的问题.<br/>做多几次尝试,再次证实了,只要大于32KB的代码,就会掉电后再也执行不起来的,而且比较Flash区代码,是没问题的,那么可以得出一个结论:MDK不存在32KB代码编译连接的限制.那么一定是文件映像出了问题的.<br/>好好比较MDK的编译连接项,终于发现问题所在&#34;One ELF Section per Function&#34;,只要开启这个就一切正常!做了多次测试,证实了这个问题.<br/><br/>在ARM上跑起uCOS后,剩下的东西都变得容易多了.]]></summary>
	  <link rel="alternate" type="text/html" href="http://lysoft.g4soft.net/article.asp?id=49" /> 
	  <id>http://lysoft.g4soft.net/default.asp?id=49</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[LY RTOS for WinAVR]]></title>
	  <author>
		 <name>lysoft</name>
		 <uri>http://lysoft.g4soft.net/</uri>
		 <email>LY_LiuYang_LY@21cn.com</email>
	  </author>
	  <category term="" scheme="http://lysoft.g4soft.net/default.asp?cateID=3" label="Tech" /> 
	  <updated>2008-06-13T21:48:10+08:00</updated>
	  <published>2008-06-13T21:48:10+08:00</published>
		  <summary type="html"><![CDATA[/*<br/>&nbsp;&nbsp;LY RTOS a lightweight micro RTOS for WinAVR - GCC for ATMEL AVR micro controller<br/>&nbsp;&nbsp;build 2008.5.28 copyrights by <a href="http://lysoft.7u7.net" target="_blank">LYSoft</a>(C) <a href="http://lysoft.7u7.net" target="_blank">Liu Yang</a><br/>&nbsp;&nbsp;<a href="http://G4Soft.net" target="_blank" rel="external">http://G4Soft.net</a><br/>*/<br/><br/>// you cannot remove this for your project which use LY RTOS<br/>// 不得<a href="http://lysoft.7u7.net" target="_blank">LYSoft</a>之移除版权信息<br/>unsigned char CopyRights[] ={&#34;LY RTOS for AVR by <a href="http://lysoft.7u7.net" target="_blank">LYSoft</a> <a href="http://lysoft.7u7.net" target="_blank">Liu Yang</a>&#34;};<br/><br/>#include &lt;io.h&gt;<br/>#include &lt;iom32.h&gt;<br/>#include &lt;interrupt.h&gt;<br/><br/>#define F_CPU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11059200<br/>#define BAUDRATE&nbsp;&nbsp;&nbsp;&nbsp;9600<br/><br/>// avoid compiler to use the following register<br/>/*<br/>register unsigned char tempR16 asm(&#34;r16&#34;);<br/>register unsigned char tempR17 asm(&#34;r17&#34;);<br/>// only about R15 can be used with IMD data LDI R16,0x01<br/>*/<br/><br/>#define OSMaxTask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3<br/>#define OSInfinite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xFFFF<br/>#define OSInvalid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0xFF<br/>#define OSTaskEmpty&nbsp;&nbsp;&nbsp;&nbsp; 0<br/>#define OSTaskReady&nbsp;&nbsp;&nbsp;&nbsp; 1<br/>#define OSTaskWait&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<br/>#define OSTaskSuspend&nbsp;&nbsp; 3<br/>// Time(Sec) = CCR * (MAX - TCNT0 + 1) / F_CPU<br/>#define OSTimerValue&nbsp;&nbsp;&nbsp;&nbsp;120&nbsp;&nbsp;// about 100ns<br/>#define MCURegCount&nbsp;&nbsp;&nbsp;&nbsp; 32<br/><br/>static unsigned char OSCurrentTaskID = 0;<br/>static unsigned char OSAtomFlag = 0;<br/>static unsigned long OSIdleCount = 0, OSTickCount = 0;<br/><br/>struct tagTaskControlBlock <br/>{<br/>&#160;&#160;&#160;&#160;unsigned char Status;<br/>&nbsp;&nbsp;unsigned int Stack;<br/>&nbsp;&nbsp;unsigned int WaitTick;<br/>&nbsp;&nbsp;unsigned char * Semaphore;<br/>} TCB[OSMaxTask + 1];<br/> <br/>unsigned char OSCr&#101;ateTask(void (*Task)(void), unsigned char *TaskStack) <br/>{ <br/>&nbsp;&nbsp;unsigned char i = 1, TaskID;<br/>&nbsp;&nbsp;for (TaskID = 0; TaskID &lt; OSMaxTask + 1; TaskID ++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (TCB[TaskID].Status == OSTaskEmpty)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;i = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;}<br/>&nbsp;&nbsp;if (i) return OSInvalid;<br/>&nbsp;&nbsp;TCB[TaskID].Status = OSTaskReady;<br/>&nbsp;&nbsp;// PUSH = SP --; POP = SP ++<br/>&nbsp;&nbsp;*TaskStack --= (unsigned int)Task;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // save low address of SP<br/>&nbsp;&nbsp;*TaskStack --= (unsigned int)Task &gt;&gt; 8;&nbsp;&nbsp;// save high address of SP<br/>&nbsp;&nbsp;*TaskStack --= 0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // R0 __tmp_reg__ <br/>&nbsp;&nbsp;*TaskStack --= 0x80;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // SREG: SEI = 1&nbsp;&nbsp;<br/>&nbsp;&nbsp;for (i = 0; i &lt; MCURegCount - 1; i ++) *TaskStack --= 0x00;<br/>&nbsp;&nbsp;TCB[TaskID].Stack = (unsigned int)TaskStack;&nbsp;&nbsp;&nbsp;&nbsp;// save SP<br/>}<br/><br/>unsigned char OSTerminateTask(unsigned char TaskID)<br/>{<br/>&#160;&#160;&#160;&#160;if (TaskID &gt; OSMaxTask) return 0;<br/>&#160;&#160;&#160;&#160;if (TCB[TaskID].Status == OSTaskEmpty) return 0;<br/>&#160;&#160;&#160;&#160;TCB[TaskID].Status = OSTaskEmpty;<br/>&#160;&#160;&#160;&#160;return 1;<br/>}<br/><br/>void OSSwitchTask()<br/>{<br/>&#160;&#160;&#160;&#160;unsigned char i = OSMaxTask;<br/>&nbsp;&nbsp;while (i)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;i --;<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;OSCurrentTaskID ++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (OSCurrentTaskID &gt; OSMaxTask) OSCurrentTaskID = 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (TCB[OSCurrentTaskID].Status == OSTaskReady) return;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// check semaphore<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (TCB[OSCurrentTaskID].Semaphore &gt; 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;if (* TCB[OSCurrentTaskID].Semaphore &gt; 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{ // deattach semaphore from task and then resume task<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TCB[OSCurrentTaskID].Semaphore = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// task ready for dispatch<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TCB[OSCurrentTaskID].Status = OSTaskReady;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;// OS idle<br/>&nbsp;&nbsp;OSCurrentTaskID = 0;<br/>&nbsp;&nbsp;return;<br/>}<br/><br/>// Macro for saving the context during an interrupt service.<br/>#define SaveContext(void) \<br/>&nbsp;&nbsp;&nbsp;&nbsp;__asm__ __volatile__ ( \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r0&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;in&nbsp;&nbsp;&nbsp;&nbsp; r0, __SREG__&#34; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;cli&#34;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r0&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r1&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;clr&nbsp;&nbsp;&nbsp;&nbsp;__zero_reg__&#34;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r2&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r3&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r4&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r5&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r6&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r7&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r8&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r9&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r10&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r11&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r12&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r13&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r14&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r15&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r16&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r17&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r18&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r19&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r20&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r21&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r22&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r23&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r24&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r25&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r26&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r27&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r28&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r29&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r30&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;push&nbsp;&nbsp; r31&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;&nbsp;\<br/>&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>// Macro for restoring the context during an interrupt service. <br/>#define RestoreContext(void) \<br/>&nbsp;&nbsp;&nbsp;&nbsp;__asm__ __volatile__ ( \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r31&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r30&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r29&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r28&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r27&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r26&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r25&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r24&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r23&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r22&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r21&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r20&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r19&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r18&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r17&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r16&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r15&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r14&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r13&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r12&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r11&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r10&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r9&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r8&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r7&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r6&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r5&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r4&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r3&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r2&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r1&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r0&#34;&nbsp;&nbsp;&nbsp;&nbsp; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;out&nbsp;&nbsp;&nbsp;&nbsp;__SREG__, r0&#34; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;pop&nbsp;&nbsp;&nbsp;&nbsp;r0&#34;&nbsp;&nbsp;&nbsp;&nbsp;&#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;::&nbsp;&nbsp;\<br/>&nbsp;&nbsp;&nbsp;&nbsp;)<br/><br/>void OSDispatch(void)&nbsp;&nbsp;__attribute__ ((naked));<br/>void OSDispatch(void) <br/>{<br/>&nbsp;&nbsp;SaveContext();<br/>&nbsp;&nbsp;__asm__ __volatile__(&#34;INT_OSDispatch: \t&#34;);&nbsp;&nbsp; // dispatch from interrupt<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;if (OSAtomFlag == 0)<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;{<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TCB[OSCurrentTaskID].Stack = SP;<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;OSSwitchTask();<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SP = TCB[OSCurrentTaskID].Stack;<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;}<br/>&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;RestoreContext();<br/>&nbsp;&nbsp;__asm__ __volatile__(&#34;RETI \t&#34;);<br/>}<br/><br/>ISR(TIMER0_OVF_vect)&nbsp;&nbsp;__attribute__ ((naked));<br/>ISR(TIMER0_OVF_vect)<br/>{<br/>&nbsp;&nbsp;SaveContext();<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;static unsigned char TaskID;&nbsp;&nbsp;// move variable out of register<br/>&nbsp;&nbsp;for (TaskID = 1; TaskID &lt; OSMaxTask + 1; TaskID ++)<br/>&nbsp;&nbsp;{ <br/>&nbsp;&nbsp;&nbsp;&nbsp;if (TCB[TaskID].WaitTick &amp;&amp; TCB[TaskID].WaitTick != OSInfinite &amp;&amp; TCB[TaskID].Status == OSTaskWait)<br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCB[TaskID].WaitTick --;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (TCB[TaskID].WaitTick == 0) TCB[TaskID].Status = OSTaskReady;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;}<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;OSTickCount ++;<br/>&nbsp;&nbsp;TCNT0 = OSTimerValue;<br/>&nbsp;&nbsp;__asm__ __volatile__(&#34;JMP INT_OSDispatch \t&#34;);<br/>}<br/> <br/>void OSSuspendTask(unsigned char TaskID)<br/>{<br/>&#160;&#160;&#160;&#160;if (TaskID &gt; OSMaxTask) return;<br/>&nbsp;&nbsp;TCB[TaskID].Status = OSTaskSuspend;<br/>&nbsp;&nbsp;if (OSCurrentTaskID == TaskID) OSDispatch();<br/>} <br/><br/>void OSResumeTask(unsigned char TaskID) <br/>{ <br/>&#160;&#160;&#160;&#160;if (OSCurrentTaskID == TaskID || TaskID &gt; OSMaxTask) return;<br/>&nbsp;&nbsp;TCB[TaskID].Status = OSTaskReady;<br/>&nbsp;&nbsp;OSDispatch();<br/>} <br/><br/>void OSDelay(unsigned int Ticks) <br/>{ <br/>&nbsp;&nbsp;if (Ticks)<br/>&nbsp;&nbsp;{&nbsp;&nbsp;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;TCB[OSCurrentTaskID].WaitTick = Ticks;<br/>&nbsp;&nbsp;&nbsp;&nbsp;TCB[OSCurrentTaskID].Status = OSTaskWait;<br/>&nbsp;&nbsp;&nbsp;&nbsp;OSDispatch();<br/>&nbsp;&nbsp;}<br/>}<br/><br/>void OSIdleTask()<br/>{<br/>&#160;&#160;&#160;&#160;while(1)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;OSDispatch();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;OSIdleCount ++;<br/>&#160;&#160;&#160;&#160;}<br/>}<br/><br/>#define OSIdleTaskStackSize 64<br/>unsigned char OSIdleTaskStack[OSIdleTaskStackSize];<br/><br/>void OSInit()<br/>{<br/>&#160;&#160;&#160;&#160;unsigned char i;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;for (i = 0; i &lt; OSMaxTask + 1; i ++)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TCB[i].Status = OSTaskEmpty;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TCB[i].Stack = 0;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TCB[i].WaitTick = 0;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TCB[i].Semaphore = 0;<br/>&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;OSCr&#101;ateTask(OSIdleTask, OSIdleTaskStack + OSIdleTaskStackSize - 1);<br/>&#160;&#160;&#160;&#160;OSAtomFlag = 0;<br/>}<br/><br/>void OSExecute()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>{<br/>&nbsp;&nbsp;TCCR0 = 0;<br/>&nbsp;&nbsp;TCCR0 |= (1 &lt;&lt; CS01);<br/>&nbsp;&nbsp;TIMSK |= (1 &lt;&lt; TOIE0);<br/>&nbsp;&nbsp;TCNT0 = OSTimerValue;<br/>&nbsp;&nbsp;SP = TCB[0].Stack + MCURegCount + 1;<br/>&nbsp;&nbsp;sei();<br/>&nbsp;&nbsp;__asm__ __volatile__(&#34;RETI \t&#34; );<br/>}<br/><br/>void OSEnterAtom(unsigned char IsAllowINT)<br/>{<br/>&#160;&#160;&#160;&#160;if (IsAllowINT == 0) cli();<br/>&#160;&#160;&#160;&#160;OSAtomFlag = 1;<br/>}<br/><br/>void OSLeaveAtom()<br/>{<br/>&#160;&#160;&#160;&#160;OSAtomFlag = 0;<br/>&#160;&#160;&#160;&#160;sei();<br/>}<br/><br/>unsigned char OSGetCurrentTaskID()<br/>{<br/>&#160;&#160;&#160;&#160;return OSCurrentTaskID;<br/>}<br/><br/>unsigned long OSGetTickCount()<br/>{<br/>&#160;&#160;&#160;&#160;return OSTickCount;<br/>}<br/>unsigned long OSGetIdleCount()<br/>{<br/>&#160;&#160;&#160;&#160;return OSIdleCount;<br/>}<br/><br/>// Semaphore<br/>void OSPostSemaphore(unsigned char * Semaphore)<br/>{<br/>&#160;&#160;&#160;&#160;if (Semaphore == 0) return;<br/>&#160;&#160;&#160;&#160;if (* Semaphore &lt; 0xFF) * Semaphore += 1;<br/>}<br/><br/>unsigned char OSWaitSemaphore(unsigned char * Semaphore, unsigned int Ticks)<br/>{<br/>&#160;&#160;&#160;&#160;if (Semaphore == 0) return;<br/>&#160;&#160;&#160;&#160;if (* Semaphore &gt; 0)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;* Semaphore -= 1;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return 1;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;// Semaphore = 0, suspend current task<br/>&#160;&#160;&#160;&#160;if (Ticks)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TCB[OSCurrentTaskID].WaitTick = Ticks;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TCB[OSCurrentTaskID].Semaphore = Semaphore;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;TCB[OSCurrentTaskID].Status = OSTaskWait;<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;OSDispatch();<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;if (* Semaphore &gt; 0)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;* Semaphore -= 1;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return 1;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;return 0;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>}<br/><br/>//*************************************************************************<br/><br/>#define uchar&nbsp;&nbsp;unsigned char<br/>#define uint&nbsp;&nbsp; unsigned int<br/>#define ulong&nbsp;&nbsp;unsigned long<br/><br/>#define MaxReadSize 100<br/><br/>uchar ReadSize = 0, Sem = 0, ReadBuffer[MaxReadSize];<br/><br/>ISR(USART_RXC_vect)<br/>{ <br/>&nbsp;&nbsp;uchar Data,Status;<br/>&#160;&#160;&#160;&#160;Status = UCSRA;<br/>&#160;&#160;&#160;&#160;Data = UDR;<br/>&nbsp;&nbsp;if ((Status &amp; ((1&lt;&lt;FE) | (1&lt;&lt;DOR) | (1&lt;&lt;PE))) != 0) return;<br/>&nbsp;&nbsp;if (Data == 13)<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;{&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;UCSRB &amp;= ~(1 &lt;&lt; RXCIE);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;&nbsp;&nbsp;OSPostSemaphore(&amp;Sem);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br/>&nbsp;&nbsp;&nbsp;&nbsp;} else if (Data == 10) return;&#160;&#160;&#160;&#160; <br/>&#160;&#160;&#160;&#160;if (ReadSize &gt;= MaxReadSize) return;<br/>&#160;&#160;&#160;&#160;ReadBuffer[ReadSize] = Data;<br/>&#160;&#160;&#160;&#160;ReadSize++;<br/>}<br/><br/>void UARTSend(unsigned char&nbsp;&nbsp;*pASCII, unsigned char Length)<br/>{<br/>&nbsp;&nbsp;uchar i;<br/>&nbsp;&nbsp;if (Length == 0) Length = 0xFF;<br/>&nbsp;&nbsp;for (i=0; i &lt; Length; i++) <br/>&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp;if ((Length == 0xFF) &amp;&amp; (pASCII[i] == 0)) return;<br/>&nbsp;&nbsp;&nbsp;&nbsp;while ( !(UCSRA &amp; (1&lt;&lt;UDRE)) ) ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;UDR = pASCII[i];<br/>&#160;&#160;&#160;&#160;}<br/>}<br/><br/>void UARTEnableReceive()<br/>{&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;ReadSize = 0;<br/>&#160;&#160;&#160;&#160;UCSRB |= (1 &lt;&lt; RXCIE);<br/>}<br/><br/>#define sbi(port, bit) (port) |= (1 &lt;&lt; (bit))<br/>#define cbi(port, bit) (port) &amp;= ~(1 &lt;&lt; (bit))<br/>#define nob(port, bit) (port) ^= (1 &lt;&lt; (bit))<br/><br/>#define KBPort PORTB<br/>#define KBDDR DDRB<br/>#define KBPIN PINB<br/>#define KBLine 7<br/><br/>uchar ScanKey()<br/>{<br/>&#160;&#160;&#160;&#160;uchar i, j, k;&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;for (i = 0; i &lt; KBLine; i++)<br/>&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;KBDDR = 0x80;&nbsp;&nbsp;//use PB7 as LCD light output, but o&#114;iginal is KBDDR = 0;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sbi(KBDDR, i);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;KBPort = KBPort | 0x7F;&nbsp;&nbsp;//use PB7 as LCD light output, but o&#114;iginal is KBPort = 0xFF;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cbi(KBPort, i);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;j = ~(1&lt;&lt;i);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;k = ~KBPIN;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;k &amp;= 0x7F; //added for use PB7 as LCD light output<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if ((k &amp; j) != 0)<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;OSDelay(1000);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if ((k &amp; j) != 0) return ((k &amp; j) | (1&lt;&lt;i));<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;return 0;<br/>}<br/><br/>void UARTInit()&nbsp;&nbsp;&nbsp;&nbsp;//初始化串口 <br/>{<br/>&nbsp;&nbsp;UCSRC = (1&lt;&lt;URSEL) | 0x06;&nbsp;&nbsp;&nbsp;&nbsp;//异步，8位数据，无奇偶校验，一个停止位，无倍速&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;UBRRL= (F_CPU/BAUDRATE/16-1)%256;<br/>&nbsp;&nbsp;UBRRH= (F_CPU/BAUDRATE/16-1)/256;<br/>&nbsp;&nbsp;UCSRA = 0x00;<br/>&nbsp;&nbsp;UCSRB = (1&lt;&lt;RXCIE)|(1&lt;&lt;RXEN)|(1&lt;&lt;TXEN); //|(1&lt;&lt;TXCIE);<br/>&nbsp;&nbsp;UDR=0; <br/>}<br/><br/>void Task1()<br/>{&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;unsigned char i, Text[16];<br/>&nbsp;&nbsp;while (1)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;i = ScanKey();<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (i)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sprintf(Text, &#34;Key: %u\r\n&#34;, i);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;OSEnterAtom(0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;UARTSend(Text, 0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;OSLeaveAtom();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;}<br/>&nbsp;&nbsp;}<br/>}<br/><br/>void Task2()<br/>{<br/>&nbsp;&nbsp;unsigned char i, Text[32];<br/>&nbsp;&nbsp;while (1)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;i = OSWaitSemaphore(&amp;Sem, OSInfinite);&nbsp;&nbsp;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;OSEnterAtom(0);<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;if (i)<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sprintf(Text, &#34;CMD &gt; [%u]\r\n&#34;, ReadSize);<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;UARTSend(Text, 0);<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;else // these code never runs when Ticks = OSInfinite<br/>&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;UARTSend(&#34;Read Timeout\r\n&#34;, 0);&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;OSLeaveAtom();<br/>&nbsp;&nbsp;&nbsp;&nbsp;UARTEnableReceive();<br/>&nbsp;&nbsp;}<br/>}<br/><br/>void Task3()<br/>{<br/>&#160;&#160;&#160;&#160;unsigned int i = 0;<br/>&nbsp;&nbsp;unsigned char Text[48];<br/>&nbsp;&nbsp;while (1)<br/>&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;i ++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;sprintf(Text, &#34;TCC: %u, IC: %lu, OSTC: %lu\r\n&#34;, i, OSIdleCount, OSTickCount);<br/>&nbsp;&nbsp;&nbsp;&nbsp;OSEnterAtom(0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;UARTSend(Text, 0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;OSLeaveAtom();<br/>&nbsp;&nbsp;&nbsp;&nbsp;OSDelay(5000);&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;}<br/>}<br/><br/>void InitMCU()<br/>{<br/>&#160;&#160;&#160;&#160;// init port<br/>&#160;&#160;&#160;&#160;DDRA = 0x37;<br/>&#160;&#160;&#160;&#160;DDRC = 0xFF;<br/>&#160;&#160;&#160;&#160;DDRD = 0xFF;<br/>&#160;&#160;&#160;&#160;PORTA = 0;<br/>&#160;&#160;&#160;&#160;PORTC = 0;<br/>&#160;&#160;&#160;&#160;PORTD = 0;<br/>}<br/><br/>// global task stack<br/>static unsigned char Stack[600];<br/><br/>int main (void)<br/>{<br/>&nbsp;&nbsp;InitMCU();<br/>&nbsp;&nbsp;UARTInit();<br/><br/>&nbsp;&nbsp;OSInit();<br/>&nbsp;&nbsp;OSCr&#101;ateTask(Task1, Stack + 199);<br/>&nbsp;&nbsp;OSCr&#101;ateTask(Task2, Stack + 399);<br/>&nbsp;&nbsp;OSCr&#101;ateTask(Task3, Stack + 599);<br/>&nbsp;&nbsp;OSExecute();<br/>}]]></summary>
	  <link rel="alternate" type="text/html" href="http://lysoft.g4soft.net/article.asp?id=48" /> 
	  <id>http://lysoft.g4soft.net/default.asp?id=48</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Disable JTAG in WinAVR]]></title>
	  <author>
		 <name>lysoft</name>
		 <uri>http://lysoft.g4soft.net/</uri>
		 <email>LY_LiuYang_LY@21cn.com</email>
	  </author>
	  <category term="" scheme="http://lysoft.g4soft.net/default.asp?cateID=3" label="Tech" /> 
	  <updated>2008-05-20T11:19:30+08:00</updated>
	  <published>2008-05-20T11:19:30+08:00</published>
		  <summary type="html"><![CDATA[Disable JTAG in WinAVR<br/><br/>do it very simple:<br/><br/>#define JTAG_Set(x) \<br/>{ \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__asm__ __volatile__ ( \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;in __tmp_reg__,__SREG__&#34; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;cli&#34; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;out %1, %0&#34; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;out __SREG__, __tmp_reg__&#34; &#34;\n\t&#34;\<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;out %1, %0&#34; &#34;\n\t&#34; \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: /* no outputs */ \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: &#34;r&#34; ((uint8_t)(x ? (1&lt;&lt;JTD) : 0)), \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;M&#34; (_SFR_IO_ADDR(MCUCSR)) \<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: &#34;r0&#34;); \<br/>}<br/><br/>use it just like this:<br/><br/>JTAG_Set(1); // disable JTAG port]]></summary>
	  <link rel="alternate" type="text/html" href="http://lysoft.g4soft.net/article.asp?id=47" /> 
	  <id>http://lysoft.g4soft.net/default.asp?id=47</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[Fix EEPROM access error for WinAVR]]></title>
	  <author>
		 <name>lysoft</name>
		 <uri>http://lysoft.g4soft.net/</uri>
		 <email>LY_LiuYang_LY@21cn.com</email>
	  </author>
	  <category term="" scheme="http://lysoft.g4soft.net/default.asp?cateID=3" label="Tech" /> 
	  <updated>2008-05-20T11:13:11+08:00</updated>
	  <published>2008-05-20T11:13:11+08:00</published>
		  <summary type="html"><![CDATA[Fix EEPROM access error for WinAVR<br/><br/>the following example is popular use in WinAVR:<br/><br/>uchar EEMEM epmem[8] = {&#34;12345678&#34;};<br/>uchar ram[8];<br/>eeprom_write_block(ram,epmem, 8);<br/>eeprom_read_block(ram,epmem, 8);<br/><br/>but I found there is an bug in it!<br/>In some complex application, it will result in system reset for AV error.<br/>So, do not use &#34;eeprom.h&#34;. And use my code to replace it.<br/><br/>#define EEMEM __attribute__((section(&#34;.eeprom&#34;)))<br/><br/>uchar EEPROMRead(uint addr)<br/>{<br/>&nbsp;&nbsp;uchar c, s;<br/>&nbsp;&nbsp;// wait write completed<br/>&nbsp;&nbsp;while (EECR &amp; (1&lt;&lt;EEWE));<br/>&nbsp;&nbsp;s = SREG;<br/>&nbsp;&nbsp;cli();<br/>&nbsp;&nbsp;// set address<br/>&nbsp;&nbsp;EEAR = addr;<br/>&nbsp;&nbsp;// start write<br/>&nbsp;&nbsp;EECR |= (1&lt;&lt;EERE);<br/>&nbsp;&nbsp;// read result<br/>&nbsp;&nbsp;c = EEDR;<br/>&nbsp;&nbsp;SREG = s;<br/>&nbsp;&nbsp;return c;<br/>}<br/><br/>void EEPROMWrite(uint addr, uchar c)<br/>{<br/>&#160;&#160;&#160;&#160;uchar s;<br/>&nbsp;&nbsp;// wait write completed<br/>&nbsp;&nbsp;while (EECR &amp; (1&lt;&lt;EEWE));<br/>&nbsp;&nbsp;s = SREG;<br/>&nbsp;&nbsp;cli();<br/>&nbsp;&nbsp;// set address<br/>&nbsp;&nbsp;EEAR = addr;<br/>&nbsp;&nbsp;EEDR = c;<br/>&nbsp;&nbsp;/* set EEMWE<br/>&nbsp;&nbsp;EECR |= (1&lt;&lt;EEMWE);<br/>&nbsp;&nbsp;// start write, but this should be done in 4 CPU cycles, use assembler can avoid this<br/>&nbsp;&nbsp;EECR |= (1&lt;&lt;EEWE); */<br/>&nbsp;&nbsp;__asm__ __volatile__ (<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;/* START EEPROM WRITE CRITICAL SECTION */\n\t&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;in&#160;&#160;&#160;&#160;r0, %[__sreg]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\n\t&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;cli&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\n\t&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;sbi&#160;&#160;&#160;&#160;%[__eecr], %[__eemwe]&#160;&#160;&#160;&#160;\n\t&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;sbi&#160;&#160;&#160;&#160;%[__eecr], %[__eewe]&#160;&#160;&#160;&#160;\n\t&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;out&#160;&#160;&#160;&#160;%[__sreg], r0&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;\n\t&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#34;/* END EEPROM WRITE CRITICAL SECTION */&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: [__eecr]&nbsp;&nbsp;&#34;i&#34; (_SFR_IO_ADDR(EECR)),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[__sreg]&nbsp;&nbsp;&#34;i&#34; (_SFR_IO_ADDR(SREG)),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[__eemwe] &#34;i&#34; (EEMWE),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[__eewe]&nbsp;&nbsp;&#34;i&#34; (EEWE)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: &#34;r0&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;);<br/>&nbsp;&nbsp;SREG = s;<br/>}<br/><br/>WinAVR的eeprom读写有Bug的,用我的代码就可以避免这个问题<br/>很多人都用<br/>EECR |= (1&lt;&lt;EEMWE);<br/>EECR |= (1&lt;&lt;EEWE);<br/>来写EEPROM,却发现数据没写入,因为置位EEMWE后必须在4个时钟周期内置位EEWE,但WinAVR等编译工具没有如此的优化,故使用嵌入汇编来解决此问题]]></summary>
	  <link rel="alternate" type="text/html" href="http://lysoft.g4soft.net/article.asp?id=46" /> 
	  <id>http://lysoft.g4soft.net/default.asp?id=46</id>
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[献给5.12劫后余生的人们]]></title>
	  <author>
		 <name>lysoft</name>
		 <uri>http://lysoft.g4soft.net/</uri>
		 <email>LY_LiuYang_LY@21cn.com</email>
	  </author>
	  <category term="" scheme="http://lysoft.g4soft.net/default.asp?cateID=11" label="Misc" /> 
	  <updated>2008-05-17T12:33:50+08:00</updated>
	  <published>2008-05-17T12:33:50+08:00</published>
		  <summary type="html"><![CDATA[时隔5.12,已经120小时了,生还的概率已经越来越接近零了,想到被埋的人们,不禁悲从中来,当真正的生死关头到来的此时,曾经柔弱的情感瞬间变得坚强,曾经多变的情绪瞬间变得执着,曾经迷惘的未来瞬间变得清晰.一方有难八方支持,是灾难再次让我们紧紧的团结起来,众志成城,让人们看到的生命的希望.<br/><br/>太多的感人故事我们已经无法一一细数,太多在一线的救援人们我们已经无法记住,<br/>但我们记住了你勇敢的身影,坚定的信念和希望的眼神...<br/><br/>坚强的生活下去,活着就是幸福...]]></summary>
	  <link rel="alternate" type="text/html" href="http://lysoft.g4soft.net/article.asp?id=45" /> 
	  <id>http://lysoft.g4soft.net/default.asp?id=45</id>
  </entry>	
		
</feed>
