---
title: 令和に学ぶ Windows 95/NT 3.51 プログラミングの闇魔術
tags:  #crystalmark #retro  
author: [hiyohiyo](https://convert.docswell.com/user/hiyohiyo)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/DJYZKN4QEM.jpg?width=480
description: 総合ベンチマークソフトCrystalMark Retro 2.0は、Windows 95/NT 3.51に対応するため、近代的なプログラミング環境ではありえない様々な闇魔術を駆使しています。 本セッションでは、i386対応、カスタムMFC作成法、IE4依存解消などWindows 95/NT 3.51対応に不可欠な闇魔術を紹介します！！
published: January 24, 26
canonical: https://convert.docswell.com/s/hiyohiyo/ZPGNP4-2026-01-24-163301
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/DJYZKN4QEM.jpg)

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


# Page. 2

![Page Image](https://bcdn.docswell.com/page/V7N3RXY278.jpg)

自己紹介


# Page. 3

![Page Image](https://bcdn.docswell.com/page/YJ99M8PDJ3.jpg)

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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/GJ89L8D5ED.jpg)

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


# Page. 5

![Page Image](https://bcdn.docswell.com/page/LJLWLRM37R.jpg)

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


# Page. 6

![Page Image](https://bcdn.docswell.com/page/47M9MRYMJW.jpg)

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


# Page. 7

![Page Image](https://bcdn.docswell.com/page/P7RGVR9LJ9.jpg)

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


# Page. 8

![Page Image](https://bcdn.docswell.com/page/PJXXZR36JX.jpg)

CrystalMark


# Page. 9

![Page Image](https://bcdn.docswell.com/page/3JKW8RYGJD.jpg)

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


# Page. 10

![Page Image](https://bcdn.docswell.com/page/LE31289575.jpg)

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


# Page. 11

![Page Image](https://bcdn.docswell.com/page/8EDXZMGYJG.jpg)

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


# Page. 12

![Page Image](https://bcdn.docswell.com/page/V7PPDR3278.jpg)

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


# Page. 13

![Page Image](https://bcdn.docswell.com/page/2JV21R4XJQ.jpg)



# Page. 14

![Page Image](https://bcdn.docswell.com/page/5EGR2M1RJL.jpg)

Visual C++ .NET ２００３最強伝説！？
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


# Page. 15

![Page Image](https://bcdn.docswell.com/page/4JQVPRDY7P.jpg)

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


# Page. 16

![Page Image](https://bcdn.docswell.com/page/K74MY8ZZJ1.jpg)

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


# Page. 17

![Page Image](https://bcdn.docswell.com/page/LJ1862RDEG.jpg)

半年かけて・・・


# Page. 18

![Page Image](https://bcdn.docswell.com/page/GJWZWR18J2.jpg)

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


# Page. 19

![Page Image](https://bcdn.docswell.com/page/4EZ15RP973.jpg)

テスト版リリース！！


# Page. 20

![Page Image](https://bcdn.docswell.com/page/Y76L9RMDJV.jpg)

ユーザーの声
Windows NT 3.51（30年前）で動かない！


# Page. 21

![Page Image](https://bcdn.docswell.com/page/G751N8Z8E4.jpg)

ユーザーの声
i386（４０年前のCPU）で動かない！


# Page. 22

![Page Image](https://bcdn.docswell.com/page/9J215KRV7R.jpg)

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


# Page. 23

![Page Image](https://bcdn.docswell.com/page/DEYZKNDQ7M.jpg)

闇魔術


# Page. 24

![Page Image](https://bcdn.docswell.com/page/VJN3RX62J8.jpg)

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


# Page. 25

![Page Image](https://bcdn.docswell.com/page/YE99M8LDE3.jpg)

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


# Page. 26

![Page Image](https://bcdn.docswell.com/page/GE89L8X57D.jpg)

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


# Page. 27

![Page Image](https://bcdn.docswell.com/page/LELWLR83JR.jpg)

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


# Page. 28

![Page Image](https://bcdn.docswell.com/page/4JM9MR6MEW.jpg)

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


# Page. 29

![Page Image](https://bcdn.docswell.com/page/PJRGVRPLE9.jpg)

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


# Page. 30

![Page Image](https://bcdn.docswell.com/page/PEXXZRN6EX.jpg)

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


# Page. 31

![Page Image](https://bcdn.docswell.com/page/3EKW8RNGED.jpg)

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


# Page. 32

![Page Image](https://bcdn.docswell.com/page/L73128V5J5.jpg)

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


# Page. 33

![Page Image](https://bcdn.docswell.com/page/87DXZM8YEG.jpg)

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


# Page. 34

![Page Image](https://bcdn.docswell.com/page/VJPPDR82J8.jpg)

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


# Page. 35

![Page Image](https://bcdn.docswell.com/page/2EV21RNXEQ.jpg)

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


# Page. 36

![Page Image](https://bcdn.docswell.com/page/57GR2MKREL.jpg)

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


# Page. 37

![Page Image](https://bcdn.docswell.com/page/4EQVPRNYJP.jpg)

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


# Page. 38

![Page Image](https://bcdn.docswell.com/page/KJ4MY8GZE1.jpg)

互換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


# Page. 39

![Page Image](https://bcdn.docswell.com/page/LE1862DD7G.jpg)

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


# Page. 40

![Page Image](https://bcdn.docswell.com/page/GEWZWRY8E2.jpg)

Windows NT 3.51対応完了！！


# Page. 41

![Page Image](https://bcdn.docswell.com/page/47Z15RX9J3.jpg)

Windows 95（30年前）＋i386（40年前）


# Page. 42

![Page Image](https://bcdn.docswell.com/page/YJ6L9R4DEV.jpg)



# Page. 43

![Page Image](https://bcdn.docswell.com/page/GJ51N8Q874.jpg)

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 ２.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


# Page. 44

![Page Image](https://bcdn.docswell.com/page/LE3128VG75.jpg)

～まとめ～


# Page. 45

![Page Image](https://bcdn.docswell.com/page/8EDXZM8NJG.jpg)

Retro対応楽しぃ～
皆様もぜひ！！


# Page. 46

![Page Image](https://bcdn.docswell.com/page/V7PPDR8N78.jpg)



