Compartilhar via


Manipulando blocos de solicitação de fluxo

O sistema operacional envia todas as solicitações de E/S no dispositivo para o driver de classe. O driver de classe, por sua vez, solicita informações específicas de hardware do minidriver passando SRBs para o minidriver. O driver de classe especifica a operação que ele solicita no membro Command do bloco de solicitação de fluxo.

O minidriver como um todo e cada fluxo dentro do minidriver podem receber solicitações de E/S. O minidriver deve fornecer uma rotina StrMiniReceiveDevicePacket para lidar com solicitações em todo o dispositivo. Cada fluxo deve dar suporte a duas rotinas para lidar com solicitações de E/S: uma para solicitações de dados e outra para solicitações de controle. O driver de classe chama o retorno de chamada de solicitação de dados, StrMiniReceiveStreamDataPacket, para lidar com todas as solicitações de leitura e gravação em um fluxo. Todas as outras solicitações para um fluxo são passadas para StrMiniReceiveStreamControlPacket.

Se o driver de classe estiver tratando a sincronização para o minidriver, ele enfileirará solicitações de fluxo e as enviará ao minidriver um de cada vez. O driver de classe mantém três filas separadas: uma para solicitações de dispositivo e outra para dados de fluxo e solicitações de controle. O minidriver pode sinalizar que está pronto para uma nova solicitação de uma dessas filas da seguinte maneira:

Tipo de solicitação Rotina Parâmetro NotificationType de Rotina

solicitação de dispositivo

StreamClassDeviceNotification

ReadyForNextDeviceRequest

solicitação de controle de fluxo

StreamClassStreamNotification

ReadyForNextStreamControlRequest

solicitação de dados de fluxo

StreamClassStreamNotification

ReadyForNextStreamDataRequest

Quando o driver de classe chama StrMiniReceiveXXXPacket, ele entrega o bloco de solicitação de fluxo para o minidriver. A rotina do minidriver tem acesso exclusivo ao bloco de solicitação de fluxo até que ele sinalize para o driver de classe que concluiu a solicitação.

Quando o minidriver concluir o processamento de uma solicitação, ele deverá sinalizar ao driver de classe que concluiu a solicitação da seguinte maneira:

  1. O minidriver deve definir o status da solicitação no campo Status do bloco de solicitação de fluxo.

  2. O minidriver deve sinalizar que concluiu a solicitação chamando StreamClassDeviceNotification ou StreamClassStreamNotification. Para concluir uma solicitação de dispositivo, o minidriver chama StreamClassDeviceNotification com um parâmetro NotificationType de DeviceRequestComplete. Para concluir uma solicitação de fluxo, o minidriver chama StreamClassStreamNotification com um parâmetro NotificationType de StreamRequestComplete.

  3. Se o driver de classe estiver tratando a sincronização e se o minidriver ainda não tiver sinalizado ao driver de classe que ele está pronto para outra solicitação nessa fila, ele deverá fazê-lo agora.

O minidriver pode combinar 2 e 3 chamando StreamClassCompleteRequestAndMarkQueueReady.

O minidriver processa solicitações de forma assíncrona, portanto, o driver de classe pode precisar cancelar ou cronometrar uma solicitação. Para essas finalidades, o minidriver deve fornecer um StrMiniCancelPacket e uma rotina StrMiniRequestTimeout . O driver de classe chama a respectiva rotina de minidriver quando cancela ou atinge o tempo limite de uma solicitação.

O driver de classe cancela uma solicitação quando a solicitação de E/S subjacente é cancelada pelo sistema operacional. O driver de classe atinge o tempo limite de solicitações que levam muito tempo para processar – ele diminui um contador de quantos segundos até atingir o tempo limite de uma solicitação no membro TimeoutCounter do bloco de solicitação de fluxo. Se o minidriver precisar adiar o processamento em uma solicitação por um longo período de tempo, ele deverá definir o membro TimeoutCounter como zero – o driver de classe não ultrapassará o tempo limite da solicitação. Depois que o minidriver retomar o processamento da solicitação, ele deverá redefinir TimeoutCounter para ser igual ao membro TimeoutOriginal do bloco de solicitação de fluxo. O minidriver pode redefinir TimeoutOriginal para alterar o período de tempo antes do tempo limite da solicitação. Consulte HW_STREAM_REQUEST_BLOCK para obter detalhes.