从微软的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
结构 – 通过浏览这个和这个来确保你已经掌握了它的要点。)