Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die Anforderung gibt an, dass der Virtualisierungsstapel benachrichtigt werden möchte, wenn eines der in SRIOV_PF_EVENT aufgeführten Ereignisse auftritt.
Hauptcode
Ausgabepuffer
Ein Puffer, der einen SRIOV_PF_EVENT-Type-Wert enthält, der vom PF-Treiber (Physical Function) gefüllt wird, wenn die Anforderung abgeschlossen wird.
Länge des Ausgabepuffers
Ein Zeiger auf die Variable, der die Anzahl der geschriebenen Bytes dem Ausgabepuffer zugewiesen wird, wenn die Anforderung abgeschlossen ist.
Statusblock
Irp->IoStatus.Status auf STATUS_SUCCESS festgelegt ist, wenn die Anforderung erfolgreich ist. Andernfalls Status der entsprechenden Fehlerbedingung als NTSTATUS- Code.
Bemerkungen
Diese IOCTL-Anforderung wird vom Virtualisierungsstapel an den PCI Express SR-IOV Physical Function (PF)-Treiber gesendet, der GUID_DEVINTERFACE_VIRTUALIZABLE_DEVICE verfügbar macht.
Die IOCTL_SRIOV_NOTIFICATION Anforderung wird vom PF-Treiber in einer Warteschlange gehalten, bis die Anforderung entweder vom Absender abgebrochen wird oder das Gerät eines der ereignisse, die in SRIOV_PF_EVENTaufgeführt sind. Der Treiber schließt dann die ausstehende Anforderung ab.
Wenn der PF-Treiber diese IOCTL-Anforderung empfängt, während ein Plug- und Play-Ereignis verarbeitet wird, für das der Treiber noch keine Benachrichtigung abgeschlossen hat, sollte die IOCTL-Anforderung sofort mit den Ereignisdetails im Ausgabepuffer abgeschlossen werden. Andernfalls sollte der Treiber die Anforderung in die Warteschlange stellen, bis er abgebrochen wird, oder ein Plug and Play-Ereignis, das eine Benachrichtigung erfordert.
Der Virtualisierungsstapel kann die IOCTL_SRIOV_NOTIFICATION Anforderung unmittelbar nach Abschluss der vorherigen IOCTL_SRIOV_NOTIFICATION Anforderung senden. Der PF-Treiber muss nachverfolgen, dass eine Ereignisbenachrichtigung übermittelt wurde und nicht zweimal zwei IOCTL-Anforderungen für dasselbe Ereignis abschließen darf.
Er wird vom PF-Treiber geschrieben, bis er vom Absender abgebrochen wird oder bis der PF-Treiber eines von mehreren PnP-Ereignissen erlebt, zu diesem Zeitpunkt wird er abgeschlossen.
case IOCTL_SRIOV_NOTIFICATION:
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL,
"IOCTL_SRIOV_NOTIFICATION:\n");
status = WdfRequestForwardToIoQueue(Request,
fdoContext->NotificationQueue);
if (!NT_SUCCESS(status))
{
// not able to push it into manual queue, too bad.
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
"WdfRequestForwardToIoQueue failed status=%!STATUS!\n",
status);
break;
}
//
// Pnp might arrived before SRIOV_NOTIFICATION. Serve the new
// outstanding pnp if there is one.
//
CheckPendingNotifications(fdoContext);
status = STATUS_PENDING;
break;
VOID
CheckPendingNotifications(
__in PDEVICE_CONTEXT DeviceContext
)
/*++
Routine Description:
This routine checks if there is a pending event and a pending request
for notification and if so completes the request.
Arguments:
DeviceContext - Pointer to the device context
Return Value:
None.
--*/
{
PSRIOV_PF_EVENT notification;
WDFQUEUE queue;
WDFREQUEST request;
NTSTATUS status;
PAGED_CODE();
WdfWaitLockAcquire(DeviceContext->PnpStateLock, NULL);
queue = DeviceContext->NotificationQueue;
if (DeviceContext->PnpEventNew
&& NT_SUCCESS(WdfIoQueueRetrieveNextRequest(queue, &request)))
{
NT_ASSERT(DeviceContext->PnpEventPending != FALSE);
DeviceContext->PnpEventNew = FALSE;
status = WdfRequestRetrieveOutputBuffer(request,
sizeof(*notification),
¬ification,
NULL);
if (!NT_SUCCESS(status))
{
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
"WdfRequestRetrieveOutputBuffer[SRIOV_NOTIFICATION] fail: %!STATUS!", status);
WdfRequestComplete(request, status);
}
else
{
TraceEvents(TRACE_LEVEL_VERBOSE, DBG_IOCTL, "Retrieved IoQueue request buffer (notification)\n");
*notification = DeviceContext->PnpEventCode;
WdfRequestCompleteWithInformation(request,
STATUS_SUCCESS,
sizeof(*notification));
}
}
WdfWaitLockRelease(DeviceContext->PnpStateLock);
return;
}
Anforderungen
Anforderung | Wert |
---|---|
Header- | pcivirt.h |
IRQL- | PASSIVE_LEVEL |