Background Info
So on Windows 7 and later there is a menu that opens when one presses control + alt + delete while logged in. This menu pops up a GUI with various options. This is the control alt delete (or CAD) menu. When you attempt to run any program in administrator mode, a popup called the “UAC Consent UI” appears that asks for user confirmation of the desired admin privileges.
The Game
The specific program I am seeing this occur in is Nintendo Nightmare, an old game from May 2009. However, the game was most likely recompiled as internally the game reports it was compiled with Game Maker 8, which did not exist in May of 2009.
The Exploit
For unknown and unclear reasons, opening either the CAD menu or the Consent UI dialog results in the game failing to execute portions of the game’s code. This includes collision detection and whatever code handles frame rate capping. I was only able to check on Windows 7, but this has also been confirmed to work on Windows 10 as well. I would ask around if anyone can run on Windows 8, but the game doesn’t even run on Windows 8 due to some Windows 8 midi bug.
Why This Would Even Be Useful To Understand
So me and other people speedrun this game... or at least try to. I in particular am absolutely horrible at it. Regardless there is actually a useful way this glitch could be potentially used to save time in a run. Actually there are six locations that come to mind almost immediately.
Here is a video of a TAS I made about a month back for reference on what the current speedrun route is: [TAS] Nintendo Nightmare in 24:04 by Typhon
Within the route there are the following key points:
- A scripted death in the first boss fight.
- Final Mario level Death Egg section.
- Link dying as fast as possible after getting Jetpack to warp to dungeon entrance.
- Link dying as fast as possible to warp out of the secret Arwing level.
- Link dying as fast as possible after getting Hookshot to warp to dungeon entrance.
- Link dying as fast as possible after getting Hammer to warp to dungeon entrance.
For five of these simply invoking a bug to instantly fall through the floor would be the fastest way to die, so those would have minor time saves just by using the bug without anything fancy.
The second point though is the one that is more useful and having far greater implications. The Death Egg segment with Mario is simultaneous the hardest segment in a run and also the longest by far, purely because of the sheer number of enemy entities. Most of the time spent in that area is killing enemies. However, by invoking this bug for a precise number of frames, the player could hypothetically jump and then allow all of the enemy entities to fall through the floor thereby instantly killing everything in the room. Doing this might very well cut a fifth of the time in the entire run.
Skipping point 2 has actually been a primary point of interest for quite some time and finding a way to skip that is probably the single highest priority.
So I am attempting to both determine why this bug occurs at a technical level and also how to potentially replicate it with exact timing (I.e. without actually opening one of those intrusive pop ups).
The Story So Far
So some other people I asked apparently know a bit more about the internals of the Game Maker 8.0 engine and apparently this bug affects all Game Maker 8.0 games, although this doesn’t say much as in the same vein the bug no longer exists in current releases. So asking the developer is about as useful as asking anyone else familiar with the engine.
Using some mining tools (don’t ask me, I have no idea), they found that in the main gameLoop an exception gets thrown with code “ 0EEDFADE” which apparently equates to some unknown Delphi exception. This in turn causes the gameLoop to skip the rest of the frame execution. Game Maker 8 is supposedly written in Delphi so all that tells us is that something received something unexpected or invalid. Similarly between the two points they narrowed the exception down to have to have happened between, they found that that the only windows API they could locate was a call to joyGetPosEX, which is apparently used for joystick functionality. Apparently even in games without joystick it still gets called.
So now I am just trying to figure out what about these dialogs is causing joystick(?) functionality to break and whether there is an easier way to “break joystick functionality”.