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

时间:2013-05-17 11:51:33

标签: windows driver ethernet ndis irp

从Microsoft的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的并发访问。

如何并发读写文件?

1 个答案:

答案 0 :(得分:2)

默认情况下,每个usermode句柄只能有一个未完成的I / O请求。打开多个手柄,或用FILE_FLAG_OVERLAPPED打开一个手柄。 (使用FILE_FLAG_OVERLAPPED后,您通常还需要使用OVERLAPPED结构 - 请确保通过略过thisthis来了解它的主旨。)