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 |
---|---|
|
Le dimensioni della struttura WDF_REQUEST_FORWARD_OPTIONS fornita non sono valide. |
|
Un membro della struttura WDF_REQUEST_FORWARD_OPTIONS fornita contiene un valore non valido. |
|
Questo valore viene restituito se si verifica una delle operazioni seguenti:
|
|
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) |