Microsoft의 ndisprot 샘플로 시작하여 NDIS 프로토콜 드라이버를 작성하려고합니다. 사용자 공간에서 나는 장치를 동시에 읽고 쓰려고합니다 (두 개의 스레드 중). 패킷을받지 못하기 때문에 ReadFile 시스템 호출 블록. 이 상태에서 WriteFile 시스템 호출을 완료 할 수 없습니다.Windows NDIS 드라이버 : 단일 장치 (IRP_MJ_READ/WRITE)에서 동시 읽기/쓰기
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' 후 몇 초까지 호출되지 않습니다'경우 어떻게 쓰기 차단을 담당 할 수 있습니까? –
ReadFile이 여전히 블로킹이기 때문에 ... 해당 기계에 패킷을 보내면 ReadFile이 성공하고 WriteFile이 바로 실행됩니다. – falstaff
향상된 코드 주석 – falstaff