Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O DMA (acesso direto à memória) baseado em pacote ocorre quando o minidriver lê dados diretamente e grava dados diretamente para capturar buffers recebidos do modo de usuário. O AVSHwS (Driver de Exemplo de Hardware Simulado) do AVStream nos exemplos do WDK (Windows Driver Kit) demonstra como criar um minidriver AVStream que executa esse tipo de DMA.
Para implementar um esquema DMA baseado em pacotes:
Especifique KSPIN_FLAG_GENERATE_MAPPINGS no membro Flags nas estruturas KSPIN_DESCRIPTOR_EX relevantes. Observe que esse sinalizador só deve ser usado por um mestre de barramento com suporte de dispersão/coleta.
Registre uma ISR (rotina de serviço de interrupção), conforme descrito em Escrita de Minidrivers AVStream para Hardware.
Em seguida, na inicialização de despacho do AVStrMiniDeviceStart:
Configure um objeto do adaptador DMA usando IoGetDmaAdapter.
Registre o objeto do adaptador DMA com a AVStream chamando KsDeviceRegisterAdapterObject.
O minidriver especifica o tamanho máximo para um único mapeamento de scatter/gather fornecendo o parâmetro MaxMappingByteCount na chamada para KsDeviceRegisterAdapterObject.
Se algum mapeamento de dispersão/coleta exceder esse tamanho máximo, o AVStream automaticamente dividirá o mapeamento em vários outros mapeamentos de dispersão/coleta, cada um com um tamanho que não ultrapassa o especificado em MaxMappingByteCount.
Você também deve fornecer uma rotina de retorno de chamada AVStrMiniPinProcess . O desenvolvedor de driver deve escolher a funcionalidade apropriada para este retorno de chamada. Como exemplo, você pode fazer o seguinte:
Clone a ponta de leitura chamando KsStreamPointerClone.
Programe o hardware de DMA com base no clone.
Chame KsStreamPointerAdvanceOffsets ou KsStreamPointerAdvance para avançar na borda superior.
Repita da etapa 2 conforme necessário para quadros adicionais.
Quando o hardware gera uma interrupção para sinalizar a conclusão do DMA, o kernel chama o ISR que o fornecedor registrou anteriormente. No ISR, o minidriver enfileira uma DPC (chamada de procedimento adiado).
Seu DPC deve atualizar DataUsed e possivelmente outros membros da estrutura KSSTREAM_HEADER . Em seguida, o DPC pode chamar KsStreamPointerDelete para excluir o clone e liberar o quadro associado.
Como alternativa, o DPC poderá avançar o ponteiro de clone se apenas parte do quadro for concluída. Para fazer isso, chame KsStreamPointerAdvanceOffsets.
Se necessário para retomar o processamento, chame KsPinAttemptProcessing.
Observação
Se um mapeamento tiver comprimento menor que o de uma página física, não é garantido que resida em apenas uma página física.