<Return[D]><Top>

DeviceIoControl

Declare Function Api_DeviceIoControl& Lib "kernel32" Alias "DeviceIoControl" (ByVal hDevice&, ByVal dwIoControlCode&, lpInBuffer As Any, ByVal nInBufferSize&, lpOutBuffer As Any, ByVal nOutBufferSize&, lpBytesReturned&, lpOverlapped As Any)

Declare Function DeviceIoControl Lib "kernel32" Alias "DeviceIoControl" (ByVal hDevice As Long, ByVal dwIoControlCode As Long, lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal nOutBufferSize As Long, lpBytesReturned As Long, lpOverlapped As OVERLAPPED) As Long

指定されたデバイスドライバへ制御コードを直接送信し、対応するデバイスに対応する動作をさせる。

パラメータ
hDevice
    動作を実行するデバイスのハンドルを指定する。デバイスハンドルを取得するには、CreateFile 関数を呼び出する。
dwIoControlCode
    動作を表す制御コードを指定する。この値は、実行する特定の動作と、実行に使うデバイスのタイプを識別する。

    次の値が定義されている。

    値                                                           意味                                                                                                              
    FSCTL_ALLOW_EXTENDED_DASD_IO パーティションの読み取りまたは書き込みの呼び出しを行う際に、I/O 境界をチェックしないよ
うファイルシステムのドライバに指示する。代わりに、デバイスドライバが境界チェックを行う。
    FSCTL_CREATE_USN_JOURNAL ターゲットボリュームに NTFS 変更ジャーナルストリームを作成するか、既存の変更ジャーナ
ルストリームに変更を加える。
    FSCTL_DELETE_REPARSE_POINT ファイルまたはディレクトリの再解析ポイントを削除する。
    FSCTL_DELETE_USN_JOURNAL ボリュームから NTFS 変更ジャーナルを削除するか、NTFS 変更ジャーナルの削除通知を
待つ。
    FSCTL_DISMOUNT_VOLUME ボリュームをマウント解除する。
    FSCTL_ENUM_USN_DATA 指定された 2 つの境界の間にある NTFS 変更ジャーナルエントリを列挙する列挙型を作成
する。
    FSCTL_GET_COMPRESSION ファイルまたはディレクトリの圧縮状態を取得する。
    FSCTL_GET_HFS_INFORMATION 入力ハンドルに関連付けられているファイルに関する、Macintosh のファインダ情報を返する。
    FSCTL_GET_REPARSE_POINT  ファイルまたはディレクトリの再解析ポイントデータを返する。
    FSCTL_LOCK_VOLUME ボリュームをロックする。
    FSCTL_MARK_HANDLE 指定されたファイルまたはディレクトリと、その NTFS 変更ジャーナルレコードに、そのファイル
またはディレクトリに加えられた変更に関する情報のマークを付ける。
    FSCTL_OPBATCH_ACK_CLOSE クライアントアプリケーションがファイルを閉じようとしていることをサーバーへ通知する。アプリケ
                                                _PENDING ーションはファイルに対する Oplock(opportunity lock)が解除されようとしていることを通知
した後に、この動作を利用できる。
    FSCTL_OPLOCK_BREAK_ACK_NO_2 ファイルに対する Oplock が解除されようとしていることを知らせる通知に応答する。アプリケー
ションはこの動作を使って、ファイルに対するすべての Oplock を解除するが、ファイルは開いた
ままの状態に保つ。
    FSCTL_OPLOCK_BREAK ファイルに対する排他 Oplock が解除されようとしていることを知らせる通知に応答する。アプ
                                    _ACKNOWLEDGE リケーションはこの動作を使って、ファイルに対してレベル 2 の Oplock を実施するよ指示す
る。
    FSCTL_OPLOCK_BREAK_NOTIFY  Oplock が解除されるまで待機することを呼び出し側のアプリケーションに許可する。
    FSCTL_QUERY_ALLOCATED ファイル内で、ディスク容量が割り当てられているファイル範囲を検索する。
                                                 _RANGES
    FSCTL_QUERY_FAT_BPB FAT16 または FAT12 のボリュームで最初の 36 バイトを返する。
    FSCTL_QUERY_USN_JOURNAL 現在の NTFS 変更ジャーナル、およびそのレコードとその容量に関する情報を照会する。
    FSCTL_READ_COMPRESSION 将来の利用に備えて予約されている。
    FSCTL_READ_USN_JOURNAL 指定された 2 つの USN 値の間に発生した NTFS 変更ジャーナルのレコードセットを、呼び
出し側のプロセスへ返する。
    FSCTL_RECALL_FILE Windows 2000 の階層格納域管理ソフトウェアである Remote Storage が管理している格納域
メディアからファイルを再度呼び出する。
    FSCTL_REQUEST_BATCH_OPLOCK ファイルに対するバッチ Oplock を要求する。
    FSCTL_REQUEST_FILTER_OPLOCK ファイルに対するフィルタ Oplock を要求する。
    FSCTL_REQUEST_OPLOCK_LEVEL_1 ファイルに対するレベル 1 の Oplock を要求する。
    FSCTL_REQUEST_OPLOCK_LEVEL_2 ファイルに対するレベル 2 の Oplock を要求する。
    FSCTL_SET_COMPRESSION ファイルまたはディレクトリの圧縮状態を設定する。
    FSCTL_SET_REPARSE_POINT ファイルまたはディレクトリの再解析ポイントを設定する。
    FSCTL_SET_SPARSE ファイルにスパースファイルのマークを付ける。
    FSCTL_SET_ZERO_DATA ファイルの一定の範囲にあるすべてのバイトを 0 に設定する。
    FSCTL_UNLOCK_VOLUME ボリュームをロック解除する。
    FSCTL_WRITE_COMPRESSION 将来の利用に備えて予約されている。
    IOCTL_DISK_CHECK_VERIFY 現在は使われていない。IOCTL_STORAGE_CHECK_VERIFY を使う。
    IOCTL_DISK_EJECT_MEDIA 現在は使われていません。IOCTL_STORAGE_EJECT_MEDIA を使う。
    IOCTL_DISK_FORMAT_TRACKS 連続した一連のディスクトラックをフォーマットする。
    IOCTL_DISK_GET_DRIVE_GEOMETRY 物理ディスクのジオメトリに関する情報を取得する。
    IOCTL_DISK_GET_DRIVE_LAYOUT ディスクの各パーティションに関する情報を提供する。
    IOCTL_DISK_GET_MEDIA_TYPES 現在は使われていない。IOCTL_STORAGE_GET_MEDIA_TYPES を使う。
    IOCTL_DISK_GET_PARTITION_INFO ディスクのパーティション情報を取得する。
    IOCTL_DISK_LOAD_MEDIA 現在は使われていない。IOCTL_STORAGE_LOAD_MEDIA を使う。
    IOCTL_DISK_MEDIA_REMOVAL 現在は使われていない。IOCTL_STORAGE_MEDIA_REMOVAL を使う。
    IOCTL_DISK_PERFORMANCE ディスクのパフォーマンス情報を提供する。
    IOCTL_DISK_REASSIGN_BLOCKS ディスクのブロックを代替セクタ領域へ割り当てる。
    IOCTL_DISK_SET_DRIVE_LAYOUT ディスクのパーティションを作成する。
    IOCTL_DISK_SET_PARTITION_INFO ディスクのパーティションタイプを設定する。
    IOCTL_DISK_VERIFY ディスクの一定の範囲を論理フォーマットする。
    IOCTL_SERIAL_LSRMST_INSERT 回線とモデムのステータスデータをデータストリームに配置する機能を有効または無効にする。
    IOCTL_STORAGE_CHECK_VERIFY リムーバブルデバイスのメディア変更の有無をチェックする。
    IOCTL_STORAGE_EJECT_MEDIA SCSI デバイスからメディアを取り出する。
    IOCTL_STORAGE_GET_MEDIA_TYPES メディアサポートに関する情報を取得する。
    IOCTL_STORAGE_LOAD_MEDIA メディアをデバイスへロードする。
    IOCTL_STORAGE_MEDIA_REMOVAL メディア取り出しメカニズムを有効または無効にする。

lpInBuffer
    動作を実行するために必要なデータを保持する 1 つのバッファへのポインタを指定する。
    dwIoControlCode パラメータが、入力データを必要としない動作を指定している場合、このパラメータは NULL でもよい。
nInBufferSize
    lpInBuffer が指すバッファのバイト単位のサイズ。
lpOutBuffer
    動作の出力データを受け取る 1 つのバッファへのポインタを指定する。
    dwIoControlCode パラメータが、出力データを作成しない動作を指定している場合、このパラメータは NULL でもよい。
nOutBufferSize
    lpOutBuffer が指すバッファのバイト単位のサイズである。
lpBytesReturned
    lpOutBuffer が指すバッファへ格納されるデータのバイト単位のサイズを受け取る、変数へのポインタを指定する。
    出力バッファが小さすぎて返されたデータを収容できない場合、この関数の呼び出しは失敗し、GetLastError 関数は

    ERROR_INSUFFICIENT_BUFFER エラーコードを返す。返されるバイト数は 0 になる。
    出力バッファが小さすぎてデータ全体を収容できず、一部のエントリだけを収容する場合、オペレーティングシステムはバッファに収容できるデ

    ータだけを返し、この関数の呼び出しは失敗する。

    GetLastError 関数は ERROR_MORE_DATA エラーコードを返し、lpBytesReturned は返されたデータの量を示する。アプリケーションで

    は新しい開始ポイントを指定したうえで、同じ動作を指定して DeviceIoControl をもう一度呼び出す必要がある。
    lpOverlapped が NULL の場合、lpBytesReturned に NULL を指定できない。動作によって出力データを作成しない場合であっても、  

    lpOutBuffer は NULL にできるが、DeviceIoControl 関数は lpBytesReturned が指す変数を使う。
    lpOverlapped が NULL ではない場合、lpBytesReturned に NULL を指定できる。動作がオーバーラップ( 非同期)である場合、  

    GetOverlappedResult 関数を呼び出して、返されたバイト数を取得できる。hDevice が 1 つの I/O 完了ポートに関連付けられている場合、

    GetQueuedCompletionStatus 関数を呼び出して、返されたバイト数を取得できる。
lpOverlapped
    1 つの OVERLAPPED 構造体へのポインタを指定する。
    FILE_FLAG_OVERLAPPED フラグをセットして hDevice を開いた場合、lpOverlapped は 1 つの有効な OVERLAPPED 構造体を指さな

    ければならない。この場合、動作はオーバーラップ( 非同期)動作として実行される。FILE_FLAG_OVERLAPPED をセットしてデバ

    イスを開き、lpOverlapped が NULL である場合、この関数は予測不可能な方法で失敗する。
    FILE_FLAG_OVERLAPPED フラグをセットせずに hDevice で指定したデバイスを開いた場合、lpOverlapped は無視され、動作が完了

    するかエラーが発生するまで DeviceIoControl 関数は制御を戻さない。

戻り値
    関数が成功すると、0 以外の値が返る。
    関数が失敗すると、0 が返る。拡張エラー情報を取得するには、GetLastError 関数を使う。

解説
    FILE_FLAG_OVERLAPPED をセットして hDevice で指定したデバイスを開き、lpOverlapped パラメータが 1 つの OVERLAPPED 構造

    体を指している場合、動作はオーバーラップ( 非同期)動作として実行される。この場合、この OVERLAPPED 構造体は、

    CreateEvent 関数を呼び出すことによって作成された手動リセットイベントオブジェクトのハンドルを保持していなければならない。