El desarrollo de controladores no es amigable para los principiantes: no sabemos cómo ni por dónde empezar. Los principiantes están perdidos, especialmente cuando se encuentran con un problema muy simple y no saben cómo resolverlo, esta serie de tutoriales se utiliza para eliminar estos obstáculos.
La mayoría de los tutoriales de desarrollo de controladores primero publicarán documentación y demostraciones para nosotros:
Introducción a los controladores de Windows: Introducción a los controladores de Windows - Controladores de Windows | Microsoft Docs
Github: https://github.com/Microsoft/Windows-driver-samples
Pero para los principiantes, al principio es de poca utilidad porque no pueden entenderlo. Todavía tenemos una cierta base de programación antes de ingresar al desarrollo de controladores. Se supone que tienes instalado vs2019 o superior vistual studio
. Primero desarrolle un Hello World
controlador, instálelo en la máquina de prueba y vea qué sucede. No nos importan los principios lógicos internos, sigamos el ejemplo y creemos la primera Hello World
demostración.
Instalación de WDK (kit de controladores de Windows)
La instalación WDK
también es un asunto relativamente simple: Vistual studio Install
búsquelo en Internet Windows Driver Kit
e instálelo. Una vez completada la instalación, aparecerá Windows Driver Kit
que ha sido verificado.
Escribiendo HolaWDK
Cree un nuevo proyecto, seleccione Empty WDM Driver
el proyecto, cree un nuevo driver.cpp
archivo y escriba el siguiente código:
// driver.cpp
#include <ntddk.h>
extern "C" void DriverUnload(PDRIVER_OBJECT pDriverObject);
extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)
{
DbgPrint("[GO2CODING_Driver] DriverEntry\n");
NTSTATUS status = STATUS_SUCCESS;
pDriverObject->DriverUnload = DriverUnload;
return status;
}
extern "C" void DriverUnload(PDRIVER_OBJECT pDriverObject)
{
DbgPrint("[GO2CODING_Driver] DriverUnload\n");
return;
}
En este momento, se producirá un error de compilación.
error C2220: 以下警告被视为错误
warning C4100: “pRegPath”: 未引用的形参
warning C4100: “pDriverObject”: 未引用的形参
También necesitamos las siguientes configuraciones:
1. Propiedades de configuración - C/C++ - Tratar las advertencias como errores en General está establecido en No
2. Establezca el Modo de firma en Propiedades de configuración - Firma del controlador - General en Desactivado.
3. Propiedades de configuración-Inf2cat-run Inf2cat está configurado en No.
Después de una compilación exitosa, se generan los archivos HelloWDM.inf
y . HelloWDM.sys
Se completa la primera demostración.
Probar máquina virtual
Al crear el controlador, a diferencia de las aplicaciones desarrolladas anteriormente, es mejor no probarlo directamente en la máquina local. Necesitamos una máquina virtual con Windows 10. Para conocer el método de instalación de la máquina virtual, consulte los tutoriales pertinentes.
También necesitamos herramientas relacionadas para el desarrollo de controladores, incluidas , , , DebugView
, DriverMonitor
, IRPTrace
, que se pueden descargar aquí . Ponlo en la máquina de prueba.WinObj
DeviceTree
DiskView
DriverManager
EzDriverInstaller
En modo normal, la máquina de prueba no puede instalar controladores de Windows no firmados. Necesitamos cambiar la máquina de prueba para que no requiera verificación de firma.
Presione para shift
reiniciar la máquina de prueba.
Ingrese a esta interfaz y seleccione Solucionar problemas->Configuración de inicio->Reiniciar. Vuelva a ingresar al sistema y presione 7 en la siguiente página para iniciar Windows.
Después de reiniciar, coloque el código compilado HelloWDK
en la máquina de prueba, ingrese a la administración de dispositivos (haga clic derecho en la computadora -> Administrar) y agregue hardware obsoleto.
Siga el siguiente paso hasta que aparezca 从磁盘安装
, seleccione la ruta de instalación a la ruta que acaba de copiar.
Antes de instalar el controlador, 先以管理员的身份
lo abrimos debugview
, Capture
seleccionamos lo siguiente y esperamos log
el resultado.
Al instalar el controlador, aparecerá el siguiente mensaje, elija instalarlo de todos modos.
Indica que la instalación está completa.
Los siguientes dispositivos nuevos aparecieron en la administración de dispositivos.
Al mismo tiempo, debugview
a continuación , podemos ver lo siguiente log
.
Esto es log
de gran importancia para nosotros, muestra que no solo instalamos exitosamente el controlador, sino que también imprimimos el registro, lo que equivale a depurar, y nuestros corazones se sienten aliviados.
El contenido de HelloWDK.inf es el siguiente:
;; The Win2K DDK documentation contains an excellent INF reference.
;--------- Version Section ---------------------------------------------------
[Version]
Signature="$CHICAGO$"
Provider=Go2Coding_Device
DriverVer=11/1/2007,3.0.0.3
; If device fits one of the standard classes, use the name and GUID here,
; otherwise create your own device class and GUID as this example shows.
Class=Go2CodingDevice
ClassGUID={
EF2962F0-0D55-4bff-B8AA-2221EE8A79B1}
CatalogFile=HelloWDK.cat
;--------- SourceDiskNames and SourceDiskFiles Section -----------------------
; These sections identify source disks and files for installation. They are
; shown here as an example, but commented out.
[SourceDisksNames]
1 = "HelloWDK",Disk1,,
[SourceDisksFiles]
HelloWDK.sys = 1,,
;--------- ClassInstall/ClassInstall32 Section -------------------------------
; Not necessary if using a standard class
; 9X Style
[ClassInstall]
Addreg=Class_AddReg
; NT Style
[ClassInstall32]
Addreg=Class_AddReg
[Class_AddReg]
HKR,,,,%DeviceClassName%
HKR,,Icon,,"-5"
;--------- DestinationDirs Section -------------------------------------------
[DestinationDirs]
YouMark_Files_Driver = 10,System32\Drivers
;--------- Manufacturer and Models Sections ----------------------------------
[Manufacturer]
%MfgName%=Mfg0,ntamd64
[Mfg0]
; PCI hardware Ids use the form
; PCI\VEN_aaaa&DEV_bbbb&SUBSYS_cccccccc&REV_dd
;改成你自己的ID
%DeviceDesc%=YouMark_DDI, PCI\VEN_9899&DEV_9899
;---------- DDInstall Sections -----------------------------------------------
; --------- Windows 9X -----------------
; Experimentation has shown that DDInstall root names greater than 19 characters
; cause problems in Windows 98
[Mfg0.ntamd64]
%DeviceDesc%=YouMark_DDI, PCI\VEN_9899&DEV_9899
[YouMark_DDI]
CopyFiles=YouMark_Files_Driver
AddReg=YouMark_9X_AddReg
[YouMark_9X_AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,DeviceIoControl.sys
HKR, "Parameters", "BreakOnEntry", 0x00010001, 0
; --------- Windows NT -----------------
[YouMark_DDI.NT]
CopyFiles=YouMark_Files_Driver
AddReg=YouMark_NT_AddReg
[YouMark_DDI.NT.Services]
Addservice = HelloWDK, 0x00000002, YouMark_AddService
[YouMark_AddService]
DisplayName = %SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%\System32\Drivers\HelloWDK.sys
[YouMark_NT_AddReg]
HKLM, "System\CurrentControlSet\Services\HelloWDK\Parameters",\
"BreakOnEntry", 0x00010001, 0
; --------- Files (common) -------------
[YouMark_Files_Driver]
HelloWDK.sys
;--------- Strings Section ---------------------------------------------------
[Strings]
ProviderName="Go2Coding."
MfgName="Go2Coding Soft"
DeviceDesc="Hello World HelloWDK!"
DeviceClassName="Go2Coding_Device"
SvcDesc="Go2Coding"
Si necesitas el código fuente de la demo, puedes enviarme un mensaje privado.