FilterGetMessage是错误的?
我正在编写Windows服务与minifilter(内核)进行通信。
-
在minifilter中使用FltSendMessage
-
在服务中使用FilterGetMessage
FilterGetMessage的状态为success(status = 0)。 但缓冲区始终为空。 什么是不正确的?
这是我在minifilter中的代码:C ++代码
status = FltSendMessage( gFilterHandle, &gClientPort, (PVOID)FltObjects->FileObject->FileName.Buffer, FltObjects->FileObject->FileName.MaximumLength, NULL, NULL, NULL);
p / s:上面的代码放在PreCreate回调中
这是我的服务代码:C#代码
// Constant buffer size public const int BUFFER_SIZE = 1024; // message header struct [StructLayout(LayoutKind.Sequential)] public struct FILTER_MESSAGE_HEADER { public uint replyLength; public ulong messageId; } // message receive struct public struct DATA_RECEIVE { public FILTER_MESSAGE_HEADER messageHeader; public byte[] messageContent; } DATA_RECEIVE dataReceive = new DATA_RECEIVE(); dataReceive.messageContent = new byte[BUFFER_SIZE]; int headerSize = Marshal.SizeOf(dataReceive.messageHeader); int dataSize = BUFFER_SIZE + headerSize; status = FilterGetMessage(hPort, out dataReceive.messageHeader, dataSize, IntPtr.Zero);
更新:虽然状态为成功,但消息头的值为0
1. dataReceive.messageHeader.messageId = 0 2. dataReceive.messageHeader.replyLength = 0
更新答案:
1. Update old code: // message receive struct public struct DATA_RECEIVE { public FILTER_MESSAGE_HEADER messageHeader; public fixed byte messageContent[BUFFER_SIZE]; }
和:
// Get data size int dataSize = Marshal.SizeOf(dataReceive);
-
添加新代码:使用
FilterGetMessage
函数后//检查状态并获取内容消息
int status = FilterGetMessage(hPort, out dataReceive.messageHeader, dataSize, IntPtr.Zero); if (status == 0) { int index = 0; unsafe { byte* ptr = dataReceive.messageContent; for (; *ptr != 0; ptr += 2) { messageContent[index++] = *ptr; } }; filePath = Encoding.ASCII.GetString(messageContent); }
我可以使用此代码立即看到一个问题:
public struct DATA_RECEIVE { public FILTER_MESSAGE_HEADER messageHeader; public byte[] messageContent; }
这不会创建连续的结构。 这将创建一个带有一个FILTER_MESSAGE_HEADER
的结构和一个对数组的引用(这不是函数所期望的)。 byte[]
是一个引用,因此数组数据不在struct中。 如果你在结构上尝试Marshal.SizeOf
,你将获得16或20个字节,而不是sizeof( FILTER_MESSAGE_HEADER ) + the length of the buffer
。 你需要的是使用带有固定缓冲区的不安全代码:
public unsafe struct DATA_RECEIVE { public FILTER_MESSAGE_HEADER messageHeader; public fixed byte messageContent[BUFFER_SIZE]; }
这将创建一个连续的结构,数组数据在结构本身而不是其他地方。 尝试使用Marshal.SizeOf
validation最终大小。