Last Updated 2004/01/23
Programming Tips Windows95系  索 引 
Windows95でのセクタ読込(CD-ROM)
2004/01/23

Microsoft の公式な文献によれば以下の様な事を行う必要がある.


Windows95 から CD-ROM に対してセクタ単位の読込を行うには,MSCDEX API 呼出を行う必要がある.
Windows95 は互換性のため MSCDEX API をサポートしている.

しかし Win32 アプリケーションからはこの様な呼出を行えないため,MSCDEX API 呼出は Win16 プログラムから行う事になる.
Win32 アプリはサンクを用いて MSCDEX API を呼び出す Win16 DLL を呼び出す.

(1) Win32 アプリから、サンクを通して Win16 DLL を呼び出す

(2) Win16 DLL は DPMI (int 31h) リアルモード割込みの擬似発行 (ax=0300h) を用いて V86 モードでの MSCDEX API 呼出を発行

2-1: 下位1M領域でのバッファの確保
MSCDEX API は V86 モード (リアルモードみたいなもの) のコンテキストで動くので,セクタ入力バッファは下位1M領域に確保しなければならない.GlobalDosAlloc() を用いて下位1M領域にバッファを確保する.
(Win16 なら GlobalDosAlloc() 呼出)
以下のサンプルでは セクタサイズは 2048 バイトとなっている.

2-2: レジスタ・セットの準備
DPMI ax=0300h では,どの様なレジスタ・セットを用いて int を発行するかを指定する.このためには,汎用レジスタ,セグメント・レジスタ,フラグ・レジスタなどがメンバとして定義された構造体を使用する.
構造体の各メンバを 以下の様にセットアップする.
        EAX    1508h (MSCDEX Absolute Read)
        ECX    ドライブ番号 (0=A 1=B ...)
        EDI    LOWORD(読み込むセクタの開始番号)
        ESI    HIWORD(読み込むセクタの開始番号)
        EDX    読み込むセクタ数
        ES     GlobalDosAlloc で得たバッファのリアルモード・セグメント
        EBX    GlobalDosAlloc で得たバッファのオフセット (0 です)

2-3: MSCDEX API の発行
DPMI ax=0300h を用いて int 2Fh を V86 モードで実行
       _asm {
          mov  ax, 0300h       ;DPMI Simulate Real Mode Interrupt
          mov  bl, 2Fh         ;実行する int 番号
          mov  bh, 01h         ;多分意味を成さないと思う
          xor  cx, cx          ;コピーするスタック上のデータ (今回は0)
          les  di, レジスタ構造体のアドレス  ;ES:DI=レジスタ構造体
          int  31h             ;DPMI call
          jc   ERRORED
       }


参考文献
DPMI に関する文献 (ax=0300h int 31h について)

Microsoft Knowledge Base PSS ID Number: Q137813
Win16 での MSCDEX セクタ読取要求発行のサンプルが載っている

#結果は未確認


参照
前後のTips
Windows95でのセクタ読込(CD-ROM)

DSS ProgrammingTipsCGI Ver2.02