miércoles, marzo 21, 2007
¿Sabía que...? [V]
jueves, marzo 01, 2007
Cómo funciona Restaurar sistema [Parte II]
Cuando el usuario abre el panel Propiedades de sistema, en primer lugar se carga la DLL Srclient.dll. El código de la misma decidirá si crear la correspondiente pestaña "Restaurar sistema" y qué opciones activar y cuáles no. Si el usuario goza de los privilegios necesarios para restaurar el sistema, Windows examinará si se ha establecido una política que desactiva Restaurar sistema.
|
Finalmente, Windows enumera las unidades de disco, examina si están aplicadas otras directivas y observa si la herramienta está activada o desactivada para generar un contenido de la pestaña apropiado (una o varias unidades de disco, opciones desactivadas, etc.).
La herramienta Restaurar sistema
Al abrir la herramienta Restaurar sistema, se ejecuta el fichero Rstrui.exe del directorio %SystemRoot%\system32\restore\. En primera instancia se observa si el servicio "Servicio de restauración del sistema" está iniciado. Si no fuera así, se le intenta establecer un tipo de inicio automático e iniciarlo.
|
A continuación, tras pasar de la pantalla inicial, se muestra un calendario para que el usuario elija un punto de restauración. Al confirmar la operación de restauración, comienza un proceso algo complejo que merece un apartado para él solo.
Restaurando el sistema
Una vez que el usuario hace clic sobre Siguiente para iniciar la restauración, se realizan una serie de pasos que generan un "entorno de restauración". Concretamente es la función InitiateRestore contenida en el fichero Srrstr.dll la encargada de realizarlos.
- Se crea un valor *Restore en la clave de Registro HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce. Este valor apunta al ejecutable Rstrui.exe y sirve para que se muestre la ventana informativa de Restaurar sistema tras el reinicio del sistema.
- Se crea un valor DWORD de nombre RestoreStatus con contenido 2. Este valor sirve para que otras aplicaciones sepan que se está produciendo una restauración.
- Automáticamente se crea un nuevo punto de restauración que será utilizado en caso de que la restauración falle o el usuario quiera deshacer los cambios realizados. El punto creado es de tipo nested, lo que quiere decir que ninguna otra aplicación puede crear otro punto en ese periodo de tiempo.
- Se crea un valor RestoreInProgress con contenido 1 en la clave HKLM\Software\Microsoft\Windows NT\CurrentVersion\SystemRestore. Este valor lo leerá Winlogon y así sabrá que debe proceder con una restauración del sistema.
- Una vez que Winlogon determina que debe realizar una restauración, se reanuda la misma.
La funcion no documentada ResumeRestore de la DLL Srrstr.dll es la que realiza la restauración en sí y es llamada por Winlogon. Ésta consta de tres partes:
- Preparar la restauración.
- Restaurar archivos y directorios.
- Grabar la instantánea del Registro y manipularla ligeramente.
Cada una de estas fases se corresponde con un porcentaje de la barra de progreso que aparecerá en pantalla: "Preparar la restauración" se realiza en el punto 0%, "restaurar archivos y directorios" en el 20% y "grabar la instantánea de Registro" en el 90%.
Preparar la restauración
En esta fase se crea un mapa de restauración a partir del archivo de cambios (Changelog). Entiéndase un mapa de restauración como una entidad abstracta que sirve para "dirigir" el proceso de restauración. Cada operación de creado de archivos, borrado, renombrado, etc. tiene su correspondiente entrada en el mapa. Esta operación dura relativamente poco tiempo.
Restaurar archivos y directorios
Esta fase se ve precedida por una "precarga" de la instantánea del Registro almacenada en el punto de restauración. Se hace esta "precarga" para asegurarse de que después no haya problemas de espacio en disco. Si hay menos de 60 MB libres, se realiza una operación FIFO para tratar de liberar espacio. Esto se realiza un par de veces, si fuera necesario. Si durante la restauración el sistema no contara con el espacio en disco necesario, la restauración no se puede completar, se registra el error, se deshacen los cambios realizados y el valor RestoreDiskSpaceError de la clave HKLM\Software\Microsoft\Windows NT\CurrentVersion\SystemRestore almacenará un 112 decimal, error Win32 que significa ERROR_DISK_FULL.
Seguidamente se restaura el sistema realizando operaciones inversas a partir del mapa de restauración: Es decir, si se realizó una operación que añade un directorio, al restaurar deberá eliminarse dicho directorio, y así similarmente con las demás operaciones. En este momento es casi inevitable que surjan pequeños problemas, algunos se ignoran y otros, como si hubiera archivos en uso, se tratarán adecuadamente después. Las principales operaciones que generan un "Failed" (único resultado que detiene una restauración) son las siguientes:
- Al renombrar un directorio, si el directorio origen no existe o la función MoveFile devuelve un error por cualquier motivo.
- Al crear un directorio, si la función CreateDirectory devuelve algún error.
- Al eliminar un directorio, si la función RemoveDirectory devuelve algún error.
- Al modificar un archivo, si una función no documentada de Restaurar sistema devuelve un error.
Si durante la restauración aparecen dos archivos o directorios con el mismo nombre, se produce lo que se denomina una colisión. Restaurar sistema resuelve la colisión renombrando el archivo o carpeta afectado añadiéndole un "(n)" al final, donde "n" es un número comprendido entre 2 y 1000. Si por cualquier motivo no pudiera encontrar un nombre alternativo, la restauración falla pues el sistema quedaría en estado inconsistente si se obviara la operación que ha resultado en la colisión.
Si se produce cualquier error durante la restauración, debe restaurarse el sistema empleando para ello el punto de restauración que se creó al principio de la misma. Para deshacer una restauración se utiliza el mismo procedimiento que el que realiza la restauración, sólo que esta vez deben realizarse las operaciones en orden inverso.
Grabar la instantánea del Registro y manipularla ligeramente
En primer lugar se trata la rama Software: Se añade el valor *Restore a la clave RunOnce (como ya comenté), se añade un valor DWORD SfcScan con contenido 2 en la clave HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon para que se analice la integridad de los archivos del sistema. Seguidamente se restauran las claves de dicha rama, con algunas obvias excepciones:
- La información sobre Asistencia remota no se restaura.
- La información del Asesor de contenido de Internet Explorer.
- La base de datos LSA.
A continuación se trata la rama SYSTEM. Las excepciones más notables son:
- La información sobre la activación de Windows (WPA).
- La información sobre la zona horaria.
- La asignación interna de letras de unidades.
Por último se trata la rama SAM (Security Account Manager).
|
También se restaura toda la información COM, los contadores de rendimiento, base de datos WMI y IIS (si procede).
Parte final. Mostrar la pantalla de información
El último punto del proceso consiste en mostrar la pantalla con la información sobre la restauración (si tuvo éxito o si no y por qué). Esta información la muestra el fichero Rstrui.exe cuando es llamado con unos parámetros internos y no documentados.
Cuando se produce una restauración "normal", esto es, no silenciosa, se anota en el Registro que debe ejecutarse el comando %SystemRoot%\system32\restore\rstrui.exe -c tan pronto como un administrador inicie sesión en el equipo. El parámetro -c, de "check", analiza el fichero %SystemRoot%\system32\restore\Rstrlog.dat para determinar si la restauración falló, o si se realizó correctamente. En caso de fallo, se llamará a rstrui.exe -result:f. Este parámetro hace que Restaurar sistema informe de si se trató de un error por falta de espacio en disco o de un error inespecífico. Lo determina leyendo el contenido de la clave HKLM\Software\Microsoft\Windows NT\CurrentVersion\SystemRestore.
Así es como funciona internamente Restaurar sistema. Si hubiera algún punto importante que me hubiera olvidado de comentar o si tuviera alguna duda, puede utilizar la sección de comentarios de la entrada y trataré de contestar todas las preguntas (si sé la respuesta, claro). Si fuese un problema técnico con Restaurar sistema, es mejor que formule su pregunta en alguna de las comunidades que existen en Internet sobre Windows.
martes, febrero 27, 2007
Cómo funciona Restaurar sistema [Parte I]
En la primera parte del artículo explicaré cómo funciona el controlador en modo núcleo de Restaurar Sistema: Sr.sys. Este controlador, presente en \WINDOWS\system32\drivers, se encarga básicamente de monitorizar los accesos de entrada y salida que se produzcan en el volumen. Lo hace interceptando llamadas de tipo IoCallDriver. El comportamiento del controlador Sr.sys viene determinado por el contenido de la clave de Registro HKEY_CLASSES_ROOT\SYSTEM\CurrentControlSet\Services\Sr\Parameters.
Inicialización del controlador
Al tratarse de un controlador de arranque, se inicializa en una etapa temprana de la carga de Windows. Nada más terminar de inicializarse, se "adhiere" a todos los volúmenes montados por el sistema operativo. Esta es la causa por la que, si dispone de un arranque dual con Windows Vista, observe que pierde todos los puntos de restauración si arranca Windows XP. Seguidamente, crea un directorio llamado "System Volume Information\_restore{GUID}" (si no existiera) en la raíz del disco. Lo crea de tipo oculto, de sistema y por defecto sólo le otorga permisos al usuario SYSTEM. En él se generan unos cuantos archivos, entre los que destacan:
- _driver.cfg: Contiene el número del punto de restauración actual, número de secuencia del LOG y otra información relacionada.
- _filelist.cfg: Este fichero es una copia del fichero Filelist.xml presente en el directorio %SystemRoot%\system32\restore\.
Básicamente monitoriza todo fichero "interesante". Por interesante se entiende lo siguiente:
- Que el archivo o carpeta no esté presente en la lista de exclusiones de _filelist.cfg.
- Que igualmente no esté incluido en una caché interna de Restaurar sistema.
Una vez que Sr.sys ha determinado que el fichero debe ser respaldado antes de proceder con la operación que se quiere realizar (por ejemplo, eliminarlo), crea una copia del mismo en el directorio System Volume Information\_restore{GUID}\RPX. La copia tiene la forma "AXXXXXXX.ext", donde "X" son números y "ext" es la extensión original del fichero. El subdirectorio Snapshot contiene copias del estado del Registro en el momento de la creación del punto de restauración. Los archivos guardados mantienen sus DACLs, atributos, streams, etc. y a la vez son comprimidos para evitar su fragmentación. Si por algún motivo los ACLs de algún fichero no cupieran en el correspondiente registro (que es de pocos KBs), se creará un fichero de la forma SXXXXXXX.acl y se incluirá una entrada en el LOG apuntando a dicho fichero.
El fichero Change.log
Este fichero es una parte extremadamente importante a la hora de restaurar el equipo de manera satisfactoria. Cuando se realiza una operación de entrada/salida "interesante", además de guardarse una copia del fichero en cuestión (como ya he comentado), se escribe en un fichero Change.log todos los detalles de la operación que se ha realizado. Nótese que, en el caso de que se hayan modificado directorios, no se realiza copia física de respaldo de los mismos, sólo se registra en Change.log la operación que se haya completado.
Para que este fichero sea manejable por el sistema operativo, el sistema lo divide en varios "trozos". Windows finaliza un trozo cuando ocurre alguno de estos eventos:
- Se ha apagado el equipo.
- Por algún motivo se ha deshabilitado el volumen en cuestión.
- Se ha desactivado Restaurar sistema en ese volumen.
- El archivo ocupa más de 1 MB de tamaño.
Esta es la funcionalidad básica del controlador de Restaurar sistema en modo núcleo, Sr.sys. En el siguiente artículo me detendré en la parte en modo usuario así como en lo que ocurre "por lo bajo" cuando el usuario pide restaurar su sistema a un punto anterior. Obviamente aclararé por qué ocurren las temidas "restauraciones incompletas", que impiden revertir de manera satisfactoria el estado del sistema.