令和に学ぶ Windows 95/NT 3.51 プログラミングの闇魔術

2.2K Views

January 24, 26

スライド概要

総合ベンチマークソフトCrystalMark Retro 2.0は、Windows 95/NT 3.51に対応するため、近代的なプログラミング環境ではありえない様々な闇魔術を駆使しています。
本セッションでは、i386対応、カスタムMFC作成法、IE4依存解消などWindows 95/NT 3.51対応に不可欠な闇魔術を紹介します!!

profile-image

CrystalMark(株)代表取締役社長。ジーズアカデミー東京DEV25卒。CrystalMark 3D25、CrystalMark Retro、CrystalDiskInfo、CrystalDiskMarkなどを開発。Microsoft MVP(2014/1~)

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

令和に学ぶ Windows 95/NT 3.51 プログラミングの闇魔術 2026/01/24 .NETラボ 勉強会 2026年1月 Microsoft MVP for Developer Technologies 宮崎 典行

2.

自己紹介

3.

名 前| 所 属| 趣 味| 受 賞| 宮崎 典行 / hiyohiyo CrystalMark(株)代表取締役社長 某会社勤務 ソフトウェア開発(27年) Microsoft MVP for Developer Technologies (2014年1月~、12期連続受賞)

4.

【代表作】以前開発していたソフトウェア CrystalMark 2004 総合ベンチマーク フリーウェア CrystalCPUID CPU情報ソフト 修正BSDライセンス

5.

【代表作】現在開発しているソフトウェア CrystalDiskMark ストレージベンチマーク CrystalDiskInfo ストレージ情報ソフト MITライセンス 4,000万DL MITライセンス 8,000万DL 約1万DL/日 約3万DL/日 合計1.2億ダウンロード以上 ※OSDN.net/SourceForge.net配信分のみ

6.

デモシーンで活躍される4名の作品でWebGL/GLSL性能を評価

7.

Windows 95/NT 3.51以降で動作する総合ベンチマークソフト 1.5年で200万ダウンロード

8.

CrystalMark

9.

CrystalMark 2004(総合ベンチマークソフト) 世界の定番にはなれず・・・自然消滅・・・ 2004/03/31リリース!

10.

自称レトロ環境対応総合ベンチマークソフト 20年後 2024/03/31リリース!

11.

Windowsの歴史とCrystalMark Retro 95 96 97 98 99 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 9x系 95 98 Me NT系 NT 3.51 NT 4.0 2000 CrystalMark Retro 1.0のターゲット ※Visual Studio 2019/2022で対応可能な範囲 XP 2001年 リリース Vista 7 8 10 11

12.

ユーザーの声 CrystalMark Retro リリース翌日! ドM 最近煽られる機会が少ないので嬉しい!

14.

Visual C++ .NET 2003最強伝説!? Visual C++ .NET 2003でWindows 95対応アプリを書ける! 製品名 製品バージョン 内部バージョン _MSC_VER リリース Visual C++ 5.0 5.0 5.0 1100 1997年 Visual C++ 6.0 6.0 6.0 1200 1998年 Visual C++.NET 2002 2002 7.0 1300 2002年 マネージ拡張C++のサポート追加。 Visual C++.NET 2003 2003 7.1 1310 2003年 Windows 95で動作するWin32バイナリ(プログラム)を作成できる 最後のバージョン。この製品までは既定の文字コード設定が「マルチバ イト文字列を使用する」になっている。 2005年 Windows 98/Me/NT4で動作するWin32バイナリ(プログラム)を 作成できる最後のバージョン。この製品以降は既定で「Unicode文字 列を使用する」に変更されている。C++/CLIのサポート追加。上位エ ディションでコード分析/analyzeが使えるようになった。 Visual C++ 2005 2005 8.0 1400 備考 出典: Microsoft Visual C++ | Wikipedia https://ja.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B

15.

Visual C++ 20年の進化は凄い!! コンパイルエラーを解消すれば動く!と思っていた時期もありました・・・ https://x.com/openlibsys/status/1775164378331132183

16.

Windows 9x/NT対応は想像以上に大変・・・

17.

半年かけて・・・

18.

Windows 9x/NT対応は概ね完了

19.

テスト版リリース!!

20.

ユーザーの声 Windows NT 3.51(30年前)で動かない!

21.

ユーザーの声 i386(40年前のCPU)で動かない!

22.

ターゲットユーザーが 濃厚過ぎる!!

23.

闇魔術

24.

Windows 95/NT対応の壁 • Visual C++機能不足 • オーナードロー非互換 • 未使用DLL依存 • IE3/4依存 • 16色/256色対応 • Windows NT 3.51対応 • i386対応 • 互換CPU判別 • FM TOWNS対応

25.

Visual C++機能不足 未対応機能は#if #ifdefなどで対処 コンパイルエラーがなく なるまでひたすら対処 https://x.com/openlibsys/status/1775529397094937023

26.

オーナードロー非互換(1/3) コンパイルはできたものの謎の描画乱れが・・・

27.

オーナードロー非互換(2/3) 根本的な解決はできず暫定対処 Windows 9x Windows NT エディットコントロール のオーナードローを断念 2つの画像に分割して対応

28.

オーナードロー非互換(3/3) CStaticベースからCButtonベースへ・・・ すべて「ボタン」

29.

未使用DLL依存(1/2) 一つ一つGetProcAddress()経由で呼び出す形に変更すればOK! https://x.com/openlibsys/status/1776620571452936346

30.

未使用DLL依存(2/2) 便利ツールで依存APIをサクッと把握! Dependency Walker Dependencies レガシー環境対応(Windows 10以降動作不可) モダン環境対応 https://www.dependencywalker.com/ https://github.com/lucasg/Dependencies

31.

IE3/4依存(1/3) IEはOSそのもの・・・数多くの便利APIとの決別が必要 SHLWAPI.DLL(IE3などで導入) MFC(ライブラリ)内部でSHLWAPI.DLLで定義 されているPathFindExtension()が使用されて いるためIE3/4に依存。 【解決策】 • PathFindExtension()を独自開発・リンクし、 SHLWAPI.DLLで定義されている PathFindExtension()は使用しない! https://x.com/openlibsys/status/1868667088359113186 MFCのソースコード

32.

IE3/4依存(2/3) PathFindExtension()の独自実装+強制リンク PathFindExtension()の独自実装 https://x.com/openlibsys/status/1868667088359113186 PathFindExtension()の強制リンク

33.

IE3/4依存(3/3) UTF-8への変換は必須!レトロ環境にはなかなかハードルが高い・・・ mlang.dll(IE4などで導入) mlang.dllで定義されたConvertINetString() を使えば、S-JIS⇔UTF-8やUTF-16⇔UTF-8 の変換が簡単に実施できます! が、Windows 95, NT3.51/4.0はIE4がデフォ ルトでは入っていないため利用することができない。 【解決策】 • 必要な文字コード変換機能を自作 (素敵なライブラリを活用) https://x.com/roytam1/status/1860630942072918387

34.

16色/256色対応 ハイカラー/フルカラー前提は甘え・・・パレットにも対応すべし! パレット非対応 パレット対応 https://x.com/openlibsys/status/1873190163477872904

35.

Windows NT 3.51対応 GDI+がクラッシュ・・・パッチ適用で回避 インターロック機能不足 GDI+内部で特権命令を実行しクラッシュ パッチ適用 割り込み制御命令(CLI, STI)をNOPに置換 https://x.com/openlibsys/status/1880478939568828539

36.

i386対応 40年前のi386にもMFC(ライブラリ)をカスタマイズして対応!! i386非対応命令 MFC内部でi486から対応のXADD命令使用 MFCをカスタムビルド XADD命令を使わないカスタムMFCを作成 ◇ atlsimpstr.h 「#ifndef _M_CEE」を「#if 0」に変更 https://x.com/roytam1/status/1869375002275176883

37.

互換CPU判別(1/2) 特定のI/OポートにアクセスしてCPUを詳細判別 Windows 9xでのみ動くコード AMDとかCyrixとか ← 皆さん、こういうコード大好きですよね? I/Oポートアクセス Windows NTでは、カーネルモードドライバ経由で ないとI/Oポートにアクセスできないためこのコー ドは動かず。 WinRing0などのカーネルモードドライバを使えば Windows NTでも詳細なCPU判別ができるので すが・・・

38.

互換CPU判別(2/2) 人生最大の黒歴史!! Microsoft MVPで唯一か!?(未調査) MS公式からBAN https://support.microsoft.com/ja-jp/windows/microsoft-defender-%E3%82%A6%E3%82%A4%E3%83%AB%E3%82%B9%E5%AF%BE%E7%AD%96%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%88-vulnerabledriver-winnt-winring0-eb057830-d77b-41a2-9a34-015a5d203c42

39.

FM TOWNS対応 突然の電源オフ・・・なんで!? 起動直後に電源オフ なっ、何かがおかしい・・・ CyrixのCPU情報判別と使用I/Oポートが一致!? FM TOWNSでは、I/Oポート0x22が電源オフ!! Cyrix製CPUの 詳細判別をしようと した瞬間に・・・ https://x.com/roytam1/status/1906377809871962124

40.

Windows NT 3.51対応完了!!

41.

Windows 95(30年前)+i386(40年前)

43.

Windowsの歴史とCrystalMark Retro 95 96 97 98 99 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 9x系 95 98 CrystalMark Retro 2.0で追加 Me ※Visual Studio .NET 2003で対応可能な範囲 NT系 NT 3.51 NT 4.0 2000 CrystalMark Retro 1.0のターゲット ※Visual Studio 2019/2022で対応可能な範囲 XP 2001年 リリース Vista 7 8 10 11

44.

~まとめ~

45.

Retro対応楽しぃ~ 皆様もぜひ!!