Filtrar alocadores específicos

Os filtros que exigem alocadores para memória a bordo ou outros métodos de armazenamento dependentes de 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 precisarem ser modificados in-loco pelo filtro, o cliente de modo de usuário definirá o sinalizador KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER na estrutura de KSALLOCATOR_FRAMING relevante.

Há duas interfaces disponíveis para o alocador. Primeiro, todos os alocadores devem dar suporte à KSMETHODSETID_StreamAllocator baseada em IRP. Os alocadores que usam esse mecanismo são limitados a um 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 houver um disponível. Caso contrário, retornará NULL imediatamente.

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 livre 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 estiver PASSIVE_LEVEL) e concluir a solicitação com o quadro livre.

É possível que a interface DISPATCH_LEVEL e a interface baseada em IRP defendam quadros livres. O KS sincroniza essa fila usando o bloqueio de rotação de cancelamento.