Partilhar via


Filtrar Alocadores Específicos

Os filtros que requerem alocadores para memória integrada ou outros métodos de armazenamento dependentes do dispositivo podem fornecer um alocador específico, suportando 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 satisfazer os 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 em modo de utilizador deve definir o sinalizador KSALLOCATOR_REQUIREMENTF_INPLACE_MODIFIER na estrutura KSALLOCATOR_FRAMING relevante.

Há duas interfaces disponíveis para o alocador. Em primeiro lugar, todos os alocadores devem apoiar o KSMETHODSETID_StreamAllocator baseado em IRP. Os alocadores que utilizam este mecanismo estão limitados ao número máximo de quadros que podem ser atribuídos. As solicitações para alocar quadros além desse limite serão marcadas como pendentes.

Em segundo lugar, o minidriver pode suportar o 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 apoiando as propriedades em KSPROPSETID_StreamAllocator.

A interface DISPATCH_LEVEL funciona da seguinte forma:

Quando uma solicitação de alocação é enviada ao alocador, o alocador retorna um ponteiro para um quadro, se houver um disponível. Se não, ele retorna imediatamente NULL.

Quando uma solicitação de liberação é enviada ao alocador, este sinaliza o evento "frame livre" do alocador de fluxo, notificando o cliente de que um frame livre está disponível. Além disso, se houver IRPs de solicitação de alocação aguardando para serem concluídos, o alocador deve 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 compitam por quadros livres. O KS sincroniza essa fila usando o bloqueio de spin para cancelamento.