这是Larry Osterman系列的最后一篇,LO要与大家说再见了。再见的意思是,再也不见。
2009.8.25
1986年8月25日,LO正忙于开发MS-DOS 4.1。MS-DOS 4.0的软盘驱动程序在拥有超过2个软驱的主机上无法正常工作,而他们无法对此进行测试,因为手头所有的主机都没有4个软驱。
瞧,这就是MS-DOS 4.0,你懂的。
2009.8.26
二十四年前的今天
1985年8月26日,LO正忙着开发MS-DOS 4.0,这是MS-DOS 2.0的多任务版本。这年,LO和他的同事们将MS-DOS 3.1的增强特性揉进了MS-DOS 4.0。
下面这段有意思,以LO的第一人称视角意译转述。
1985年夏天,我与Valorie有工作上的交集,她在Windows和Word团队担任测试工程师,主要是测试打印机驱动程序,直到12月离开。12月我向她求婚,她接受了我的求婚。大约一年后,1987年1月我们结婚了。(此处应有掌声)
scz:
好吧,MS-DOS 4.0是微软历史上没什么存在感的版本,后来的Win97、WinMe也好不到那儿去。MS-DOS 3.1和5.0是成功典范,Win95、Win98也是成功典范。93年我们用的要么是MS-DOS 3.1,要么是MS-DOS 5.0。好像微软有这个特点,在两个成功版本中间夹个失败版本。有人觉得Vista成功吗?此外,MS-DOS的多任务能是个啥,只能是TSR。如果你跟我是同时代的程序员,TSR三个字母是否将你拉回到青春飞扬的岁月,可能应该说"爷青回"?
2010.5.26
LO有台老旧的电脑,上面保存有1993年随NT 3.1出场的Win32 SDK,他在其中翻看最早的RPC文档,以便与他的老板争论.idl文件中size_is的含义是啥,他这次的老板是DCE/MS RPC的主力开发人员。最终他赢了,MSDN做了修正。不知他2010年的老板跟他1991年的老板是同一人否,应该不是。
2011.5.3
1991年LO为NT 3.1开发了bowser.sys,就是著名的Computer Browser服务的内核态组件,接收并处理子网内其他主机广播过来的mailslot消息。
细心的读者会发现,驱动名是bowser.sys,而不是想像中的browser.sys。该驱动某些情况下会在eventvwr.msc中产生一条日志,其内容形如
The browser driver has received too many illegal datagrams from the remote computer xxx to name yyy on transport NetBT_Tcpip_*. The data is the datagram. No more events will be generated until the reset frequency has expired.
但日志列表中"来源"列显示的不是browser,而是bowser。
$ dir C:\Windows\System32\drivers\bowser.sys
在资源管理器中查看bowser.sys的属性,在"详细信息"中有
File description NT Lan Manager Datagram Receiver Driver
Original filename browser.sys
有意思,微软知道"它"应该叫browser.sys,但在文件系统中仍然起名bowser.sys。
Win10 LTSB版本还有这个服务,用户态组件是browser.dll。
$ sc qc Browser
[SC] QueryServiceConfig SUCCESSSERVICE_NAME: Browser
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\Windows\System32\svchost.exe -k netsvcs
LOAD_ORDER_GROUP : NetworkProvider
TAG : 0
DISPLAY_NAME : Computer Browser
DEPENDENCIES : LanmanWorkstation
: LanmanServer
SERVICE_START_NAME : LocalSystem
$ reg.exe query "HKLM\SYSTEM\CurrentControlSet\services\Browser\Parameters" /v "ServiceDll"
ServiceDll REG_EXPAND_SZ %SystemRoot%\System32\browser.dll
但更多其他版本Win10已无这个用户态组件,services.msc中没有Browser服务。
1991年LO初次开发bowser.sys时,他当时的老板相当固执。LO为其介绍bowser.sys的功能时,老板吼道:“真是条狗!我们为什么不称它为bowser?”当时调试子系统中有组件已经名为browser,程序员们不想更改调试组件的名称,于是新增的Browser服务最终定名bowser。换句话说,这是条狗的名字,同时也是那批才华横溢却又不乏幽默的程序员们在时间长河中留下的彩蛋。
除了30年前的当事人们知道此事的来龙去脉,绝大多数"外人"并不清楚背景,以至于不断有人反馈这个"拼写错误"给微软,其中包括微软其他技术团队的成员。2006年LO为此写了篇blog解释此事。2011年又有人写信指出"拼写错误",LO又写了篇blog做了一个搞笑的回复:“这让我很崩溃!如果知道自己真地会在之后20年里为那个笑话所困扰,我会重新考虑的。可以把它作为一个教训,避免在您的代码中使用幽默的名字,否则您将在接下来的20年甚至更长时间内回答有关它们的问题。如果我将驱动胡乱命名为brwsrhlp.sys(当时文件名有8.3限制),而不是bowser.sys,永远不会有人提出任何问题。但我选择了一个有点可爱的名字,然后……”LO发完这篇blog后,有人回复指出bowser.sys的文件属性里点出了"真名"browser.sys,LO又感慨了一番:“他们是对的。据我所知,在过去的20年里,没有人注意到……”。
scz:
我想说,30年后我注意到了,没看过2011年blog之前。此外,我对不起LO,每次给别人加固系统时都会禁用该服务,除了有限的几次调试Exploit时,我从未在非测试环境中开启过该服务。该服务是"网络邻居"的底层支撑组件,二十年多年前刚用上Win95的我总是把"网络邻居"更名成"敌人们"。本想吐槽该服务的,但既已知道是技术前辈开发的,作罢。
2011年,深受"拼写错误"反馈困扰的LO写了第三篇与之相关的blog。
20年前,我将此日志消息添加到Browser服务中,以检测在子网内疯狂发送垃圾消息的主机。初衷是,这些日志指向的源头出错了,程序员或网络工程师应该调查一下,这些垃圾消息通常是由网络硬件故障引起的,20年前这种情况并不少见。但是你会发现,人们只是反馈日志的来源有"拼写错误",他们从不费心查看这条日志的内容,看看是否有值得报告的内容。无人费心阅读日志内容的部分原因是,太多组件生成日志,日志中充斥着大量无意义的内容,比如,某某服务已启动,某某服务已停止。客户不愿意查看日志内容,因为看也白看,什么也做不了。此处有个非常重要的经验教训,没人会费心阅读日志,因为日志中噪音太多。因此,当你打算写日志时,请认真考虑一下,这条日志真地值得生成吗,日志中是否包含对客户有价值的信息?除非你有办法上传排查日志供日后分析,否则生成日志有无作用尚不明朗。我知道有些企业管理解决方案确实会上传日志、集中分析。
LO这槽吐得666。
至于那条狗,时至今日,为了保持向后兼容性,微软无意改变所谓的"拼写错误"。
2015.11
最近看Windows调试子系统相关的一件事,从Alex Ionescu那儿注意到微软程序员Larry Osterman的blog
https://docs.microsoft.com/en-us/archive/blogs/larryosterman/
Alex Ionescu说Larry Osterman是他最喜欢的微软blogger之一。如果一个神人如此提及谁谁,大概率后者的blog值得围观。我去拜读了一番,果然是个有趣的灵魂。可惜更新于2015.11戛然而止,现在应该是退休了?