FltSendMessage 함수(fltkernel.h)
FltSendMessage 는 미니 필터 드라이버 또는 미니 필터 드라이버 인스턴스를 대신하여 대기 중인 사용자 모드 애플리케이션에 메시지를 보냅니다.
구문
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 가 가리키는 버퍼의 크기(바이트)입니다. 이 매개 변수는 선택 사항이지만 ReplyBuffer 가 NULL 이 아닌 경우 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 는 미니 필터 드라이버 또는 미니 필터 드라이버 인스턴스를 대신하여 사용자 모드 애플리케이션에 메시지를 보냅니다.
미니 필터 드라이버가 FltSendMessage 를 호출하여 보내기 전에 애플리케이션이 FilterGetMessage를 호출하여 메시지를 가져오는 경우 메시지가 즉시 전달됩니다. 일반적으로 애플리케이션이 메시지 루프 내에서 FilterGetMessage 를 호출하는 경우입니다.
그렇지 않으면 애플리케이션이 메시지를 가져오기 위해 호출되지 않은 경우 미니 필터 드라이버는 다음과 같이 대기 상태로 전환됩니다.
Timeout 이 0이 아니고 시간 제한 간격이 만료되기 전에 애플리케이션에서 FilterGetMessage 를 호출하면 메시지가 전달됩니다.
제한 시간이 0이 아니고 시간 제한 간격이 만료되기 전에 애플리케이션이 FilterGetMessage 를 호출하지 않으면 메시지가 전달되지 않고 FltSendMessage 가 STATUS_TIMEOUT 반환합니다. (참고: STATUS_TIMEOUT 성공 코드입니다.)
시간 제한이 0이면 미니 필터 드라이버가 무기한 대기 상태로 전환됩니다. 애플리케이션이 FilterGetMessage를 호출하면 메시지가 전달됩니다.
메시지가 전달된 후 ReplyBuffer 가 NULL 이면 FltSendMessage 는 STATUS_SUCCESS 반환합니다.
그렇지 않으면 ReplyBuffer 가 NULL 이 아니면 미니 필터 드라이버는 다음과 같이 대기 상태로 전환됩니다.
제한 시간이 0이 아니고 시간 제한 간격이 만료되기 전에 애플리케이션이 FilterReplyMessage를 호출하면 미니 필터 드라이버가 회신을 수신하고 FltSendMessage 가 STATUS_SUCCESS 반환합니다.
Timeout 이 0이 아니고 시간 제한 간격이 만료되기 전에 미니 필터 드라이버가 회신을 받지 못하면 FltSendMessage 는 STATUS_TIMEOUT 반환합니다. (참고: STATUS_TIMEOUT 성공 코드입니다.)
미니 필터 드라이버가 회신을 대기할 때 시간 제한이 0이면 미니 필터 드라이버가 무기한 대기 상태로 전환됩니다. 애플리케이션이 FilterReplyMessage 를 호출하면 미니 필터 드라이버가 회신을 수신하고 FltSendMessage 가 STATUS_SUCCESS 반환합니다.
참고
(시스템별) 구조 패딩 요구 사항으로 인해 FltSendMessage 및 FilterReplyMessage와 연결된 버퍼의 크기를 설정할 때 정확도가 필요합니다. 예를 들어 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)를 설정하고 FltSendMessage 의 ReplyLength 매개 변수를 동일한 값으로 설정하는 것이 분명해 보일 수 있습니다. 그러나 구조 패딩 특이성 sizeof(REPLY_STRUCT) sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT)때문에 . 이 경우 FltSendMessage 는 STATUS_BUFFER_OVERFLOW 반환합니다.
따라서 dwReplyBufferSize 및 ReplyLength 를 둘 다 대신 sizeof(REPLY_STRUCT)설정하여 FilterReplyMessage 및 FltSendMessage(위의 예제를 활용)를 호출하는 것이 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 |
추가 정보
피드백
다음에 대한 사용자 의견 제출 및 보기