Condividi tramite


Funzione WdfRequestForwardToParentDeviceIoQueue (wdfrequest.h)

[Si applica solo a KMDF]

Il metodo WdfRequestForwardToParentDeviceIoQueue esegue nuovamente una richiesta di I/O da una coda I/O di un dispositivo figlio a una coda di I/O specificata del dispositivo padre del 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 a un oggetto code del framework.

[in] ForwardOptions

Puntatore a una struttura di 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
Le dimensioni della struttura WDF_REQUEST_FORWARD_OPTIONS fornita non sono valide.
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 operazioni 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 uguali.
  • La coda di I/O specificata non appartiene al dispositivo padre.
  • Il driver ha abilitato lo stato di avanzamento garantito e la richiesta di I/O specificata è riservata a situazioni di memoria ridotta.
  • Il driver non ha chiamato WdfPdoInitAllowForwardingRequestToParent.
STATUS_WDF_BUSY
La coda di I/O specificata non accetta nuove richieste.
 

Questo metodo potrebbe restituire anche altri valori NTSTATUS.

Un controllo di bug si verifica se il driver fornisce un handle di oggetti non valido.

Commenti

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

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

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

Se il driver ha chiamato WdfDeviceInitSetRequestAttributes per specificare lo spazio di contesto per gli oggetti richiesta del dispositivo padre , il framework non aggiunge questo spazio di contesto per richiedere agli oggetti ricevuti dal driver nella coda del dispositivo figlio. Il driver può chiamare WdfObjectAllocateContext per aggiungere lo spazio di contesto a un oggetto request prima che il driver chiami WdfRewardToParentDeviceIoQueue. D'altra parte, se il driver denominato WdfDeviceInitSetRequestAttributes per gli oggetti richiesta del dispositivo figlio e se gli oggetti della richiesta del dispositivo padre usano lo spazio di contesto uguale o minore rispetto 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 send and forget per tutte le richieste di I/O riqueued. Pertanto, tenere presente che nel momento in cui il framework elimina un oggetto richiesta riqueued, potrebbe aver già rimosso il dispositivo figlio che originariamente ha ricevuto l'oggetto request. Pertanto, il driver non deve usare la funzione EvtCleanupCallback o EvtDestroyCallback di un oggetto richiesta riqueued per accedere alle risorse del dispositivo figlio, perché le risorse potrebbero essere rimosse prima dell'esecuzione della funzione EvtCleanupCallback o EvtDestroyCallback.

Per altre informazioni su WdfRequestForwardToParentDeviceIoQueue, vedere Ripetizione delle richieste di I/O.

Esempio

L'esempio di codice seguente determina innanzitutto il dispositivo padre di un dispositivo che ha ricevuto una richiesta di I/O e quindi esegue 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
                       );
  }

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
Versione KMDF minima 1,9
Intestazione wdfrequest.h (include Wdf.h)
Libreria Wdf01000.sys (vedere Framework Library Versioning).
IRQL <=DISPATCH_LEVEL
Regole di conformità DDI DriverCreate(kmdf)

Vedi anche

WdfPdoInitAllowForwardingRequestToParent