シリアル IRP の主要な関数コード

このトピックでは、シリアル IRP の主要な関数コードについて説明します。

ヘッダー: Wdm.h (Wdm.h または Ntddk.h を含みます)

IRP_MJ_CREATE

IRP_MJ_CREATE 要求は、シリアル デバイスを開きます。

送信日時

クライアントは、ポートまたはポートに接続されているデバイスにアクセスする前に、シリアル デバイスを開く必要があります。

入力パラメーター

なし。

出力パラメーター

なし。

I/O 状態ブロック

Information フィールドは 0 に設定されます。

Status フィールドには、以下のいずれかの値が設定されます。

状態 の値 説明
STATUS_SUCCESS シリアル デバイスが正常に開かれました。
STATUS_ACCESS_DENIED デバイスは既に開いています。
STATUS_DELETE_PENDING Serial がデバイスを削除する処理を行っています。
STATUS_INSUFFICIENT_RESOURCES デバイスが [Plug and Play Started] (プラグ アンド プレイ開始) 状態ではないか、ドライバーが内部データ構造を割り当てられませんでした。
STATUS_NOT_A_DIRECTORY シリアル デバイスをディレクトリとして開けません。
STATUS_PENDING Serial により要求はキューに登録され、後で処理されます。
STATUS_SHARED_IRQ_BUSY デバイスに割り当てられた割り込みが、開いている別のデバイスに使用されています。

操作

シリアル デバイスは使用する前に開く必要があります。 シリアル デバイスは排他的デバイスです。1 つのポートで開けるファイルは、常に 1 つだけです。

IRP_MJ_DEVICE_CONTROL

IRP_MJ_DEVICE_CONTROL 要求は、シリアル ポートを操作します。

送信日時

クライアントは、デバイス制御要求を使用して以下のことを行います。

  • ポートに関する情報の取得
  • レジスタの取得と設定
  • 操作モードの取得と設定

Serial でサポートされているデバイス制御要求の詳細については、ntddser.h ヘッダーを参照してください。

入力パラメーター

要求ごとに異なる

出力パラメーター

要求ごとに異なる

I/O 状態ブロック

要求ごとに異なる

操作

要求ごとに異なる

IRP_MJ_FLUSH_BUFFERS

IRP_MJ_FLUSH_BUFFER 要求は、シリアル デバイスの内部書き込みバッファーをフラッシュします。

送信日時

クライアントは、フラッシュ要求を使用して、フラッシュ要求の前にクライアントから送信されたすべての書き込み要求を Serial がいつ完了したかを判断します。

入力パラメーター

なし。

出力パラメーター

なし。

I/O 状態ブロック

Information メンバーは 0 に設定されます。

Status メンバーは、以下のいずれかの状態値に設定されます。

状態 の値 説明
STATUS_SUCCESS 要求は正常に完了しました。
STATUS_CANCELLED クライアントが要求を取り消しました。 デバイス エラーが発生した場合に要求を取り消すように Serial が構成されていて、デバイス エラーが発生した場合も、Serial は要求を取り消します。
STATUS_DELETE_PENDING ドライバーがデバイスを削除する処理を行っています。
STATUS_PENDING Serial により要求はキューに登録され、後で処理されます。

操作

Serial が書き込み要求とフラッシュ要求のキューを作成し、要求を受信した順序で処理を開始します。 Serial は、フラッシュ要求の前に受信したすべての書き込み要求に対して IoCompleteRequest を呼び出した後にフラッシュ要求を完了します。 ただし、フラッシュ要求の完了は、以前に開始されたすべての書き込み要求がデバイス スタック内の他のドライバーによって完了されたことを示すわけではありません。 たとえば、フィルター ドライバーがまだ書き込み要求を処理しているかもしれません。 クライアントは、書き込み要求の IRP を解放または再利用する前に、デバイス スタック内のすべてのドライバーによって書き込み要求が完了されていることをチェックする必要があります。

IRP_MJ_INTERNAL_DEVICE_CONTROL

IRP_MJ_INTERNAL_DEVICE_CONTROL 要求は、シリアル デバイスの内部動作モードを設定します。

送信日時

クライアントは、内部デバイス制御要求を使用して以下のことを行います。

  • 基本設定の取得とリセット
  • 待機/スリープ解除操作の制御

内部デバイス制御要求の詳細については、ntddser.h ヘッダーを参照してください。

入力パラメーター

要求ごとに異なる

出力パラメーター

要求ごとに異なる

I/O 状態ブロック

要求ごとに異なる

操作

要求ごとに異なる

IRP_MJ_PNP

IRP_MJ_PNP 要求は、プラグ アンド プレイ (PnP) をサポートします。

送信日時

PnP マネージャーは、デバイスに対してクエリを実行したり、デバイスを起動、停止、削除したりするために IRP_MJ_PNP 要求を送信します。

入力パラメーター

要求ごとに異なる

出力パラメーター

要求ごとに異なる

I/O 状態ブロック

要求ごとに異なる

操作

Serial では、以下のプラグ アンド プレイ要求がサポートされます。

Serial は、他のすべてのプラグ アンド プレイ要求を、それ以上処理することなくデバイス スタックに送信します。

Serial は、プラグ アンド プレイ要求に対して、シリアル固有の以下の処理を実行します。

IRP_MN_QUERY_ID (BusQueryHardwardIDs 型)

シリアル デバイスがマルチポート ISA カード上にある場合、Serial は、ワイド文字列 "*PNP0502" をハードウェア ID の文字列に追加します。

IRP_MN_FILTER_RESOURCE_REQUIREMENTS

マルチポート ISA カード上のシリアル デバイスは、同じ割り込みステータス レジスタと同じ割り込みを共有します。

プラグ アンド プレイ要求の一般的な操作の詳細については、「プラグ アンド プレイ マイナー IRP」を参照してください。

IRP_MJ_POWER

IRP_MJ_POWER 要求は、電源管理を制御します。

送信日時

電源マネージャーは、電源の状態に対するクエリを実行したり、電源の状態を設定したりするために電源要求を使用します。

入力パラメーター

要求ごとに異なる

出力パラメーター

要求ごとに異なる

I/O 状態ブロック

要求ごとに異なる

操作

Serial では、以下の電源要求がサポートされます。

Serial は、他のすべての電源要求を、下位レベルのドライバーに完了させるためにデバイス スタックに送信します。

Serial は、Serial をファンクション ドライバーか下位レベルのフィルター ドライバーとして使用するシリアル デバイス スタックの、既定の電源ポリシー所有者です。

これらの要求の一般的な操作の詳細については、「電源 IRP の扱い方のルール」を参照してください。

IRP_MJ_QUERY_INFORMATION

IRP_MJ_QUERY_INFORMATION 要求は、シリアル デバイスの EOF (End Of File) 情報を照会します。

送信日時

クライアントは情報照会要求を使用して、シリアル デバイスで開かれたファイルに関する標準的な情報と位置情報を取得します。

入力パラメーター

Parameters.QueryFile.FileInformationClass は、FileStandardInformationFilePositionInformation に設定されます。

出力パラメーター

パラメーター 説明
FileStandardInformation AssociatedIrp.SystemBuffer メンバーは、Serial が標準的な情報を出力するために使用するクライアント割り当て FILE_STANDARD_INFORMATION 構造体をポイントします。
FilePositionInformation AssociatedIrp.SystemBuffer メンバーは、Serial が位置情報を出力するために使用するクライアント割り当て FILE_POSITION_INFORMATION 構造体をポイントします。

I/O 状態ブロック

要求が成功した場合、Information メンバーは 0 に設定されます。

Status メンバーは、以下のいずれかの状態値に設定されます。

状態 の値 説明
STATUS_SUCCESS 要求は正常に完了しました。
STATUS_CANCELLED クライアントが要求を取り消しました。 デバイス エラーが発生した場合に要求を取り消すように Serial が構成されていて、デバイス エラーが発生した場合も、Serial は要求を取り消します。
STATUS_DELETE_PENDING Serial がデバイスを削除する処理を行っています。
STATUS_INVALID_PARAMETER 要求された情報はサポートされていません。
STATUS_PENDING Serial により要求はキューに登録され、後で処理されます。

操作

Serial では、FileStandardInformation 型と FilePositionInformation 型の要求がサポートされます。

標準的なファイル情報は、必要に応じて常に 0 または FALSE に設定されます。 位置情報は常に 0 に設定されます。

IRP_MJ_READ

IRP_MJ_READ 要求は、シリアル デバイスからクライアントにデータを転送します。

送信日時

クライアントは、シリアル デバイスのデータを読み取るときには常に読み取り要求を使用します。

入力パラメーター

Parameters.Read.Length メンバーは、クライアントの読み取りバッファーに転送するバイト数に設定されます。

出力パラメーター

AssociatedIrp.SystemBuffer メンバーは、シリアル デバイスで読み取られたデータのコピー先になるクライアント割り当て読み取りバッファーをポイントします。

I/O 状態ブロック

Information メンバーは、クライアントの読み取りバッファーに転送されたバイト数に設定されます。

Status メンバーは、以下のいずれかの値に設定されます。

状態 の値 説明
STATUS_SUCCESS 要求は正常に完了しました。
STATUS_CANCELLED クライアントが要求を取り消しました。 デバイス エラーが発生した場合に要求を取り消すように Serial が構成されていて、デバイス エラーが発生した場合も、Serial は要求を取り消します。
STATUS_DELETE_PENDING Serial がデバイスを削除する処理を行っています。
STATUS_PENDING Serial により要求はキューに登録され、後で処理されます。
STATUS_TIMEOUT 要求を完了するまでの時間が、合計タイムアウト値か間隔タイムアウト値を超えました。

操作

クライアントは、タイムアウト イベントを使用して読み取り要求を終了できます。 ただし、シリアル デバイスを開いたときに、デバイスのタイムアウト設定が未定義になっていることに注意してください。 カーネル モード クライアントでは、IOCTL_SERIAL_INTERNAL_BASIC_SETTINGS を使用してタイムアウト パラメーターを 0 に設定できます (タイムアウト イベントは使用されません)。 ユーザー モード クライアントとカーネル モード クライアントでは、IOCTL_SERIAL_SET_TIMEOUTS 要求を使用してタイムアウト パラメーターを設定できます。

読み取りと書き込みのタイムアウトの詳細については、「シリアル デバイスに読み取りと書き込みのタイムアウトを設定する」を参照してください。

IRP_MJ_SET_INFORMATION

IRP_MJ_SET_INFORMATION 要求は、シリアル デバイスに関する EOF 情報を設定します。

送信日時

クライアントは、情報設定要求を使用して、シリアル デバイスで開かれたファイルの現在の EOF 位置を変更します。

入力パラメーター

Parameters.SetFile.FileInformationClass メンバーは、FileEndOfFileInformationFileAllocationInformation に設定されます。

出力パラメーター

なし。

I/O 状態ブロック

要求が成功した場合、Information メンバーは 0 に設定されます。

Status メンバーは、以下のいずれかの状態値に設定されます。

状態 の値 説明
STATUS_SUCCESS 要求は正常に完了しました。
STATUS_CANCELLED クライアントが要求を取り消しました。 デバイス エラーが発生した場合に要求を取り消すように Serial が構成されていて、デバイス エラーが発生した場合も、Serial は要求を取り消します。
STATUS_DELETE_PENDING Serial がデバイスを削除する処理を行っています。
STATUS_INVALID_PARAMETER 指定された EOF 情報はサポートされていません。
STATUS_PENDING Serial により要求はキューに登録され、後で処理されます。

操作

Serial では、FileEndOfFileInformation 型と FileAllocationInformation 型の要求がサポートされます。 ただし、Serial が実際にファイル情報を設定するわけではありません。 EOF 位置は常に 0 に設定されます。

IRP_MJ_SYSTEM_CONTROL

IRP_MJ_SYSTEM_CONTROL 要求は、WMI 要求をサポートします。

送信日時

WMI カーネル モード コンポーネントは、Serial によってシリアル デバイスの WMI プロバイダーとして登録された後であれば、いつでも IRP_MJ_SYSTEM_CONTROL 要求を送信できます。 WMI IRP は通常、ユーザー モードのデータ コンシューマーが WMI データを要求したときに送信されます。

入力パラメーター

要求ごとに異なる

出力パラメーター

要求ごとに異なる

I/O 状態ブロック

WMI 要求では、Status フィールドは以下のいずれかの値に設定されます。

状態 の値 説明
STATUS_SUCCESS 要求は正常に完了しました。
STATUS_BUFFER_TOO_SMALL 出力バッファーのサイズ (バイト単位) が、要求された情報に必要なサイズよりも小さくなっています。
STATUS_INSUFFICIENT_RESOURCES シリアル ポート名を保存するためのシステム リソースが不足していました。
STATUS_INVALID_DEVICE_REQUEST 要求が無効です。
STATUS_WMI_GUID_NOT_FOUND WMI GUID はサポートされていません。

操作

Serial は、WmiSystemControl を使用して WMI システム制御要求を処理します。 Serial は、デバイスに送信された WMI 要求を処理するために WmiSystemControl によって呼び出される、以下の種類の WMI ライブラリ コールバック ルーチンを登録します。

Serial は、その他のシステム制御要求をサポートしていません。 WMI 以外の要求の場合、Serial は現在のスタックの場所をスキップし、デバイス スタックに要求を送信します。

Serial は、次の表に掲載されている WMI GUID を登録します。

シリアル WMI GUID 関連付けられるデータ構造

SERIAL_PORT_WMI_NAME_GUID USHORT に続けて WCSTR
SERIAL_PORT_WMI_COMM_GUID SERIAL_WMI_COMM_DATA
SERIAL_PORT_WMI_HW_GUID SERIAL_WMI_HW_DATA
SERIAL_PORT_WMI_PERF_GUID SERIAL_WMI_PERF_DATA
SERIAL_PORT_WMI_PROPERTIES_GUID WMI_SERIAL_PORT_PROPERTIES

シリアル デバイスの WMI 名は、デバイスのプラグ アンド プレイ レジストリ キーのエントリ値 PortName の値です。

IRP_MJ_WRITE

IRP_MJ_WRITE 要求は、クライアントからシリアル デバイスにデータを転送します。

送信日時

クライアントは、シリアル デバイスにデータを書き込むときには常に書き込み要求を使用します。

入力パラメーター

Parameters.Write.Length メンバーは、クライアント割り当て書き込みバッファーからシリアル デバイスにコピーするバイト数に設定されます。

AssociatedIrp.SystemBuffer メンバーは、Serial がシリアル デバイスにコピーするデータのコピー元になるクライアント割り当て書き込みバッファーをポイントします。

出力パラメーター

なし。

I/O 状態ブロック

Information メンバーは、クライアントの書き込みバッファーからシリアル デバイスへ実際にコピーされたバイト数に設定されます。

Status メンバーは、以下のいずれかの値に設定されます。

状態 の値 説明
STATUS_SUCCESS 要求は正常に完了しました。
STATUS_CANCELLED クライアントが要求を取り消しました。 デバイス エラーが発生した場合に要求を取り消すように Serial が構成されていて、デバイス エラーが発生した場合も、Serial は要求を取り消します。
STATUS_DELETE_PENDING Serial がデバイスを削除する処理を行っています。
STATUS_PENDING Serial により要求はキューに登録され、後で処理されます。
STATUS_TIMEOUT 書き込み要求に許可された合計時間を超えました。

操作

クライアントは、タイムアウト イベントを使用して書き込み要求を終了できます。 ただし、シリアル デバイスを開いたときに、デバイスに設定されていたタイムアウト イベントが未定義になっていることに注意してください。 カーネル モード クライアントは、IOCTL_SERIAL_INTERNAL_BASIC_SETTINGS を使用してタイムアウト パラメーターをゼロに設定したり (タイムアウト イベントは使用しません)、IOCTL_SERIAL_SET_TIMEOUTS 要求を使用してタイムアウト パラメーターを設定したりできます。 読み取りと書き込みのタイムアウトの詳細については、「シリアル デバイスに読み取りと書き込みのタイムアウトを設定する」を参照してください。

プラグ アンド プレイのマイナー IRP

電源 IRP の処理に関するルール

シリアル コントローラー ドライバー設計ガイド