2013-05-17 2 views
0

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에 대한 동시 액세스를 차단합니다.

동시에 파일을 읽고 쓸 수 있습니까?

+0

ReadFile'가'WriteFile' 후 몇 초까지 호출되지 않습니다'경우 어떻게 쓰기 차단을 담당 할 수 있습니까? –

+0

ReadFile이 여전히 블로킹이기 때문에 ... 해당 기계에 패킷을 보내면 ReadFile이 성공하고 WriteFile이 바로 실행됩니다. – falstaff

+0

향상된 코드 주석 – falstaff

답변

2

기본적으로 usermode 핸들 당 하나의 미해결 I/O 요청 만있을 수 있습니다. 여러 개의 핸들을 열거 나 하나의 핸들을 FILE_FLAG_OVERLAPPED으로여십시오. (당신이 FILE_FLAG_OVERLAPPED를 사용하면, 당신은 또한 일반적으로 OVERLAPPED 구조를 사용해야합니다 - 당신이 thisthis를 감추고에 의해 그것의 요점을 가지고 있는지 확인하십시오.)

+0

답해 주셔서 감사합니다. 여러 핸들을 사용하면 잘 작동합니다 (위의 주석 참조). – falstaff