Rotinas de expedição opcionais
Os drivers podem incluir as seguintes rotinas de expedição:
-
IRP_MJ_CLEANUP indica que o último identificador de um objeto de arquivo associado ao objeto de dispositivo de destino está sendo fechado. As solicitações de E/S pendentes para o objeto de arquivo ainda podem existir. Os drivers podem implementar uma rotina DispatchCleanup para executar a limpeza que não é específica para qualquer identificador de arquivo específico. Os drivers também podem usar sua rotina DispatchClose para a mesma finalidade.
DispatchQueryInformation, DispatchSetInformation
Alguns drivers de nível mais alto podem ter que processar IRP_MJ_QUERY_INFORMATION e IRP_MJ_SET_INFORMATION IRPs. Essas solicitações indicam que um aplicativo no modo de usuário, um componente de modo kernel ou um driver solicitou informações sobre o comprimento do objeto de arquivo (representando o objeto de dispositivo do driver) para o qual o solicitante do modo de usuário tem um identificador ou que o solicitante do modo de usuário está tentando definir um fim de arquivo nesse objeto de arquivo.
Drivers de classe e dispositivo serial paralelos lidam com essas solicitações definindo o FILE_STANDARD_INFORMATION ou FILE_POSITION_INFORMATION comprimento ou posição como zero. Outros drivers de dispositivo de nível mais alto devem dar suporte a essas solicitações, especialmente se um aplicativo de modo de usuário ou driver de modo kernel puder chamar funções de runtime C para manipular o objeto de arquivo. Os drivers do sistema de arquivos devem dar suporte a essas solicitações mais plenamente do que esses drivers de dispositivo de nível mais alto.
-
Um driver que armazena dados em cache em um dispositivo ou armazena dados em buffer internamente na memória alocada por driver pode receber IRP_MJ_FLUSH_BUFFERS. O recebimento dessa solicitação indica que o driver deve gravar seus dados armazenados em buffer ou liberar os dados armazenados em cache no dispositivo ou descartar dados armazenados em buffer ou armazenados em cache que foram lidos do dispositivo.
Por exemplo, o teclado do sistema e os drivers de classe do mouse, que têm buffers de anéis internos para dados de entrada de seus dispositivos, dão suporte à solicitação de liberação. Drivers de dispositivos de armazenamento em massa e drivers em camadas acima deles também dão suporte a essa solicitação.
-
Qualquer driver que provavelmente será chamado antes que o sistema seja desligado deve lidar com IRP_MJ_SHUTDOWN. A rotina DispatchShutdown deve fazer qualquer limpeza determinada pelo driver que for necessária antes que o power manager envie um IRP de configuração do sistema para desligar o sistema. Um driver pode chamar IoRegisterShutdownNotification ou IoRegisterLastChanceShutdownNotification para se registrar para notificação de desligamento.
Os drivers para dispositivos de armazenamento em massa e drivers intermediários em camadas sobre eles podem contar com um driver de sistema de arquivos de nível mais alto para enviar-lhes IRPs de desligamento quando o sistema está prestes a desligar. Ou seja, o FSD é responsável por garantir que todos os dados de arquivo armazenados em cache sejam gravados em dispositivos periféricos, chamando drivers subjacentes para liberar dados de seus caches ou buffers de dispositivo (se houver) e assim por diante antes que o sistema seja desligado.
O driver de um dispositivo de armazenamento em massa que armazena dados em cache internamente deve fornecer rotinas DispatchShutdown e DispatchFlushBuffers . Se um driver de armazenamento em massa armazenar dados em buffer na memória, mas seu dispositivo não tiver cache interno, ele também deverá fornecer rotinas DispatchShutdown e DispatchFlushBuffers .
Qualquer driver intermediário em camadas acima de um driver que lida com IRP_MJ_FLUSH_BUFFERS e solicitações de IRP_MJ_SHUTDOWN também fornece rotinas DispatchShutdown e DispatchFlushBuffers .