投稿日 | : 2004/03/22(Mon) 15:41 |
投稿者 | : morimori |
URL | : |
タイトル | : Re: DeveceIoControl()について |
morimoriです。
K.J.KさんのアドバイスをいただいてDDKをインストールしてこれを参考にしながら各処理を行っている
ところですが、1点わからない点がでてきたため、投稿させていただきます。
現在、「DeviceIoControl()」を使用してメディアのフォーマットを行おうと思っているのですが、エラ
ーとなります。GetLastError()でエラー情報を見るとエラーコード「24」(コマンドの長さが正しくない)
が返ってきます。
対象メディアがスマートメディアのため、制御コードに「IOCTL_DISK_VERIFY」を設定しているのですが
、このコードの構造体パラメーターの設定がおかしいようです。
パラメータには
・ディスク範囲の開始オフセットの指定(8Byte)
・ディスク範囲のバイト単位の長さ(4Byte)
を指定するようにとMSDNのヘルプには書いてあるのですが、ここの指定方法がわかりません。
現在はメディア情報の取得で、「シリンダ数」「トラック数」「セクタ数」「セクタあたりのバイト数
」は取得しているのでこの値を使用して開始オフセットにシリンダ数を設定し、バイト単位の長さにそれ
以外の値を乗算した値でバイト単位で指定しているのですが、エラーとなります。
下記にソースを公開しますので、ご教授をいただければと思います。
よろしくお願いします。
WindowsXP Pro、VB6.0SP5
【ソース】
'制御コード「IOCTL_DISK_VERIFY」のパラメータ
Public Type VERIFY_INFO
lngLowerStartingPoint As Long
lngUpperStartingPoint As Long
lngLength As Long
End Type
'メディア情報を取得するパラメータ
Public Type MEDIA_INFO
lngLowerCylinder As Long 'シリンダ数の下位4バイト
lngUpperCylinder As Long 'シリンダ数の上位4バイト
lngMediaType As Long 'メディア種別
lngTrackPerCylinder As Long '1シリンダあたりのトラック数
lngSectorPerTrack As Long '1トラックあたりのセクタ数
lngBytesPerSector As Long '1セクタあたりのバイトサイズ
End Type
Public gudtMediaInfo As MEDIA_INFO '
Private Sub MediaFormat(ByVal lngHdl As Long)
Dim i As Integer
Dim lngRet As Long
udtFmt_RM As VERIFY_INFO
VolumeLock(mlngHdl) 'ボリュームのロック
GetMediaInfo(lngHdl) 'メディア情報の取得
udtFmt_RM.lngLength = lngTrackPerCylinder * lngSectorPerTrack * lngBytesPerSector
For i = 0 To gudtMediaInfo.lngLowerCylinder
udtFmt_RM.lngLowerStartingPoint = i
lngRet = DeviceIoControl(lngHdl, lngCtlCode, VarPtr(udtFmt_RM), _
Len(udtFmt_RM), 0&, 0&, lngRetByteCnt, ByVal
0&)
If lngRet = 0 Then
lngErrCode = Err.LastDllError
'Exit For
End If
Next i
VolumeDisMount(lngHdl) 'ボリュームのディスマウント
VolumeUnLock(lngHdl) 'ボリュームのアンロック
CloseHandle(lngHdl) 'ハンドルのクローズ
Exit Sub