Condividi tramite


Funzione KsProbeStreamIrp (ks.h)

La funzione KsProbeStreamIrp apporta le modifiche specificate ai buffer di input e output del provider di risorse in base ai flag passati e quindi convalida l'intestazione del flusso. Ciò è utile quando si localizza la gestione delle eccezioni o si eseguono operazioni asincrone su un IRP. L'IRP risultante è essenzialmente il formato METHOD_OUT_DIRECT o METHOD_IN_DIRECT, ad eccezione del fatto che l'accesso al buffer di dati può essere IoModifyAccess, a seconda dei flag passati a questa funzione o ai flag nell'intestazione del flusso.

Sintassi

KSDDKAPI NTSTATUS KsProbeStreamIrp(
  [in, out]      PIRP  Irp,
  [in]           ULONG ProbeFlags,
  [in, optional] ULONG HeaderSize
);

Parametri

[in, out] Irp

Specifica l'IRP di cui eseguire il mapping dei buffer di input e output. La modalità richiedente dell'IRP viene usata durante il probe dei buffer.

[in] ProbeFlags

Specifica i flag che specificano come eseguire il probe dell'IRP di streaming; I flag sono elencati nella tabella seguente.

[in, optional] HeaderSize

Specifica le dimensioni per convalidare ogni intestazione rispetto a quella passata al client oppure zero se non è necessario eseguire alcuna convalida. Se usato, si presuppone che l'intero buffer passato sia un multiplo di questa dimensione di intestazione, a meno che il buffer non contenga invece un'intestazione di modifica del formato singola.

Valore restituito

La funzione KsProbeStreamIrp restituisce STATUS_SUCCESS in caso di esito positivo oppure restituisce un errore di memoria o accesso.

Osservazioni

Se la funzione viene usata solo per allocare gli indirizzi MDL e non per eseguire il probe e bloccare gli indirizzi, il chiamante deve disporre di una routine di completamento per pulire il file MDL. Ad esempio, un meccanismo di blocco JITE può allocare l'elenco MDL, ma solo bloccare la memoria in base alle esigenze. Il client deve fornire codice di pulizia per rimuovere l'elenco MDL parzialmente bloccato prima del completamento dell'IRP, presumibilmente in una routine di completamento.

Se le intestazioni sembrano essere già state copiate in un buffer di sistema, non viene convalidata di nuovo. In generale, la chiamata alla funzione KsProbeStreamIrp più volte con un IRP non è dannosa. Dopo aver chiamato la funzione, le intestazioni del flusso sono disponibili in PIRP. AssociatedIrp.SystemBuffer. Se gli MDL del buffer di flusso sono stati allocati, sono disponibili tramite il PIRP. MdlAddress.

Le definizioni seguenti vengono usate per la variabile probeFlags :

valore probeFlags Descrizione
KSPROBE_READ Indica che l'operazione è un flusso letto nel dispositivo. Si tratta dell'impostazione predefinita.
KSPROBE_WRITE Indica che l'operazione è una scrittura di flusso nel dispositivo.
KSPROBE_ALLOCATEMDL Indica che gli mdls devono essere allocati per i buffer di flusso se non sono già stati allocati. Se non sono presenti buffer di flusso, il flag viene ignorato. Se KSPROBE_PROBEANDLOCK non viene specificato contemporaneamente a questo flag, il chiamante deve disporre di una routine di completamento per pulire qualsiasi MDL se non tutti gli MDL sono stati rilevati correttamente e bloccati.
KSPROBE_PROBEANDLOCK Se la KSPROBE_ALLOCATEMDL è impostata, indica che la memoria a cui fa riferimento gli ELENCHI di dati per i buffer di flusso deve essere eseguita il probe e il blocco. Se il flag di allocazione MDL non è impostato, questo flag viene ignorato anche se l'allocazione MDL è stata eseguita in precedenza. Il metodo di probe è determinato dal tipo di IRP passato. Per un'operazione di scrittura, viene usato IoReadAccess. Per un'operazione di lettura, viene usato IoWriteAccess. Se il client che ha inviato i dati usa il pool non di paging, gli MDL appropriati vengono inizializzati anziché eseguire il probe e il blocco.
KSPROBE_SYSTEMADDRESS Recupera un indirizzo di sistema per ogni MDL nella catena, in modo che il chiamante non debba eseguire questa operazione in un passaggio separato. Questa operazione viene ignorata se il probe e il flag di blocco non sono impostati, anche se gli elenchi di istruzioni gestito sono stati sottoposti a probe in precedenza.
KSPROBE_ALLOWFORMATCHANGE Per una scrittura di flusso, consente di impostare il flag KSSTREAM_HEADER_OPTIONSF_TYPECHANGED nell'intestazione del flusso. Ciò implica che l'intestazione del flusso non è di lunghezza estesa, anche se è stata indicata una dimensione estesa dell'intestazione. Inoltre, in questo caso può essere presente una sola intestazione di flusso contenuta in IRP. Il buffer associato a questa intestazione contiene il nuovo formato di dati. Per i flussi di dati di memoria di sistema, il buffer non deve essere stato acquisito dall'allocatore negoziato, in quanto non fa parte del flusso di dati.

Fabbisogno

Requisito Valore
piattaforma di destinazione Universale
intestazione ks.h (include Ks.h)
libreria Ks.lib