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のソースコードを見てください。
なお、各構造体の、ここでは説明していないメンバにセットされた値を
覗いてみると、けっこう面白かったりします。
2006年06月07日
ドライブを列挙する
この記事へのコメント
コメントを書く
この記事へのトラックバック

