miniFilter 内核层与应用程序通信

重点说下FltSendMessage() FilterGetMessage() 和 FilterReplyMessage() 这三个函数

 

首先:内核层的结构体

//  Defines the commands between the utility and the filter
typedef enum _NPMINI_COMMAND {
	ENUM_PASS = 0,
	ENUM_BLOCK
} NPMINI_COMMAND;	

//  Defines the command structure between the utility and the filter.
typedef struct _COMMAND_MESSAGE {
	NPMINI_COMMAND 	Command;  
	ULONG ulValue;
} COMMAND_MESSAGE, *PCOMMAND_MESSAGE;

 应用层通讯需要用到的结构体

 1 typedef struct _COMMAND_MESSAGE {
2 NPMINI_COMMAND Command;
3 ULONG ulValue;
4 } COMMAND_MESSAGE, *PCOMMAND_MESSAGE;
5
6
7 typedef struct _USERCOMMAND_MESSAGE {
8 FILTER_MESSAGE_HEADER messageHeader;
9 COMMAND_MESSAGE cmdMessage;
10 }USERCOMMAND_MESSAGE, *PUSERCOMMAND_MESSAGE;
11
12 typedef struct _USERCOMMAND_MESSAGE_REPLAY
13 {
14 FILTER_REPLY_HEADER replayHeader;
15 COMMAND_MESSAGE cmdMessage;
16
17 }USERCOMMAND_MESSAGE_REPLAY,*PUSERCOMMAND_MESSAGE_REPLAY;


内核里的调用

View Code
 1 //发送的数据
2 COMMAND_MESSAGE gCmdMessageSend;
3
4 gCmdMessageSend.Command=ENUM_PASS;
5 gCmdMessageSend.ulValue=100;
6
7 //接收的数据
8 COMMAND_MESSAGE gCmdMessageGet;
9
10 timeout.HighPart=10000000;
11
12
13 ULONG ulReplayLength=sizeof(COMMAND_MESSAGE);
14
15 status=FltSendMessage(gFilterHandle,&gClientPort,&gCmdMessageSend,sizeof(COMMAND_MESSAGE),&gCmdMessageGet,&ulReplayLength,NULL);
16
17
18
19 KdPrint(("after FltSendMessage %x,%d,%d \n",status,ulReplayLength,gCmdMessageGet.ulValue));

这里FltSendMessage必须等到FilterGetMessage和FilterReplyMessage全部返回正确才能够继续运行 否则挂起

应用层的调用

View Code
 1 USERCOMMAND_MESSAGE data;
2 USERCOMMAND_MESSAGE_REPLAY dataReplay;
3
4 while(TRUE)
5 {
6 data->cmdMessage.ulValue=10;
7 HRESULT hr= FilterGetMessage(g_hPort,(PFILTER_MESSAGE_HEADER)data,sizeof(USERCOMMAND_MESSAGE),NULL);
8
9
10 if (hr==S_OK)
11 {
12 CString str;
13 str.Format(_T("%d"),data->cmdMessage.ulValue);
14
15 dataReplay->replayHeader.MessageId=data->messageHeader.MessageId;
16
17 //返回数据
18 dataReplay->cmdMessage.ulValue=10;
19 hr=FilterReplyMessage(g_hPort,(PFILTER_REPLY_HEADER)dataReplay,sizeof(COMMAND_MESSAGE)+sizeof(FILTER_REPLY_HEADER));
20
21
22 }
23 }



转载于:https://www.cnblogs.com/ljinshuan/archive/2012/03/15/2397743.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值