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 }