Compartilhar via


Filtrar alocadores específicos

Os filtros que exigem alocadores para memória a bordo ou outros métodos de armazenamento dependentes do dispositivo podem fornecer um alocador específico, dando suporte a propriedades e métodos do alocador. Para obter mais informações, consulte KSPROPERTY_STREAM_ALLOCATOR.

Um filtro recebe uma IRP_MJ_CREATE do tipo KSCREATE_REQUEST_ALLOCATOR especificando as opções de enquadramento para o alocador. A rotina de criação do alocador do minidriver valida a solicitação de criação chamando KsValidateAllocatorCreateRequest. Se a chamada for bem-sucedida, essa rotina retornará um ponteiro para a estrutura de KSALLOCATOR_FRAMING relevante.

Se o filtro não puder atender aos requisitos de enquadramento, ele retornará um código de falha em resposta ao IRP. Caso contrário, o filtro anexa um ponteiro a uma estrutura ao membro FsContext do objeto de arquivo e atende às solicitações de alocador resultantes.

Se os buffers passados para a interface de streaming devem ser modificados in-place pelo filtro, o cliente do modo de usuário define o sinalizador KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER na estrutura KSALLOCATOR_FRAMING relevante.

Há duas interfaces disponíveis para o alocador. Primeiro, todos os alocadores devem dar suporte ao KSMETHODSETID_StreamAllocator baseado em IRP. Os alocadores que utilizam esse mecanismo são limitados pelo número máximo de quadros alocados. As solicitações para alocar quadros além desse limite serão marcadas como pendentes.

Em segundo lugar, o minidriver poderá dar suporte ao acesso à tabela de funções se o tipo de pool de alocação puder ser atendido em DISPATCH_LEVEL. Fornecer acesso à tabela de funções é opcional. Faça isso dando suporte às propriedades em KSPROPSETID_StreamAllocator.

A interface DISPATCH_LEVEL funciona da seguinte maneira:

Quando uma solicitação de alocação é enviada ao alocador, o alocador retorna um ponteiro para um quadro se um estiver disponível. Caso contrário, ele retornará imediatamente NULL.

Quando uma solicitação gratuita é enviada ao alocador, o alocador sinaliza o evento de "quadro livre" do alocador de fluxo notificando o cliente de que um quadro gratuito está disponível. Além disso, se houver IRPs de solicitação de alocação aguardando a conclusão, o alocador deverá agendar um item de trabalho (se o IRQL atual não for PASSIVE_LEVEL) e concluir a solicitação com o quadro livre.

É possível que tanto a interface DISPATCH_LEVEL quanto a interface baseada em IRP disputem pelos quadros disponíveis. O KS sincroniza essa fila usando o spin lock de cancelamento.