[HN Gopher] Why Castrol Honda Superbike crashes on (most) modern...
       ___________________________________________________________________
        
       Why Castrol Honda Superbike crashes on (most) modern systems
        
       Author : shepmaster
       Score  : 166 points
       Date   : 2025-11-16 20:54 UTC (1 days ago)
        
 (HTM) web link (seri.tools)
 (TXT) w3m dump (seri.tools)
        
       | vintagedave wrote:
       | > Microsoft has only kept the documentation for the DX8 version
       | of EnumDevices left online
       | 
       | This saddens me. Who knows how much valuable info has been lost.
       | I recall back in the days of MSDN, we had docs back to early
       | Windows, and it was a wonderful historical record. Today's Docs
       | site seems to keep info only for a few versions.
        
         | falcor84 wrote:
         | Another good reason to support independent internet archives
        
         | bayindirh wrote:
         | Why share something which you can sell for exorbitant prices?
         | /s
        
         | bitwize wrote:
         | Anybody who still has MSDN Library CDs from the 90s, archive
         | them at archive.org NOW!
        
           | seritools wrote:
           | AFAIK they are all backed up. For the blogpost I used the DX5
           | SDK docs, DX7 SDK docs, and the MSDN Library from VS2005
           | (last version to include 9x information).
           | 
           | The VS2008 version purged all API information regarding pre-
           | Windows 2000.
        
           | netsharc wrote:
           | Oh geez, I have them, probably from the 00's. I tried to get
           | into Windows programming, but it was all over my head.
           | 
           | Incredible that a few decades after thinking "All the world's
           | knowledge will be online", we probably have to return to
           | physical libraries to find the knowledge that ended up not
           | being online anymore.
        
         | stonemetal12 wrote:
         | Also of note Valve's Proton only goes back to DX8. Versions
         | prior to that were considered not worth it.
        
           | Krutonium wrote:
           | That's only kind of true; Wine itself supports older versions
           | of DirectX with the target API being OpenGL instead of
           | Vulkan. It's just not quite super performant and kinda buggy.
           | That said, there's other wrappers you can use to convert
           | older DirectX versions into new ones, and if you can get to
           | DirectX 8 or 9, now you've got DXVK.
        
       | ensocode wrote:
       | Thanks for the flashback :)
        
       | PaulKeeble wrote:
       | Its interesting to see how bad assumptions that almost certainly
       | held up at the time really don't any more and that leads to this
       | bug being exposed. Modern machines have a lot more addressable
       | devices and a failure to properly filter and using a vector
       | ultimately leads to a bug that on the surface feels like since it
       | works on Win98 must be caused by Windows but isn't.
        
         | gambiting wrote:
         | I mean that's just a bad assumption no matter how anyone looks
         | at it - if you created an array for 8 devices then just stop
         | adding to it when you reach 8. The "a user will never have more
         | than 8 gamepads" is a bad assumption because the logical
         | question then is "what if they do" and the answer even back in
         | the day would have been "the game will crash" which isn't how
         | any code should be written. Stop processing at 8 if you are so
         | sure there will never be more than 8, but have the most basic
         | sanity checks.
        
           | AyyEye wrote:
           | Back in the days of manually setting IRQs enough of them were
           | used by the system that no, you couldn't use 8 gamepads.
           | Assuming you could even connect them.
           | 
           | (I think this game is probably past those times but not by
           | much)
        
             | seritools wrote:
             | I specifically checked if DirectInput from DirectX 5
             | already supports/provides USB HID devices, and it does!
             | Granted, even then it was unlikely to encounter 8 USB
             | devices, let alone HID devices in particular.
        
       | xx_ns wrote:
       | I appreciated the footnote on filesize optimization as someone
       | who's constantly trying to compulsively generate the smallest
       | binaries possible.
       | 
       | Interesting article, thank you.
        
       | purpleidea wrote:
       | The cool part of this adventure is that the author was able to
       | write this DLL patch purely in rust! Good testament of how far it
       | has come. Can't wait to see more C code ported to either Golang
       | or Rust!
        
         | Xylakant wrote:
         | I chuckled at the callout to Rust9x. Neat to see it pop up
         | randomly.
        
           | seritools wrote:
           | Author here -- given that r9x is also my project it wasn't
           | entirely random :^)
        
             | vintagedave wrote:
             | This is pretty amazing, and I'm surprised in a sense by how
             | few workarounds you've had to implement. It makes me wonder
             | what Windows would look like if we had Win2K or Win7 with
             | today's system APIs (for high DPI, increased security etc.)
             | 
             | I know Windows has made great strides in security, but I
             | deeply miss the old Windows and this really hits home about
             | how _little_ has fundamentally changed, or rather, how much
             | the continuance of these APIs means today's Windows could
             | be like old Windows, if MS wanted.
             | 
             | I came across Windhawk a couple of days ago here on HN, a
             | system to patch Windows to look and behave more old-style;
             | wow.
        
       | vintagedave wrote:
       | I was quite interested in the patch -- am I right in thinking the
       | DirectX library only exports a single function and _everything_
       | else is through DX interfaces?
       | 
       | I expected to see significantly more code, pass-through to the
       | original DLL.
        
         | xx_ns wrote:
         | The author linked to the repo and the code is at
         | https://github.com/seritools/castrol-honda-dinput-fix/blob/m...
         | 
         | Seems pretty straightforward. They hook DirectInputCreateA()
         | and pass their own device enumeration wrapper with the
         | offending flag removed.
        
           | tialaramex wrote:
           | The flag DIDEVTYPE_JOYSTICK was added by this fix not
           | removed.
           | 
           | The idea is, rather than handle up to 8 devices, otherwise UB
           | and usually crash, handle up to 8 "joysticks" and disregard
           | any beyond that.
        
             | xx_ns wrote:
             | Apologies, that's what I meant to say. I blame that on my
             | lack of coffee today, my bad.
        
             | anthk wrote:
             | I'd just use WineD3D in this case; I'm sure there's
             | dinput.dll too ported to Wine for Windows.
        
         | seritools wrote:
         | > am I right in thinking the DirectX library only exports a
         | single function and _everything_ else is through DX interfaces
         | 
         | Yup! That's why I didn't have to create a gazillion passthrough
         | functions.
         | 
         | The original DLL in my modern Windows installation has these 8
         | exports:                   DirectInputCreateA
         | DirectInputCreateEx         DirectInputCreateW
         | DllCanUnloadNow         DllGetClassObject
         | DllRegisterServer         DllUnregisterServer
         | 
         | The game only calls DirectInputCreateA, and the rest happens
         | via the COM object that that function creates.
        
       | jebarker wrote:
       | Nice write-up. Reminds me that debugging is the most fun part of
       | programming!
        
       | 1313ed01 wrote:
       | I have had very bad success rate with my old Windows CDROM/DVD
       | era games. Pretty much all of them either have some kind of DRM
       | or they run but with bugs.
       | 
       | When available I just buy the GOG versions instead, but even
       | those versions sadly often have issues.
       | 
       | Meanwhile slightly older games from the DOS era works perfectly
       | everywhere thanks to DOSBox. I would love to see something like
       | that for old Windows. Merge DOSBox with WINE, someone?
        
         | trollbridge wrote:
         | You can run Windows 95 in DOSBox. You could also just run WINE
         | which runs most old games.
        
         | anthk wrote:
         | You can use WineD3D for Windows.
        
         | seritools wrote:
         | Usually dgVoodoo handles most of the games (that don't have
         | actual bugs like this game) fairly well.
         | 
         | Otherwise, 86Box is a pretty good full-system emulator for
         | everything up to the early 3D era.
         | 
         | As for DRM, there's various ways around it of course :)
        
       | neonz80 wrote:
       | Why an extra DLL instead of just patching the game executable?
       | With some luck it is a one byte patch (from push 0 to push 4).
        
         | seritools wrote:
         | Because I felt like it :) Also works for multiple
         | versions/patchlevels.
         | 
         | But yeah, with the info provided it should be patchable. It's a
         | `push esi` though, where esi has to stay 0 for a few further
         | usages, so it's a bit more than a one-byte patch. It also
         | wouldn't fully resolve the OOB write in the rare case where you
         | _do_ have 9+ game controllers connected.
        
         | qingcharles wrote:
         | I feel like this is a cleaner solution. As a user you don't
         | have to faff around running a whole application just to change
         | 3 bytes. Just drop this file in and go.
        
       | progforlyfe wrote:
       | I love hard-core deep debugging for stuff like this. Great work!!
        
       ___________________________________________________________________
       (page generated 2025-11-17 23:02 UTC)