次の方法で共有


単一の DispatchCreateClose ルーチン

多くのドライバー 、特に階層化されたドライバーのチェーン内の下位レベルのドライバーは、 作成 要求の受信時に存在を確立するだけでよく、 クローズ 要求の受信を確認するだけで済みます。

たとえば、 IoGetDeviceObjectPointer を呼び出す 1 つ以上の密接に結合されたクラス ドライバーを持つデバイス コントローラーのポート ドライバーには、最小限の DispatchCreateClose ルーチンが含まれる場合があります。 ルーチンは、次のように IRP を完了する以外に何もしない可能性があります。

    :    : 
{ 
    Irp->IoStatus.Status = STATUS_SUCCESS; 
 Irp->IoStatus.Information = 0; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
 return STATUS_SUCCESS; 
}

この最小限の DispatchCreateClose ルーチンは、I/O 状態ブロックの 情報 メンバーを 0 に設定し、作成要求に対してファイル オブジェクトが開かれていることを示します。 情報 は、クローズ要求に対して意味がありません。 このルーチンは 状態 をSTATUS_SUCCESSに設定し、ドライバーが I/O 要求を受け入れる準備ができていることを示す状態値も返します。

要求が完了するまで元のユーザーが不確定だが非常に小さい間隔を待機すると見なされるため、この最小限の DispatchCreateClose ルーチンは、IRP (IO_NO_INCREMENT) の発信元の優先順位を高めずに IRP の作成を完了します。

DispatchCreateClose ルーチンの作業量は、ドライバーのデバイスまたは基になるデバイスの性質と、ドライバーの設計に部分的に依存します。 作成と閉じる要求に対して非常に異なる操作を実行する場合、ドライバーは 個別の DispatchCreate ルーチンと DispatchClose ルーチン でこれらの要求を処理する必要があります。

論理デバイスまたは物理デバイスを表すファイル オブジェクトを開く作成要求を処理するには、最上位レベルのドライバーで次の操作を行う必要があります。

  1. IoGetCurrentIrpStackLocation を呼び出して、IRP 内の I/O スタックの場所へのポインターを取得します。

  2. FileObjectを確認します。I/O スタックの場所のFileName を指定し、FileName のUnicode文字列の長さが 0 の場合はSTATUS_SUCCESSで IRP を完了し、それ以外の場合はSTATUS_INVALID_PARAMETERで IRP を完了します。

上記の手順に従うと、デバイスで疑似ファイルを開こうとしても後で問題が発生しなくなります。 例えば、存在しない \\device\parallel0\temp.datを開こうとする予防になります。