微软“黑历史”:一个活了 45 年的愚蠢 Bug!

【CSDN编者按】微软于近期推出了Windows 10操做系统。不断压缩的更新周期下,通常而言,系统Bug的存活但愿会被很快掐灭,快速迭代。可是本文的做者在Windows 10上从一个USB 3.0 SSD向另外一个SSD拷贝文件时却遭遇了一个44年前的bug,他把这个“愚蠢”的Bug分享到了博客上,而且引发了开发者们的回忆热潮。html

640?wx_fmt=jpeg

如下为译文:编程

如今都2018年了,而这个来自于1974年的错误信息竟然还在。最新版本的Windows 10依然有这个限制,而这个bug第一次出现的时候星球大战还没上映,都跟水门事件同样老了。windows

640?wx_fmt=jpeg

这个bug出现时,超市里的东西尚未UPC条码,由于UPC还没发明。服务器

这个bug出现时,世界上只有一家电话公司,由于他们还没分家。Ted Bundy还没被抓。Babe Ruth的本垒打纪录尚未被打破。微信

这个bug出现时,幸运大转轮还没播出,也没人看过Rocky Horror。斯皮尔伯格只是一系列小众电视剧的导演,电影票房也十分糟糕。埃德蒙德·费兹杰罗号货轮仍是一堆铁矿石。app

这个愚蠢的bug出现时,教父2才刚刚在电影院中上映。dom

1.那么,这个bug到底是什么?

由于Unix(当时才仅仅5岁)发明了一个很好的点子——“一切皆是文件”,也就是说,你能够用一样的命令和指令读写套接字、管道、控制台等等。ui

这个点子是由Gary Kildall在1974年想出来的。用这个方法有不少方便之处,好比能够从串口拷贝数据到文本文件,或者直接从命令行打印文本文件。spa

在Unix中,这个点子是经过特殊目录下的特殊文件实现的,好比/dev/tty表示控制台,/dev/lp0表示第一个打印机等。/dev/zero能够提供无限的零,/dev/random能够提供随机字节,还有不少!操作系统

但有个问题:CP/M是为8位计算机设计的,这些计算机内存很小,也没有硬盘,最多也就有个8寸软驱。目录是什么?还要目录干啥。你换个软盘就好了。

但没有目录,就没办法把全部特殊文件都放在/dev/目录下了。因此这些文件实际上被放到了“全部地方”。因此,若是你要打印FOO.TXT,能够执行“PIP LST:=FOO.TXT”,就能把foo.txt拷贝到“文件”LST,而实际上这个就是打印机。

这个命令在任何地方均可以使用,由于根本没有目录!很是简单。

2.那扩展名怎么办?

这里就有问题了:程序喜欢给本身的文件加上正确的扩展名。

因此若是你运行一个程序,它问你“请输入要保存代码的文件名”时,你能够输入LST让它直接打印出来,或者输入PTP让它输出到磁带(别忘了如今是1974年!)

可是!程序可能会本身在文件名后面加上.TXT!LST.TXT不是打印机,对吧?

错了,LST.TXT也是打印机。这些特殊设备存在于全部扩展名中,这样上面的问题才不会出现。因此,若是“CON”被用来指代键盘,那么CON.TXT、CON.WAT、CON.BUG都是键盘。

额……这确实是个hack,但就是好使,并且这只不过是只有4k内存的微型计算机,谁在意呢?

3.IBM、微软等巨头的加入

结果70年代末到80年代初CP/M普遍流行。

它是最主要的商用操做系统之一。它定义了一套接口,你能够用这套接口在NorthStar Horizon上写CP/M代码,而后放到Seequa Chameleon上运行(注:二者都是计算机的型号)。

因为它缺乏图形标准,因此没法进入游戏市场(虽然有一些Infocom的东西),因此主要是用于商用。但它实在太流行了,因而IBM很天然地但愿在80年代早期的“我的电脑”项目上使用它。

因而IBM计划在IBM我的电脑发布时支持几种操做系统,其中CP/M是最主要的那个。但CPM的x86版直到IBM我的电脑发布六个月以后才出现……并且价格是感人的$240,相比之下DOS只要$40。

因此绝大部分用户选择了微软的PC-DOS,这个产品曾经是由Seattle Computer Products开发的一个划时代的新操做系统。微软买下了Tim Paterson的这个项目,并在其基础上开发了PC-DOS(后来更名为MS-DOS)。

Tim Paterson的操做系统叫作“QDOS”,意思是“Quick and Dirty Operation System”——“快速、肮脏的操做系统”。缘由基本上是由于CP/M尚未x86版,QDOS就是为了解决CP/M的一些问题而出现的。因此,不少方面都借鉴了CP/M。

其中主要的一点就是借鉴了不使用目录来操做特殊文件的点子,由于在CP/M中这个功能颇有用。因而QDOS和PC-DOS 1.0中也有AUX、PRN、CON、LPT等等!

4.结果问题来了

1983年随着IBM XT一块儿发行的PC-DOS 2.0中的大部分被微软重写了。由于IBM XT带硬盘,因此PC-DOS须要支持目录。显然,一个10MB的硬盘须要目录来组织文件!

但问题来了:用户在两年前PC DOS 1.0时就开始使用这些特殊文件名了。许多软件都用了这些特殊文件名!各类批处理文件也须要它们。因此,尽管有了目录以后微软能够建一个C:DEV目录,但他们没有这样作。

这种牺牲可用性来知足向后兼容性的事情毫不是最后一次。特殊文件依然适用于全部目录,全部扩展名。因此“DIR > LPT”来打印目录的技巧不会因为你从A:切换到了C:DOS就不能用了。

可是,咱们如今早就不用DOS 2.0了……Windows 95是基于DOS的,因此很天然地继承了这一行为。(固然Windows 1/2/3也继承了,但与它们相比,Win95才是真正意义上的操做系统。)

可是,咱们如今早就不用Windows 95了!如今的Windows是基于Windows NT的,不是Win95。

但Windows NT想要与DOS/Windows程序兼容。而XP合并了两条产品线,因此这些特殊文件依然存在——这时距离这个bug出现已通过去44年了!

你能够本身试试看!打开文件管理器,新建一个文本文件,命名为con.txt、aux.txt、prn.txt。

但Windows不会让你这么干的:

640?wx_fmt=png

这都是由于Gary Kiddal说“特殊文件表示硬件设备!Unix的这个点子很不错。我要把这个点子实如今个人玩具操做系统中”……那一年出生的人的孩子都长大成人了,但咱们仍然不能建con.txt……

微软给出的官方列表是:

CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9

https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file

更有意思的是,在Win95上访问C:concon(或C:auxaux)会直接致使蓝屏。即便在1995年这也很是荒谬,由于这个bug已经21岁了!你能想象一个错误的设计会如此长寿么?

640?wx_fmt=png640?wx_fmt=png

福利:下面这张图是Tim Paterson在今年8月的VCF:W上介绍DOS的历史。

640?wx_fmt=jpeg

至于为何我发现了这个没法拷贝文件的bug……这些特殊文件名是在操做系统级别实现的,而不是文件系统级别。因此这些文件名彻底是合法的NTFS文件名,而我在Linux下使用这些NTFS文件系统。

并且显然OS/2也没有实现这些特殊文件名,由于IBM在OS/2 devcon磁盘上发布的一些opengl头文件中有个文件叫AUX.H。

640?wx_fmt=png

因此我今天想把这个NTFS盘备份到主PC上而后惊喜地发现,我没办法拷贝全部文件,而形成这个问题的bug的年龄比全部读者都大……

5.内容纠错

抱歉我这几天要么在医院里,要么在睡觉,好不容易才有机会上来更新一下:

1.CP/M对于特殊文件的处理方式其实不像我说的那么简单,因此我一直也没学会,也有可能学会了而后忘了。其实特殊文件后面要有个冒号,就跟盘符同样。好比PRN:是打印机,而PRN不是。

2.CP/M并不像DOS那样在操做系统层次实现!CP/M中是在PIP(文件复制)命令中实现的。因此没办法像DOS那样让程序直接保存到PRN.TXT进行打印。我可能没说清楚,我想说的是DOS,没有暗示CP/M也能这样作。

3.PC DOS 1其实没有重定向或管道,因此没办法像我说的那样作重定向。我忘记了。这些功能是1983年在PC DOS 2.0中加入的。但PC DOS 1的确支持从特殊文件中拷贝或拷贝到特殊文件,因此我说的大方向是对的,虽然例子搞错了。

不论如何,感谢你们的回复!我没想到这篇文章能这么火,其实它只是我在遇到一个44年的bug以后感到很无力而已。

并且我想重申,这篇文章并非想说“Windows很垃圾”。通常来讲,向后兼容是很好的。实际上我但愿看到更多向后兼容。

我只是以为,在Windows 10上从一个USB 3.0 SSD向另外一个SSD拷贝文件时,遇到个44年前的bug很奇妙。

就像你在宇宙空间站中被马踢了同样。

6.开发者的见解

Hacker News上的不少开发者对于这个45岁的bug发表了本身的见解。

评论1:

好怀念那时的互联网……当时咱们常常搜索21端口,就能找到不少开放了匿名FTP权限的机器,其中不少机器都是Windows的。

咱们在这些匿名FTP上常用的“技巧”是:用这些特殊文件名建立一些嵌套的目录。在FTP服务器上,你能够建立这些目录,也能够访问它们(只要你知道正确的路径),但Windows下这些目录会致使错误,或者访问时会形成系统崩溃。再加上你能够建立文件名中只有空格的目录,因此能够在匿名FTP上放不少东西而不被管理员发现。

评论2:

咱们高中的实验室中用的是Windows For Workgroups 3.11,咱们用Alt+255(这个字符在DOS下像个空格,但在Windows下是隐藏的)来隐藏Doom、Descent还有不少其余DOS游戏的安装文件。

实验室管理员禁用了Ctrl+C和Ctrl+Break来防止有人退出DOS下的登陆提示符直接进入C:,但我不知怎么发现了Alt+3也能输入一样的字符,起到一样的做用。

只有一次有个老师对我喊“在实验室里待了太长时间”,但我历来没被抓到过。我以为管理员(上了点年纪的编程和数学老师)应该知道咱们在干什么。

评论3:

好玩的是那些“COM”、“LTP”等后面加数字的……或者至少加上个像是数字的Unicode,因此COM²跟COM2同样不能用。

这种设备映射是在Win32层进行的,而不是NT内核上,因此你可使用“verbatim path syntax”来越过这些规则。例如,“C:TempCOM2.TXT”是特殊设备,而“\?C:TEmpCOM2.TXT”就是个普通文件,彻底能够正常读写……但像文件管理器这种没使用verbatim path syntax的程序就会报错。

原文:https://threadreaderapp.com/thread/1058676834940776450.html

做者:foone

译者:弯月,责编:郭芮

 


“征稿啦”

CSDN 公众号秉持着「与千万技术人共成长」理念,不只以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让全部的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。

若是你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新看法,欢迎联系 CSDN 投稿,联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱(guorui@csdn.net)。