的Windows NDIS驱动程序:在单个设备上并行读/写(IRP_MJ_READ /写)(Wind

2019-09-04 01:05发布

与微软的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); 

我加了一些调试信息,发现与IRP_MJ_WRITE(NdisprotWrite)相关的驱动程序功能被连叫! 用户空间应用和所述设备\ Device \ NDISprot驱动程序块并发访问之间的东西。

我怎么能并发读写的文件?

Answer 1:

默认情况下,你只能有每个用户模式处理一个未完成的I / O请求。 无论是打开多个把手,或打开一个手柄FILE_FLAG_OVERLAPPED 。 (一旦使用FILE_FLAG_OVERLAPPED ,你也通常需要使用OVERLAPPED结构-确保你已经通过略读了它的要点这个和这个 。)



文章来源: Windows NDIS Driver: Concurrent Read/Write on a single device (IRP_MJ_READ/WRITE)