Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Um driver de exportação é uma DLL de modo kernel que pode ser carregada por uma variedade de outros componentes específicos de hardware ou de pilha de dispositivos, mas não tem algumas das características de um driver completo de modo kernel. Especificamente, um driver de exportação não possui uma tabela de despacho, não faz parte da pilha de drivers de , nem tem uma entrada no banco de dados do gestor de controlo de serviços que o defina como um serviço de sistema. Embora um driver de exportação não tenha uma tabela de despacho , ele pode fornecer rotinas de despacho a um driver padrão. O driver padrão insere as rotinas de despacho em sua própria tabela de despacho. Um driver de exportação tem um esboço rotina de DriverEntry que nunca é chamada.
Os controladores de exportação de modo kernel são especialmente adequados para implementar a parte de um conjunto de controladores que é independente da pilha subjacente e das características de hardware.
O Windows inclui vários drivers de exportação que são carregados por outros drivers, por exemplo:
- Driver da porta SCSI
- Driver de classe de fita
- O driver do controlador IDE são todos os drivers de exportação fornecidos pelo sistema
Os drivers padrão também podem funcionar como drivers de exportação. Para que um driver funcione em ambos os sentidos, ele deve ser construído como um driver de exportação e carregado como um driver regular.
Criando um driver de exportação
Para criar um driver de exportação no Visual Studio, use o seguinte procedimento:
- Crie um novo projeto a partir de um modelo, como Vazio Driver WDM.
- Adicione um arquivo de definição de módulo ao projeto, por exemplo:
LIBRARY mydriver.sys
EXPORTS
DllInitialize PRIVATE
DllUnload PRIVATE
O ponto de entrada para uma DLL de modo kernel é sempre DllInitialize. O sistema chama a rotina DllInitialize de uma DLL de modo kernel imediatamente após o carregamento da DLL. Os drivers de exportação devem fornecer DllInitialize rotinas. Você pode usar a rotina DllInitialize para adquirir ou inicializar recursos necessários por outras rotinas na DLL.
Não é possível especificar o ponto de entrada usando o DLLENTRY macro.
NTSTATUS DllInitialize(
_In_ PUNICODE_STRING RegistryPath
);
RegistryPath é um ponteiro para uma string Unicode com contagem que especifica o caminho para a chave do registo da DLL, HKEY_LOCAL_MACHINE\CurrentControlSet\Services\DllName. As rotinas de DLL podem usar essa chave para armazenar informações específicas da DLL. O buffer apontado por RegistryPath é liberado assim que DllInitialize sai. Portanto, se a DLL fizer uso da chave, DllInitialize deve duplicar o nome da chave.
O processo de compilação gera uma biblioteca de exportação com uma extensão .lib e um driver de exportação com uma extensão .sys.
Importando funções de um driver de exportação
Para importar funções que são exportadas por um driver de exportação, você deve declarar as funções usando a macro DECLSPEC_IMPORT, que é definida em Ntdef.h. Por exemplo:
DECLSPEC_IMPORT int LoadPrinterDriver (int arg1);
Essa macro traduz-se em uma declaração de classe de armazenamento __declspec(dllimport) nas plataformas onde é necessário, e não resulta em nada naquelas onde não é necessário.
No driver de exportação, a função a ser exportada deve ser declarada com a macro DECLSPEC_EXPORT. Esta macro equivale a uma declaração de classe de armazenamento __declspec(dllexport) nas plataformas onde é necessária e a nada nas plataformas onde não é necessária. Se um condutor de exportação fornecer uma rotina de expedição a um condutor normal, essa rotina não tem de ser exportada.
Carregando e descarregando um driver de exportação
Os drivers de exportação devem ser instalados no diretório %Windir%\System32\Drivers. A partir do Windows 2000, o sistema operacional mantém uma contagem de referência que indica o número de vezes que as funções do driver de exportação foram importadas por outros drivers. O sistema diminui essa contagem sempre que um dos drivers de importação é descarregado. Quando a contagem de referência cai para zero, o sistema descarrega o driver de exportação. No entanto, o driver de exportação deve conter o ponto de entrada padrão e rotinas de descarregamento, DllInitialize e DllUnload, ou o sistema operativo não ativará esse mecanismo de contagem de referência.
O sistema chama a rotina DllUnload de uma DLL de modo kernel quando descarrega a DLL.
NTSTATUS DllUnload(void);
Os drivers de exportação devem fornecer rotinas DllUnload. Você pode usar a rotina DllUnload para liberar quaisquer recursos usados pelas rotinas na DLL.