0

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

如何同时读取和写入文件?

4

1 回答 1

2

默认情况下,每个用户模式句柄只能有一个未完成的 I/O 请求。打开多个句柄,或使用FILE_FLAG_OVERLAPPED. (一旦你使用FILE_FLAG_OVERLAPPED,你通常还需要使用OVERLAPPED结构 - 确保你通过略读thisthis掌握了它的要点。)

于 2013-05-23T07:39:47.100 回答