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;

要求

要求 价值
标头 pcivirt.h
IRQL PASSIVE_LEVEL

另请参阅

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendInternalIoctlOthersSynchronously

在驱动程序中创建 IOCTL 请求

IOCTL_SRIOV_DETACH

WdfIoTargetSendIoctlSynchronously