Condividi tramite


Filtrare allocatori specifici

I filtri che richiedono allocatori per la memoria su scheda o altri metodi di archiviazione dipendenti dal dispositivo possono fornire un allocatore specifico supportando le proprietà e i metodi dell'allocatore. Per altre informazioni, vedere KSPROPERTY_STREAM_ALLOCATOR.

Un filtro riceve un IRP_MJ_CREATE di tipo KSCREATE_REQUEST_ALLOCATOR specificando le opzioni di frame per l'allocatore. La routine di creazione dell'allocatore del minidriver convalida la richiesta di creazione chiamando KsValidateAllocatorCreateRequest. Se la chiamata ha esito positivo, questa routine restituisce un puntatore alla struttura KSALLOCATOR_FRAMING pertinente.

Se il filtro non riesce a soddisfare i requisiti di frame, restituisce un codice di errore in risposta all'IRP. In caso contrario, il filtro collega al membro FsContext dell'oggetto file un puntatore a una struttura e gestisce le richieste dell'allocatore risultante.

Se i buffer passati all'interfaccia di streaming devono essere modificati sul posto dal filtro, il client in modalità utente imposta il flag KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER sulla struttura KSALLOCATOR_FRAMING pertinente.

Sono disponibili due interfacce per l'allocatore. Prima di tutto, tutti gli allocatori devono supportare i KSMETHODSETID_StreamAllocator basati su IRP. Gli allocatori che usano questo meccanismo sono limitati a un numero massimo di fotogrammi allocati. Le richieste di allocazione dei frame oltre questo limite verranno contrassegnate come in sospeso.

In secondo luogo, il minidriver può supportare l'accesso alla tabella delle funzioni se il tipo di pool di allocazione può essere gestito al livello DISPATCH_LEVEL. L'accesso alla tabella delle funzioni è facoltativo. Fai questo supportando le proprietà in KSPROPSETID_StreamAllocator.

L'interfaccia DISPATCH_LEVEL funziona come segue:

Quando viene inviata una richiesta di allocazione all'allocatore, l'allocatore restituisce un puntatore a un frame, se disponibile. In caso contrario, restituisce immediatamente NULL.

Quando viene inviata una richiesta gratuita all'allocatore, l'allocatore segnala all'allocatore di flusso l'evento "free frame" che informa il client che è disponibile un frame libero. Inoltre, se sono presenti irP di richiesta di allocazione in attesa di essere completati, l'allocatore deve pianificare un elemento di lavoro (se il runtime di integrazione corrente non è PASSIVE_LEVEL) e completare la richiesta con il frame libero.

È possibile che sia l'interfaccia DISPATCH_LEVEL che l'interfaccia basata su IRP si contendono fotogrammi gratuiti. KS sincronizza questa coda usando il blocco di selezione annulla.