灌溉梦想,记录脚步

九行代码让windows崩溃

目前很多地方都转载着利用9行代码使windows崩溃的文章,不过我发现没有关于为什么会使windows崩溃的分析。我先把原文给大家看看。然后把具体的细节说一下。
微软一直声称Windows XP多么多么稳定可靠,但日前一位名为Masaru Tsuchiyama的外国编程爱好者刊出了一小段C语言代码。这一只有9行的小程序如果在Windows XP/2000下运行,则可导致系统完全崩溃,并重新启动。但此程序对其他版本的Windows没有任何影响。这一产生无限循环输出的小程序的代码如下:
#include
int main( void )
{
for(;{
printf( "hung up\t\t\b\b\b\b\b\b" );
print("hung up\t\t\b\b\b\b\b\b";
}
return 0;
}
如果去掉Print语句,此程序还会导致NT 4.0系统出现蓝屏错误。
但愿微软赶快修补这一漏洞。同时提醒大家,此代码只可用于研究,不得用于任何非法勾当。
如果去掉Print语句,此程序还会导致NT 4.0系统出现蓝屏错误。以上遍上网上纷纷转载的原文。

关于为什么会导致错误,就在看下面的分析吧。
\b是退格
代码是用退格符把console里的光标退成null,
然后显示任一字符(除\t),即崩溃.
但是一般情况\b是不能退出规定的区域的,
而如\b的前一个字符是\t则可以退出规定的区域(bug?).
双击运行时,系统将新建一个console,所以我们的显示在console
的左上角,我们只需两个\b就可退出屏幕(第一个吃掉\t).
原因是win32子系统意外中止导致系统崩溃.smss是windows系统建立的第一个用户进程,他的工作之一是建立csrss和winlogon进程,然后一直等待这两个进程的句柄,如果这两个进程意外中止,
smss将导致系统崩溃.csrss进程就是专门负责所有win32进程和系统进行通信的进程.所有win32进程的系统调用都会由csrss帮你完成,但是这样做因为需要进程切换所以效率太低.所以在windowsNT从3.51升级到4.0时将许多部分从用户态移入内核态,win32进程的系统调用将直接进行以减少进程切换时间.但是仍有少量系统调用需要csrss进程完成,据我所知createprocess
是这样的函数,所有console上的显示是这样的函数(还有其他的).
当我们调用printf("\t\b\ba")最终将调用WriteFile API.
WriteFile((HANDLE)7,"\t\b\ba",NULL,NULL)等同于
printf("\t\b\ba"),7是console标准输入的句柄.
WriteFile判断句柄类型,如是文件句柄将调用ntdll.dll中的
NtWriteFile函数.如是console句柄将调用WriteConsoleA函数.
WriteConsoleA函数将调用ntdll.dll中的csrClientCallServer
函数通知csrss进程,然后调用NtRequestWaitReplyPort等待结果.
估计是csrss进程在处理这个请求过程中出错了.
几年前侯杰老师分析后我整理出来的。因为没有地方说过,甚至简单的分析都没有,所以我才把他翻出来 :) 细心的人发现csrss出错的细节没有描述,谁有时间就补充一下吧..

政治老师

高中的年级组长是一个政治老师,很多同学都恨他。一日,全年级大扫除,年级组长巡视一番后,气呼呼地来到我们班,把班长和卫生委员叫出去狠批一通。原来走廊的雪白的墙壁上,不知哪个倒霉孩子用油笔写了几个大字“刘*宁大傻B”,而这几个字正好位于我们班的卫生区……众人狂汗:“刘*宁”便是那年级组长的名讳……
为平息刘老师的怒气,全班齐上阵,又是擦又是刮,无论如何弄不掉那几个字。最后,某位高人想了个古今无双的办法,一命换一命,牺牲掉了卫生委员……

——我们在那行字上添了一笔。

我们的卫生委员名叫“刘*宇”。

device eth0 does not seem to be present, delaying

造成出现这种情况问题有很多种,解决方法如下:

#lsmod | grep r8169 (因为我的网卡是RTL8100系列的)

#rmmod r8169 (假如你曾经安装过此驱动)

#cd r8169

#make clean modules

#make install

#depmod r8169

#insmod ./src/r8169.ko

到此已经安装完成。

查看一下:

#ifconfig -a

如果你看到了网卡eth0或是eth1则表明网卡驱动安装成功。

用Helix Server架设流媒体服务

以下教程为WEB管理的未汉化的教程,请学会后在汉化也不迟
1.解开压缩包
2.首先运行 压缩包解开之后 里面的rs904-win32_960.exe
3.点NEXT
4.点Browse,然后选中 压缩包解开之后 里面的RNKey-Helix_Server-90.lic文件
5.然点NEXT
6.然点Accept
7.把C:\Program Files\Real\Helix Server改成d:\Helix Server
注:也可改成其它分区的路径,建议不要装在C盘
8.点NEXT
9. username:流媒体服务器WEB管理的用户名,我输aaa,然后是密码,重复输入一次密码。
10.然后一直点NEXT直到Finish
注意:第10步最好用默认的端口号,当然如果你还要在这台服务器上安装其它WEB服务器的话,你可以把HTTP Port 的端口改一下。
如果你没有用默认的端口号安装的话,比如RTSP Port端口你用的不是554而是518,那么到时你的流媒体服务器访问时就要加上518的端口号,
如:
rtsp://你的IP:518/vod/real9video.rm
如果是默认的端口号554则为
rtsp://你的IP/vod/real9video.rm
11.点OK完成安装。
12.在桌面上的快捷方式Helix Server上点右键,然后点“属性”,然后点“查找目标”,将会打开一个文件夹
13.复制 压缩包解开之后 里面的rmserver.exe文件到上面打开的这个文件夹里粘贴,然后点“是”同意替换。
14.运行一下桌面上的快捷方式Helix Server(注意不是上面目录里的rmserver.exe),然后重启电脑(如果你不想重启的话,你可以打开“控制面板”-“管理工具”-“服务”按一下键盘上的H键,找到Helix Server,然后在Helix Server上面点右键 – 点“启动服务”)
15.运行桌面上的网页快捷方式Helix Server Administrator
16.输入你安装时的WEB管理的用户名和密码
17.找到左边的Server Setup点一下
18.找到左边IP Binding点一下,在右边找到Edit IP Address 在下面输入0.0.0.0表示同意所有内网和外网IP访问(不要急,等下我们可以限制)。
19.然后点APPLY,注意每次点了APPLY都会弹出个窗口要你点“确定”,弹出窗口的意思是你要APPLY(应用)成功要重启Helix Server服务才OK。
20.右上角的Restart Server就是重启Helix Server服务器。我们点一下Restart Server,然后点“确定”即可,20秒以后如果能回到你刚才的页面则OK,不行的话你按键盘上的F5键刷新一下再重新点一下Restart Server
21.找到左边的Connection Control点他一下,在右边的Maximum Client Connections是指Helix Server服务器支持最多在线的人数,我这个最多支持10000个,因此我们就输入10000,记得要点APPLY哦,然后点Restart Server重启Helix Server服务
22.找到左边的Mount Points点一下,然后在右边找到Mount Point Description后面的“+”点它一下就会多出一个Content1
23.找到Edit Description,把下面的Content1改成VOD
24.找到Mount Point ,把下面的改成 /vod/
25.找到Base Path 点一下,在下面输入你电影的物理路径,如我的为D:\ 我就输入 D:\
流访问路径的例子:如我的“d:\”下有个目录为“D:\欧美片\魔戒\魔戒1.rmvb”
则流访问路径为rtsp://你的IP/vod/欧美片/魔戒/魔戒1.rmvb
当然也可以加载网络路径,如\\serverdy1\vod1
如果你要加载网络路径,则要把Base Path Location下的Local改成Network
这里我们不改,就用默认的Local
然后点APPLY,然后点Restart Server重启Helix Server服务
26.封IP
找到左边的Security 点一下
找到左边的Access Control点一下
在右边找到Allow all other connections点一下
找到Access Type 把Allow改成Deny,然后点APPLY,注意:点APPLY了后先不要点Restart Server重启Helix Server服务
27.开放IP
在右边找到Access Rules后的+,点一下+就会出现Rule1
在Edit Rule Description下把Rule1改个名,我改的是edy132注意必须是字母开头的,不改也可以。
找到Access Type,下面的Allow不变
找到Client IP Address or Hostname,在下面输入你想开放的IP
找到Client Netmask,这里是子网掩码,通过这里的设置,我们可以开放一个网段的IP,如果不设置则默认为None,意思就是开放你刚才在Client IP Address or Hostname下面输入的IP
找到Server IP Address or Hostname,这里设成Any,大小写都行
找到Ports ,如果你是默认安装的就输入
554,7070,1755
如果你安装时改了端口,则软入你改的端口
然后点APPLY
然后选中刚才把Rule1改名后的edy132,点“↑”把它移到Allow all other connections上面。
28.只允许本机WEB管理
在右边找到Access Rules后的+,点一下+就会出现Rule1
在Edit Rule Description下把Rule1改个名,改成ADMIN
找到Client IP Address or Hostname,输入localhost
然后点APPLY
然后选中刚才把Rule1改名后的ADMIN,点“↑”把它移到Allow all other connections上面。
29.然后点APPLY,然后点Restart Server重启Helix Server服务。
30.进行了(28、29)的操作后,你要在你桌面上的网页快捷方式“Helix Server Administrator”上面单击右键,然后点“属性”-“web文档”在url里面改一下。例如我的为:
http://xyedytest:18781/admin/index.html
我就把它改成:
http://localhost:18781/admin/index.html
要不然会访问不了WEB管理。
31.参照27加入其它你想开放的IP

IIS提示‘另一个程序正在使用此文件,进程无法访问’

IIS中网站服务所占用的是80端口,出现这样的提示我们可以判定是端口冲突造成的,故,查看真正运行的占用80端口的程序,在“运行”输入“cmd”,进入命令行,输入netstat -abn > c:/port80.txt此命令既是查询当前运行的程序所占用的端口状况,然后到c盘port80.txt文件中找到占用80端口的程序pid,记下pid。打开任务管理器,点击“查看”,选择列,勾选“PID(进程标识符)”,然后单击“进程”标签,找到80端口对应的pid,就可以看到是那个程序占用的了,更改这个程序的port,再重启这个程序,使更改生效。
再次启动iis,一切ok。
比较常见的是其他的web服务器软件占用了端口,比如apache,停掉就可以了!

怎样成为优秀的程序员

Tip 1 要方法而不是记忆
我的一个程序员朋友常跟我说记住超过200个C++函数是多么的有帮助。“我从来不必去查找函数的定义,因此我可以比其他程序员编程快上50%。”他自豪的说。可结果是什么?难道他不知道编译器的代码自动完成功能可以节约大量查找函数及输入函数的时间吗,另外当C#发布出来后,他在记忆函数上面的努力就白费了。当然,编程中对函数的熟记是一件必需的事情,但是你应当花费更多的时间在学习做事的方法上,比如说创建一个数据库连接,如何产生RSS源等,然后是关注于代码是如何实现的。学习做事的正确方法远比死记硬背重要。
Tip 2 建立属于你自己的资源库
我们都会有因为这样或者那样原因而不得不建立的代码集。我从来不记得连接数据库的准确代码语句,所以我每次都不得不在代码集中花10分钟去查询它。为了解决这个问题,我创建了一个用于记录代码片段的Word文档,以帮助我记忆和查找。我的一个同事建了个记录链接的书签,另外一个同事在他的邮件中存储了这些内容。无论你的方法是什么,都是一种可以使你方便查找到文件或内容的好习惯。当你建立你的知识库后,你会发现它将极大的帮助你去把代码写得更好和更快。
Tip 3 知道做什么而不是怎样做
很多初级程序员问我“我怎样做这个,或者我怎样做那个?”我总是会跟他们说“你想做什么呢?”听闻此言后,他们会死盯着我,就好像我跟他们的妈妈约会了一样。这就是我的下一个观点,绝不要在知道你想做什么之前去学习怎样做,比如一个程序员想要搜索一个文本文件中是否存在的某个特定的词汇。下面是用C#来实现该目的:
view plaincopy to clipboardprint?
string fileContent; System.IO.FileStream myStream = new FileStream("c:\\aa.txt", FileMode.Open); System.IO.StreamReader myStreamReader = new StreamReader(myStream); fileContent = myStreamReader.ReadToEnd(); myStreamReader.Close(); int idx = fileContent. IndexOf("string"); if (idx) { return true } string fileContent;System.IO.FileStream myStream = new FileStream("c:\\aa.txt", FileMode.Open);System.IO.StreamReader myStreamReader = new StreamReader(myStream); fileContent = myStreamReader.ReadToEnd();myStreamReader.Close();int idx = fileContent.IndexOf("string"); if (idx){return true}
现在我给他这些代码去做这件事,但是更重要的是理解自己正在试着做的是什么。在这个例子中我们想做的是:
1. 打开一个文件
2. 读其中的内容
3. 关闭文件
4. 搜索字串
5. 如果找到了则输出结果
用这个方法来解决事情产生了以下结果:
1. 它使语言无关
2. 使你的精力集中在需要做什么上
3. 使你的代码更易读和有效
知道要做什么将使你的代码更有目的性。现在在C++、PHP、VB.NET、Ruby on Rails中编写上述代码是很容易的事情了,因为你理解了要做什么而不是怎样去做。
Tip 4 创建适合你的注释风格
每一个程序员都讨厌注释,但是为了写出更有质量和易读的代码,我们需要注释。问题是大多数程序员常被告知如何注释,一些公司希望每一行代码都有注释,另外一些则想要在每个函数前面有一段注释,还有的规定在不同的代码块前注释。我并不同意这种强制性的规定,只要代码是可用的、易读的和有效的,那么程序员应当可以用其个人喜好的格式来注释。对我来说在每一行都注释将破坏代码的节奏,我更喜欢在函数的前面注释,罗列我接下来一步步将要做什么,然后在函数中参考注释中所写的步骤进行编程。这是适合我的模式,这样可以在我编程前帮助我组织设计,也保持了我的节奏,使我不会因为需要注释而在编程时中断,也有助于其他人阅读我的代码。下面是我怎样注释的例子:

view plaincopy to clipboardprint?
/* 1. Open File* 2. Read file into string* 3. Close file* 4. Search for key word* 5. If fond return true; */ string fileContent; //1. System.IO.FileStream myStream = new FileStream("c:\\aa.txt", FileMode.Open); System.IO.StreamReader myStreamReader = new StreamReader(myStream); //2. fileContent = myStreamReader.ReadToEnd(); //3. myStreamReader.Close(); //4. int idx = fileContent.IndexOf("string"); if (idx) { //5. return true; } /* 1. Open File* 2. Read file into string* 3. Close file* 4. Search for key word* 5. If fond return true;*/string fileContent;//1.System.IO.FileStream myStream = new FileStream("c:\\aa.txt", FileMode.Open);System.IO.StreamReader myStreamReader = new StreamReader(myStream);//2.fileContent = myStreamReader.ReadToEnd();//3.myStreamReader.Close(); //4.int idx = fileContent.IndexOf("string");if (idx){//5.return true;}

这种注释风格使我和大多数程序员可以容易的阅读它。那么,找一个适合你的注释风格吧。
Tip 5 精通one,学习another,关注next
有时有程序员发email问我他应该学习什么语言,什么是最好的编程语言等等。你至少应该精通一门编程语言,可以相当好的去编写代码,然后再去学习掌握另外一门,逐渐的成长。以我自己为例,我精通C#,擅长PHP,并且已经开始使用Ruby on Rails大概有一两个月了。为什么呢?精通一门语言可以使你进步,在进步中写更好的代码,找到完成任务更好的方法等。进步也是我作为一个程序员年复一年的工作,却仍没有觉得枯燥的原因。