微型过滤器从用户模式应用程序接收常量值
Mini-filter receives constant value from user-mode application
我遇到了一个问题,我使用 FltSendMessage 从内核模式向用户模式发送一条消息,希望得到回复。传递的结构包含一个设置为 0 或 1 的 int。用户模式通过设置此标志并调用 FilterReplyMessage 进行回复。但是,当内核收到消息时,它的值始终为 56。无论我在用户模式下将标志设置为多少,内核始终收到值 56。我很困惑我的错误在哪里。
我已经尝试将 passFlag 的数据类型从 int 更改为其他类型(USHORT 等),我知道这可能不会有什么不同,但值得一试。
因为内核消息已成功回复(检查用户模式 HRESULT returns 没有错误并且没有超时,所以如果没有收到回复系统将挂起,但它不会),我知道错误必须与在用户模式和内核模式之间传递的缓冲区有关。我似乎找不到 passFlag 在内核模式下没有被正确解释的原因。
有人可以帮忙吗?
共享结构:
typedef struct _REPLY_MESSAGE_STRUCT {
// Message header.
FILTER_REPLY_HEADER header;
// Flag to be set
// by user mode.
int passFlag;
}REPLY_MESSAGE_STRUCT, *PREPLY_MESSAGE_STRUCT;
内核代码:
DbgPrint("Sending Message...\n");
replyBuffer.passFlag = 0;
ULONG replySize = ((ULONG)sizeof(replyBuffer.header)) + ((ULONG)sizeof(replyBuffer));
REPLY_MESSAGE_STRUCT replyBuffer;
// Note: Try-catch statement has been omitted in this question to save time.
// In the actual code there is a try-catch statement surrounding FltSendMessage.
status = FltSendMessage(imageFilterData.filterHandle,
&imageFilterData.clientPort,
(PVOID)&sendingBuffer.messageBuffer,
sizeof(sendingBuffer.messageBuffer),
(PVOID)&replyBuffer,
&replySize,
0
);
// Always returns 56
// When a reply has been received.
DbgPrint("Message received: %i\n", replyBuffer.passFlag);
用户代码:
// User-mode buffer is the same size as kernel-mode buffer.
ULONG replySize = ((ULONG)sizeof(replyBuffer.header)) + ((ULONG)sizeof(replyBuffer));
replyMessage.header.MessageId = messageFromKernel.header.MessageId;
REPLY_MESSAGE_STRUCT replyMessage;
// User-mode setting flag.
replyMessage.passFlag = 1;
// Flag is changed to 1 successfully.
printf("Test: %i\n", replyMessage.passFlag);
// Reply is sent successfully, but flag value on kernel end is always 56
hResult = FilterReplyMessage(port,
&replyMessage.header,
replySize);
_com_error err2(hResult);
errorMessage = err2.ErrorMessage();
// No errors.
printf("Result: %s\n", errorMessage);
我尝试过的:
正在更改 passFlag 的数据类型。
遍历 FltSendMessage 和 FilterReply 消息前后的每个步骤,以查找值在发送回内核之前是否正在更改。
您在调用中使用了错误数据 FltSendMessage
:
ReplyBuffer 是指向 custom 用户定义数据的指针。它不能从 FILTER_REPLY_HEADER
开始
SenderBuffer 是指向 custom 用户定义数据的指针。它不能从 FILTER_MESSAGE_HEADER
开始
首先你需要 define structures,它们在内核和用户模式之间共享,用于消息和回复。例如
struct SCANNER_NOTIFICATION {
// any custom data
int someData;
};
struct SCANNER_REPLY {
// any custom data
int passFlag;
};
在内核模式下你可以直接使用它:
SCANNER_NOTIFICATION send;
SCANNER_REPLY reply;
ULONG ReplyLength = sizeof(reply);
FltSendMessage(*, *, &send, sizeof(send), &reply, &ReplyLength, *);
在用户模式下你 need define 2 个额外的结构:
struct SCANNER_MESSAGE : public FILTER_MESSAGE_HEADER, public SCANNER_NOTIFICATION {};
struct SCANNER_REPLY_MESSAGE : public FILTER_REPLY_HEADER, public SCANNER_REPLY {};
(我这里用的是c++风格,here用的是c风格)
在用户模式下我们需要使用 next,例如:
SCANNER_MESSAGE* mesage;
FilterGetMessage(*, mesage, sizeof(SCANNER_MESSAGE), *);
和
SCANNER_REPLY_MESSAGE reply;
reply.MessageId = mesage->MessageId;
FilterReplyMessage(*, &reply, sizeof(reply));
我遇到了一个问题,我使用 FltSendMessage 从内核模式向用户模式发送一条消息,希望得到回复。传递的结构包含一个设置为 0 或 1 的 int。用户模式通过设置此标志并调用 FilterReplyMessage 进行回复。但是,当内核收到消息时,它的值始终为 56。无论我在用户模式下将标志设置为多少,内核始终收到值 56。我很困惑我的错误在哪里。
我已经尝试将 passFlag 的数据类型从 int 更改为其他类型(USHORT 等),我知道这可能不会有什么不同,但值得一试。
因为内核消息已成功回复(检查用户模式 HRESULT returns 没有错误并且没有超时,所以如果没有收到回复系统将挂起,但它不会),我知道错误必须与在用户模式和内核模式之间传递的缓冲区有关。我似乎找不到 passFlag 在内核模式下没有被正确解释的原因。
有人可以帮忙吗?
共享结构:
typedef struct _REPLY_MESSAGE_STRUCT {
// Message header.
FILTER_REPLY_HEADER header;
// Flag to be set
// by user mode.
int passFlag;
}REPLY_MESSAGE_STRUCT, *PREPLY_MESSAGE_STRUCT;
内核代码:
DbgPrint("Sending Message...\n");
replyBuffer.passFlag = 0;
ULONG replySize = ((ULONG)sizeof(replyBuffer.header)) + ((ULONG)sizeof(replyBuffer));
REPLY_MESSAGE_STRUCT replyBuffer;
// Note: Try-catch statement has been omitted in this question to save time.
// In the actual code there is a try-catch statement surrounding FltSendMessage.
status = FltSendMessage(imageFilterData.filterHandle,
&imageFilterData.clientPort,
(PVOID)&sendingBuffer.messageBuffer,
sizeof(sendingBuffer.messageBuffer),
(PVOID)&replyBuffer,
&replySize,
0
);
// Always returns 56
// When a reply has been received.
DbgPrint("Message received: %i\n", replyBuffer.passFlag);
用户代码:
// User-mode buffer is the same size as kernel-mode buffer.
ULONG replySize = ((ULONG)sizeof(replyBuffer.header)) + ((ULONG)sizeof(replyBuffer));
replyMessage.header.MessageId = messageFromKernel.header.MessageId;
REPLY_MESSAGE_STRUCT replyMessage;
// User-mode setting flag.
replyMessage.passFlag = 1;
// Flag is changed to 1 successfully.
printf("Test: %i\n", replyMessage.passFlag);
// Reply is sent successfully, but flag value on kernel end is always 56
hResult = FilterReplyMessage(port,
&replyMessage.header,
replySize);
_com_error err2(hResult);
errorMessage = err2.ErrorMessage();
// No errors.
printf("Result: %s\n", errorMessage);
我尝试过的:
正在更改 passFlag 的数据类型。
遍历 FltSendMessage 和 FilterReply 消息前后的每个步骤,以查找值在发送回内核之前是否正在更改。
您在调用中使用了错误数据 FltSendMessage
:
ReplyBuffer 是指向 custom 用户定义数据的指针。它不能从 FILTER_REPLY_HEADER
开始
SenderBuffer 是指向 custom 用户定义数据的指针。它不能从 FILTER_MESSAGE_HEADER
首先你需要 define structures,它们在内核和用户模式之间共享,用于消息和回复。例如
struct SCANNER_NOTIFICATION {
// any custom data
int someData;
};
struct SCANNER_REPLY {
// any custom data
int passFlag;
};
在内核模式下你可以直接使用它:
SCANNER_NOTIFICATION send;
SCANNER_REPLY reply;
ULONG ReplyLength = sizeof(reply);
FltSendMessage(*, *, &send, sizeof(send), &reply, &ReplyLength, *);
在用户模式下你 need define 2 个额外的结构:
struct SCANNER_MESSAGE : public FILTER_MESSAGE_HEADER, public SCANNER_NOTIFICATION {};
struct SCANNER_REPLY_MESSAGE : public FILTER_REPLY_HEADER, public SCANNER_REPLY {};
(我这里用的是c++风格,here用的是c风格) 在用户模式下我们需要使用 next,例如:
SCANNER_MESSAGE* mesage;
FilterGetMessage(*, mesage, sizeof(SCANNER_MESSAGE), *);
和
SCANNER_REPLY_MESSAGE reply;
reply.MessageId = mesage->MessageId;
FilterReplyMessage(*, &reply, sizeof(reply));