29

When Windows 1.01 is started under DOSBox, FreeDOS or one of the later versions of MS-DOS, garbage characters are printed on the screen right after displaying the Microsoft logo. Here’s an example in MS-DOS 5.0:

Windows 1.01 crashing at the splash screen, with a message ‘Incorrect DOS version’, followed by garbage text including the strings ‘Windows System Insert disk in Change Disk FatalExit code = stack overflow’

Afterwards, Windows starts normally, and seemingly works fine.

How serious is this crash? Is there a way to prevent it?

3
  • 14
    FatalExit code = stack overflow
    – CJ Dennis
    Aug 24 at 22:27
  • 24
    It's almost as if the website took its name from a common error message. Aug 25 at 8:08
  • 3
    Yeah, I think this should be turfed to SO! Aug 25 at 8:32
58

This is a botched version check error message.

Windows 1.x was designed to run under MS-DOS 2.0, 3.0 and 3.10; to ensure it only runs under one of these, it performs a version test on its host DOS. Windows does not merely obtain the officially-advertised version number; to ensure the version number is not spoofed, it also tests whether certain fields of the DOS data segment are found at the expected addresses. When one of these checks fails, the beta version of Windows displays a message detailing the specific check that failed to pass:

Windows 1.0 Beta crashing with the message ‘Incorrect DOS versionDisk transfer address does not match’

In the final release of Windows, these detailed messages were hastily removed. The code that would print them, however, was not, and this is what produces the garbage output. We can see this in the disassembly of WIN100.BIN:

-u 7359:7004
7359:7004 B430              MOV     AH,30
7359:7006 CD21              INT     21
7359:7008 3C02              CMP     AL,02
7359:700A 7204              JB      7010
7359:700C 3C04              CMP     AL,04
7359:700E 7203              JB      7013
7359:7010 E9A002            JMP     72B3
-u 7359:72b3
7359:72B3 50                PUSH    AX
7359:72B4 B87C6E            MOV     AX,6E7C
7359:72B7 0E                PUSH    CS
7359:72B8 50                PUSH    AX
7359:72B9 E8DAFB            CALL    6E96
7359:72BC 58                POP     AX
7359:72BD 0E                PUSH    CS
7359:72BE 50                PUSH    AX
7359:72BF E8D4FB            CALL    6E96
7359:72C2 B8926E            MOV     AX,6E92
7359:72C5 0E                PUSH    CS
7359:72C6 50                PUSH    AX
7359:72C7 E8CCFB            CALL    6E96
7359:72CA 33C0              XOR     AX,AX
7359:72CC 1F                POP     DS
7359:72CD 07                POP     ES
7359:72CE 5F                POP     DI
7359:72CF 5E                POP     SI
7359:72D0 C3                RET
-d 7359:6e7c
7359:6E70                         -            49 6E 63 6F             Inco
7359:6E80  72 72 65 63 74 20 44 4F-53 20 76 65 72 73 69 6F rrect DOS versio
7359:6E90  6E 24 0D 0A 24 CF 55 8B-EC 1E B4 09 C5 56 04 CD n$..$.U......V..
7359:6EA0  21 1F 8B E5 5D C2 04 00-55 53 45 52 00 53 59 53 !...]...USER.SYS
7359:6EB0  54 45 4D 00 23 31 00 23-32 00 4B 45 59 42 4F 41 TEM.#1.#2.KEYBOA
7359:6EC0  52 44 00 23 35 00 56 57-0E 1F B8 20 35 CD 21 89 RD.#5.VW... 5.!.
7359:6ED0  1E 76 00 8C 06 78 00 B8-21 35 CD 21 89 1E 7A 00 .v...x..!5.!..z.
7359:6EE0  8C 06 7C 00 B8 24 35 CD-21 89 1E 7E 00 8C 06 80 ..|..$5.!..~....
7359:6EF0  00 B8 27 35 CD 21 89 1E-82 00 8C 06             ..'5.!......

At address 6E96 is a simple wrapper around DOS’s ‘print string’ system call. When the version number check fails, control flow jumps straight to the fragment which displays the ‘Incorrect DOS version’ message, and then whatever happens to be in the code segment at the offset held in AX. (In this case, AX happens to hold the DOS version number, so you could in principle guess what DOS version Windows crashed on based on what is displayed on the screen.) In the beta release, between those two there is an additional MOV AX instruction that sets the other string to ‘DOS 2.0 or greater required’.

The remedy is clear now: you need to downgrade your DOS to a version supported by Windows 1.x. Although it just so happens that later versions of MS-DOS are sufficiently similar to 3.10 to allow the other version checks to pass, which means that spoofing the version number should work fine as well. For that purpose you can use the command ver set 3 10 (in DOSBox), callver 3.10 (FreeDOS) or setver win100.bin 3.10 (MS-DOS, rebooting afterwards).

As to why the version check was there in the first place, I cannot say for sure. While later shenanigans with the infamous AARD code buried inside Windows 3.1 (and a similar, somewhat more obscure check found in other products) might suggest this might have been an anti-competitive measure, personally I find this rather doubtful. Windows 1 was released in 1985, whereas Microsoft’s anti-competitive efforts only began a few years later, after the release of the newly-rebranded DR DOS in 1988. Where the error message in Windows 1 beta helpfully pinpointed the exact version test that failed, the AARD code message was deliberately vague and cryptic, meant to provoke uncertainty; the code itself was also obfuscated. Given that, I presume Windows 1 verified the DOS version not to sabotage DR DOS (which did not even exist under that name back then), but because it relied in some places on implementation details that weren’t part of the official API surface, presumably for performance reasons. (Which still makes it rather sketchy: we are simply lucky that those details were preserved intact until the very end of the MS-DOS line.)

Anyway, it would have been pretty ironic if the Windows 1.01 version check were put in place to harm competition, as Windows 1 actually runs fine under DR DOS 6 (whose ‘get version’ syscall reports it as PC DOS 3.31), while under the roughly contemporaneous MS-DOS 6 (which does not spoof the version number) it crashes like described above.

2
  • 6
    <en.wikipedia.org/w/…>: Blue error screens have been around since Windows 1.0; if Windows found a newer DOS version than it expected, it would generate a blue screen with white text saying "Incorrect DOS version" followed by a list of loaded kernel modules and their respective memory addresses — Wikipedia, impeccable as usual Aug 25 at 8:04
  • 2
    The funniest part of that article is that they spend a whole subsection dunking on news media getting a pretty minor history detail wrong, while the rest of the article is a chaotic mess of unsubstantiated hearsay like this, correct mostly by accident Aug 25 at 12:30
-1

In order to harm competition, according to Nostalgia Nerd's Windows’ Hidden Self Destruct Code YouTube video.

Windows was released in 1985. MS-DOS 5.0 in 1991. I guess Windows 1 was only supported for 5 years. Microsoft did the same to cheaper and better DR-DOS in the '90s.

What the guy is supposed to do is feel uncomfortable, and when he has bugs, suspect the problem is DR-DOS and then go out to buy MS-DOS, or decide not to take the risk for the other machines he has to buy in the office

 — from Nostalgia Nerd's video.

7
  • 12
    I don't think so. <os2museum.com/wp/how-to-void-your-valuable-warranty> suggests Microsoft wasn't too worried about MS-DOS clones until 1988. The code in Windows 1, unlike the AARD code, isn't obfuscated at all, and the beta error message even helpfully tells you which version test failed, unlike the obfuscatory language found in later, anti-competitive version checks. This suggests that the check was there primarily for a technical reason after all. This time. Aug 25 at 7:42
  • 4
    Raymond Chen's articles about Windows "sucking the brains out of DOS" on load give credence to the "technical reason" idea. Windows directly reads data structures from DOS's memory, so it needs to be sure that each memory address it reads contains what it expects it to contain.
    – Medinoc
    Aug 25 at 10:05
  • 7
    In fact, Windows 1.0x will start without errors on DRDOS 6 where it will error on MSDOS 6.
    – john_e
    Aug 25 at 10:59
  • 3
    I'm sure your answer's nice, but please include text as text (not images) and give a source citation. Your only source appears to be a youtube link: please describe why that link's important and why it contains useful information. I'm not going to follow a random youtube link without a clue what it's for
    – scruss
    Aug 28 at 22:40
  • 2
    @CeesTimmerman - the edits I made are what I was suggesting. Some of us can't read text that's an image
    – scruss
    Aug 30 at 17:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.