직렬 IRP 주 함수 코드

이 항목에서는 직렬 IRP 주요 함수 코드를 설명합니다.

헤더: Wdm.h(Wdm.h 또는 Ntddk.h 포함)

IRP_MJ_CREATE

IRP_MJ_CREATE 요청은 직렬 디바이스를 엽니다.

전송 시기

클라이언트는 포트 또는 포트에 연결된 디바이스에 액세스하기 전에 직렬 디바이스를 열어야 합니다.

입력 매개 변수

없음

출력 매개 변수

없음

I/O 상태 블록

정보 필드는 0으로 설정됩니다.

상태 필드는 다음 값 중 하나로 설정됩니다.

상태 값 Description
STATUS_SUCCESS 직렬 디바이스가 성공적으로 열렸습니다.
STATUS_ACCESS_DENIED 디바이스가 이미 열려 있습니다.
STATUS_DELETE_PENDING 직렬이 디바이스를 제거하는 중입니다.
STATUS_INSUFFICIENT_RESOURCES 디바이스가 플러그 앤 플레이 시작 상태가 아니거나 드라이버에서 내부 데이터 구조를 할당할 수 없습니다.
STATUS_NOT_A_DIRECTORY 직렬 디바이스를 디렉터리로 열 수 없습니다.
STATUS_PENDING 이후 처리를 위해 요청을 직렬 큐에 대기했습니다.
STATUS_SHARED_IRQ_BUSY 디바이스에 할당된 인터럽트는 열려 있는 다른 디바이스에서 사용 중입니다.

작업

직렬 디바이스를 사용하려면 먼저 열어야 합니다. 직렬 디바이스는 전용 디바이스입니다. 지정된 시간에 포트에서 하나의 파일만 열 수 있습니다.

IRP_MJ_DEVICE_CONTROL

IRP_MJ_DEVICE_CONTROL 요청은 직렬 포트를 작동합니다.

전송 시기

클라이언트는 디바이스 제어 요청을 사용하여 다음을 수행합니다.

  • 포트에 대한 정보 가져오기
  • 레지스터 가져오기 및 설정
  • 운영 모드 가져오기 및 설정

Serial에서 지원하는 디바이스 제어 요청에 대한 설명은 ntddser.h 헤더를 참조하세요.

입력 매개 변수

요청 관련

출력 매개 변수

요청 관련

I/O 상태 블록

요청 관련

작업

요청 관련

IRP_MJ_FLUSH_BUFFERS

IRP_MJ_FLUSH_BUFFER 요청은 직렬 디바이스의 내부 쓰기 버퍼를 플러시합니다.

전송 시기

클라이언트는 플러시 요청을 사용하여 Serial이 플러시 요청 전에 전송된 모든 쓰기 요청을 완료한 시기를 결정합니다.

입력 매개 변수

없음

출력 매개 변수

없음

I/O 상태 블록

정보 멤버가 0으로 설정됩니다.

상태 멤버는 다음 상태 값 중 하나로 설정됩니다.

상태 값 Description
STATUS_SUCCESS 요청이 성공적으로 완료되었습니다.
STATUS_CANCELLED 클라이언트가 요청을 취소했습니다. 또한 직렬은 디바이스 오류가 발생하고 디바이스 오류가 있는 경우 요청을 취소하도록 직렬이 구성된 경우에도 요청을 취소합니다.
STATUS_DELETE_PENDING 드라이버가 디바이스를 제거하는 중입니다.
STATUS_PENDING 이후 처리를 위해 요청을 직렬 큐에 대기했습니다.

작업

직렬 큐를 만들고 요청이 수신되는 순서대로 쓰기 및 플러시 요청을 처리하기 시작합니다. 직렬은 플러시 요청 전에 받은 모든 쓰기 요청에 대해 IoCompleteRequest 를 호출한 후 플러시 요청을 완료합니다. 그러나 플러시 요청이 완료되었다고 해서 이전에 시작된 모든 쓰기 요청이 디바이스 스택의 다른 드라이버에 의해 완료되었음을 의미하지는 않습니다. 예를 들어 필터 드라이버는 여전히 쓰기 요청을 처리하고 있을 수 있습니다. 클라이언트는 쓰기 요청의 IRP를 해제하거나 다시 사용하려고 시도하기 전에 디바이스 스택의 모든 드라이버에서 쓰기 요청이 완료되었는지 확인해야 합니다.

IRP_MJ_INTERNAL_DEVICE_CONTROL

IRP_MJ_INTERNAL_DEVICE_CONTROL 요청은 직렬 디바이스에서 내부 운영 모드를 설정합니다.

전송 시기

클라이언트는 내부 디바이스 제어 요청을 사용하여 다음을 수행합니다.

  • 기본 설정 가져오기 및 다시 설정
  • 대기/절전 모드 해제 작업 제어

내부 디바이스 제어 요청에 대한 설명은 ntddser.h 헤더를 참조하세요.

입력 매개 변수

요청 관련

출력 매개 변수

요청 관련

I/O 상태 블록

요청 관련

작업

요청 관련

IRP_MJ_PNP

IRP_MJ_PNP 요청은 플러그 앤 플레이 지원합니다.

전송 시기

PnP 관리자는 디바이스를 쿼리하고 디바이스를 시작, 중지 및 제거하기 위해 IRP_MJ_PNP 요청을 보냅니다.

입력 매개 변수

요청 관련

출력 매개 변수

요청 관련

I/O 상태 블록

요청 관련

작업

직렬은 다음 플러그 앤 플레이 요청을 지원합니다.

직렬은 추가 처리 없이 다른 모든 플러그 앤 플레이 요청을 디바이스 스택 아래로 보냅니다.

직렬은 플러그 앤 플레이 요청에 대해 다음과 같은 직렬별 처리를 수행합니다.

IRP_MN_QUERY_ID (BusQueryHardwardID 형식)

직렬 디바이스가 다중 포트 ISA 카드에 있는 경우 직렬은 하드웨어 ID 문자열에 와이드 문자열 "*PNP0502"를 추가합니다.

IRP_MN_FILTER_RESOURCE_REQUIREMENTS

다중 포트 ISA 카드의 직렬 디바이스는 동일한 인터럽트 상태 레지스터와 동일한 인터럽트를 공유합니다.

플러그 앤 플레이 요청의 제네릭 작업에 대한 설명은 플러그 앤 플레이 부 IRP를 참조하세요.

IRP_MJ_POWER

IRP_MJ_POWER 요청은 전원 관리를 제어합니다.

전송 시기

전원 관리자는 전원 요청을 사용하여 전원 상태를 쿼리하고 설정합니다.

입력 매개 변수

요청 관련

출력 매개 변수

요청 관련

I/O 상태 블록

요청 관련

작업

직렬은 다음 전원 요청을 지원합니다.

직렬은 하위 수준 드라이버에서 완료할 다른 모든 전원 요청을 디바이스 스택 아래로 보냅니다.

직렬은 직렬을 함수 드라이버 또는 하위 수준 필터 드라이버로 사용하는 직렬 디바이스 스택의 기본 전원 정책 소유자입니다.

이러한 요청의 일반 작업에 대한 자세한 내용은 Power IRP 처리 규칙을 참조하세요.

IRP_MJ_QUERY_INFORMATION

IRP_MJ_QUERY_INFORMATION 요청은 직렬 디바이스에 대한 파일 끝 정보를 쿼리합니다.

전송 시기

클라이언트는 쿼리 정보 요청을 사용하여 표준 정보를 가져오고 직렬 디바이스에서 열린 파일에 대한 정보를 배치합니다.

입력 매개 변수

Parameters.QueryFile.FileInformationClassFileStandardInformation 또는 FilePositionInformation으로 설정됩니다.

출력 매개 변수

매개 변수 설명
FileStandardInformation ASSOCIATedIrp.SystemBuffer 멤버는 Serial이 표준 정보를 출력하는 데 사용하는 클라이언트 할당 FILE_STANDARD_INFORMATION 구조를 가리킵니다.
FilePositionInformation ASSOCIATedIrp.SystemBuffer 멤버는 직렬이 위치 정보를 출력하는 데 사용하는 클라이언트 할당 FILE_POSITION_INFORMATION 구조를 가리킵니다.

I/O 상태 블록

요청이 성공하면 정보 멤버가 0으로 설정됩니다.

상태 멤버는 다음 상태 값 중 하나로 설정됩니다.

상태 값 Description
STATUS_SUCCESS 요청이 성공적으로 완료되었습니다.
STATUS_CANCELLED 클라이언트가 요청을 취소했습니다. 또한 직렬은 디바이스 오류가 발생하고 디바이스 오류가 있는 경우 요청을 취소하도록 직렬이 구성된 경우에도 요청을 취소합니다.
STATUS_DELETE_PENDING 직렬이 디바이스를 제거하는 중입니다.
STATUS_INVALID_PARAMETER 요청된 정보는 지원되지 않습니다.
STATUS_PENDING 이후 처리를 위해 요청을 직렬 큐에 대기했습니다.

작업

Serial은 FileStandardInformation 및 FilePositionInformation 형식의 요청을 지원 합니다.

표준 파일 정보는 항상 0 또는 FALSE로 설정됩니다. 위치 정보는 항상 0으로 설정됩니다.

IRP_MJ_READ

IRP_MJ_READ 요청은 직렬 디바이스에서 클라이언트로 데이터를 전송합니다.

전송 시기

클라이언트는 직렬 디바이스에서 데이터를 읽을 때마다 읽기 요청을 사용합니다.

입력 매개 변수

Parameters.Read.Length 멤버는 클라이언트의 읽기 버퍼로 전송할 바이트 수로 설정됩니다.

출력 매개 변수

ASSOCIATedIrp.SystemBuffer 멤버는 직렬이 직렬 디바이스에서 읽은 데이터를 복사하는 클라이언트 할당 읽기 버퍼를 가리킵니다.

I/O 상태 블록

정보 멤버는 클라이언트의 읽기 버퍼로 전송되는 바이트 수로 설정됩니다.

상태 멤버는 다음 값 중 하나로 설정됩니다.

상태 값 Description
STATUS_SUCCESS 요청이 성공적으로 완료되었습니다.
STATUS_CANCELLED 클라이언트가 요청을 취소했습니다. 또한 직렬은 디바이스 오류가 발생하고 디바이스 오류가 있는 경우 요청을 취소하도록 직렬이 구성된 경우에도 요청을 취소합니다.
STATUS_DELETE_PENDING 직렬이 디바이스를 제거하는 중입니다.
STATUS_PENDING 이후 처리를 위해 요청을 직렬로 큐에 대기했습니다.
STATUS_TIMEOUT 요청을 완료하는 데 걸리는 시간이 총 제한 시간 값 또는 간격 제한 시간 값을 초과했습니다.

작업

클라이언트는 시간 제한 이벤트를 사용하여 읽기 요청을 종료할 수 있습니다. 그러나 직렬 디바이스를 열면 디바이스에 대한 제한 시간 설정이 정의되지 않습니다. 커널 모드 클라이언트는 IOCTL_SERIAL_INTERNAL_BASIC_SETTINGS 사용하여 제한 시간 매개 변수를 0으로 설정할 수 있습니다(시간 제한 이벤트는 사용되지 않음). 사용자 모드 및 커널 모드 클라이언트는 IOCTL_SERIAL_SET_TIMEOUTS 요청을 사용하여 제한 시간 매개 변수를 설정할 수 있습니다.

읽기 및 쓰기 시간 제한에 대한 자세한 내용은 직렬 디바이스에 대한 읽기 및 쓰기 시간 제한 설정을 참조하세요.

IRP_MJ_SET_INFORMATION

IRP_MJ_SET_INFORMATION 요청은 직렬 디바이스에 대한 파일 끝 정보를 설정합니다.

전송 시기

클라이언트는 설정된 정보 요청을 사용하여 직렬 디바이스에서 열린 파일의 현재 파일 끝 위치를 변경합니다.

입력 매개 변수

Parameters.SetFile.FileInformationClass 멤버가 FileEndOfFileInformation 또는 FileAllocationInformation으로 설정됩니다.

출력 매개 변수

없음

I/O 상태 블록

요청이 성공하면 정보 멤버가 0으로 설정됩니다.

상태 멤버는 다음 상태 값 중 하나로 설정됩니다.

상태 값 Description
STATUS_SUCCESS 요청이 성공적으로 완료되었습니다.
STATUS_CANCELLED 클라이언트가 요청을 취소했습니다. 또한 직렬은 디바이스 오류가 발생하고 디바이스 오류가 있는 경우 요청을 취소하도록 직렬이 구성된 경우에도 요청을 취소합니다.
STATUS_DELETE_PENDING 직렬이 디바이스를 제거하는 중입니다.
STATUS_INVALID_PARAMETER 지정된 파일 끝 정보는 지원되지 않습니다.
STATUS_PENDING 이후 처리를 위해 요청을 직렬로 큐에 대기했습니다.

작업

Serial은 FileEndOfFileInformationFileAllocationInformation 형식의 요청을 지원합니다. 그러나 직렬은 실제로 파일 정보를 설정하지 않습니다. 파일 끝 위치는 항상 0으로 설정됩니다.

IRP_MJ_SYSTEM_CONTROL

IRP_MJ_SYSTEM_CONTROL 요청은 WMI 요청을 지원합니다.

전송 시기

WMI 커널 모드 구성 요소는 직렬 디바이스에 대한 WMI 공급자로 직렬 등록 후 언제든지 IRP_MJ_SYSTEM_CONTROL 요청을 보낼 수 있습니다. WMI IRP는 일반적으로 사용자 모드 데이터 소비자가 WMI 데이터를 요청하면 전송됩니다.

입력 매개 변수

요청별

출력 매개 변수

요청별

I/O 상태 블록

WMI 요청의 경우 직렬은 상태 필드를 다음 값 중 하나로 설정합니다.

상태 값 Description
STATUS_SUCCESS 요청이 성공적으로 완료되었습니다.
STATUS_BUFFER_TOO_SMALL 출력 버퍼의 크기(바이트)가 요청된 정보의 필요한 크기보다 작습니다.
STATUS_INSUFFICIENT_RESOURCES 직렬 포트 이름을 저장할 시스템 리소스가 부족했습니다.
STATUS_INVALID_DEVICE_REQUEST 요청이 잘못되었습니다.
STATUS_WMI_GUID_NOT_FOUND WMI GUID는 지원되지 않습니다.

작업

직렬은 WmiSystemControl 을 사용하여 WMI 시스템 제어 요청을 처리합니다. 직렬은 WmiSystemControl 이 디바이스로 전송된 WMI 요청을 처리하기 위해 호출하는 다음과 같은 유형의 WMI 라이브러리 콜백 루틴을 등록합니다.

직렬은 다른 시스템 제어 요청을 지원하지 않습니다. WMI가 아닌 요청의 경우 직렬은 현재 스택 위치를 건너뛰고 디바이스 스택 아래로 요청을 보냅니다.

직렬은 다음 표에 설명된 WMI GUID를 등록합니다.

직렬 WMI GUID 관련 데이터 구조

SERIAL_PORT_WMI_NAME_GUID USHORT 다음에 WCSTR
SERIAL_PORT_WMI_COMM_GUID SERIAL_WMI_COMM_DATA
SERIAL_PORT_WMI_HW_GUID SERIAL_WMI_HW_DATA
SERIAL_PORT_WMI_PERF_GUID SERIAL_WMI_PERF_DATA
SERIAL_PORT_WMI_PROPERTIES_GUID WMI_SERIAL_PORT_PROPERTIES

직렬 디바이스의 WMI 이름은 디바이스의 플러그 앤 플레이 레지스트리 키 아래에 있는 항목 값 PortName의 값입니다.

IRP_MJ_WRITE

IRP_MJ_WRITE 요청은 클라이언트에서 직렬 디바이스로 데이터를 전송합니다.

전송 시기

클라이언트는 직렬 디바이스에 데이터를 쓸 때마다 쓰기 요청을 사용합니다.

입력 매개 변수

Parameters.Write.Length 멤버는 클라이언트가 할당한 쓰기 버퍼에서 직렬 디바이스로 복사할 바이트 수로 설정됩니다.

ASSOCIATedIrp.SystemBuffer 멤버는 직렬이 직렬 디바이스에 데이터를 복사하는 클라이언트 할당 쓰기 버퍼를 가리킵니다.

출력 매개 변수

없음

I/O 상태 블록

정보 멤버는 클라이언트의 쓰기 버퍼에서 직렬 디바이스로 실제로 복사된 바이트 수로 설정됩니다.

상태 멤버는 다음 값 중 하나로 설정됩니다.

상태 값 Description
STATUS_SUCCESS 요청이 성공적으로 완료되었습니다.
STATUS_CANCELLED 클라이언트가 요청을 취소했습니다. 또한 직렬은 디바이스 오류가 발생하고 직렬이 디바이스 오류가 있는 경우 요청을 취소하도록 구성된 경우 요청을 취소합니다.
STATUS_DELETE_PENDING 직렬은 디바이스를 제거하는 중입니다.
STATUS_PENDING 이후 처리를 위해 요청을 직렬로 큐에 대기했습니다.
STATUS_TIMEOUT 쓰기 요청에 허용되는 총 시간을 초과했습니다.

작업

클라이언트는 시간 제한 이벤트를 사용하여 쓰기 요청을 종료할 수 있습니다. 그러나 직렬 디바이스가 열리면 디바이스에 설정된 제한 시간 이벤트는 정의되지 않습니다. 커널 모드 클라이언트는 IOCTL_SERIAL_INTERNAL_BASIC_SETTINGS 사용하여 제한 시간 매개 변수를 0으로 설정하고(제한 시간 이벤트가 사용되지 않음) IOCTL_SERIAL_SET_TIMEOUTS 요청을 사용하여 제한 시간 매개 변수를 설정할 수 있습니다. 읽기 및 쓰기 시간 제한에 대한 자세한 내용은 직렬 디바이스에 대한 읽기 및 쓰기 시간 제한 설정을 참조하세요.

플러그 앤 플레이 부 IRP

전원 IRP 처리 규칙

직렬 컨트롤러 드라이버 디자인 가이드