The BurgerMaster segment may have been legendary, but some legends aren’t true

Raymond Chen

Raymond

Some time ago, I discussed the historical significance of the Burgermaster drive-in restaurant. This triggered a memory from one of my colleagues:

I also heard that the BurgerMaster was identified by an ordinal value, and that ordinal value was the telephone number of the restaurant.

That sounds like a fun story. Alas, it doesn’t hold up.

The Get­Proc­Address function checks the numeric value of the string pointer it is given. If it is greater than or equal to 65536, then it is interpreted as a string pointer. But if it is less than 65535, then it’s treated as an ordinal. Therefore, ordinal values are limited to 65535. That’s not enough digits to hold a U.S. telephone number.

The Global­Master­Handle function was exported as ordinal 28. There does not appear to be any significance to this number. It was just the next available ordinal in the block assigned to global memory functions.

4 comments

Comments are closed. Login to edit/delete your existing comments

  • Avatar
    Peter Cooper

    Is there any chance that “28” was the company-wide speeddial number that Burgermaster was assigned to? (Like you’d hit “speeddial-2-8” or the like, depending on how the phone system did speeddials?) Or maybe it was just the last two digits of the full phone number (by coincidence or not)?

    I’m in my 30’s and I remember as a child only needing to dial 4 digits when calling within the same exchange, so it is possible that a phone number would fit within 16 bits, even if it was a phone number only usable within Microsoft’s geographic area. I don’t know the exact timing of that, though, and I don’t live near Washington so things may have been different there.

  • Avatar
    cheong00

    On the other hand it will sound more realistic if the tale is “I also heard that the BurgerMaster was identified by an ordinal value, and that ordinal value was the last 4 digits of telephone number of the restaurant.”

    It’s very common for big companies to allocate a block of continuous phone numbers for their PBX phones. It’s quite doable to just allocate a block of numbers and assign forwarding to restaurants according to the internal ordinal number of it.”

  • Avatar
    Neil Rashbrook

    Ah yes, the good old days, when memory was so tight that you preferred to import functions by ordinal instead of name. I think you could probably go one better than GetProcAddress(GetModuleHandle("KERNEL"), "28") by using MAKEINTRESOURCE(28) instead. Or you could always manually import it in your .DEF file; I’ve done that before when I was using an old version of MSVC for Windows 3.0 but I wanted to import Windows 3.1 functions.

    • Ivan K
      Ivan K

      Sorry for nitpicking or completely missing a joke, but makintresource(28) would do a

      ((LPSTR)((ULONG_PTR)((WORD)(28)))

      , without the _PTR in the olden days #define I guess.
      I think it was pointed out here before somewhere that the first 64k of memory was reserved so that’s how a number instead of a string pointer into memory could be detected.
      I’m guessing this is safer and quicker than parsing the string for total value between “min” and “max” (and restrict to decimal digits to avoid identifier confusion).