2006年06月07日

ドライブを列挙する


ASPIでディスクドライブを列挙するには、以下の手順で行います。

1.GetASPI32SupportInfo ASPI-API関数で
ホストアダプタの数を取得する。
2.各ホストアダプタへ SC_HA_INQUIRY コマンドを送り、
アダプタが持つターゲットの数を取得する。
3.各ターゲットへ SC_GET_DEV_TYPE コマンドを送り、
ターゲットの種類を取得する。

C++言語で書くと、大雑把な流れはこんな感じです。


BYTE Ha, Tgt, HaMax, TgtMax;
DWORD Info;

// ホストアダプタの数を取得
Info = lpGetASPI32SupportInfo(); //ASPIが利用可能か
if(HIBYTE(LOWORD(Info)) != SS_COMP)
{
HaMax = 0; //利用不可
}
else //利用可能
{
HaMax = LOBYTE(LOWORD(Info)); //ホストアダプタの数
}

// 各バスを検索する。
for(Ha = 0; Ha < HaMax; Ha++)
{
// ターゲットの数を取得する。
SRB_HAInquiry ha_cmd;
memset(&ha_cmd, 0, sizeof(ha_cmd));
ha_cmd.SRB_Cmd = SC_HA_INQUIRY;
ha_cmd.SRB_Ha = Ha;
lpSendASPI32Command((LPSRB)&ha_cmd); //ホストアダプタの情報を取得
//そのアダプタにあるターゲットの数
if(ha_cmd.HA_Unique[3] == 0)
{
TgtMax = 8; //0の場合はデフォルトの8
}
else
{
TgtMax = ha_cmd.HA_Unique[3];
}
// ターゲットデバイスの情報を取得
for(Tgt = 0; Tgt < TgtMax; Tgt++)
{
SRB_GDEVBlock dev_cmd;
memset(&dev_cmd, 0, sizeof(dev_cmd));
dev_cmd.SRB_Cmd = SC_GET_DEV_TYPE;
dev_cmd.SRB_Ha = Ha;
dev_cmd.SRB_Tgt = Tgt;
dev_cmd.SRB_Lun = 0; // Lunの数を取得する方法がわからないので、
取り合えず0番を調べておきます。
lpSendASPI32Command((LPSRB)&dev_cmd); //デバイスの情報を取得する。
if(dev_cmd.SRB_Status == SS_COMP
&& dev_cmd.SRB_DeviceType == DTYPE_CDROM) //CD-ROMドライブを発見
{
//得られた[Ha:Tgt:Lun]の値をどこかに記憶しておく。
//この値を使って、ドライブを識別、交信する。
}
}
}


より正確には、せんべえ焼きか、CD Manipulatorのソースコードを見てください。

なお、各構造体の、ここでは説明していないメンバにセットされた値を
覗いてみると、けっこう面白かったりします。
posted by 七癖 at 18:23| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。