Partilhar via


Restrições ao código paginável em drivers de armazenamento

Para evitar deadlock, nenhuma parte de um driver de armazenamento usado para atender a solicitações de leitura ou gravação deve ter código paginável, nem nunca deve tentar acessar a memória paginável. Isso ocorre porque as rotinas DispatchRead e DispatchWrite do driver podem ser chamadas em IRQL > PASSIVE_LEVEL e a E/S de paginação que atende a uma falha de página ocorre em IRQL = APC_LEVEL.

Regras semelhantes se aplicam à rotina de expedição de controle de dispositivo de um driver de armazenamento, DispatchDeviceControl, com determinadas qualificações. A rotina de expedição de controle de dispositivo de um driver de armazenamento não deve conter código paginável ou acessar memória paginável. A rotina de expedição deve ser capaz de receber solicitações IOCTL destinadas a outros drivers em IRQLs arbitrários e passá-los para baixo na pilha de driver. Os drivers devem passar todas as solicitações IOCTL sem tratamento na pilha sem alterar o IRQL ou o contexto da solicitação.

No entanto, a Microsoft exige que todas as solicitações IOCTL de armazenamento sejam enviadas em PASSIVE_LEVEL, portanto, embora a rotina de expedição não seja paginável em si, ela pode chamar sub-rotinas pagináveis para lidar com solicitações IOCTL de armazenamento. Essas sub-rotinas também podem acessar a memória paginável.

Rotinas como DriverEntry, Reinitialize e Unload, que não fazem E/S e são executadas em IRQL = PASSIVE_LEVEL também podem ter código paginável.

Considerações especiais se aplicam a drivers que gerenciam dispositivos de armazenamento no caminho de paginação. Um driver estará no "caminho de paginação" se ele participar de operações de E/S no arquivo de paginação. Quando um driver de armazenamento está no caminho de paginação, sua rotina DispatchPower para solicitações de IRP_MJ_POWER não deve ser paginável.

Por padrão, o código para drivers no modo kernel não é paginável, nem a memória global usada pelos drivers do modo kernel é paginável. Para obter informações sobre como tornar o código paginável, consulte Tornando o código do driver ou os dados pagináveis.