Condividi tramite


Funzione IoBuildSynchronousFsdRequest (wdm.h)

La routine IoBuildSynchronousFsdRequest alloca e configura un'IRP per una richiesta di I/O sincrona.

Sintassi

__drv_aliasesMem PIRP IoBuildSynchronousFsdRequest(
  [in]           ULONG            MajorFunction,
  [in]           PDEVICE_OBJECT   DeviceObject,
  [in, out]      PVOID            Buffer,
  [in, optional] ULONG            Length,
  [in, optional] PLARGE_INTEGER   StartingOffset,
  [in]           PKEVENT          Event,
  [out]          PIO_STATUS_BLOCK IoStatusBlock
);

Parametri

[in] MajorFunction

Codice della funzione principale per l'IRP. Questo codice può essere IRP_MJ_PNP, IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_FLUSH_BUFFERS o IRP_MJ_SHUTDOWN.

[in] DeviceObject

Puntatore alla struttura DEVICE_OBJECT per l'oggetto dispositivo del driver inferiore successivo, che rappresenta il dispositivo di destinazione.

[in, out] Buffer

Puntatore a un buffer di dati. Se MajorFunction è IRP_MJ_WRITE, il buffer contiene dati da scrivere. Se MajorFunction è IRP_MJ_READ, il buffer riceve i dati. Se MajorFunction è IRP_MJ_FLUSH_BUFFERS o IRP_MJ_SHUTDOWN, questo parametro deve essere NULL.

[in, optional] Length

Lunghezza, in byte, del buffer a cui punta buffer. Per i dispositivi come i dischi, questo valore deve essere un numero intero multiplo delle dimensioni del settore. A partire da Windows 8, la dimensione del settore può essere di 4.096 o 512 byte. Nelle versioni precedenti di Windows, le dimensioni del settore sono sempre 512 byte. Questo parametro è necessario per le richieste di lettura e scrittura, ma deve essere zero per le richieste di scaricamento e arresto.

[in, optional] StartingOffset

Puntatore all'offset sul disco, per le richieste di lettura e scrittura. Le unità e il significato di questo valore sono specifiche del driver. Questo parametro è necessario per le richieste di lettura e scrittura, ma deve essere zero per le richieste di scaricamento e arresto.

[in] Event

Puntatore a un oggetto evento allocato e inizializzato del chiamante. Gestione I/O imposta l'evento sullo stato segnalato quando un driver di livello inferiore completa l'operazione richiesta. Dopo aver chiamato IoCallDriver, il driver può attendere l'oggetto evento.

[out] IoStatusBlock

Puntatore a una posizione che riceve il blocco di stato di I/O impostato quando l'IRP viene completato da un driver di livello inferiore.

Valore restituito

Se l'operazione ha esito positivo, IoBuildSynchronousFsdRequest restituisce un puntatore a una struttura IRP inizializzata, con la posizione dello stack I/O inferiore successivo configurata dai parametri forniti. In caso contrario, la routine restituisce NULL.

Commenti

Un driver di file system (FSD) o un altro driver di livello superiore può chiamare IoBuildSynchronousFsdRequest per configurare i provider di integrazione che invia in modo sincrono ai driver di livello inferiore.

IoBuildSynchronousFsdRequest alloca e configura un'istanza di IRP che richiede driver di livello inferiore per eseguire un'operazione di lettura, scrittura, scaricamento o arresto sincrona. L'IRP contiene informazioni sufficienti per avviare l'operazione.

I driver di livello inferiore potrebbero imporre restrizioni sui parametri forniti a questa routine. Ad esempio, i driver di disco potrebbero richiedere che i valori forniti per Length e StartingOffset siano interi più delle dimensioni del settore del dispositivo.

Dopo aver chiamato IoBuildSynchronousFsdRequest per creare una richiesta, il driver deve chiamare IoCallDriver per inviare la richiesta al driver inferiore successivo. Se IoCallDriver restituisce STATUS_PENDING, il driver deve attendere il completamento dell'IRP chiamando KeWaitForSingleObjectnell'evento specificato. La maggior parte dei driver non deve impostare una routine IoCompletion per l'IRP .

Gli IRP creati da IoBuildSynchronousFsdRequest devono essere completati dalla chiamata di un driver a IoCompleteRequest. Un driver che chiama IoBuildSynchronousFsdRequest non deve chiamare IoFreeIrp, perché il gestore I/O libera questi IRP sincroni dopo la chiamata di IoCompleteRequest .

IoBuildSynchronousFsdRequest accoda gli indirizzi IP creati in una coda IRP specifica per il thread corrente. Se il thread viene chiuso, il gestore di I/O annulla l'IRP.

Requisiti

Requisito Valore
Client minimo supportato Disponibile a partire da Windows 2000.
Piattaforma di destinazione Universale
Intestazione wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
Regole di conformità DDI ForwardedAtBadIrqlFsdSync(wdm), HwStorPortProhibitedDDDIs(storport), IoBuildSynchronousFsdRequestNoFree(wdm), IoBuildSynchronousFsdRequestWait(wdm), IoBuildSynchronousFsdRequestWaitTimeout(wdm), PowerIrpDDis(wdm), SignalEventInCompletion(wdm)

Vedi anche

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoCompleteRequest

KeInitializeEvent

KeWaitForSingleObject