[リストへもどる]
一括表示

投稿時間:2004/03/11(Thu) 19:27
投稿者名:morimori
URL :
タイトル:
DeveceIoControl()について
morimoriです。

VBで、API関数「DeviceIoControl()」を用いてメディアに対する処理を行いたいと思っています。
その中で、第2引数に指定する制御コードの部分でMSDNに制御コードの一覧が表示されているのです
が、それぞれの定数値はどの値なのかを知りたいのですが、知っている方はいますでしょうか?
インターネットで検索していくつかはわかったのですが、わからない個数の方が多い状態です。

ご教授、よろしくお願いします。

投稿時間:2004/03/15(Mon) 14:53
投稿者名:morimori
URL :
タイトル:
Re: DeveceIoControl()について
morimoriです。

「DeviceIoControl()」の制御コード定数の件で投稿させていただきましたが、この件に関しては解決し
ました。そして、各定数を用いて処理を行っているのですが、質問したい項目があります。
現在、メディアのフォーマットを行いたいと思っているのですが、引数の指定方法がわかりません。
「SHFormatDrive()」を用いることでフォーマットを行うことはできるのですが、ダイアログが表示され
てしまうため、処理上、あまりよくありません。
ご教授いただきたいと思いますので、よろしくお願いします。

WindowsXP Pro ,VB6.0SP5

投稿時間:2004/03/16(Tue) 11:24
投稿者名:K.J.K.
Eメール:akiya@koalanet.ne.jp
URL :
タイトル:
Re: DeveceIoControl()について
とりあえず、Windows XP DDK(Device driver Development Kit)を
手に入れて、それで調べてみては。
ストレージデバイスに対するコマンドなどについて詳細な説明が
ありますので。

投稿時間:2004/03/16(Tue) 11:48
投稿者名:morimori
URL :
タイトル:
Re^2: DeveceIoControl()について
morimoriです。

KJ.K様、ご返答ありがとうございます。

> とりあえず、Windows XP DDK(Device driver Development Kit)を
> 手に入れて、それで調べてみては。
DDKはフリーで入手できるのでしょうか?つまらない質問をしてすみません。

投稿時間:2004/03/16(Tue) 20:03
投稿者名:K.J.K.
Eメール:akiya@koalanet.ne.jp
URL :
タイトル:
Re: DeveceIoControl()について
http://www.microsoft.com/japan/whdc/ddk/winddk.mspx
を見て下さい。

投稿時間:2004/03/17(Wed) 10:08
投稿者名:morimori
URL :
タイトル:
Re^2: DeveceIoControl()について
morimoriです。

> http://www.microsoft.com/japan/whdc/ddk/winddk.mspx
> を見て下さい。
ありがとうございます。参考にしたいと思います。また、わからないことがあったらご教授下さい。
よろしくお願いします。

投稿時間: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

投稿時間:2004/03/23(Tue) 22:32
投稿者名:K.J.K.
Eメール:akiya@koalanet.ne.jp
URL :
タイトル:
Re: DeveceIoControl()について
# とりあえず、他のところで質問してて、またここに戻ってきたようなので、
# 手抜き回答。

> 対象メディアがスマートメディアのため、制御コードに「IOCTL_DISK_VERIFY」を
> 設定しているのですが

となれば、スマートメディアのデバイスドライバの仕様について資料を
集めるべきでしょう。
# ハードに依存するプログラムを書くときの鉄則ですよね。

投稿時間:2004/03/24(Wed) 09:40
投稿者名:morimori
URL :
タイトル:
Re^2: DeveceIoControl()について
morimoriです。

> となれば、スマートメディアのデバイスドライバの仕様について資料を
> 集めるべきでしょう。
> # ハードに依存するプログラムを書くときの鉄則ですよね。
アドバイスありがとうございます。資料を集めてみたいと思います。
今後ともよろしくお願いします。