FltCreateCommunicationPort 関数 (fltkernel.h)

FltCreateCommunicationPort は、ミニフィルター ドライバーがユーザー モード アプリケーションからの接続要求を受信できる通信サーバー ポートを作成します。

構文

NTSTATUS FLTAPI FltCreateCommunicationPort(
  [in]           PFLT_FILTER            Filter,
  [out]          PFLT_PORT              *ServerPort,
  [in]           POBJECT_ATTRIBUTES     ObjectAttributes,
  [in, optional] PVOID                  ServerPortCookie,
  [in]           PFLT_CONNECT_NOTIFY    ConnectNotifyCallback,
  [in]           PFLT_DISCONNECT_NOTIFY DisconnectNotifyCallback,
  [in, optional] PFLT_MESSAGE_NOTIFY    MessageNotifyCallback,
  [in]           LONG                   MaxConnections
);

パラメーター

[in] Filter

呼び出し元の不透明なフィルター ポインター。

[out] ServerPort

通信サーバー ポートの不透明なポート ハンドルを受け取る呼び出し元によって割り当てられた変数へのポインター。 ミニフィルター ドライバーは、このハンドルを使用して、ユーザー モード アプリケーションからの受信接続要求をリッスンします。

[in] ObjectAttributes

通信サーバー ポートの属性を指定する OBJECT_ATTRIBUTES 構造体へのポインター。 この構造体は、 InitializeObjectAttributes の以前の呼び出しによって初期化されている必要があります。 このパラメーターは必須であり、 NULL にすることはできません。 通信ポート オブジェクトのこの構造体のメンバーは、次のとおりです。

メンバー
ULONG の 長さ

InitializeObjectAttributes は、 このメンバーを sizeof(OBJECT_ATTRIBUTES) に設定します

PUNICODE_STRING ObjectName ポート オブジェクトの一意の名前 (L"\\MyFilterPort"など) を含む UNICODE_STRING 構造体へのポインター。
PSECURITY_DESCRIPTOR SecurityDescriptor ポート オブジェクトに適用するセキュリティ記述子 (SECURITY_DESCRIPTOR) へのポインター。 必要に応じて、 FltBuildDefaultSecurityDescriptor を呼び出すことによって、既定のセキュリティ記述子を作成できます。
ULONG 属性 ポート ハンドルに必要な属性を指定するフラグのビットマスク。 これらのフラグには、OBJ_KERNEL_HANDLEを含める必要があります。 呼び出し元は必要に応じて、OBJ_CASE_INSENSITIVE フラグを設定することもできます。これは、名前参照コードが完全一致検索を実行するのではなく 、ObjectName の大文字と小文字を無視する必要があることを示します。

[in, optional] ServerPortCookie

ミニフィルター ドライバーによって定義されたコンテキスト情報へのポインター。 この情報を使用して、同じミニフィルター ドライバーによって作成された複数の通信サーバー ポートを区別できます。 フィルター マネージャーは、このコンテキスト ポインターをパラメーターとして ConnectNotifyCallback ルーチンに渡します。 このパラメーターは省略可能であり、 NULL にすることができます

[in] ConnectNotifyCallback

呼び出し元が指定したコールバック ルーチンへのポインター。 フィルター マネージャーは、ユーザー モード アプリケーションが FilterConnectCommunicationPort を 呼び出してミニフィルター ドライバーに接続要求を送信するたびに、このルーチンを呼び出します。 このパラメーターは必須であり、 NULL にすることはできません。 このルーチンは、IRQL = PASSIVE_LEVELで呼び出されます。

このルーチンは、次のように宣言されています。

typedef NTSTATUS
(*PFLT_CONNECT_NOTIFY) (
      IN PFLT_PORT ClientPort,
      IN PVOID ServerPortCookie,
      IN PVOID ConnectionContext,
      IN ULONG SizeOfContext,
      OUT PVOID *ConnectionPortCookie
      );

ClientPort

ユーザー モード アプリケーションとカーネル モード ミニフィルター ドライバーの間で確立される新しいクライアント ポートの不透明なハンドル。

ミニフィルター ドライバーは、この クライアント ポート でメッセージを送信および返信するときに、このハンドルを ClientPort パラメーターとして FltSendMessage に渡す必要があります。 (これは、FltCreateCommunicationPort によって返される ServerPort ハンドルと同じではないことに注意してください)。

ミニフィルター ドライバーは、最終的にこのクライアント ポートを閉じる必要があります。 クライアント ポートは、通常はミニフィルター ドライバーの DisconnectNotifyCallback ルーチンから FltCloseClientPort を呼び出すことによって閉じられます。

ServerPortCookie

ミニフィルター ドライバーによって定義されたコンテキスト情報へのポインター。 この情報を使用して、同じミニフィルター ドライバーによって作成された複数の通信サーバー ポートを区別できます。 サーバー ポートが作成されると、ミニフィルター ドライバーは、このコンテキスト ポインターを FltCreateCommunicationPort へのパラメーターとして渡しました。

ConnectionContext

ユーザー モード アプリケーションが lpContext パラメーターで FilterConnectCommunicationPort に渡したコンテキスト情報ポインター。

SizeOfContext

ConnectionContext が指すバッファーのサイズ (バイト単位)。

ConnectionPortCookie

このクライアント ポートを一意に識別する情報へのポインター。 この情報は、ミニフィルター ドライバーによって定義されます。 フィルター マネージャーは、ミニフィルター ドライバーの DisconnectNotifyCallback ルーチンと MessageNotifyCallback ルーチンにパラメーターとしてこのコンテキスト ポインター 渡します。

[in] DisconnectNotifyCallback

クライアント ポートのユーザー モード ハンドル数が 0 に達したとき、またはミニフィルター ドライバーがアンロードされるときに呼び出される呼び出し元から指定されたコールバック ルーチンへのポインター。 このパラメーターは必須であり、 NULL にすることはできません。 このルーチンは、IRQL = PASSIVE_LEVELで呼び出されます。

このルーチンは、次のように宣言されています。

typedef VOID
(*PFLT_DISCONNECT_NOTIFY) (
      IN PVOID ConnectionCookie
      );

ConnectionCookie

このクライアント ポートを一意に識別する情報へのポインター。 この情報は、ミニフィルター ドライバーによって定義されます。 クライアント ポートが作成されると、ミニフィルター ドライバーは ConnectNotifyCallback ルーチンの ConnectionPortCookie パラメーターでこのコンテキスト ポインターを返しました。

[in, optional] MessageNotifyCallback

呼び出し元が指定したコールバック ルーチンへのポインター。 フィルター マネージャーは、ユーザー モード アプリケーションが FilterSendMessage を呼び出してクライアント ポートを介してミニフィルター ドライバーにメッセージを送信するたびに、IRQL = PASSIVE_LEVELでこのルーチンを呼び出します。 このパラメーターは省略可能であり、 NULL にすることができますNULL の場合、ポートにデータを送信するためにユーザー モードから行われた要求は、エラーを受け取ります。

このルーチンは、次のように宣言されています。

typedef NTSTATUS
(*PFLT_MESSAGE_NOTIFY) (
      IN PVOID PortCookie,
      IN PVOID InputBuffer OPTIONAL,
      IN ULONG InputBufferLength,
      OUT PVOID OutputBuffer OPTIONAL,
      IN ULONG OutputBufferLength,
      OUT PULONG ReturnOutputBufferLength
      );

PortCookie

このクライアント ポートを一意に識別する情報へのポインター。 この情報は、ミニフィルター ドライバーによって定義されます。 クライアント ポートが作成されると、ミニフィルター ドライバーは ConnectNotifyCallback ルーチンの ConnectionPortCookie パラメーターでこのコンテキスト ポインターを返しました。

InputBuffer

ミニフィルター ドライバーに送信されるメッセージを含む呼び出し元によって割り当てられたバッファーへのポインター。

InputBuffer は、未加工のロック解除されたユーザー モード バッファーへのポインターであることに注意してください。 このポインターは、ユーザー モード プロセスのコンテキストでのみ有効であり、 try/except ブロック内からのみアクセスする必要があります。

フィルター マネージャーは ProbeForRead を呼び出してこのポインターを検証しますが、バッファーが正しく配置されていることを確認しません。 バッファーに配置要件がある構造体が含まれている場合、ミニフィルター ドライバーは必要なアラインメント チェックを実行します。 これを行うには、MiniSpy サンプル ミニフィルター ドライバーに示すように、ミニフィルター ドライバーで IS_ALIGNED マクロを使用できます。

このパラメーターは省略可能であり、 NULL にすることができます

InputBufferLength

InputBuffer が指すバッファーのサイズ (バイト単位)。 InputBufferNULL の場合、このパラメーターは無視されます。

OutputBuffer

ミニフィルター ドライバーから応答 (存在する場合) を受信する呼び出し元によって割り当てられたバッファーへのポインター。

OutputBuffer は、ロックが解除された未加工のユーザー モード バッファーへのポインターであることに注意してください。 このポインターは、ユーザー モード プロセスのコンテキストでのみ有効であり、 try/except ブロック内からのみアクセスする必要があります。

フィルター マネージャーは ProbeForWrite を呼び出してこのポインターを検証しますが、バッファーが正しく配置されていることを確認しません。 バッファーに配置要件がある構造体が含まれている場合、ミニフィルター ドライバーは必要なアラインメント チェックを実行します。 これを行うには、MiniSpy サンプル ミニフィルター ドライバーに示すように、ミニフィルター ドライバーで IS_ALIGNED マクロを使用できます。

このパラメーターは省略可能であり、 NULL にすることができます

OutputBufferLength

OutputBuffer が指すバッファーのサイズ (バイト単位)。 OutputBufferNULL の場合、このパラメーターは無視されます。

ReturnOutputBufferLength

OutputBuffer が指すバッファーで返されるバイト数を受け取る、呼び出し元によって割り当てられた変数へのポインター。

[in] MaxConnections

このサーバー ポートで許可される同時クライアント接続の最大数。 このパラメーターは必須であり、0 より大きくする必要があります。

戻り値

FltCreateCommunicationPort は、次のいずれかのSTATUS_SUCCESSまたは適切な NTSTATUS 値を返します。

リターン コード 説明
STATUS_FLT_DELETING_OBJECT
指定した フィルター が破棄されています。 これはエラー コードです。
STATUS_INSUFFICIENT_RESOURCES
FltCreateCommunicationPort でプール割り当てエラーが発生しました。 これはエラー コードです。
STATUS_OBJECT_NAME_COLLISION
同じ名前のミニフィルター ドライバー通信ポートが既に存在します。 ポート名は一意である必要があります。 これはエラー コードです。

注釈

ミニフィルター ドライバーは FltCreateCommunicationPort を呼び出して、通信サーバー ポート オブジェクトを作成します。

サーバー ポートが作成されたら、ユーザー モード アプリケーションは FilterConnectCommunicationPort を呼び出してポートに接続できます。 接続すると、ユーザー モード アプリケーションは 、FilterSendMessageFilterGetMessageFilterReplyMessage などのユーザー モード メッセージング関数を呼び出すことによって、メッセージを送受信できます。

呼び出し元は、FltCreateCommunicationPortの ObjectAttributes パラメーターのOBJ_KERNEL_HANDLE属性フラグを設定する必要があります。 このフラグを設定すると、 FltCreateCommunicationPort の呼び出し元が実行されている可能性があるユーザー モード プロセスでミニフィルター ドライバー通信サーバー ポート ハンドルが使用されなくなります。 このフラグが設定されていない場合、 FltCreateCommunicationPort はSTATUS_INVALID_PARAMETERを返します。

FltCreateCommunicationPort によって作成されたすべてのサーバー ポートは、FltCloseCommunicationPort を呼び出すことによって最終的に閉じる必要があります。 サーバー ポートを閉じると、サーバー ポートへの新しい接続は許可されません。 また、FilterConnectCommunicationPort への呼び出しはすべて失敗します。 ただし、既存の接続は、ユーザー モード アプリケーションまたはミニフィルター ドライバーによって閉じられるまで、またはミニフィルター ドライバーがアンロードされるまで開いたままです。

要件

要件
対象プラットフォーム ユニバーサル
Header fltkernel.h (Fltkernel.h を含む)
Library FltMgr.lib
[DLL] Fltmgr.sys
IRQL PASSIVE_LEVEL

こちらもご覧ください

FilterConnectCommunicationPort

FilterGetMessage

FilterReplyMessage

FilterSendMessage

FltBuildDefaultSecurityDescriptor

FltCloseClientPort

FltCloseCommunicationPort

FltFreeSecurityDescriptor

FltSendMessage

InitializeObjectAttributes

OBJECT_ATTRIBUTES

PFLT_FILTER_UNLOAD_CALLBACK

ProbeForRead

ProbeForWrite

SECURITY_DESCRIPTOR