アプリケーションからのI/O Controlをドライバで受け取る方法

皆さん、こんにちは。A寿です。   突然ですが、皆さんは象の背中に乗ったことはありますか?・・・このお話にご興味のある方は本文の最後の【閑話休題】までどうぞ。     さて、先日は、「アプリケーションからSCSIコマンドを発行する方法」として、I/O ControlでSCSIコマンドを発行する方法をご紹介いたしました。そのI/O Controlをドライバ側でどのように受け取ればよいのかが気になるところではないかと思います。また、特定のI/O ControlやSCSIコマンドを自分が開発しているドライバで受け取って、何らかの処理を加えたいと考える方もいらっしゃるかと思います。そこで、本日は、「アプリケーションからのI/O Controlをドライバで受け取る方法」をご案内したいと思います。     Storage Samples   http://msdn.microsoft.com/en-us/library/dd163407.aspx   のドキュメントに、たくさんのストレージ サンプル ドライバが紹介されておりますが、今回はディスククラスドライバの上位フィルタドライバのサンプルである、diskperfドライバを使って、前回のSPTIアプリケーションが発行したIOCTL_SCSI_PASS_THROUGHのI/O Controlを受け取って、そのI/O Controlと一緒に渡されるSCSI_PASS_THROUGH構造体の中身をデバッガに表示させてみたいと思います。表示結果を前回のブログと比較することにより、確かにアプリケーションからドライバにSCSIコマンドを渡せていることがわかると思います。   まず、一般的な、アプリケーションがI/O Controlを発行した場合に、それを受け取るドライバ側の処理を説明いたしますと、次の手順となります。     (1) ドライバのIRP_MJ_DEVICE_CONTROLのコールバック(*1)で、目的のI/O Controlが入ってきたかどうかを判断する   (2) 目的のI/O Controlが入ってきていたら、そのI/O Controlに対する処理を行う         (*1) コールバックとは、K里さんのブログ「DriverObject と DriverEntry」で「Dispatch Routine」と言われているものと同じです。           dispatch routineの言葉の定義は、例えば、             Windows Driver Kit: Glossary の D  (http://msdn.microsoft.com/en-us/library/ms789534.aspx) の項目に      …


アプリケーションからSCSIコマンドを発行する方法

皆さん、こんにちは。A寿です。   突然ですが、皆さんはワイングラスの種類によってワインの味が変わる、という体験をしたことはありますか?・・・とお話しだすと、今回は少し長くなりますので、(もっと長い)本編が終わった後の【閑話休題】で述べさせていただきたいと思います。   さて、本日は、アプリケーションからSCSIコマンドを発行する方法をご紹介したいと思います。WDKのサンプルである、SPTI(SCSI Pass Through Interface)は、以下のフォルダにあります。     C:\WinDDK\6001.18002\src\storage\tools\spti   このフォルダのファイルの一覧を見てみますと、以下の5つのファイルがあります。   C:\WinDDK\6001.18002\src\storage\tools\spti>dir  ドライブ C のボリューム ラベルがありません。  ボリューム シリアル番号は 0836-2E4B です    C:\WinDDK\6001.18002\src\storage\tools\spti のディレクトリ   2008/11/27  16:57    <DIR>          . 2008/11/27  16:57    <DIR>          .. 2008/01/18  21:53               273 makefile  // 変更不可のファイルです 2008/01/18  21:53               136 sources   // ビルド用のマクロ定義ファイルです 2008/01/18  21:53            26,954 spti.c    // SPTIサンプルのソースコードです 2008/01/18  21:53            …