IOCTL_VPCI_INVALIDATE_BLOCK IOCTL(vpci.h)
PCI Express(PCIe) VF(가상 함수)의 드라이버는 하나 이상의 VF 구성 블록에서 데이터에 대한 변경 내용을 알리기 위해 IOCTL_VPCI_INVALIDATE_BLOCK IOCTL 요청을 실행합니다. IOCTL이 완료되면 드라이버에 이러한 변경 내용에 대한 알림이 표시됩니다. 알림을 받으면 드라이버는 이전에 지정된 VF 구성 블록에서 읽은 모든 데이터가 유효하지 않다고 가정해야 합니다. 따라서 드라이버는 구성 블록 데이터를 다시 읽어 캐시를 업데이트해야 합니다.
드라이버는 이 IOCTL을 드라이버 스택의 다음 하위 드라이버에 발급합니다.
- I/O 요청 패킷 구조 준비
- I/O 스택 위치 구조 준비
- IOCTL 요청 발급
- IOCTL 요청 완료 결과
주 코드
상태 블록
요청이 성공하면 Irp->IoStatus.Status가 STATUS_SUCCESS 설정됩니다.
그렇지 않으면 NTSTATUS 코드로 적절한 오류 조건에 대한 상태입니다.
자세한 내용은 [XREF-LINK:NTSTATUS 값]을 참조하세요.
발언
I/O 요청 패킷 구조 준비
드라이버는 먼저 I/O 요청 패킷(IRP)을 할당하거나 다시 사용해야 합니다. IoBuildDeviceIoControlRequest 루틴을 사용하여 IOCTL IRP를 구체적으로 할당할 수 있습니다. IoAllocateIrp, IoReuseIrp또는 IoInitializeIrp같은 범용 IRP 만들기 및 초기화 루틴을 사용할 수도 있습니다. IRP 할당에 대한 자세한 내용은 Lower-Level 드라이버대한 IRP 만들기를 참조하세요.그런 다음 드라이버는 다음 표에 설명된 대로 IRP 구조체의 멤버를 설정해야 합니다.
IRP 멤버 | 값 |
---|---|
UserBuffer | NULL |
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 | |
매개 변수. DeviceIoControl.IoControlCode | |
매개 변수. DeviceIoControl.Type3InputBuffer | VPCI_INVALIDATE_BLOCK_OUTPUT 구조체에 대한 포인터입니다. 드라이버는 IOCTL_VPCI_INVALIDATE_BLOCK I/O 요청에 대한 매개 변수를 사용하여 이 구조체의 형식을 지정합니다. |
매개 변수. DeviceIoControl.InputBufferLength | VPCI_INVALIDATE_BLOCK_OUTPUT 구조체의 크기(바이트)입니다. |
매개 변수. DeviceIoControl.OutputBufferLength |
읽을 구성 데이터를 포함할 호출자 할당 버퍼의 크기(바이트)입니다.
참고 이 값은 VPCI_INVALIDATE_BLOCK_OUTPUT 구조체의 BytesRequested 멤버의 값과 동일해야 합니다.
|
IOCTL 요청 발급
이 IOCTL 요청을 실행하기 위해 드라이버는 IoCallDriver 루틴을 호출하여 드라이버 스택의 다음 하위 드라이버에 요청을 전달합니다. 드라이버는 다음 표에 설명된 대로 IoCallDriver 매개 변수를 설정합니다.IoCallDriver 매개 변수 | 값 |
---|---|
DeviceObject | 하위 드라이버의 디바이스 개체입니다. |
Irp | 이전에 할당되고 초기화된 IRP 주소입니다. 자세한 내용은 I/O 요청 패킷 구조 준비하는참조하세요. |
IOCTL 요청 완료 결과
IOCTL_VPCI_INVALIDATE_BLOCK IOCTL 요청이 완료되면 호출자가 할당한 IO_STATUS_BLOCK 구조체의 멤버가 다음 표의 값으로 설정됩니다.
상태 값 | 값 |
---|---|
상태 | STATUS_SUCCESS |
정보 | 영 |
IOCTL_VPCI_INVALIDATE_BLOCK IOCTL이 실행되고 완료되면 VF 드라이버는 하나 이상의 VF 구성 블록에서 PF 드라이버가 변경(무효화된) 데이터를 변경했다는 알림을 받습니다.
- 게스트 운영 체제에서 실행되는 VF 드라이버입니다. 이 운영 체제는 Hyper-V 자식 파티션 내에서 실행됩니다.
-
관리 운영 체제에서 실행되는 PF 드라이버입니다.
이 운영 체제는 Hyper-V 부모 파티션 내에서 실행됩니다.
- 게스트 OS에서 NDIS는 IOCTL_VPCI_INVALIDATE_BLOCK 요청을 발급합니다.
-
관리 OS에서 다음 단계가 수행됩니다.
- PF 미니포트 드라이버는 NdisMInvalidateConfigBlock 함수를 호출하여 VF 구성 데이터가 변경되었으며 더 이상 유효하지 않음을 NDIS에 알립니다. 드라이버는 BlockMask 매개 변수를 변경된 VF 구성 블록을 지정하는 ULONGLONG 비트 마스크로 설정합니다. 비트 마스크의 각 비트는 VF 구성 블록에 해당합니다. 비트가 1로 설정된 경우 해당 VF 구성 블록의 데이터가 변경됩니다.
-
NDIS는 VF 구성 블록 데이터의 변경에 대해 관리 OS에서 실행되는 가상화 스택에 신호를 보냅니다. 가상화 스택은 BlockMask 매개 변수 데이터를 캐시합니다.
참고 PF 미니포트 드라이버가 NdisMInvalidateConfigBlock호출할 때마다 가상화 스택이 또는 해당 캐시의 현재 값이 있는 BlockMask 매개 변수 데이터를.
- 가상화 스택은 게스트 OS에서 실행되는 VPCI(가상 PCI) 드라이버에 VF 구성 데이터의 무효화에 대해 알 수 있습니다. 가상화 스택은 캐시된 BlockMask 매개 변수 데이터를 VPCI 드라이버로 보냅니다.
-
게스트 OS에서 다음 단계가 발생합니다.
- VPCI 드라이버는 IOCTL_VPCI_INVALIDATE_BLOCK 요청과 연결된 VPCI_INVALIDATE_BLOCK_OUTPUT 구조체의 BlockMask 멤버에 캐시된 BlockMask 매개 변수 데이터를 저장합니다.
-
VPCI 드라이버가 IOCTL_VPCI_INVALIDATE_BLOCK 요청을 성공적으로 완료합니다. 이 경우 NDIS는 VF 미니포트 드라이버에 OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK OID(개체 식별자) 요청을 발급합니다.
NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO 구조체에 대한 포인터는 OID 요청에 전달됩니다. 이 구조에는 캐시된 BlockMask 매개 변수 데이터가 포함됩니다.
또한 NDIS는 VF 구성 데이터에 대한 변경 내용에 대한 연속 알림을 처리하기 위해 다른 IOCTL_VPCI_INVALIDATE_BLOCK 요청을 발행합니다.
- VF 드라이버는 OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK 요청을 처리할 때 지정된 VF 구성 블록에서 데이터를 읽습니다.
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows Server 2012 이상 버전의 Windows에서 지원됩니다. |
헤더 | vpci.h(Wdm.h 포함) |
IRQL | DISPATCH_LEVEL |
참고 항목
IRP_MJ_INTERNAL_DEVICE_CONTROL
드라이버 IOCTL 요청 만들기
OID_SRIOV_VF_INVALIDATE_CONFIG_BLOCK
NDIS_SRIOV_VF_INVALIDATE_CONFIG_BLOCK_INFO