IOCTL_SRIOV_ATTACH IOCTL (pcivirt.h)

请求指示虚拟化堆栈想要注册 SR-IOV 设备收到的即插即用事件。

主要代码

IRP_MJ_DEVICE_CONTROL

状态块

Irp->如果请求成功,IoStatus.Status 设置为 STATUS_SUCCESS。 否则, 状态 为相应的错误条件作为 NTSTATUS 代码。

注解

此 IOCTL 请求由虚拟化堆栈发送到公开GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE的 PCI Express SR-IOV 物理功能 (PF) 驱动程序。

如果 PF 设备当前已停止或正在停止以重新平衡资源,则此请求不安全。 设备在收到 IRP_MN_QUERY_STOP_DEVICE 后被视为已停止,并在收到 IRP_MN_CANCEL_STOP_DEVICE 或堆栈中的较低设备完成 IRP_MN_START_DEVICE 时重启。 在这种情况下,驱动程序必须延迟此请求的完成,直到设备重启。

没有必要将此 IRP 保持挂起状态,因为请求始终作为同步内核模式 IRP 发送,导致调用方在任何情况下都阻止线程。

完成此请求后,VSP 随后可以发送 IOCTL_SRIOV_NOTIFICATIONIOCTL_SRIOV_EVENT_COMPLETE 请求。

若要取消注册即插即用事件,VSP 会发送IOCTL_SRIOV_DETACH请求。

(SRIOV_PF_EVENT) 中定义的这些事件会导致 完成IOCTL_SRIOV_NOTIFICATION 并等待 IOCTL_SRIOV_EVENT_COMPLETE

在此处理IOCTL_SRIOV_ATTACH请求的示例中,PF 驱动程序在其设备上下文中维护 PnP 状态。 当驱动程序收到IRP_MN_QUERY_STOP_DEVICE时,deviceContext->PnpRebalancing 设置为 TRUE,在接收IRP_MN_START_DEVICE时设置为 FALSE。
    case IOCTL_SRIOV_ATTACH:
        TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL, "IOCTL_SRIOV_ATTACH:\n");

        WdfWaitLockAcquire(fdoContext->PnpStateLock, NULL);

        //
        // Block until it is safe for the VSP to attach.  Don't
        // bother with pending this IRP since this is always a sent as
        // a synchronous kernel-mode IRP and the caller would block
        // the thread anyway.  May need to repeat the wait since
        // waiting for the safe-to-attach event must not be done while
        // holding the state lock.
        //
        while (fdoContext->PnpSafeToAttach == FALSE)
        {
            WdfWaitLockRelease(fdoContext->PnpStateLock);

            KeWaitForSingleObject(&fdoContext->PnpSafeEvent,
                                  Executive,
                                  KernelMode,
                                  FALSE,
                                  NULL);

            WdfWaitLockAcquire(fdoContext->PnpStateLock, NULL);
        }

        //
        // Allow only a single attach at any time.
        //
        if (fdoContext->PnpVspAttached == FALSE)
        {
            fdoContext->PnpVspAttached = TRUE;
            status = STATUS_SUCCESS;
        }
        else
        {
            status = STATUS_SHARING_VIOLATION;
        }
        WdfWaitLockRelease(fdoContext->PnpStateLock);

        break;

要求

要求
Header pcivirt.h
IRQL PASSIVE_LEVEL

另请参阅

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendInternalIoctlOthersSynchronously

在驱动程序中创建 IOCTL 请求

IOCTL_SRIOV_DETACH

WdfIoTargetSendIoctlSynchronously