Начиная с образца ndisprot от Microsoft, я пытаюсь написать драйвер протокола 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.
Как я могу одновременно читать и писать в файл?
ReadFile
вызывается только через несколько секунд послеWriteFile
, как он может отвечать за блокировку записи? - person Harry Johnston   schedule 20.05.2013