Claude Code로 패치하여 64비트 윈도우에서 드디어 실행되는 Flight Simulator 95/98
Flight Simulator 95/98 finally running on 64-bit Windows, patched by Claude Code
핵심 요약
Claude Code를 활용해 64비트 윈도우에서 실행 불가능했던 고전 게임 FS95와 FS98의 오류를 수정함.
- 고전 게임 복구 — 64비트 윈도우에서 충돌하던 FS95와 FS98을 패치함
- Claude Code 활용 — DLL 및 EXE 파일의 예외 처리 루틴을 분석하여 수정함
- 기술적 해결책 — Vectored Exception Handler를 추가하여 0으로 나누기 오류를 해결함
- 패치 배포 — 사용자가 직접 게임을 설치한 후 적용할 수 있는 패처를 공유함
안녕들 하냐. 난 Flight Simulator라면 환장하는 골수팬인데, 옛날 물건을 도통 버리질 못하는 성격이다. 요즘 사람들이 Claude Code 써서 전혀 상관없는 게임 두 개를 기가 막히게 섞어놓는 미친 모드들을 만드는 걸 보고, 나도 64비트 윈도우에서 안 돌아가는 고전 게임 FS95랑 FS98을 Claude Code한테 던져주고 왜 안 돌아가는지 좀 파헤쳐 보라고 시켜봤다. 뭐, 이 정도면 훨씬 간단한 작업 아니겠냐?
난 10년 전부터 이 게임들이 2D/3D 창 처리 과정에서 발생하는 '0으로 나누기(divide by zero)' 예외 때문에 튕긴다는 걸 알고 있었거든. 그래서 WINDOW.DLL이랑 G3D.DLL, 이 두 DLL 파일이 문제일 거라고 짐작했지. DxWnd에서 "handle exceptions" 옵션 켜고 돌려보기도 했는데, 그래픽이 다 깨져서 도저히 게임을 할 수 있는 수준이 아니더라고. 몇 년 전에 레딧 유저 u/rozniak이 흥미로운 글을 쓴 적도 있고 말이야. 어쨌든 Claude를 시켜서 FS95의 해당 DLL들을 패치해 봤는데 잘 작동하더라고. 근데 FS98을 디버깅해보니까 범인은 DLL이 아니라 게임 EXE 파일이었던 거임. Claude가 찾아낸 정보를 바탕으로 FS95에서도 똑같은 문제를 추적해 냈다.
Claude가 내린 결론은 이거다:
"FLTSIM98.EXE에는 마이크로소프트가 이 오류 나는 나눗셈을 처리하려고 만든 루틴이 들어있다. 나눗셈이 실패하면 메모리에서 명령어를 읽어와서 적절한 레지스터에 제한된 결과값을 넣고, 해당 명령어를 건너뛰는 방식이지. 게임은 이 모든 걸 __try/__except 안에서 돌리는데, 이게 바로 64비트 윈도우의 윈도우 콜백 내부에서는 접근할 수 없는 메커니즘이다.
윈도우에는 콜백 경계가 중요해지기 전에 작동하는 '벡터 예외 핸들러(vectored handler)'라는 게 따로 있다. 게임 루틴이 딱 이런 핸들러에 필요한 시그니처를 가지고 있더라고. 그래서 패치를 통해 프로그램 진입점에 86바이트를 추가해서 AddVectoredExceptionHandler로 루틴을 등록하고 게임을 정상적으로 시작하게 만들었다. 패치 하나로 게임이 원래 의도했던 결과값을 그대로 유지하면서 모든 나눗셈 오류를 해결한 거지." 덧붙이자면, 는 처럼 EXE에 있는 게 아니라 DIVTRAP.DLL에 해당 루틴이 들어있더라. 어쨌든 내 테스트 결과로는 이제 두 게임 다 64비트 윈도우에서 아무 문제 없이 잘 돌아간다.

