<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx</link><description>Three examples off the top of my head of the consequences of
grovelling into and relying on undocumented structures. Defragmenting things that can't be defragmented In Windows 2000, there are several categories of things
that cannot be defragmented.
Directories,</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45486</link><pubDate>Tue, 23 Dec 2003 19:13:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45486</guid><dc:creator>Mike Dunn</dc:creator><description>I bet some of those &amp;quot;special&amp;quot; fixes (like the NMHDR one) have some very &amp;quot;colorful&amp;quot; comments attached to them. ;)&lt;br&gt; &lt;br&gt;Just curious, how do you know when to use that &amp;quot;fake stack&amp;quot; NMHDR?</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45497</link><pubDate>Tue, 23 Dec 2003 20:03:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45497</guid><dc:creator>Colen</dc:creator><description>But WHY?&lt;br&gt;&lt;br&gt;WHY do you do these things? Surely that only encourages them? If I write software that doesn't work, isn't it my responsibility to fix it, not rely on someone else to work out what on earth is going wrong and do so?</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45509</link><pubDate>Tue, 23 Dec 2003 20:44:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45509</guid><dc:creator>Braden Simpson</dc:creator><description>As an aside, why is NTFS so hell-bent on fragmenting itself? Even if I have half the harddrive available as contiguous space it seems that a large file will invariably get written across every little chunk it can find before finally encroaching upon a decent sized block. Install several large applications and you automagically end up in fragmentation city complete with harddrive thrashing performance loss...</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45510</link><pubDate>Tue, 23 Dec 2003 20:54:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45510</guid><dc:creator>Raymond Chen</dc:creator><description>Colen: Look at the scenario from the customer's standpoint. You bought programs X, Y and Z. You then upgraded to Windows XP. Your computer now crashes randomly, and program Z doesn't work at all.  You're going to tell your friends, &amp;quot;Don't upgrade to Windows XP. It crashes randomly, and it's not compatible with program Z.&amp;quot;  Are you going to debug your system to determine that program X is causing the crashes, and that program Z doesn't work because it is using undocumented window messags? Of course not. You're going to return the Windows XP box for a refund.  (You bought programs X, Y, and Z some months ago. The 30-day return policy no longer applies to them. The only thing you can return is Windows XP.)&lt;br&gt;&lt;br&gt;Braden: I don't work on NTFS; you'll have to ask somebody who does.&lt;br&gt;&lt;br&gt;</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45541</link><pubDate>Tue, 23 Dec 2003 22:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45541</guid><dc:creator>asdf</dc:creator><description>How come you guys can spot obscure things like case 3 but you can't spot blatantly obvious things like explorer drawing the treeview items 1 pixel off in the &amp;quot;Folders&amp;quot; explorer bar? Not only are there double pixels on the dotted line but the tooltips are offset.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45587</link><pubDate>Wed, 24 Dec 2003 02:12:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45587</guid><dc:creator>Colen</dc:creator><description>Raymond: Isn't this the sort of thing that compatability mode was designed for? Or would telling it to run in Windows 2000 mode (for example) not help in such cases?&lt;br&gt;&lt;br&gt;Regardless, I can see *why* you do it, it just seems like a horribly bad idea to me. Give them an inch, etc.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45590</link><pubDate>Wed, 24 Dec 2003 02:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45590</guid><dc:creator>Raymond Chen</dc:creator><description>&amp;quot;Compatibility mode&amp;quot; changes the behavior of the operating system. Things like, &amp;quot;GetVersion() reports Windows 95 (even though it's really Windows XP),&amp;quot; or &amp;quot;If you read the registry to detect what version of IE is running, you will see 4.0 (even though it's really 5.1),&amp;quot; or &amp;quot;if you call RegDeleteKey, perform a recursive deletion because that's what Windows 95 did.&amp;quot;&lt;br&gt;&lt;br&gt;It does not mean &amp;quot;Rewrite the innards of the operating system so all undocumented data structures look just like they were in Windows 95.&amp;quot;&lt;br&gt;&lt;br&gt;And &amp;quot;compatibility mode&amp;quot; doesn't help for shell extensions, since Explorer itself does not run in compatibility mode. (Compatibility mode is set for an entire process.)</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45677</link><pubDate>Wed, 24 Dec 2003 07:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45677</guid><dc:creator>Christian</dc:creator><description>&amp;gt;So I had to create a &amp;quot;fake X,Y&amp;quot; &lt;br&gt;&lt;br&gt;&amp;gt;I had to create a special NMHDR structure&lt;br&gt;&amp;gt;that &amp;quot;looked like&amp;quot; the stack the program&lt;br&gt;&amp;gt;wanted to see and pass that special &amp;quot;fake&lt;br&gt;&amp;gt;stack&amp;quot;. &lt;br&gt;&lt;br&gt;&lt;br&gt;Does this two things mean that Windows 2000 contains this stuff always?&lt;br&gt;&lt;br&gt;Did you really do that only that these two programs work? I can't believe that!&lt;br&gt;&lt;br&gt;That compatibility mode enables things like this is fully aceptable, but that windows is full of stuff that is only there for just a few programs is scaring!&lt;br&gt;&lt;br&gt;Who decided that these buggy software should work with XP? Your manager?&lt;br&gt;Is this a policy of MS that these kinds of &amp;quot;fixes&amp;quot; must be made?&lt;br&gt;&lt;br&gt;&lt;br&gt;Why don't you write an angry letter to the offending company, let them fix it and block the software via the machanismns in Windows that give you these message boxes that software is too old?&lt;br&gt;&lt;br&gt;I think the best would be to have an embedded link &amp;quot;Details&amp;quot; and if the user clicks on it Windows should tell the story what idiotic thing that ISV thought of. All those stupid trolls and computer magazines would read this notice and blame the other company and not MS.&lt;br&gt;The computer-illiterate wouldn't understand this text, but they would read that they have to go to the vendor's homepage and fix it.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45679</link><pubDate>Wed, 24 Dec 2003 08:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45679</guid><dc:creator>asdf</dc:creator><description>I agree with Christian that the vendors should fix their stuff instead of MS but that &amp;quot;Details&amp;quot; feature is like the kettle calling the pot black. Some of the API is missing so much functionality, it's not even funny. Like the built in controls not being able to respond to some style changes (yeah ES_MULTILINE and LB_SORT are really hard for them to respond to in WM_STYLECHANGED) or getting scrollbars to only appear when text overflows a box, etc., etc., etc. The only way to combat for the lack of functionality is extreme stuff like that or rewriting your own stuff from scratch.&lt;br&gt;&lt;br&gt;I think Microsoft is to blame for the first case because it should have added defragmenting from the start. It would be pretty niave to say that a company that makes defragmenting software should miss out on useful features because it has to use undocumented structures.&lt;br&gt;&lt;br&gt;The problem here is that there is no (free?) way to communicate with Microsoft developers that you're using stuff in undocumented ways and they should test against it when the OS changes so they can harass you to fix your own software when things break during testing instead of after the OS ships. If there is, then I haven't heard of it.</description></item><item><title>Can we do a better job catching undocumented behaviour?</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45686</link><pubDate>Wed, 24 Dec 2003 09:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45686</guid><dc:creator>AlisdairM</dc:creator><description>In order to get permission to use the Windows Logo selling your product, you need to pass Microsoft test process.&lt;br&gt;&lt;br&gt;Can this process not be made more aggressive, using a special version of Windows that specifically does nasty things with undocumented behaviour?  Eg modifying all 'reserved' parameters in some clear way and renaming all undocumented/unsupported APIs?&lt;br&gt;&lt;br&gt;Anything abusing the documented system is more likely to fail early.&lt;br&gt;&lt;br&gt;The thought of tying the OS of the masses to some stone age architecture to support a few abusive programmers scares me.  I suspect Win32 is a lost cause, but hope something more aggressive, along the lines above, can make it into the Longhorn process.&lt;br&gt;&lt;br&gt;Oh, and make sure MS apps (apart from those shipping with OS) pass this same test suite, or else legal will be crawling all over you!</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45691</link><pubDate>Wed, 24 Dec 2003 10:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45691</guid><dc:creator>Christian</dc:creator><description>Have you tried the checked build, AlisdairM?</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45692</link><pubDate>Wed, 24 Dec 2003 11:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45692</guid><dc:creator>David Reynolds</dc:creator><description>Why not publish documentation for all the code and structures? Then, companies and software writers can use the correct methods and interfaces to obtain what they need, rather than having to use reverse-engineering to get what they need. At least they will then know what they can and can't use, and why:- and it will sort out many of these messes.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45693</link><pubDate>Wed, 24 Dec 2003 11:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45693</guid><dc:creator>Mike Dimmick</dc:creator><description>David: it's called MSDN Library. If it's not in MSDN Library, _don't use it_!&lt;br&gt;&lt;br&gt;Actually, we all have to take a view on whether to do something unsupported. I've had to write Pocket PC programs that persist Remote Access phonebook entries across device cold boots, and set them up on installation. The RasSetEntryProperties API allows you to change the phone number, etc, but you can't set up the modem through that API. There are no APIs to configure the Unimodem TAPI driver as appropriate.&lt;br&gt;&lt;br&gt;Luckily, the Unimodem TAPI driver is included in the CE 3.0 and CE.NET Shared Source, including the appropriate data structure. However, this structure is not documented - my code could still break in future.&lt;br&gt;&lt;br&gt;I'd like there to be a public, published API for everything that the user can do through the UI, including changing locale settings, because our customers (we're a vertical-market ISV, producing custom data capture applications) need to be able to pick up a unit with a completely flat battery and wiped memory and be up and running again in minutes, with as little user intervention as possible. Forcing the user to enter an additional dial string for configuring a GPRS modem is not on the cards! Ensuring that the device is set to English (UK) locale and GMT London time zone is also required (haven't worked this one out yet).</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45741</link><pubDate>Wed, 24 Dec 2003 15:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45741</guid><dc:creator>Larry Osterman</dc:creator><description>David,&lt;br&gt;  The reason we can't publish the structures is that it precludes our changing them FOREVER.  I mean FOREVER.  There are structures in NTVDM that have existed since 1984 (or earlier) because there are apps that depend on them.  &lt;br&gt;&lt;br&gt;And Raymond has already pointed it the answer to a number of other comments:  We can't just simply mark the app as being &amp;quot;broken&amp;quot; because it's our job to make sure that as many apps as possible work.  You can't say &amp;quot;Hey, &amp;lt;Major Software Vendor's application that has millions of copies in circulation&amp;gt; isn't supported on Windows XP because &amp;lt;Major Software Vendor&amp;gt; doesn't follow the rules&amp;quot; if you actually want to ship operating systems.  The companies that use &amp;lt;Major Software Vendors'&amp;gt; products won't buy your new operating system upgrade.  Companies won't ditch their word processor just to put in an OS upgrade, they'll wait on the upgrade to keep their apps working.&lt;br&gt;&lt;br&gt;</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45759</link><pubDate>Wed, 24 Dec 2003 16:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45759</guid><dc:creator>Raymond Chen</dc:creator><description>&amp;quot;I think Microsoft is to blame for the first case because it should have added defragmenting from the start.&amp;quot;&lt;br&gt;&lt;br&gt;So you're arguing that Microsoft should not ship an operating system until every imagineable OS feature is implemented fully? By this argument, linux shouldn't have shipped ext3 because there isn't a e3defrag yet.&lt;br&gt;&lt;br&gt;&amp;quot;Why not publish documentation for all the code and structures?&amp;quot;&lt;br&gt;&lt;br&gt;That wouldn't have helped program (b). Even if they had the documentation on the internal structure, the change to the structure in Windows 2000 was caused by the *compiler*. Or are you saying that Windows should never upgrade the compiler, too?&lt;br&gt;&lt;br&gt;And, as Larry noted, this would prevent us from ever changing the structure. It turns out that in Windows XP, that very structure was changed to add new features to Explorer. Are you saying that we shouldn't have added those features? Should we just plain stop changing Explorer ever again?&lt;br&gt;&lt;br&gt;&amp;quot;I'd like there to be a public, published API for everything that the user can do through the UI.&amp;quot;&lt;br&gt;&lt;br&gt;I discussed this previously. There are some settings which intentionally have no API because that would allow bad people to manipulate them.&lt;br&gt;&lt;br&gt;&lt;a target="_new" href="http://blogs.gotdotnet.com/raymondc/commentview.aspx/441c4836-e2ef-4088-bc06-936d41886fbc"&gt;http://blogs.gotdotnet.com/raymondc/commentview.aspx/441c4836-e2ef-4088-bc06-936d41886fbc&lt;/a&gt;&lt;br&gt;&lt;br&gt;&amp;quot;Who decided that these buggy software should work with XP?&amp;quot;&lt;br&gt;&lt;br&gt;You, the customer.&lt;br&gt;&lt;br&gt;&amp;quot;Why don't you ... block the software...?&amp;quot;&lt;br&gt;&lt;br&gt;I already discussed this.&lt;br&gt;&lt;br&gt;&lt;a target="_new" href="http://weblogs.asp.net/oldnewthing/archive/2003/12/19/44644.aspx"&gt;http://weblogs.asp.net/oldnewthing/archive/2003/12/19/44644.aspx&lt;/a&gt;&lt;br&gt;&lt;br&gt;&amp;quot;ES_MULTILINE and LB_SORT are really hard for them to respond to in WM_STYLECHANGED&amp;quot;&lt;br&gt;&lt;br&gt;Actually, ES_MULTILINE is incredibly difficult to respond to WM_STYLECHANGED. You see, there are actually two different edit controls in the system, one for single-line and one for multiline. The WM_CREATE handler decides which one to create based on the style passed at creation. Changing it on the fly would mean having to replace one object with the other on the fly.&lt;br&gt;&lt;br&gt;Changing LBS_SORT on the fly means that you can create inconsistent data structures: The listbox thinks it's sorted (and therefore can use binary search and other optimizations) when in reality it isn't sorted (because you started with an unsorted listbox and then flipped the LBS_SORT bit).</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#45803</link><pubDate>Wed, 24 Dec 2003 22:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:45803</guid><dc:creator>asdf</dc:creator><description>I know they're two different objects but I don't see how hard it is to handle ES_MULTILINE, just save the handle (whatever you get from EM_GETHANDLE), create a new one, set the handle again (but don't use SendMessage, just call the internal functions to do so), and if that succeeds destroy the old one or else keep the old stuff the same. You'll be doing everything the app developer has to do except this one will keep the HWND value the same.&lt;br&gt;&lt;br&gt;Flipping the LBS_SORT bit on should assume everything is unsorted and resort everything from scratch.&lt;br&gt;&lt;br&gt;I'm not arguing MS should ship defrag stuff from the start, I'm arguing that if MS doesn't add a feature, they shouldn't complain (well... they should complain, but at least they should accept it as a fact of life) that some company had to use something extreme to get it to work because they're not going to skip out on a cool feature if it's possible for it to work. Doing it your way without touching undocumented stuff will make MS the authority of what software can and cannot do. (Though I still stand by that the NMHDR case above is just plain dumb on their part).</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#46104</link><pubDate>Sat, 27 Dec 2003 13:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:46104</guid><dc:creator>Hennk Devos</dc:creator><description>Raymond, you know that i will not agree with you on this.&lt;br&gt;I do agree fully with the NMHDR problem: This is very bad behavior of the programmers.&lt;br&gt;But you are saying that a company writing a defragger SHOULD NOT BE ALLOWED to build CERTAIN FUNCTIONALITY into their software? This is never going to happen!&lt;br&gt;As long as you don't give us, developers, certain information, we will reverse-engineer and accidents will happen.&lt;br&gt;As i argued before, why not share information on undocumented things and make it very clear that it will not work in the next Windows version?&lt;br&gt;What the defrag programmers should have done in my opinion is not start up on a newer OS on which it was not tested. Instead they could display a message: This version of our software is not working on your opersting system. Please go *here* for a free update.&amp;quot;. Then instead of Microsoft patching the OS, they could have helped the developer patch the application.&lt;br&gt;&lt;br&gt;But please please please, stop telling us which functionality we are allowed to implement for our software. This is completely unacceptable.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#46111</link><pubDate>Sat, 27 Dec 2003 16:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:46111</guid><dc:creator>Raymond Chen</dc:creator><description>If only apps that relied on undocumented behavior were always so conscientious I could be swayed. But your very own program that relies on an undocumented (and changing, as you even noticed yourself) interface &lt;a target="_new" href="http://www.codeproject.com/shell/selecticon.asp"&gt;http://www.codeproject.com/shell/selecticon.asp&lt;/a&gt; doesn't follow your own advice.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#46227</link><pubDate>Sun, 28 Dec 2003 21:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:46227</guid><dc:creator>Henk Devos</dc:creator><description>Yes i admit, i have sinned many times myself.&lt;br&gt;The article you refer to is 4 years old, and i did learn some things during that time. That's also why i want to have these discussions: Maybe we can figure out a good solution together. and a guideline that programs using undocumented functions should stop themselves from starting up on Windows versions they were not tested on might be exactly the solution we are looking for.&lt;br&gt;But you also have to admit, this function should have been documented from the start. It's a common dialog that many developers want to use.</description></item><item><title>I'd like to run Linux, but...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#46233</link><pubDate>Mon, 29 Dec 2003 01:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:46233</guid><dc:creator>Office Development, Security, Randomness...</dc:creator><description /></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#46246</link><pubDate>Sun, 28 Dec 2003 22:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:46246</guid><dc:creator>Raymond Chen</dc:creator><description>(stupid viewstate error)&lt;br&gt;&lt;br&gt;This article is much newer and doesn't do any version checks either.&lt;br&gt;&lt;br&gt;&lt;a target="_new" href="http://www.codeproject.com/shell/foldertasks.asp"&gt;http://www.codeproject.com/shell/foldertasks.asp&lt;/a&gt;&lt;br&gt;&lt;br&gt;Documenting a function isn't just writing a web page and a header file. It implies a continuing support commitment, dediciation of testing resources, and a promise that the function will continue to operate as documented for the indefinite future, even if the underlying technology changes radically. Doing this for the &amp;quot;Pick Icon&amp;quot; dialog is pretty silly, since you can always write your own. (I've done it. It's not hard.) It's not like it's impossible to write one.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#46319</link><pubDate>Mon, 29 Dec 2003 08:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:46319</guid><dc:creator>Henk Devos</dc:creator><description>It's easy to do yourself, true.&lt;br&gt;Once, on Windows NT 4, i mimicked the security dialogs (permissions etc) for my private secured objects. At that time there was no way to bring up the real security dialogs. I did this all using only documented functions. This took me lots of work to program. But then came Windows 2000 with completely changed security dialogs. This was a system specific for one company (Belgian railways) on computers dedicated to this job, so the computers never got upgraded. But if this would have been general-purpose software the result would have been unacceptable on Windows 2000 (or not even have worked).&lt;br&gt;That is the purpose of common dialogs: when users want to perform the same task, they get the same dialog on the same OS.&lt;br&gt;If Microsoft suddenly decides to give the pick icon dialog a radical new look then do i have to program several dialogs and run a different one depending on the OS?&lt;br&gt;&lt;br&gt;About the folder tasks article, it doesn't contain any sample code, let alone sample code with version checks in it. It just contains interface definitions. It mentions that it is Windows XP specific and in the comments i say it will not work on Longhorn. In the future i will be more explicit and include clear warnings that version checks are needed.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#46507</link><pubDate>Tue, 30 Dec 2003 01:21:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:46507</guid><dc:creator>Mark Hurd</dc:creator><description>For the significant companies you can sick legal on them for reverse engineering.&lt;br&gt;&lt;br&gt;Sooner or later there will be a test case on this so that we all know where we stand. With .NET this is even more important.&lt;br&gt;</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#57592</link><pubDate>Sun, 11 Jan 2004 19:39:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:57592</guid><dc:creator>Mark Hurd</dc:creator><description>Good reasons here to not use Microsoft software.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#57593</link><pubDate>Sun, 11 Jan 2004 19:41:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:57593</guid><dc:creator>Colen</dc:creator><description>Does all windows best weblog software suck this bad? &amp;lt;script&amp;gt;alert('help')&amp;lt;/script&amp;gt;</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#57598</link><pubDate>Sun, 11 Jan 2004 19:54:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:57598</guid><dc:creator>Raymond Chen</dc:creator><description>Welcome all you slashdotters. Here let me insult Windows a bit, just to save you some time.  &amp;quot;Micro$oft sux. Windoze is lame. Linux roolz. If Windows software sucks, it's Microsoft's fault.&amp;quot;</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#57650</link><pubDate>Mon, 12 Jan 2004 01:58:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:57650</guid><dc:creator>acceleriter</dc:creator><description>Was that really necessary?</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#57667</link><pubDate>Mon, 12 Jan 2004 02:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:57667</guid><dc:creator>Raymond Chen</dc:creator><description>I figured I'd get all the insults out of the way, then people who wanted to have a meaningful discussion could do so.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#58915</link><pubDate>Thu, 15 Jan 2004 11:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:58915</guid><dc:creator>Anonymous Coward</dc:creator><description>Actually, Mr. Checn, Windows software sucks because it's binary, closed-source, and written to satisfy endlessly diverse commercial interests that conflict with each other.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#58989</link><pubDate>Thu, 15 Jan 2004 15:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:58989</guid><dc:creator>Raymond Chen</dc:creator><description>&amp;quot;written to satisfy endlessly diverse commercial interests that conflict with each other&amp;quot; - that's also why it's so successful. In the real world, sometimes you have to suck to succeed.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#59147</link><pubDate>Thu, 15 Jan 2004 21:27:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:59147</guid><dc:creator>Anonymous Coward</dc:creator><description>You missed my point, which was that whether Windows sucks from a technical perspective (even though it seems inevitable given it's goal of satisfying those interests) is utterly irrelevant, because closed source software sucks period. This point is very much exemplified by the disgusting binary hacking you describe on this page. The idea of crawling up the stack to check variables is revolting, and would never happen in a non-proprietary system. I would never want to waste time on my system trying to deal with such nonsense when there are thousands of more productive, interesting things to do that don't involve playing with someone's regurgitated binary refuse.&lt;br&gt;&lt;br&gt;In &amp;quot;the real world&amp;quot;, there are better systems, that don't force you to waste time in such a manner. Unfortunately, the commercial market for software thinks differently at the moment, but I and many others like me hope it won't always be so because we think non-proprietary technology is better for everyone.&lt;br&gt;&lt;br&gt;BTW, I don't see where other (possibly slashdot-reading) folk were flaming you that &amp;quot;Windows sucks, Linux rul3z&amp;quot; so it seems to me that you wanted to instigate such a flame war with your comment.  Care to point out what you were retaliating to?</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#59152</link><pubDate>Thu, 15 Jan 2004 21:32:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:59152</guid><dc:creator>Raymond Chen</dc:creator><description>The insults started with &amp;quot;Does all windows best weblog software suck this bad&amp;quot; and &amp;quot;this sucks&amp;quot; so I thought I'd forestall them.&lt;br&gt;&lt;br&gt;So suppose you're some app and you want to do something, but after checking the source code, you find that linux won't let you it.  (Say you want some custom display behavior for the files in the directory that contains your program's data files.)&lt;br&gt;&lt;br&gt;What do you do? Do you crawl up the stack looking for the information anyway? Do you grovel around KDE's internal data structures and patch yourself in? Or do you just shrug your shoulders and say, &amp;quot;Oh well, I guess I can't do that.&amp;quot;&lt;br&gt;&lt;br&gt;What if you really *really* want to do it?</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#59169</link><pubDate>Thu, 15 Jan 2004 22:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:59169</guid><dc:creator>hughk</dc:creator><description>I had the benefit of working with another large semi-closed source operating system. I say semi, because for a long time it was possible to get source listings of many interesting bits. You found all kinds of interesting things out from the listings and if you were careful *and built in a version check* you used them. Later the listings were dropped, but there were still sources for a lot of the info like the kernel and file system data structures. You accepted that they might change, but that was it.&lt;br&gt;&lt;br&gt;I can understand your problems with people messing with undocumented stuff, but sometimes its the only option. The only thing that these guys did wrong was to forget the version sanity check.&lt;br&gt;&lt;br&gt;However, the company that was reaching down the stack frames was really doing something a little dangerous.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#59179</link><pubDate>Thu, 15 Jan 2004 22:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:59179</guid><dc:creator>Raymond Chen</dc:creator><description>Even if they had the version check, that doesn't help the customer. Customer upgrades to XP, program says &amp;quot;Sorry, this program doesn't work on XP&amp;quot;, customer returns XP to store for refund and tells all her friends, &amp;quot;Don't upgrade to XP, its compatibility is awful.&amp;quot;</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#59255</link><pubDate>Fri, 16 Jan 2004 02:55:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:59255</guid><dc:creator>Anonymous Coward</dc:creator><description>With GNU ld (guh-new el-dee, a user-space dynamic linker), you can override any library function at run-time by using the LD_PRELOAD environment.  There are some libraries that do this to add transparent compression for example, but it's mostly considered a dirty hack.  Despite that, it's much cleaner than the method described here. &lt;br&gt;&lt;br&gt;There's nothing technical that stops a software writer from engaging in those kinds of dirty hacks on a GNU/Linux or other non-prorietary system -- the only effective way to stop people from doing it is social pressure.  But it is very effective, because many people and professional distributiors would refuse to use or to distribute software that contains such dirty hacks.&lt;br&gt;&lt;br&gt;Your KDE example is not a very good one, because it's likely you could override some part of a window like the company was trying to do much cleaner way (I'm no KDE expert though).  A better example with which i'm more familiar is Linux kernel modules (device-drivers for Linux basically).  There you may have no choice but to use some dirtily-coded commercial proprietary module or you may not use your hardware. The better alternative there is to use different hardware with visible source code, but very often people are stuck.  The only effective method is again social pressure.  This method has seen some effectiveness in getting companies to distribute source code for their drivers, so that if they do include dirty hacks they can be removed.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#62393</link><pubDate>Sat, 24 Jan 2004 02:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:62393</guid><dc:creator>Ed</dc:creator><description>In the first example, the defrag program had to resort to undocumented behavior because Microsoft had the attitude of &amp;quot;NTFS doesn't need disk defragmentation, it never gets fragmented&amp;quot;.&lt;br&gt;&lt;br&gt;So when you say, &amp;quot;And then when the NTFS folks added support for defragmenting...&amp;quot;, why did they add this support???  Because the defrag programs *proved* that defragmentation was necessary.&lt;br&gt;&lt;br&gt;MS forced the defrag companies to resort to undocumented behaviors because MS refused to believe that it was necessary.&lt;br&gt;</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#63593</link><pubDate>Wed, 28 Jan 2004 00:16:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:63593</guid><dc:creator>Mark Hurd</dc:creator><description>FYI the 1/11/2004 comment (#57592) is NOT from me.&lt;br&gt;&lt;br&gt;Mark Hurd B.Sc.(Ma.)(Hons.)&lt;br&gt;</description></item><item><title>Inside the MSI file format, again.</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#70516</link><pubDate>Tue, 10 Feb 2004 12:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:70516</guid><dc:creator>when setup isn't just xcopy</dc:creator><description>Another tour of the MSI file format.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#74382</link><pubDate>Mon, 16 Feb 2004 21:39:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:74382</guid><dc:creator>D.J. Wiendels</dc:creator><description>is it posible to make (new) undocumented structures unavaialble for client software? This would stop the //only-there-for-downwards-compatibillity// stuff from piling up in the future...</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#74385</link><pubDate>Mon, 16 Feb 2004 21:45:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:74385</guid><dc:creator>Raymond Chen</dc:creator><description>Depends what you mean by &amp;quot;unavailable&amp;quot;. Remember that once you let a DLL into your process it can access anything in the process (because it is now part of the process). If you meant something else by &amp;quot;unavailable&amp;quot;, please elaborate.</description></item><item><title>First consequences of the Windows source code leak</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#74793</link><pubDate>Tue, 17 Feb 2004 17:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:74793</guid><dc:creator>Oscar's Road!</dc:creator><description>The first one, is that &amp;lt;a href=&amp;quot;http://www.securitytracker.com/alerts/2004/Feb/1009067.html&amp;quot;&amp;gt;there has already been found a security bug in IE 5&amp;lt;/a&amp;gt;. It didn't take long to find anything! :)&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br&gt;The second one is that people have had a look at the </description></item><item><title>Oscar's Road!</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#74882</link><pubDate>Tue, 17 Feb 2004 16:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:74882</guid><dc:creator>TrackBack</dc:creator><description>First consequences of the Windows source code leak</description></item><item><title>'Chinese Wall' ???</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#75200</link><pubDate>Wed, 18 Feb 2004 00:46:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:75200</guid><dc:creator>JustMe2</dc:creator><description>I love the fact that Microsoft using hidden and/or undocumented APIs is OK but if other companies use them it is wrong...&lt;br&gt;&lt;br&gt;BTW, what every happend to that 'chinese wall' that seperated the App side of Microsoft from the OS side?</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#75207</link><pubDate>Wed, 18 Feb 2004 00:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:75207</guid><dc:creator>Raymond Chen</dc:creator><description>I personally still believe in the Chinese Wall. And as an OS person, I personally disapprove of using undocumented APIs outside the OS itself regardless of who calls them.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#75216</link><pubDate>Wed, 18 Feb 2004 01:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:75216</guid><dc:creator>JustMe2</dc:creator><description>Nice to see that Microsoft court testimony about the seperations boils down to words like believe.  Why isn't it a policy?&lt;br&gt;&lt;br&gt;Also, what happend to Microsoft statements during the antitrust trail that if the sourcecode was released it would harm the security of the USA.  Then Microsoft released the code to China and Russia.  Isn't that purjury?</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#75221</link><pubDate>Wed, 18 Feb 2004 01:23:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:75221</guid><dc:creator>Raymond Chen</dc:creator><description>I do not make policy or make court statements. I was just expressing my opinion.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#80112</link><pubDate>Thu, 26 Feb 2004 00:39:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:80112</guid><dc:creator>Shaun </dc:creator><description>While I can understand your rationale, particularly given that you have to deal with the results of other programmer's mistakes, the simple fact is that users want novel functionality. If an undocumented interface or structure is required to make that functionality possible, then we have no option but to use it. &lt;br&gt;&lt;br&gt;And the truth is that I don't see why I should apologise for that, I only resort to undocumented interfaces when there is absolutely no documented way of doing what I need to do. When I do use undocumented interfaces, I write code to sanity check the environment before using the interfaces in question and to disable their use if it isn't safe.&lt;br&gt;&lt;br&gt;Obviously this is still a problem for you, since my application may stop functioning in the next release of windows, but there is simply no other option, no matter how annoying you may find it. </description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#81017</link><pubDate>Fri, 27 Feb 2004 12:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:81017</guid><dc:creator>Manuel Alves</dc:creator><description>I liked the discussion until it got onto the Linux/windows thing. I don't have any preference for each; I just want to get the job done. As for the money thing, yes it’s true; you must pay Microsoft for Windows. In Linux case you must pay some guy that runs the system. Generally I prefer to depend on one company rather than on someone that can leave the next day.</description></item><item><title>re: When programs grovel into undocumented structures...</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#157791</link><pubDate>Thu, 17 Jun 2004 03:35:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:157791</guid><dc:creator>Raymond Chen</dc:creator><description>Commenting on this article has been closed.</description></item><item><title>Microsoft kan rent faktisk finde ud af noget</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#406223</link><pubDate>Thu, 07 Apr 2005 19:12:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:406223</guid><dc:creator>SIGKILL</dc:creator><description>Hvis der er noget Microsoft kan, s&amp;amp;#229; er det at bevare bagudkompatibilitet (og derved, helt automatisk, fremadkompatibilitet). Microsoft bliver tit kritiseret for at bryde bagudkompatibilitet i nyere udgaver af deres programmer, men, helt &amp;amp;#230;rligt, det er d</description></item><item><title>Not a kernel guy &amp;raquo; ???????????????? ?????????????????????????? - ?????? ????????????????.</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#1487331</link><pubDate>Thu, 18 Jan 2007 08:16:42 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1487331</guid><dc:creator>Not a kernel guy » ???????????????? ?????????????????????????? - ?????? ????????????????.</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://blog.not-a-kernel-guy.com/2007/01/17/136"&gt;http://blog.not-a-kernel-guy.com/2007/01/17/136&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>Microsoft and backward compatibility &amp;laquo; Random Notes</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#2015495</link><pubDate>Tue, 03 Apr 2007 05:44:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2015495</guid><dc:creator>Microsoft and backward compatibility « Random Notes</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://alekseysanin.wordpress.com/2007/04/03/microsoft-and-backward-compatibility/"&gt;http://alekseysanin.wordpress.com/2007/04/03/microsoft-and-backward-compatibility/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>Martian Headsets</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#8326045</link><pubDate>Wed, 19 Mar 2008 21:26:40 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8326045</guid><dc:creator>joelonsoftware.com</dc:creator><description>&lt;p&gt;You’re about to see the mother of all flamewars on internet groups where web developers hang out. It&lt;/p&gt;
</description></item><item><title>?? ?????????????????? ?? ????????????????????. ?????????????????????? ???????????????? &amp;laquo; Sorokin88&amp;#8217;s Weblog</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#8333596</link><pubDate>Mon, 24 Mar 2008 17:56:01 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8333596</guid><dc:creator>?? ?????????????????? ?? ????????????????????. ?????????????????????? ???????????????? « Sorokin88’s Weblog</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://sorokin88.wordpress.com/2008/03/24/%d0%9e-%d0%b1%d1%80%d0%b0%d1%83%d0%b7%d0%b5%d1%80%d0%b0%d1%85-%d0%b8-%d1%81%d1%82%d0%b0%d0%bd%d0%b4%d0%b0%d1%80%d1%82%d0%b0%d1%85-%d0%9c%d0%b0%d1%80%d1%81%d0%b8%d0%b0%d0%bd%d1%81%d0%ba%d0%b8%d0%b5/"&gt;http://sorokin88.wordpress.com/2008/03/24/%d0%9e-%d0%b1%d1%80%d0%b0%d1%83%d0%b7%d0%b5%d1%80%d0%b0%d1%85-%d0%b8-%d1%81%d1%82%d0%b0%d0%bd%d0%b4%d0%b0%d1%80%d1%82%d0%b0%d1%85-%d0%9c%d0%b0%d1%80%d1%81%d0%b8%d0%b0%d0%bd%d1%81%d0%ba%d0%b8%d0%b5/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>The BBC News Redesign ramblings &amp;laquo; Content Negotiable</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#8351520</link><pubDate>Wed, 02 Apr 2008 17:32:15 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8351520</guid><dc:creator>The BBC News Redesign ramblings « Content Negotiable</dc:creator><description>&lt;p&gt;PingBack from &lt;a rel="nofollow" target="_new" href="http://daarchitect.wordpress.com/2008/04/02/the-bbc-news-redesign-ramblings/"&gt;http://daarchitect.wordpress.com/2008/04/02/the-bbc-news-redesign-ramblings/&lt;/a&gt;&lt;/p&gt;
</description></item><item><title>火星人的耳机</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#8552459</link><pubDate>Mon, 26 May 2008 17:17:20 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8552459</guid><dc:creator>阿齐</dc:creator><description>&lt;p&gt;原帖：&lt;a rel="nofollow" target="_new" href="http://www.joelonsoftware.com/items/2008/03/17.html翻译"&gt;http://www.joelonsoftware.com/items/2008/03/17.html翻译&lt;/a&gt;：&lt;a rel="nofollow" target="_new" href="http://www.newsmth.net/bbstcon.php?board=J"&gt;http://www.newsmth.net/bbstcon.php?board=J&lt;/a&gt;...&lt;/p&gt;
</description></item><item><title>火星人的耳机</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#8552466</link><pubDate>Mon, 26 May 2008 17:21:04 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8552466</guid><dc:creator>阿齐</dc:creator><description>&lt;p&gt;原帖：&lt;a rel="nofollow" target="_new" href="http://www.joelonsoftware.com/items/2008/03/17.html翻译"&gt;http://www.joelonsoftware.com/items/2008/03/17.html翻译&lt;/a&gt;：&lt;a rel="nofollow" target="_new" href="http://www.newsmth.net/bbstcon.php?board="&gt;http://www.newsmth.net/bbstcon.php?board=&lt;/a&gt;...&lt;/p&gt;
</description></item><item><title>In Defense of the IPhone API Limitations; the Compatibility Contract</title><link>http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#9083311</link><pubDate>Sat, 15 Nov 2008 04:42:12 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9083311</guid><dc:creator>Code and cars</dc:creator><description>&lt;p&gt;The iPhone API is new. It has yet to mature. Yes, it does use a very mature 20-year-old foundation steeped in the NeXTSTEP heritage as its foundation, there's a lot that was removed or didn't make the translation from AppKit/Cocoa...&lt;/p&gt;
</description></item></channel></rss>