从 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 的并发访问。
如何同时读取和写入文件?