FilterGetMessage是错误的?

我正在编写Windows服务与minifilter(内核)进行通信。

  1. minifilter中使用FltSendMessage

  2. 在服务中使用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); 
  1. 添加新代码:使用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.SizeOfvalidation最终大小。