Windows NDIS驱动程序:并行读取/写入单个设备(IRP_MJ_READ / WRITE)

从微软的ndisprot示例开始,我尝试编写一个NDIS协议驱动程序。 从用户空间我尝试读取和写入设备同时(两个线程中)。 由于我没有收到任何数据包,ReadFile系统调用块。 我无法在此状态下完成WriteFile系统调用。

CHAR NdisProtDevice[] = "\\\\.\\\\NDISprot"; CHAR * pNdisProtDevice = &NdisProtDevice[0]; this.iHandle = CreateFile(pNdisProtDevice, GENERIC_WRITE | GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // Blocks, because no frames arrive bSuccess = (BOOLEAN)ReadFile(Handle, (LPVOID)pReadBuf, PacketLength, &BytesRead, NULL); ... // Called some seconds later from another thread, while ReadFile still blocking... bSuccess = (BOOLEAN)WriteFile(Handle, pWriteBuf, PacketLength, &BytesWritten, NULL); 

我添加了一些debugging消息,发现与IRP_MJ_WRITE(NdisprotWrite)相关的驱动函数甚至没有被调用! 用户空间应用程序和驱动程序之间的某些内容会阻止并发访问设备\ Device \ NDISprot。

我怎样才能并发读写文件?

默认情况下,每个用户模式句柄只能有一个未完成的I / O请求。 打开多个句柄,或使用FILE_FLAG_OVERLAPPED打开一个句柄。 (一旦你使用了FILE_FLAG_OVERLAPPED ,你通常也需要使用OVERLAPPED结构 – 通过浏览这个和这个来确保你已经掌握了它的要点。)