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