IOCTL_SRIOV_ATTACH IOCTL (pcivirt.h)
この要求は、仮想化スタックが SR-IOV デバイスによって受信プラグ アンド プレイイベントに登録することを示します。
メジャー コード
ステータス ブロック
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_NOTIFICATION と IOCTL_SRIOV_EVENT_COMPLETE 要求を送信できます。
プラグ アンド プレイ イベントの登録を解除するために、VSP はIOCTL_SRIOV_DETACH要求を送信します。
これらのイベント ( SRIOV_PF_EVENTで定義) により、 IOCTL_SRIOV_NOTIFICATION が完了し、 IOCTL_SRIOV_EVENT_COMPLETEが待機します。
- IRP_MN_QUERY_STOP_DEVICE は SriovEventPfQueryStopDevice を生成します。
- IRP_MN_START_DEVICEでは、再調整のためにデバイスが停止した場合にのみSriovEventPfRestart が生成されます (上記を参照)。
- IRP_MN_CANCEL_STOP_DEVICEは、再調整のためにデバイスが停止した場合にのみSriovEventPfRestart を生成します。
- IRP_MN_QUERY_REMOVE_DEVICE は SriovEventPfQueryRemoveDevice を生成します。
- IRP_MN_SURPRISE_REMOVAL は SriovEventPfSurpriseRemoveDevice を生成します。
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