首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迷你过滤器从用户模式应用程序接收恒定值。

迷你过滤器从用户模式应用程序接收恒定值。
EN

Stack Overflow用户
提问于 2018-05-15 09:28:01
回答 1查看 337关注 0票数 0

我遇到了一个问题,我使用期望得到答复的FltSendMessage从内核模式向用户模式发送消息。传递的结构包含一个int,通过设置此标志并调用FilterReplyMessage,将其设置为0或1。用户模式应答。但是,当内核接收到消息时,它的值始终是56。无论我在用户模式中将标志设置为什么数字,内核总是接收值56。我不知道我的错误在哪里。

我尝试将passFlag的数据类型从int更改为其他类型(USHORT等)我知道这不会有什么区别,但值得一试。

因为内核消息被成功地回复(检查用户模式HRESULT不返回错误,并且没有超时,所以如果没有收到响应,系统将挂起,而它不会),我知道错误必须与缓冲区在用户模式和内核模式之间传递。我似乎找不到为什么在内核模式下不能正确解释passFlag的原因。

有人能帮忙吗?

共有结构:

代码语言:javascript
复制
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; 

内核代码:

代码语言:javascript
复制
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);

用户代码:

代码语言:javascript
复制
// 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消息之前和之后遍历每个步骤,以确定在将值发送回内核之前是否正在更改该值。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,用于消息和回复。例如

代码语言:javascript
复制
struct SCANNER_NOTIFICATION {
    // any custom data
    int someData;

};

struct SCANNER_REPLY {
    // any custom data
    int passFlag;
};

在内核模式中,您直接使用它,如下所示:

代码语言:javascript
复制
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附加结构:

代码语言:javascript
复制
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,例如:

代码语言:javascript
复制
SCANNER_MESSAGE* mesage;
FilterGetMessage(*, mesage, sizeof(SCANNER_MESSAGE), *);

代码语言:javascript
复制
    SCANNER_REPLY_MESSAGE reply;
    reply.MessageId = mesage->MessageId;
    FilterReplyMessage(*, &reply, sizeof(reply));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50346724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档