Cómo desarrollar controladores de dispositivos Windows NT
1. Herramientas de desarrollo
1. Máquina virtual y sistema operativo
Utilizo el sistema operativo win10 e instalé "VMware Station11" en la máquina virtual. , solo se instala un sistema operativo "win7 x64", y más adelante se instalará un sistema de máquina virtual win10. En circunstancias normales, instalo y depuro el controlador en una máquina virtual para evitar estropear el sistema operativo local.
Intentaremos "depurar el controlador en la máquina virtual a través de winDbg nativo" en el futuro. Este es un método de depuración relativamente avanzado. Haga clic para abrir el enlace.
2. Herramientas de desarrollo
Utilizo principalmente "WDK7600" (haga clic para abrir el enlace) y "VS2015 wdk10" (haga clic para abrir el enlace). El primero lo instalé en la máquina virtual "win7 X64" y el segundo en esta máquina y en la computadora del laboratorio. Dado que el libro de texto "Desarrollo detallado de controladores de Windows" y el blog de aprendizaje que utilicé se desarrollaron utilizando la versión wdk7, para tener un entorno consistente, elegí probar los códigos de muestra de estos libros de texto en una máquina virtual.
Para wdk7, consulte el blog: haga clic para abrir el enlace.
Con respecto a "VS2015 wdk10", primero debe instalar VS2015 y luego wdk10 en el sistema win10. Además, debe instalar la actualización de VS2015. (winDbg está integrado en wdk10, ruta: C:\Program Files (x86)\Windows Kits\10\Debuggers\x64).
Notas:
1) VS2015 se instala de forma predeterminada y no instala cy sdk. Debe elegir una instalación personalizada.
2) Si es así; se ha instalado de forma predeterminada. Ahora, si instala wdk10 en este momento, se mostrará una advertencia;
3) En este momento, puede elegir crear un nuevo proyecto c con VS2015 primero y luego se le pedirá que instale los módulos en la parte c;
4) Después de la instalación, wdk10 se puede instalar normalmente. Si todavía hay problemas de compilación después de instalar wdk10, primero debe ir a VS para verlo. si hay módulos relevantes, e instálelos completamente de acuerdo con el punto 3 anterior.
Otra cosa a tener en cuenta es que el compilador informó "Error de Inf2Cat -2: "Inf2Cat, la prueba de signabilidad falló. "Haga doble clic para ver el resultado de la herramienta",
Blog de referencia: haga clic. El enlace está abierto
El motivo para abrir el enlace es que la hora del "DriverVer" del archivo inf es incorrecta. La hora predeterminada en "Inf2cat" de VS2015 es UTF. la hora local en las propiedades del proyecto->selección "inf2cat".
3. Herramientas de depuración
1) debugview
En el controlador, llame a la función KdPrint (similar a printf en lenguaje C) y luego vea la impresión. información a través de debugview. Este es el método de depuración más utilizado.
Cabe señalar que: primero, verifique las opciones relacionadas con "kernel" en el menú "capturar" para capturar la información del kernel. Luego, debe ejecutar el software usando "Administrador". Debugview a menudo informa errores en win10:
Debe encontrar "dbgv.sys" en "C:\Windows\System32\drivers", eliminarlo y luego ejecutar el software como "administrador".
2)
4. Métodos de depuración
1) Durante la fase de instalación del controlador, puede ir a "C:\Windows\System32\drivers". directorio para ver el archivo correspondiente. ¿Está el archivo "sys" en su lugar?
2) cmd-gt; regedit para abrir el registro y luego "buscar" la información del dispositivo correspondiente en el menú "Editar".
3) Utilice la función KdPrint para imprimir el registro y el software DebugView para capturar el registro (el método más utilizado
4) Escriba el archivo de registro en el código del controlador; (teóricamente factible, por explorar);
5) Almacenar información de volcado. La llamada información de volcado significa que antes de que el sistema falle, el sistema operativo registrará la pila de llamadas actual en un archivo de volcado. (Para obtener configuraciones detalladas de la información de volcado del sistema, consulte el último capítulo de "Explicación detallada de la tecnología de desarrollo de controladores de Windows" o el blog: haga clic para abrir el enlace). Después de configurar el archivo de volcado, si encuentra una pantalla azul, coloque el archivo de volcado en WinDbg para verlo. Este también es un método de depuración comúnmente utilizado.
6) IRPTrace, este software puede rastrear IRP, pero no está disponible en win7 y versiones posteriores. Puede intentar escribir un programa de seguimiento usted mismo.
7) PCITree, verifica el montaje del dispositivo;
8) WinObject, verifica información diversa del objeto en el controlador.
9) WinDbg depura máquinas virtuales, que es una aplicación avanzada. Con VS2015, puede ver "Memoria", "Pila de llamadas", "Subprocesos" y "Desmontaje".
Nota: Durante el proceso de desarrollo del controlador, es necesario dominar gradualmente varias herramientas y métodos de depuración.
2. Marco de desarrollo
Según la información que busqué recientemente, existen aproximadamente tres tipos de controladores de Windows: controlador NT, controlador WDM y controlador WDF. Entre ellos, el controlador NT es Plug-in-and-Play (PNP). Es un servicio del sistema. La mayoría de los controladores de dispositivos actuales no son de este tipo. No es mi enfoque y no los ampliaré más adelante. introducción. Tanto el controlador WDM como el controlador WDF son controladores plug-and-play, y el último es una versión mejorada del primero.
1. Marco WDM
WDM es el marco de desarrollo de controladores de Windows anterior. Aunque Microsoft ahora recomienda usar WDF, aprender WDM puede ayudarlo a comprender mejor los aspectos internos del sistema operativo (. WDF es una encapsulación de nivel superior de WDM). En segundo lugar, "Explicación detallada de la tecnología de desarrollo de controladores de Windows" y muchas publicaciones de blogs en Internet utilizan WDM desde una perspectiva de aprendizaje, también es necesario dominar una cierta cantidad de conocimientos sobre WDM.
Para obtener conocimientos básicos del marco WDM, puede consultar la publicación del blog: Haga clic para abrir el enlace. También usaré una publicación de blog separada para explicar este aspecto en el futuro, que incluye principalmente:
1) DriverObject vs Device Object;
2) Objeto de dispositivo físico (PDO) y Objeto de dispositivo funcional (FDO);
3) Jerarquía de controladores: jerarquía horizontal (p. ej.: entre FDO) y jerarquía vertical (FDO a PDO);
4) Función de entrada (DriverEntry)
5) Extensión del dispositivo (DRIVER_EXTENSION);
6) Rutina importante (rutina): AddDevice
7) Mecanismo IRP (paquete de solicitud de E/S) : MajorFunction (MJ)) y MinorFunction (MN);
2. Marco WDF
Para el marco WDF, puede consultar "Desarrollo de controladores de dispositivos Windows7" 》Este libro.
El marco WDF se puede dividir en KMDF (Kernel Model Driver Frame) y UMDF (User Model Driver Frame). Su modelo de controlador es el siguiente:
1) objeto WDF (propiedades, métodos y eventos);
2) Integración de plug-and-play y administración de energía
3) Cola y cancelación de E/S integradas
4) I/ Oh modelo. En Windows, la función de IRP no es solo proporcionar solicitudes de E/S tradicionales (lectura, escritura, creación, etc.) al controlador. Es un mecanismo de comunicación basado en paquetes entre el sistema operativo y el controlador, conductor y conductor.
3. Un controlador KMDF típico
Cree un nuevo proyecto a través de VS2015, seleccione "KMDF", generará los siguientes archivos:
1) público. GUID y CTL_CODE se definen en hy se proporcionan para el uso de la aplicación;
2) Las macros y funciones de depuración definidas en trace.h no están enfocadas por ahora
3) el controlador. h y el controlador .c definen el código del marco principal. Incluyendo: función de entrada (DriverEntry), rutina de carga del dispositivo (KMDFDriver1EvtDeviceAdd) y función para limpiar el área de contexto. Este archivo es todo código de marco. Durante el proceso de desarrollo del controlador, puede seleccionar un marco. Después de seleccionar el marco, generalmente no agrega funciones al archivo, sino que las coloca en "device.c" y "queue.c".
4) dispositivo.h y dispositivo.c se ocupan principalmente de funciones relacionadas con el dispositivo, y la implementación de la interacción con el dispositivo se coloca en este archivo. Incluye principalmente la inicialización del dispositivo y la liberación de recursos;
5) queue.h y queue.c, manejan principalmente IRP, incluido KMDFDriver1EvtIoDeviceControl;