Resolving Race Conditions in Device Drivers
9/8/2008
O XXX_PreClose (Device Manager) e XXX_PreDeinit (Device Manager) transmitir interface driver entrada pontos identificador corrida condições em que um segmento abre ou fecha um identificador dispositivo enquanto o outro executa E/S, ou no qual um segmento Abre, Fecha ou executa E/S em um identificador enquanto outro segmento desativa a driver de dispositivo.
Device Manager mantém um contagem de referência de segmentos executar no driver entrada pontos. Quando o contagem de referência segmento atingir zero, Device Manager segura pode descarregar o driver. Usa Device Manager InterlockedIncrement e relacionado operações sincronização para gerenciar referência contagens.
Device Manager mantém um crítico global seção para validar alças dispositivo retornadas da ActivateDeviceEx e RegisterDevice. Este crítico global seção também é usada para validar retornadas pelo dispositivo arquivo alças CreateFile.
In a XXX_Init (Device Manager), XXX_Deinit (Device Manager), XXX_Open (Device Manager), e XXX_Close (Device Manager) entrada aponta, Device Manager valida alças, libera o crítico seção e, em seguida, chamadas para o apropriado ponto de entrada driver de dispositivo.
Por motivos desempenho, Device Manager não leva o crítico global seção durante E/S chamadas como XXX_Read (Device Manager), XXX_Write (Device Manager), SetFilePointer, e DeviceIoControl. Em vez disso, ele depende contagens usado para manter o driver de descarregamento enquanto segmentos estão sendo executadas codificar no driver. Segmentos Executar arquivo dispositivo - identificador - com base em E/S, incremento uma contagem usado na estrutura descritor identificador Device Manager a estrutura descritor driver de dispositivo e.
Do driver XXX_Close ponto de entrada acorda qualquer segmentos que são bloqueados no identificador especificado pelo hOpenContext parâmetro e libera recursos associado com hOpenContext.
O XXX_Deinit ponto de entrada acorda qualquer segmentos bloqueados em E/S em todos os identificadores associado com a instância dispositivo especificada por hDeviceContext. Ele então libera recursos para todos os identificadores arquivo dispositivo, que são todos os hOpenContext Valores retornados da XXX_Open Chama, para instância de dispositivo. Finalmente, ele libera recursos para instância de dispositivo. Uma vez XXX_Deinit é chamado em um dispositivo, XXX_Close é não chamado mais sobre o aberto alças dispositivo.
Um condição de concorrência podem ocorrer durante períodos de E/S pesada para dispositivos que está sendo carregado e descarregado. Como Device Manager libera seu crítico global seção Antes chamado driver de dispositivo entrada pontos, é possível que um segmento pode chamar XXX_Read, XXX_Write, XXX_Open, ou XXX_Closee também chamar em ponto de entrada do o driver de dispositivo, enquanto outro segmento chamadas XXX_Deinit Na instância de dispositivo. Nessa situação, parece para o driver que XXX_Read, XXX_Write, XXX_Open, ou xxx_Close foi chamado após a chamar para xxx_Deinit. Se o driver pressupõe que o parâmetro contexto para XXX_Read, XXX_Write, XXX_Open, ou xxx_Close é válido, o driver pode excluir a referência liberar recursos e causar uma falhar. Um condição de concorrência semelhante existe entre XXX_Read, XXX_Write Operações e chamadas para CloseHandle.
O XXX_PreClose e XXX_PreDeinit entrada pontos permitem que os drivers para eliminar essas condições de corrida. Embora os dois pontos entrada opcional, se você implementar XXX_PreClose, você deve implementar XXX_PreDeinit ou o driver não irá carregar. Para evitar drivers de Liberando recursos associado com o driver, esses pontos entrada separar ativação segmentos e invalidar alças.
O XXX_PreClose ponto de entrada permite que o driver para acordar adormecido segmentos e marca o identificador como fechado so that mais E/S tentativas falharem normalmente. Quando Device Manager confirma que há segmentos estão programados para executar no driver, chamadas Device Manager o XXX_Close ponto de entrada para que o driver possa livre recursos identificador.
Da mesma forma, o XXX_PreDeinit ponto de entrada permite que o driver para acordar adormecido segmentos, marca todos os trata como fechamento e marca o dispositivo próprio como deinitializing para que mais tenta aberto alças falharem normalmente. Quando Device Manager confirma que há segmentos estão programados para executar no driver, chamadas Device Manager o XXX_Deinit ponto de entrada para que o driver possa versão recursos para todos os identificadores associado com o dispositivo e com o dispositivo próprio.
Drivers que implementar essas entrada dois pontos podem esperar que os contextos identificador passado para seus pontos entrada será sempre ser válido, porque as alças não lançadas até Device Manager confirmou que nenhum segmentos estão acessando-los.
É possível que o driver será desativada após a chamar para XXX_PreClose, mas antes de chamar para XXX_Close. Da perspectiva do driver neste maiúsculas e minúsculas, XXX_PreClose wakes aguardando segmentos, mas XXX_Deinit Recursos identificador lançamentos.
Observação
Sem usar o XXX_PreClose e XXX_PreDeinit entrada pontos, um driver pode trabalho corrigir esse problema criando um crítico global contagens seção no seu ponto de entrada DLL em conjunto com o uso em suas estruturas instância de dispositivo e identificador. Este método é bastante complexo para implementar e difíceis de serem testar.
See Also
Reference
Concepts
Device File Names
Device Manager Registry Keys
I/O Resource Manager
Other Resources
Device Manager
Stream Interface Drivers
Synchronization Reference