共用方式為


IOCTL_SRIOV_ATTACH IOCTL (pcivirt.h)

要求指出虛擬化堆疊想要註冊 SR-IOV 裝置所收到的 隨插即用 事件。

主要程序代碼

IRP_MJ_DEVICE_CONTROL

狀態區塊

Irp->如果要求成功,IoStatus.Status 會設定為 STATUS_SUCCESS。 否則, 狀態 為適當的錯誤狀況為 NTSTATUS 程式碼。

備註

此 IOCTL 要求是由虛擬化堆疊傳送至 PCI Express SR-IOV 實體函式, (公開GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE的 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 狀態。 deviceContext->PnpRebalancing 設定為 TRUE,當驅動程式收到IRP_MN_QUERY_STOP_DEVICE,並在收到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