다음을 통해 공유


IOCTL_VPCI_READ_BLOCK IOCTL(vpci.h)

PCI Express(PCIe) VF(가상 함수)의 드라이버는 IOCTL_VPCI_READ_BLOCK

VF 구성 블록에서 데이터를 읽기 위해 IOCTL(I/O 제어 코드)입니다. 드라이버는 드라이버 스택의 다음 하위 드라이버에 이 IOCTL을 발급합니다.

참고 이 IOCTL 요청은 단일 루트 I/O 가상화(SR-IOV) 인터페이스를 지원하는 디바이스의 PCIe VF 드라이버에서 발급됩니다.
 
드라이버가 IOCTL_VPCI_READ_BLOCK IOCTL을 발급하는 경우 드라이버는 다음 단계를 수행해야 합니다.
I/O 요청 패킷 구조 준비
I/O 스택 위치 구조 준비
IOCTL 요청 발급
IOCTL 요청 완료 결과
커널 모드 드라이버 간에 IOCTL을 발급하는 방법에 대한 자세한 내용은 드라이버 에서 IOCTL 요청 만들기를 참조하세요.

주 코드

IRP_MJ_DEVICE_CONTROL

상태 블록

요청이 성공하면 Irp-IoStatus.Status>가 STATUS_SUCCESS 설정됩니다.

그렇지 않으면 NTSTATUS 코드로 적절한 오류 조건에 대한 상태입니다.

자세한 내용은 [XREF-LINK:NTSTATUS 값]을 참조하세요.

설명

I/O 요청 패킷 구조 준비

드라이버는 먼저 IRP(I/O 요청 패킷)를 할당하거나 다시 사용해야 합니다. IoBuildDeviceIoControlRequest 함수를 사용하여 IOCTL IRP를 구체적으로 할당할 수 있습니다. IoAllocateIrp, IoReuseIrp 또는 IoInitializeIrp와 같은 범용 IRP 만들기 및 초기화 함수를 사용할 수도 있습니다. IRP 할당에 대한 자세한 내용은 Lower-Level 드라이버에 대한 IRP 만들기를 참조하세요.

그런 다음 드라이버는 다음 표에 설명된 대로 IRP 구조체의 멤버를 설정해야 합니다.

IRP 멤버
UserBuffer 읽을 구성 데이터를 포함할 호출자가 할당한 버퍼의 주소입니다.
UserEvent KeInitializeEvent 함수 호출에서 초기화된 이벤트 개체의 주소입니다.
참고 IOCTL 요청의 비동기 완료가 필요하지 않은 경우 이 멤버를 NULL로 설정해야 합니다. 자세한 내용은 드라이버에서 IOCTL 요청 만들기를 참조하세요.
 
UserIosb 호출자가 할당한 IO_STATUS_BLOCK 구조체의 주소입니다. 이 구조는 I/O 요청의 최종 상태 나타내기 위해 하위 드라이버에 의해 업데이트됩니다.
 

I/O 스택 위치 구조 준비

드라이버는 IoGetNextIrpStackLocation 함수를 호출하여 낮은 드라이버의 I/O 스택 위치에 액세스합니다. 이 함수는 I/O 스택 위치에 대한 매개 변수를 포함하는 IO_STACK_LOCATION 구조체에 대한 포인터를 반환합니다.

그런 다음 드라이버는 다음 표에 설명된 대로 IO_STACK_LOCATION 구조체의 멤버를 설정해야 합니다.

IO_STACK_LOCATION 멤버
MajorFunction

IRP_MJ_INTERNAL_DEVICE_CONTROL

Parameters.DeviceIoControl.IoControlCode

IOCTL_VPCI_READ_BLOCK

Parameters.DeviceIoControl.Type3InputBuffer VPCI_READ_BLOCK_INPUT 구조체에 대한 포인터입니다. 드라이버는 IOCTL_VPCI_READ_BLOCK I/O 요청에 대한 매개 변수를 사용하여 이 구조체의 형식을 지정합니다.
IParameters.DeviceIoControl.InputBufferLength VPCI_READ_BLOCK_INPUT 구조체의 크기(바이트)입니다.
Parameters.DeviceIoControl.OutputBufferLength 읽을 구성 데이터를 포함할 호출자가 할당한 버퍼의 크기(바이트)입니다.
참고 이 값은 VPCI_READ_BLOCK_INPUT 구조체의 BytesRequested 멤버 값과 동일해야 합니다.
 
 

IOCTL 요청 발급

이 IOCTL 요청을 실행하기 위해 드라이버는 IoCallDriver 함수를 호출하여 드라이버 스택의 다음 하위 드라이버에 요청을 전달합니다. 드라이버는 다음 표에 설명된 대로 IoCallDriver 의 매개 변수를 설정합니다.
IoCallDriver 매개 변수
DeviceObject 하위 드라이버의 디바이스 개체입니다.
Irp 이전에 할당되고 초기화된 IRP 의 주소입니다. 자세한 내용은 IRP(I/O 요청 패킷) 구조 준비를 참조하세요.
 

IOCTL 요청 완료 결과

IOCTL_VPCI_READ_BLOCK IOCTL 요청이 완료되면 호출자가 할당한 IO_STATUS_BLOCK 구조체의 상태 멤버가 다음 표의 값 중 하나로 설정됩니다.
상태 값 Description
STATUS_SUCCESS IOCTL이 성공적으로 완료되었습니다.
STATUS_PENDING IOCTL이 완료되지 않았습니다. 드라이버는 현재 스레드를 대기 상태로 전환하기 위해 KeWaitForSingleObject 함수를 호출해야 합니다. 드라이버는 Object 매개 변수를 KeInitializeEvent 함수 호출에서 초기화된 이벤트 개체의 주소로 설정합니다.

IOCTL 요청이 완료되면 이벤트가 신호를 보냅니다. 이벤트가 신호를 받으면 스레드는 실행을 다시 시작합니다.

STATUS_BUFFER_TOO_SMALL Parameters.DeviceIoControl.InputBufferLength 멤버 또는 Parameters.DeviceIoControl.OutputBufferLength 멤버가 필요한 버퍼 크기보다 작은 값으로 설정되었습니다.
 

요청이 성공적으로 완료되면 IO_STATUS_BLOCK 구조의 정보 멤버가 읽은 바이트 수로 설정됩니다. 그렇지 않으면 정보 멤버가 0으로 설정됩니다.

IOCTL_VPCI_READ_BLOCK IOCTL이 실행되면 PCIe PF(물리적 함수)의 드라이버에 지정된 VF 구성 블록에서 데이터를 반환하라는 알림이 표시됩니다.

참고 운영 체제는 이 IOCTL을 성공적으로 완료하는 데 필요한 리소스를 예약하고 관리합니다.
 
VF 구성 블록은 PCIe PF의 드라이버와 SR-IOV 인터페이스를 지원하는 디바이스의 VF 간의 백채널 통신에 사용됩니다. VF 구성 블록의 데이터는 다음 드라이버 간에 교환할 수 있습니다.
  • 게스트 운영 체제에서 실행되는 VF 드라이버입니다. 이 운영 체제는 Hyper-V 자식 파티션 내에서 실행됩니다.
  • 관리 운영 체제에서 실행되는 PF 드라이버입니다.

    이 운영 체제는 Hyper-V 부모 파티션 내에서 실행됩니다.

VF 구성 블록의 사용 및 해당 구성 데이터의 형식은 디바이스의 IHV(독립 하드웨어 공급업체)에 의해 정의됩니다. 구성 데이터는 PF 및 VF의 드라이버에서만 사용됩니다.
참고IOCTL_VPCI_READ_BLOCK IOCTL은 ReadVfConfigBlock 함수에 대한 비동기 대안을 제공합니다.
 

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Server 2012 이상 버전의 Windows에서 지원됩니다.
머리글 vpci.h(Wdm.h 포함)
IRQL DISPATCH_LEVEL

추가 정보

IO_STATUS_BLOCK

IRP_MJ_INTERNAL_DEVICE_CONTROL

ReadVfConfigBlock

드라이버에서 IOCTL 요청 만들기

VPCI_READ_BLOCK_INPUT

IRP

IO_STACK_LOCATION

IoCallDriver