Pontos a serem considerados para rotinas startio
Tenha em mente os seguintes pontos ao implementar uma rotina StartIo :
Uma rotina StartIo deve sincronizar seu acesso a um dispositivo físico e a quaisquer informações de estado ou recursos compartilhados que o driver mantém na extensão do dispositivo com outras rotinas do driver que acessam o mesmo dispositivo, local de memória ou recursos.
Se a rotina StartIo compartilhar o dispositivo ou o estado com o ISR, ele deverá usar KeSynchronizeExecution para chamar uma rotina SynchCritSection fornecida pelo driver para programar o dispositivo ou acessar o estado compartilhado. Para obter mais informações, consulte Usando seções críticas.
Se a rotina StartIo compartilhar o estado ou recursos com rotinas diferentes do ISR, ela deverá proteger o estado compartilhado ou os recursos com um bloqueio de rotação executivo inicializado pelo driver para o qual o driver fornece o armazenamento. Para obter mais informações, consulte Spin Locks.
Se um driver de dispositivo não WDM monolítico configurar um objeto de controlador, sua rotina StartIo poderá usar o objeto controller para sincronizar operações por meio de um dispositivo físico compartilhado com dispositivos anexados (semelhantes).
Consulte Objetos do Controlador para obter mais informações.
A menos que um driver de nível mais alto acoplado predefinir grandes solicitações de transferência de DMA para seu driver de dispositivo subjacente, a rotina StartIo do driver de dispositivo subjacente deve dividir grandes solicitações de transferência em intervalos de transferência parcial e o driver deve realizar uma sequência de operações de dispositivo de transferência parcial. Cada transferência parcial deve ser dimensionada para atender às funcionalidades do hardware: os recursos do dispositivo do driver ou, para um dispositivo DMA subordinado, os recursos do controlador de DMA do sistema, o que tiver restrições mais rigorosas.
Consulte Objetos do Adaptador e DMA para obter mais informações sobre como usar o DMA do sistema ou do master de barramento.
A rotina StartIo de um driver que usa DMA deve sincronizar transferências usando um objeto adaptador.
Uma rotina StartIo é executada em IRQL = DISPATCH_LEVEL, o que restringe o conjunto de rotinas de suporte que ele pode chamar.
Por exemplo, uma rotina StartIo não pode acessar nem alocar memória paginável e não pode esperar que um objeto dispatcher seja definido como o estado sinalizado. Por outro lado, uma rotina StartIo pode adquirir e liberar um bloqueio de rotação executivo alocado pelo driver com KeAcquireSpinLockAtDpcLevel e KeReleaseSpinLockFromDpcLevel, que são executados mais rápido que KeAcquireSpinLock e KeReleaseSpinLock.
Consulte Gerenciando prioridades de hardware e bloqueios de rotação para obter mais informações.
Se o driver mantiver IRPs em um estado cancelável, sua rotina StartIo deverá marcar se o IRP de entrada já foi cancelado antes de iniciar qualquer processamento para essa solicitação em seu dispositivo. Para obter mais informações, consulte Cancelando IRPs.