windows 7 - responder - ¿Es posible descargar un controlador de kernel sin un reinicio?
solucion error 0x0000007b windows 7 (4)
Si desea poder descargar su controlador, debe configurar una función que básicamente se ejecute cada vez que se descargue 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 del conductor. Aquí hay un código de ejemplo:
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;
}
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.
Entonces, ¿cómo se puede probar fácilmente modificaciones incrementales a un controlador kernal fácilmente? Gracias
Ver los registros de la API de configuración puede ser un buen lugar para comenzar: http://msdn.microsoft.com/en-us/library/ff550887%28v=VS.85%29.aspx
Si devcon solicita un reinicio, usted puede ver el código en el DDK, depurar por qué está pidiendo y profundizar en el tema de esa manera también.
Intente compilar, firmar y cargar 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 descargue DebugView , descomprímalo, ejecútelo como administrador y luego "Capture Kernel" debajo de la opción de menú "Capturar". Descargue, descomprima y ejecute el Cargador de controladores OSR , 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.
Sí. sc stop <driver name>
debería detener su controlador. Si su controlador está asociado con un determinado devnode PnP, debe descargarse después de eliminar el devnode.