FltSendMessage 함수(fltkernel.h)

FltSendMessage는 미니필터 드라이버 또는 미니필터 드라이버 instance 대신 대기 중인 사용자 모드 애플리케이션에 메시지를 보냅니다.

구문

NTSTATUS FLTAPI FltSendMessage(
  [in]            PFLT_FILTER    Filter,
  [in]            PFLT_PORT      *ClientPort,
  [in]            PVOID          SenderBuffer,
  [in]            ULONG          SenderBufferLength,
  [out, optional] PVOID          ReplyBuffer,
  [in, out]       PULONG         ReplyLength,
  [in, optional]  PLARGE_INTEGER Timeout
);

매개 변수

[in] Filter

호출자에 대한 불투명 필터 포인터입니다. 이 매개 변수는 필수이며 NULL일 수 없습니다.

[in] ClientPort

사용자 모드 애플리케이션과 커널 모드 미니필터 드라이버 간의 연결 포트에 대한 불투명 클라이언트 포트 포인터가 포함된 변수에 대한 포인터입니다. 클라이언트 포트 포인터에 대한 자세한 내용은 FltCreateCommunicationPort에 대한 참조 항목에서 ConnectNotifyCallback 매개 변수에 대한 설명을 참조하세요.

[in] SenderBuffer

사용자 모드 애플리케이션으로 보낼 메시지를 포함하는 호출자가 할당한 버퍼에 대한 포인터입니다. 이 매개 변수는 필수이며 NULL일 수 없습니다.

[in] SenderBufferLength

SenderBuffer가 가리키는 버퍼의 크기(바이트)입니다. 자세한 내용은 비고를 참조하세요.

[out, optional] ReplyBuffer

애플리케이션에서 회신(있는 경우)을 수신하는 호출자가 할당한 버퍼에 대한 포인터입니다. 이 매개 변수는 선택 사항이며 NULL일 수 있습니다.

[in, out] ReplyLength

ReplyBuffer가 가리키는 버퍼의 크기(바이트)입니다. 이 매개 변수는 선택 사항이지만 ReplyBufferNULL이 아닌 경우 NULL이 아니어야 합니다.

[in, optional] Timeout

총 절대 또는 상대 시간 길이(100나노초 단위)를 지정하는 시간 제한 값에 대한 포인터로, 사용자 모드 애플리케이션에서 메시지를 받을 때까지 및 회신을 받을 때까지 호출자를 대기 상태로 전환할 수 있습니다(예상되는 경우).

양수 값은 1601년 1월 1일을 기준으로 절대 시간을 지정합니다. 음수 값은 현재 시간을 기준으로 간격을 지정합니다. 호출자를 대기 상태로 무기한 설정할 수 있는 경우 NULL 로 설정합니다.

반환 값

FltSendMessage 는 STATUS_SUCCESS 또는 다음 중 하나와 같은 적절한 NTSTATUS 값을 반환합니다.

반환 코드 설명
STATUS_INSUFFICIENT_RESOURCES FltSendMessage 에서 풀 할당 오류가 발생했습니다. 오류 코드입니다.
STATUS_PORT_DISCONNECTED 통신 포트의 연결이 끊어졌습니다. 오류 코드입니다.
STATUS_THREAD_IS_TERMINATING 스레드가 애플리케이션 또는 사용자에 의해 종료되었기 때문에 대기가 중단되었습니다.
STATUS_TIMEOUT 메시지를 배달하거나 회신을 받기 전에 시간 제한 간격이 만료되었습니다. 성공 코드입니다.

설명

FltSendMessage는 미니필터 드라이버 또는 미니필터 드라이버 instance 대신 사용자 모드 애플리케이션에 메시지를 보냅니다.

미니필터 드라이버가 FltSendMessage 를 호출하여 보내기 전에 애플리케이션이 FilterGetMessage 를 호출하여 메시지를 가져오는 경우 메시지가 즉시 전달됩니다. 일반적으로 애플리케이션이 메시지 루프 내에서 FilterGetMessage 를 호출하는 경우입니다.

그렇지 않으면 애플리케이션이 메시지를 가져오기 위해 호출하지 않은 경우 미니필터 드라이버는 다음과 같이 대기 상태로 전환됩니다.

  • 시간 제한이 0이 아니고 애플리케이션이 시간 제한 간격이 만료되기 전에 FilterGetMessage를 호출하면 메시지가 배달됩니다.

  • Timeout이 0이 아니고 시간 제한 간격이 만료되기 전에 애플리케이션이 FilterGetMessage를 호출하지 않으면 메시지가 배달되지 않으며 FltSendMessage는 STATUS_TIMEOUT 반환합니다. (참고: STATUS_TIMEOUT 성공 코드입니다.)

  • 시간 제한이 0이면 미니필터 드라이버가 무기한 대기 상태로 전환됩니다. 애플리케이션이 FilterGetMessage를 호출하면 메시지가 배달됩니다.

메시지가 전달된 후 ReplyBufferNULL이면 FltSendMessage 는 STATUS_SUCCESS 반환합니다.

그렇지 않으면 ReplyBufferNULL이 아니면 미니필터 드라이버가 다음과 같이 대기 상태로 전환됩니다.

  • Timeout이 0이 아닌 경우 시간 제한 간격이 만료되기 전에 애플리케이션에서 FilterReplyMessage를 호출하면 미니필터 드라이버가 회신을 수신하고 FltSendMessage는 STATUS_SUCCESS 반환합니다.

  • Timeout이 0이 아니고 시간 제한 간격이 만료되기 전에 미니필터 드라이버가 회신을 받지 못하면 FltSendMessage는 STATUS_TIMEOUT 반환합니다. (참고: STATUS_TIMEOUT 성공 코드입니다.)

  • 미니필터 드라이버가 회신을 기다리는 동안 시간 제한이 0이면 미니필터 드라이버가 무기한 대기 상태로 전환됩니다. 애플리케이션이 FilterReplyMessage를 호출하면 미니필터 드라이버가 회신을 수신하고 FltSendMessage 가 STATUS_SUCCESS 반환합니다.

참고

 (시스템별) 구조 패딩 요구 사항으로 인해 FltSendMessageFilterReplyMessage와 연결된 버퍼의 크기를 설정할 때 정확도가 필요합니다. 예를 들어 FilterReplyMessage 를 통해 데이터를 미니필터로 보내야 한다고 가정합니다. 사용자 모드 구성 요소는 이렇게 하려면 다음 구조를 선언할 수 있습니다.

typedef struct _REPLY_STRUCT
{
    FILTER_REPLY_HEADER Header;
    MY_STRUCT Data;  // The structure to be sent to the minifilter
} REPLY_STRUCT, *PREPLY_STRUCT;

이 구조를 고려할 때 FilterReplyMessage의 호출자가 dwReplyBufferSizesizeof(REPLY_STRUCT)로 설정하고 FltSendMessageReplyLength 매개 변수를 동일한 값으로 설정하는 것이 분명해 보일 수 있습니다. 그러나 구조 패딩 특이성 sizeof(REPLY_STRUCT) 으로 인해 가 보다 sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT)클 수 있습니다. 이 경우 FltSendMessage 는 STATUS_BUFFER_OVERFLOW 반환합니다.

따라서 dwReplyBufferSizeReplyLength를 둘 다 대신 sizeof(REPLY_STRUCT)로 설정하여 FilterReplyMessageFltSendMessage(위의 예제를 활용)를 호출하는 sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT) 것이 좋습니다. 이렇게 하면 REPLY_STRUCT 구조체의 끝에 있는 추가 패딩이 무시됩니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 SP4, Windows XP SP2, Windows Server 2003 SP1 이상 운영 체제용 Microsoft Windows 2000 업데이트 롤업 1.
대상 플랫폼 유니버설
헤더 fltkernel.h(FltKernel.h 포함)
라이브러리 FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

추가 정보

FilterGetMessage

FilterReplyMessage

FilterSendMessage

FltCreateCommunicationPort