IOCTL_SRIOV_DETACH IOCTL (pcivirt.h)
要求は、仮想化スタックが プラグ アンド プレイ イベントの登録を解除することを示します (以前はIOCTL_SRIOV_ATTACH要求を通じて登録されています)。
メジャー コード
ステータス ブロック
Irp->要求が成功した場合、IoStatus.Status はSTATUS_SUCCESSに設定されます。 それ以外の場合、 Status は NTSTATUS コードとして適切なエラー条件を示します。
注釈
この IOCTL 要求は、仮想化スタックによって、GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICEを公開する PCI Express SR-IOV 物理関数 (PF) ドライバーに送信されます。
ここから、PF は IOCTL_SRIOV_EVENT_COMPLETE と IOCTL_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