次の方法で共有


IOCTL_SRIOV_DETACH IOCTL (pcivirt.h)

要求は、仮想化スタックが プラグ アンド プレイ イベントの登録を解除することを示します (以前はIOCTL_SRIOV_ATTACH要求を通じて登録されています)。

メジャー コード

IRP_MJ_DEVICE_CONTROL

ステータス ブロック

Irp->要求が成功した場合、IoStatus.Status はSTATUS_SUCCESSに設定されます。 それ以外の場合、 StatusNTSTATUS コードとして適切なエラー条件を示します。

注釈

この IOCTL 要求は、仮想化スタックによって、GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICEを公開する PCI Express SR-IOV 物理関数 (PF) ドライバーに送信されます。

ここから、PF は IOCTL_SRIOV_EVENT_COMPLETEIOCTL_SRIOV_NOTIFICATION 要求を受信することを想定しないでください。

IOCTL_SRIOV_EVENT_COMPLETEの待機を停止する必要があるドライバー。 ドライバーが現在待機している場合は、待機を停止し、IRP プラグ アンド プレイ処理を続行する必要があります。

このIOCTL_SRIOV_DETACH要求の処理例では、PF ドライバーはデバイス コンテキストで PnP 状態を維持します。 deviceContext-PnpRebalancing> は TRUE に設定されます。ドライバーがIRP_MN_QUERY_STOP_DEVICEを受け取り、 IRP_MN_START_DEVICE を受信すると FALSE に設定されます。

    case IOCTL_SRIOV_DETACH:

        WdfWaitLockAcquire(deviceContext->PnpStateLock, NULL);

        deviceContext->PnpVspAttached = FALSE;

        if (deviceContext->PnpRebalancing != FALSE)
        {
            //
            // Any new client (VSP state machine) will not know about
            // the current rebalance is it should block attach until
            // rebalance is over.
            //

    								deviceContext>PnpSafeToAttach = FALSE;
    								KeClearEvent(&deviceContext>PnpSafeEvent);

        }

        //
        // Unblock the PnP thread if it waiting for an IO control from the
        // client as the client just detached.
        //
        deviceContext->PnpEventStatus = STATUS_SUCCESS;
        KeSetEvent(&deviceContext->PnpUnblockEvent, IO_NO_INCREMENT, FALSE);

        WdfWaitLockRelease(deviceContext->PnpStateLock);

        status = STATUS_SUCCESS;
        break;



要件

要件
Header pcivirt.h
IRQL PASSIVE_LEVEL

こちらもご覧ください

WdfIoTargetSendInternalIoctlSynchronously

WdfIoTargetSendInternalIoctlOthersSynchronously

ドライバー内での IOCTL 要求の作成

IOCTL_SRIOV_ATTACH

WdfIoTargetSendIoctlSynchronously