我遇到了一个问题,我使用期望得到答复的FltSendMessage从内核模式向用户模式发送消息。传递的结构包含一个int,通过设置此标志并调用FilterReplyMessage,将其设置为0或1。用户模式应答。但是,当内核接收到消息时,它的值始终是56。无论我在用户模式中将标志设置为什么数字,内核总是接收值56。我不知道我的错误在哪里。
我尝试将passFlag的数据类型从int更改为其他类型(USHORT等)我知道这不会有什么区别,但值得一试。
因为内核消息被成功地回复(检查用户模式HRESULT不返回错误,并且没有超时,所以如果没有收到响应,系统将挂起,而它不会),我知道错误必须与缓冲区在用户模式和内核模式之间传递。我似乎找不到为什么在内核模式下不能正确解释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);我试过的是:
发布于 2018-05-15 11:16:05
在调用FltSendMessage中使用错误数据
ReplyBuffer是指向自定义用户定义数据的指针。它不能从FILTER_REPLY_HEADER SenderBuffer是指向自定义用户定义数据的指针开始。它不能从FILTER_MESSAGE_HEADER开始
首先,您需要在内核和用户模式之间共享的https://github.com/Microsoft/Windows-driver-samples/blob/master/filesys/miniFilter/scanner/inc/scanuk.h,用于消息和回复。例如
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, *);在用户模式下,您可以使用https://github.com/Microsoft/Windows-driver-samples/blob/master/filesys/miniFilter/scanner/user/scanuser.h 2附加结构:
struct SCANNER_MESSAGE : public FILTER_MESSAGE_HEADER, public SCANNER_NOTIFICATION {};
struct SCANNER_REPLY_MESSAGE : public FILTER_REPLY_HEADER, public SCANNER_REPLY {};(我在这里使用c++样式,当https://github.com/Microsoft/Windows-driver-samples/blob/master/filesys/miniFilter/scanner/user/scanuser.h使用c样式时),在用户模式中,我们需要使用next,例如:
SCANNER_MESSAGE* mesage;
FilterGetMessage(*, mesage, sizeof(SCANNER_MESSAGE), *);和
SCANNER_REPLY_MESSAGE reply;
reply.MessageId = mesage->MessageId;
FilterReplyMessage(*, &reply, sizeof(reply));https://stackoverflow.com/questions/50346724
复制相似问题