Condividi tramite


Funzione WdfRequestForwardToParentDeviceIoQueue (wdfrequest.h)

[Si applica solo a KMDF]

Il metodo WdfRequestForwardToParentDeviceIoQueue accoda nuovamente una richiesta di I/O da una coda di I/O di un dispositivo figlio a una coda di I/O specificata del dispositivo padre dell'elemento figlio.

Sintassi

NTSTATUS WdfRequestForwardToParentDeviceIoQueue(
  [in] WDFREQUEST                   Request,
  [in] WDFQUEUE                     ParentDeviceQueue,
  [in] PWDF_REQUEST_FORWARD_OPTIONS ForwardOptions
);

Parametri

[in] Request

Handle per un oggetto richiesta framework.

[in] ParentDeviceQueue

Handle per un oggetto coda del framework.

[in] ForwardOptions

Puntatore a una struttura WDF_REQUEST_FORWARD_OPTIONS allocata dal chiamante.

Valore restituito

WdfRequestForwardToParentDeviceIoQueue restituisce STATUS_SUCCESS se l'operazione ha esito positivo. In caso contrario, questo metodo potrebbe restituire uno dei valori seguenti:

Codice restituito Descrizione
STATUS_INFO_LENGTH_MISMATCH
La dimensione della struttura di WDF_REQUEST_FORWARD_OPTIONS fornita non è valida.
STATUS_INVALID_PARAMETER
Un membro della struttura WDF_REQUEST_FORWARD_OPTIONS fornita contiene un valore non valido.
STATUS_INVALID_DEVICE_REQUEST
Questo valore viene restituito se si verifica una delle condizioni seguenti:
  • Il driver non ha ottenuto la richiesta di I/O da una coda di I/O.
  • Le code di I/O di origine e di destinazione sono le stesse.
  • La coda di I/O specificata non appartiene al dispositivo padre.
  • Il driver ha abilitato stato di avanzamento garantito e la richiesta di I/O specificata è riservata per situazioni di memoria insufficiente.
  • Il driver non ha chiamato WdfPdoInitAllowForwardingRequestToParent.
STATUS_WDF_BUSY
La coda di I/O specificata non accetta nuove richieste.
 

Questo metodo può anche restituire altri valori NTSTATUS .

Se il driver fornisce un handle di oggetto non valido, si verifica un controllo di bug.

Osservazioni

Prima che un driver possa chiamare WdfRequestForwardToParentDeviceIoQueue, deve chiamare WdfPdoInitAllowForwardingRequestToParent.

Il driver deve usare lo stesso metodo per accedere ai buffer di dati (memorizzati nel buffer, diretto o nessuno dei due) sia per il dispositivo padre che per il dispositivo figlio.

Se il driver chiamerà WdfRequestForwardToParentDeviceIoQueue per rieseguere una richiesta di I/O, il driver non deve usare l'oggetto richiesta come padre di altri oggetti framework, ad esempio oggetti timer o oggetti elemento di lavoro.

Se il driver ha chiamato WdfDeviceInitSetRequestAttributes per specificare spazio di contesto per gli oggetti richiesta del dispositivo padre padre dispositivo, il framework non aggiunge questo spazio di contesto per richiedere gli oggetti ricevuti dal driver nella coda di un dispositivo figlio. Il driver può chiamare WdfObjectAllocateContext per aggiungere lo spazio di contesto a un oggetto richiesta prima che il driver chiami WdfRequestForwardToParentDeviceIoQueue. D'altra parte, se il driver ha chiamato WdfDeviceInitSetRequestAttributes per gli oggetti richiesta del dispositivo figlio dispositivo e se gli oggetti richiesta del dispositivo padre usano lo spazio di contesto uguale o inferiore allo spazio di contesto del dispositivo figlio, il driver può usare lo spazio di contesto dell'oggetto richiesta senza chiamare WdfObjectAllocateContext.

Attualmente, il driver deve usare l'opzione invia e dimentica per tutte le richieste di I/O accodate. Pertanto, tenere presente che al momento in cui il framework elimina un oggetto richiesta accodato, potrebbe aver già rimosso il dispositivo figlio che ha originariamente ricevuto l'oggetto richiesta. Pertanto, il driver non deve usare il EvtCleanupCallback o EvtDestroyCallback funzione di un oggetto richiesta riaqueued per accedere alle risorse del dispositivo figlio, perché le risorse potrebbero essere rimosse prima dell'esecuzione del EvtCleanupCallback o evtDestroyCallback funzione.

Per altre informazioni su WdfRequestForwardToParentDeviceIoQueue, vedere Requeuing I/O Requests.

Esempi

L'esempio di codice seguente determina innanzitutto il dispositivo padre di un dispositivo che ha ricevuto una richiesta di I/O e quindi accoda nuovamente la richiesta di I/O alla coda di I/O predefinita del dispositivo padre.

WDFDEVICE device, parentDevice;
WDF_REQUEST_FORWARD_OPTIONS forwardOptions;
NTSTATUS status;

device = WdfIoQueueGetDevice(WdfRequestGetIoQueue(Request));
parentDevice = WdfPdoGetParent(device);

WDF_REQUEST_FORWARD_OPTIONS_INIT(&forwardOptions);
status = WdfRequestForwardToParentDeviceIoQueue(
             Request,
             WdfDeviceGetDefaultQueue(parentDevice),
             &forwardOptions
             );
if (!NT_SUCCESS(status)) {
    WdfRequestComplete(
                       Request,
                       status
                       );
  }

Fabbisogno

Requisito Valore
piattaforma di destinazione Universale
versione minima di KMDF 1.9
intestazione wdfrequest.h (include Wdf.h)
libreria Wdf01000.sys (vedere Controllo delle versioni della libreria framework).
IRQL <=DISPATCH_LEVEL
regole di conformità DDI DriverCreate(kmdf)

Vedere anche

WdfPdoInitAllowForwardingRequestToParent