2018-02-23 18:58:03 +00:00
|
|
|
|
---
|
|
|
|
|
created_at: '2015-07-11T18:38:51.000Z'
|
|
|
|
|
title: Zombie Operating Systems and ASP.NET MVC (2009)
|
|
|
|
|
url: http://bitquabit.com/post/zombie-operating-systems-and-aspnet-mvc/
|
|
|
|
|
author: kreeben
|
|
|
|
|
points: 78
|
|
|
|
|
story_text: ''
|
|
|
|
|
comment_text:
|
|
|
|
|
num_comments: 15
|
|
|
|
|
story_id:
|
|
|
|
|
story_title:
|
|
|
|
|
story_url:
|
|
|
|
|
parent_id:
|
|
|
|
|
created_at_i: 1436639931
|
|
|
|
|
_tags:
|
|
|
|
|
- story
|
|
|
|
|
- author_kreeben
|
|
|
|
|
- story_9871014
|
|
|
|
|
objectID: '9871014'
|
2018-06-08 12:05:27 +00:00
|
|
|
|
year: 2009
|
2018-02-23 18:58:03 +00:00
|
|
|
|
|
|
|
|
|
---
|
2018-03-03 09:35:28 +00:00
|
|
|
|
In 1973, an operating system called CP/M was born. CP/M had no
|
|
|
|
|
directories, and filenames were limited to 8.3 format. To support input
|
|
|
|
|
and output from user programs, the pseudofiles `COM1`, `COM2`, `COM3`,
|
|
|
|
|
`COM4`, `LPT1`, `LPT2`, `CON`, `AUX`, `PRN`, and `NUL` were provided.
|
2018-02-23 18:19:40 +00:00
|
|
|
|
|
2018-03-03 09:35:28 +00:00
|
|
|
|
In 1980, Seattle Computer Products decided to make a cheap, approximate
|
|
|
|
|
clone of CP/M, called 86-DOS. 86-DOS therefore had no directories,
|
|
|
|
|
supported 8.3 file names, and included the pseudofiles `COM1`, `COM2`,
|
|
|
|
|
`COM3`, `COM4`, `LPT1`, `LPT2`, `CON`, `AUX`, `PRN`, and `NUL`. Further,
|
|
|
|
|
because many programs always saved their files with a specific
|
|
|
|
|
extension, [any file with these names and an extension was treated as
|
|
|
|
|
identical to the filename without the
|
|
|
|
|
extension](http://blogs.msdn.com/oldnewthing/archive/2003/10/22/55388.aspx).
|
2018-02-23 18:19:40 +00:00
|
|
|
|
|
2018-03-03 09:35:28 +00:00
|
|
|
|
In 1981, Microsoft Corporation purchased the rights to use 86-DOS,
|
|
|
|
|
renamed it MS-DOS, and shipped it to customers.
|
2018-02-23 18:19:40 +00:00
|
|
|
|
|
2018-03-03 09:35:28 +00:00
|
|
|
|
In 1983, Microsoft Corporation released MS-DOS 2.0. MS-DOS 2.0 supported
|
|
|
|
|
hierarchical directories. To maintain backwards compatibility with
|
|
|
|
|
applications designed for MS-DOS 1.0, which had no concept of
|
|
|
|
|
directories, Microsoft placed the pseudofiles `COM1`, `COM2`, `COM3`,
|
|
|
|
|
`COM4`, `LPT1`, `LPT2`, `CON`, `AUX`, `PRN`, and `NUL`, with all
|
|
|
|
|
possible extensions, in all directories.
|
|
|
|
|
|
|
|
|
|
In 1988, Microsoft began the development of a modern, preemptively
|
|
|
|
|
multitasked, memory-protected, multiuser system loosely based on VMS,
|
|
|
|
|
called Windows NT. Windows NT supported a completely new file system
|
|
|
|
|
design, called NTFS, modeled on OS/2’s HPFS, which allowed for arbitrary
|
|
|
|
|
file names in Unicode UCS-2. To maintain backwards compatibility with
|
|
|
|
|
DOS applications running under the new operating system, some of which
|
|
|
|
|
were written before DOS had hierarchical directories, Windows NT placed
|
|
|
|
|
the pseudofiles `COM1-9`, `LPT1-9`, `CON`, `AUX`, `PRN`, and `NUL`, with
|
|
|
|
|
all possible extensions, in all directories. Windows NT shipped to
|
|
|
|
|
customers in 1993.
|
|
|
|
|
|
|
|
|
|
In 1998, Microsoft released the Option Pack to the two-year-old Windows
|
|
|
|
|
NT 4.0, containing a new technology called Active Server Pages, or ASP.
|
|
|
|
|
ASP allowed the creation of dynamic websites via COM scripting. Because
|
|
|
|
|
ASP was file-based, URLs by definition could not include `/com1-9.asp`,
|
|
|
|
|
`/lpt1-9.asp`, `/con.asp`, `/aux.asp`, `/prn.asp`, or `/nul.asp`.
|
|
|
|
|
|
|
|
|
|
In 2002, Microsoft announced the imminent release of the .NET framework.
|
|
|
|
|
One component of .NET was ASP.NET, a vast improvement over ASP. Although
|
|
|
|
|
ASP.NET provided vastly superior ways to write web pages than those
|
|
|
|
|
provided by ASP, the mechanism was still completely based on per-file
|
|
|
|
|
web pages—and although this mechanism could be overridden by various
|
|
|
|
|
means, for backwards compatibility reasons, ASP.NET always checked for
|
|
|
|
|
the existence of a file first before attempting to execute a custom
|
|
|
|
|
handler. Thus, web pages could not contain `/com[1-9](\..*)?`,
|
|
|
|
|
`/lpt[1-9](\..*)?`, `/con(\..*)?`, `/aux(\..*)?`, `/prn(\..*)?`, or
|
|
|
|
|
`/nul(\..*)?`.
|
|
|
|
|
|
|
|
|
|
In 2009, Microsoft released ASP.NET MVC, a thoroughly modern, orthogonal
|
|
|
|
|
web framework supporting the most up-to-date understanding of how to
|
|
|
|
|
architect well-factored, scalable web applications. ASP.NET MVC broke
|
|
|
|
|
free of the per-file emphasis of previous frameworks, instead
|
|
|
|
|
emphasizing regex-based URL dispatching, similar to popular scripting
|
|
|
|
|
frameworks such as Django, Rails, and Catalyst. These URLs did not map
|
|
|
|
|
to files; they instead mapped to objects that were designed to handle
|
|
|
|
|
the request. Thus, URLs could be built entirely on what made logical
|
|
|
|
|
sense, rather than on the confines of what the file system dictated.
|
|
|
|
|
|
|
|
|
|
But ASP.NET MVC was based on ASP.NET. Which checks for the existence of
|
|
|
|
|
a file before running any scripts. Which means it will check directories
|
|
|
|
|
that have `COM1-9`, `LPT1-9`, `CON`, `AUX`, `PRN`, and `NUL` in them,
|
|
|
|
|
with any extension.
|
|
|
|
|
|
|
|
|
|
And that is why, in 2009, when developing in Microsoft .NET 3.5 for
|
|
|
|
|
ASP.NET MVC 1.0 on a Windows 7 system, [you cannot include
|
|
|
|
|
`/com\d(\..*)?`, `/lpt\d(\..*)?`, `/con(\..*)?`, `/aux(\..*)?`,
|
|
|
|
|
`/prn(\..*)?`, or `/nul(\..*)?` in any of your
|
|
|
|
|
routes](http://stackoverflow.com/questions/987105/asp-net-mvc-routing-vs-reserved-filenames-in-windows).
|