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 di 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 un puntatore a una struttura al membro FsContext dell'oggetto file e servizi 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 di KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER nella struttura KSALLOCATOR_FRAMING pertinente.

Esistono due interfacce disponibili 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 frame allocati. Le richieste per allocare frame oltre questo limite verranno contrassegnate in sospeso.

In secondo luogo, il minidriver può supportare l'accesso alla tabella delle funzioni se il tipo di pool di allocazione può essere servito in DISPATCH_LEVEL. L'accesso alla tabella delle funzioni è facoltativo. Eseguire questa operazione 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 l'evento "frame libero" allocatore di flusso che informa il client che è disponibile un frame gratuito. Inoltre, se sono presenti IRP di richiesta di allocazione in attesa di completamento, l'allocatore deve pianificare un elemento di lavoro (se il irQL corrente non è PASSIVE_LEVEL) e completare la richiesta con il frame libero.

È possibile che sia l'interfaccia DISPATCH_LEVEL sia l'interfaccia basata su IRP per la ricerca di frame gratuiti. KS sincronizza questa coda usando il blocco di rotazione annulla.