高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先



DV 18 - CD-ROM の検出

(更新日: 97 年 1 月 31 日)

Q: 開発中のアプリケーションはハードディスクから実行しますが、特殊な CD-ROM がシステムにセットされている必要があります。ユーザによっては、ハードディスクのボリュームまたはフロッピーディスクがこの CD-ROM と同じ名前である可能性もあります。こうした状況をチェックするため、アプリケーションでは、特定の名前のファイルを含む特別な名前のロックされたボリュームを検索しますが、このプロセスを簡略化したいと考えています。マウントされているボリュームまたは SCSI アドレスが CD-ROM であるかどうかを判断するための最適な方法を教えてください。

A: これまで、Macintosh 上のボリュームが CD-ROM であるかどうかを判断する簡便な方法は存在しませんでした。このため、デベロッパはさまざまな方法を試みてきました。

  1. マウントされているドライブに対するドライブキューの要素を調べて、dQRefNum がポイントしているドライバを特定します。さらに、このドライバの名前を調べて、それが ".AppleCD" であれば、そのドライブはおそらく CD-ROM です。

    このアプローチが可能なのは Apple 純正の CD-ROM だけです。サードパーティ製 CD-ROM ドライバの名前はまちまちであるためこの方法は使えません。
  2. ドライブキューエントリの前にある 4 バイトに格納されているドライブの属性を調べます。"ハードウェア内でロック" されていて、しかもリムーバブルである場合、そのドライブはおそらく CD-ROM です。
  3. ドライブに対して直接 SCSI リクエストを発行します。

    この方法は一部の初期型 CD-ROM (SCSI-2 に準拠していないもの) には使えません。SCSI-2 以前には、CD-ROM のデバイスタイプは定義されていませんでした。このため、一部の CD-ROM ドライブでは、それがハードディスクであるというレポートを行っていました。SCSI Manager 4.3 によって問題はさらに複雑化しています。また、IDE CD-ROM ドライブの場合には、まったく異なる呼び出しアーキテクチャが必要となります。

    さらに、PowerBook 1400 のような一部の新機種や多数の互換機では、ATAPI プロトコルベースの CD-ROM ドライブが使用されており、通常行うような SCSI 検査では情報が得られません。

しかし、.AppleCD (および .AppleCD 互換) ドライバのバージョン 5.2.x 以降、CD-ROM ドライバでは、DriverGestalt csCode がサポートされました。

これらのドライバを使って、メディアが挿入されている CD-ROM ドライブを検出するため、ドライブテーブルをスキャンし、ドライバに対して DriverGestalt コマンドを発行して、デバイスタイプを確定することができます。次のコードは、この方法を具体的に示しています。
#include 

void FindTheCD-ROMS(void)  //  ドライブテーブルをスキャンして CD-ROM を見つける

{
    DriverGestaltParam          pb;
    DrvQEl  *dqp;
    OSErr   status;

    pb.csCode       = kDriverGestaltCode;       // Driver Gestalt PB をセットアップする
    pb.driverGestaltSelector = kdgDeviceType;   // デバイスタイプを確認する

    dqp = (DrvQEl *) GetDrvQHdr()->qHead;       // ドライブキューの先頭から始める

    while (dqp != NULL) {                       //ドライブキューに含まれる各デバイスについて

        pb.ioCRefNum    = dqp->dQRefNum;            // ドライバの refNum を取得する
        pb.ioVRefNum    = dqp->dQDrive;             // ドライブの refNum を取得する

        status = PBStatusSync((ParmBlkPtr) &pb);    // ドライバのゲシュタルトを呼び出す

        if (status == noErr)
            if(pb.driverGestaltResponse == kdgCDType ) // デバイスタイプは 'cdrm'
            {
                    printf("Drive: %d Driver:(%d) ",
                             (int) dqp->dQDrive, dqp->dQRefNum);
            }

        dqp = (DrvQEl *) dqp->qLink;                // 次のドライブ
    }
}
サンプル全体は、Macintosh Disk Driver Gestalt Sample というタイトルで DTS に用意されています。このサンプルプログラムの中では、デバイスのクエリーを行う方法が具体的に示されています。

マウントされていないドライブを検出するには、必要に応じて、SCSI または ATA マネージャのいずれかを使用する必要があります。"ATA demo" という DTS コードサンプルでは、ATA バスをスキャンし、使用可能なデバイスを特定する方法が具体的に示されています。

また、バージョン 5.2.X 以降の .AppleCD ドライバには、CD-ROM デバイスのタイプに関する情報を返す、ドライバのステータスを取得する呼び出しが用意されています。

次のパラメータを使って、.AppleCD ドライバのステータスを取得します。
    csCode = 120
    csParam[ 0 -1]   will return a DeviceIdent of the form

typedef struct DeviceIdent{
  uchar busType;       // SCSI -  0                ATAPI = 7
  uchar bus;           // SCSI - Bus#              ATAPI = 0
  uchar targetID;      // SCSI - Target SCSI ID    ATAPI = Bus #
  uchar partition ;    // SCSI - LUN               ATAPI  = 0
}
注意すべき点: .AppleCD ドライバの古いバージョンを使用している場合、上の呼び出しは正常に動作しません。この場合は、前述の方法のいずれかを試みるか、ユーザに CD-ROM ドライバのアップデートを要求する必要があります。

Updated by Vinnie Moscaritolo
devsupport@apple.com


[ Technical Q&A's : Devices : DV18 ]