要求指出虛擬化堆疊想要註冊 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_DEVICESriovEventPfRestart 只有在裝置停止 重新平衡時才產生 (請參閱上圖)。
- 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;
要求
要求 | 價值 |
---|---|
標頭 | pcivirt.h |
IRQL | PASSIVE_LEVEL |
另請參閱
WdfIoTargetSendInternalIoctlSynchronously
WdfIoTargetSendInternalIoctlOthersSynchronously
在驅動程式 中建立IOCTL要求