2011-01-30 20 views
7

Estoy jugando con uno de los ejemplos de controladores de kernel en Win7 DDK. Puedo modificar compilar y construir mi archivo * .sys. Puedo instalarlo también con su INF (usando el administrador de dispositivos o devcon) o usando directamente el administrador de control de servicios. Sin embargo, cuando hago el siguiente cambio y genero un archivo * .sys actualizado, parece que surge un conflicto entre este nuevo archivo y mi controlador ahora detenido (he intentado usar Servcie Control Manager 'stop' y 'delete service', etc.). Si reinicio, puedo instalar el nuevo controlador y ejecutarlo bien. De forma similar, si elijo desinstalar en el Administrador de dispositivos, Windows me solicita que reinicie.¿Es posible descargar un controlador de kernel sin un reinicio?

Entonces, ¿cómo se puede probar fácilmente las modificaciones incrementales en un controlador kernal fácilmente? Gracias

+0

En general, sí, esto es posible, al menos cuando instala el controlador mediante funciones API. No estoy seguro de si es posible con los controladores instalados usando el archivo INF. –

Respuesta

4

En cuanto a los registros de la API de configuración podría ser un buen punto de partida: http://msdn.microsoft.com/en-us/library/ff550887%28v=VS.85%29.aspx

Si devcon solicita un reinicio, usted podría mirar el código en el DDK, depuración por qué está haciendo y profundizar en la cuestión de que manera también.

+0

@ J.Strouse: Eso podría ser útil, gracias. –

3

Sí. sc stop <driver name> debe detener su controlador. Si su controlador está asociado con un determinado devnode PnP, debe descargarse después de eliminar el devnode.

+0

@Larry: no está asociado y aún así no es solo un conjunto simple de IOTCRL. –

+0

Pregunta tonta: ¿configuró el punto de entrada de descarga del controlador en el despacho de su controlador? –

3

Si desea poder descargar su controlador, debe configurar una función que básicamente se ejecuta cada vez que se descarga el controlador: lo más probable es que ponga código que libere los búferes asignados y cualquier otro recurso que pueda estar "vivo" "durante el ciclo de vida del controlador. He aquí un ejemplo de código:

VOID Unload(IN PDRIVER_OBJECT pDriverObject) { 
       //do whatever you like here 
       //this deletes the device 
     IoDeleteDevice(pDriverObject->DeviceObject); 


    return; 
} 

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING regPath) { 


    //initialize your driver and the major function array 

//set the unload function 
    pDriverObject->DriverUnload = &Unload; 
} 
1

tratar de compilar, firma, y ​​la carga de este código:

#include <ntddk.h>  
VOID OnUnload(IN PDRIVER_OBJECT driverObjectA) { 
    DbgPrint("Unload\n"); 
} 
NTSTATUS DriverEntry(PDRIVER_OBJECT driverObjectA, PUNICODE_STRING RegistryPath){ 
    DbgPrint("DriverEntry\n"); 
    driverObjectA->DriverUnload = OnUnload; 
return STATUS_SUCCESS; 
} 

luego descargar DebugView, descomprimirlo, ejecutarlo como administrador y, a continuación, "Capture núcleo" bajo la Elemento de menú "Capturar". Descargue, descomprima y ejecute OSR Driver Loader, registre el controlador, el "Servicio de inicio". Observará un mensaje de registro "DriverEntry" en DbgView. Ahora en el cargador del controlador OSR, "Detener servicio" y observe un mensaje de descarga. Espero que eso te ayude.

Cuestiones relacionadas