IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE IOCTL(nfpdev.h)
클라이언트는 구독된 메시지가 도착할 때 수신하기 위해 구독 핸들에 IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE 요청을 반복적으로 보냅니다. 일반적으로 구독 유형과 일치하는 메시지가 실제로 도착할 때까지 이 IOCTL은 구독 핸들에서 보류됩니다.
주 코드
입력 버퍼
없음
출력 버퍼
메시지 데이터가 도착하면 반환하려면 유효한 버퍼가 필요합니다. 이 버퍼의 첫 번째 DWORD 는 반환할 버퍼의 다음 크기에 대한 힌트를 클라이언트에 예약합니다. 이 버퍼는 일반적으로 처음에는 255바이트이지만 드라이버는 힌트만 제공하고 STATUS_BUFFER_OVERFLOW IOCTL을 완료하여 클라이언트가 더 큰 버퍼를 보내도록 요청할 수 있습니다.
상태 블록
요청이 성공하면 Irp-IoStatus.Status>가 STATUS_SUCCESS 설정됩니다.
그렇지 않으면 NTSTATUS 코드로 적절한 오류 조건에 대한 상태입니다.
자세한 내용은 NTSTATUS 값을 참조하세요.
설명
- 클라이언트는 보류된 IOCTL이 완료될 때마다 다른 IOCTL을 보내야 합니다. 드라이버는 적절한 잠금을 사용하여 이 IOCTL의 성공적인 완료 횟수가 구독 유형에 대한 성공적인 메시지 수신 수와 동일하도록 보장해야 합니다.
-
이 IOCTL을 사용할 때 필요한 작업은 다음과 같습니다.
- 이전에 "Subs\" 디바이스 네임스페이스에서 열리지 않은 핸들에서 이 IOCTL을 받은 경우 드라이버는 STATUS_INVALID_DEVICE_STATE 사용하여 완료해야 합니다.
- 드라이버는 구독 파일 핸들 내의 구독 유형과 일치하는 수신된 메시지의 "수신됨" 큐를 유지해야 합니다.
-
드라이버에서 이 IOCTL이 수신되는 경우:
- "수신됨" 큐가 비어 있으면 드라이버는 나중에 완료하기 위해 IOCTL을 보류해야 합니다.
- "수신됨" 큐가 비어 있지 않으면 드라이버는 하나의 메시지 버퍼를 큐에서 제거하고, 메시지 버퍼를 IOCTL의 출력 버퍼에 복사하고, 즉시 STATUS_SUCCESS 사용하여 IOCTL을 완료해야 합니다.
- 형식과 일치하는 메시지가 수신되고 IOCTL이 현재 보류되지 않은 경우 드라이버는 메시지 버퍼를 "수신됨" 큐에 추가해야 합니다.
- 형식과 일치하는 메시지가 수신되고 사용 가능한 보류 중인 IOCTL("수신됨" 큐가 비어 있음)이 있는 경우 드라이버는 메시지 버퍼를 IOCTL의 출력 버퍼에 복사하고 보류 중인 IRP를 STATUS_SUCCESS 완료해야 합니다. 보류 중인 IRP가 완료된 후에도 "수신됨" 큐는 계속 비어 있어야 합니다.
- 드라이버가 STATUS_SUCCESS 사용하여 이 IOCTL을 완료하는 경우 출력 버퍼의 첫 번째 DWORD [4바이트]에는 다음 클라이언트 버퍼의 크기에 대한 힌트가 포함되어야 하며 IOCTL의 정보 필드에는 이 메시지의 크기와 sizeof(DWORD)(4바이트)가 포함되어야 합니다.
- IOCTL에 입력 버퍼가 포함된 경우 드라이버는 STATUS_INVALID_PARAMETER 사용하여 IOCTL을 완료해야 합니다.
- 받은 메시지에 길이가 0인 페이로드가 있는 경우 드라이버는 메시지를 무시해야 합니다. Windows는 길이가 0인 페이로드가 있는 메시지를 삭제하므로 성능 최적화입니다.
- 받은 메시지가 너무 커서 이 IOCTL의 버퍼에 복사할 수 없는 경우 드라이버는 필요한 버퍼 크기를 출력 버퍼의 처음 4바이트에 복사하고 IOCTL의 "정보" 필드를 sizeof(DWORD)("4")로 설정하고 STATUS_BUFFER_OVERFLOW 사용하여 IOCTL을 완료해야 합니다. 메시지 버퍼는 "수신됨" 큐에 남아 있어야 합니다.
- 다른 IOCTL이 현재 구독 핸들에 보류 중인 동안 이 IOCTL을 수신하는 경우 두 번째(또는 그 이상) 하나는 STATUS_INVALID_DEVICE_STATE 완료해야 합니다.
- 드라이버는 보류 중인 IOCTL의 CancelIo를 지원해야 합니다.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 8 |
머리글 | nfpdev.h |