Crear controladores de exportación
Un controlador de exportación es un archivo DLL en modo kernel que puede cargarse por una variedad de otros componentes específicos del hardware o específicos de la pila de dispositivos, pero que no tiene algunas de las características de un controlador en modo kernel completo. En concreto, un controlador de exportación no tiene una tabla de distribución, no tiene un lugar en la pila de controladores y no tiene una entrada en la base de datos del administrador de control de servicios que la define como un servicio del sistema. Aunque un controlador de exportación no tiene una tabla de distribución, puede suministrar rutinas de envío a un controlador estándar. El controlador estándar inserta las rutinas de envío en su propia tabla de distribución. Un controlador de exportación tiene una rutina driverEntry de código auxiliar que nunca se llama.
Los controladores de exportación en modo kernel son especialmente adecuados para implementar la parte de un par de controladores que es independiente de las características subyacentes de pila y hardware.
Windows incluye varios controladores de exportación cargados por otros controladores, por ejemplo:
- Controlador de puerto SCSI
- Controlador de clase tape
- El controlador de controlador IDE es todos los controladores de exportación proporcionados por el sistema
Los controladores estándar también pueden funcionar como controladores de exportación. Para que un controlador funcione de ambas maneras, debe compilarse como controlador de exportación y cargarse como controlador normal.
Creación de un controlador de exportación
Para crear un controlador de exportación en Visual Studio, use el procedimiento siguiente:
- Cree un nuevo proyecto a partir de una plantilla, como el controlador WDM vacío.
- Agregue un archivo de definición de módulo al proyecto, por ejemplo:
LIBRARY mydriver.sys
EXPORTS
DllInitialize PRIVATE
DllUnload PRIVATE
El punto de entrada de un archivo DLL en modo kernel siempre es DllInitialize. El sistema llama a una rutina DllInitialize del modo kernel inmediatamente después de cargar el archivo DLL. Los controladores de exportación deben proporcionar rutinas DllInitialize . Puede usar la rutina DllInitialize para adquirir o inicializar recursos requeridos por otras rutinas del archivo DLL.
No se puede especificar el punto de entrada mediante la macro DLLENTRY .
NTSTATUS DllInitialize(
_In_ PUNICODE_STRING RegistryPath
);
RegistryPath es un puntero a una cadena Unicode con recuento que especifica la ruta de acceso a la clave del Registro de la DLL, HKEY_LOCAL_MACHINE\CurrentControlSet\Services\DllName. Las rutinas dll pueden usar esta clave para almacenar información específica de DLL. El búfer al que apunta RegistryPath se libera una vez que se cierra DllInitialize . Por lo tanto, si el archivo DLL usa la clave, DllInitialize debe duplicar el nombre de la clave.
El proceso de compilación genera una biblioteca de exportación con una extensión .lib y un controlador de exportación con una extensión de .sys.
Importación de funciones desde un controlador de exportación
Para importar funciones exportadas por un controlador de exportación, debe declarar las funciones mediante la macro DECLSPEC_IMPORT, que se define en Ntdef.h. Por ejemplo:
DECLSPEC_IMPORT int LoadPrinterDriver (int arg1);
Esta macro se resuelve en una declaración de clase de almacenamiento __declspec(dllimport) en esas plataformas en las que sea necesario y en nada en esas plataformas cuando no sea necesario.
En el controlador de exportación, la función que se va a exportar debe declararse con la macro DECLSPEC_EXPORT. Esta macro se resuelve en una declaración de clase de almacenamiento __declspec(dllexport) en esas plataformas donde sea necesario y en nada en esas plataformas donde no sea necesario. Si un controlador de exportación proporciona una rutina de envío a un controlador estándar, esa rutina no tiene que exportarse.
Carga y descarga de un controlador de exportación
Los controladores de exportación deben instalarse en el directorio %Windir%\System32\Drivers. A partir de Windows 2000, el sistema operativo mantiene un recuento de referencias que indica el número de veces que otros controladores han importado las funciones del controlador de exportación. El sistema disminuye este recuento cada vez que se descarga uno de los controladores de importación. Cuando el recuento de referencias cae en cero, el sistema descarga el controlador de exportación. Sin embargo, el controlador de exportación debe contener el punto de entrada estándar y las rutinas de descarga, DllInitialize y DllUnload, o el sistema operativo no activará este mecanismo de recuento de referencias.
El sistema llama a la rutina DllUnload del archivo DLL del modo kernel cuando descarga el archivo DLL.
NTSTATUS DllUnload(void);
Los controladores de exportación deben proporcionar rutinas DllUnload. Puede usar la rutina DllUnload para liberar los recursos usados por las rutinas del archivo DLL.