El alma de Windows: el registro

Recuerdos

La configuración en MS-DOS se componía de los archivos config.sys y autoexec.bat.

El primero cargaba los controladores de los dispositivos, mientras que el segundo se encargaba de ejecutar programas, establecer las variables de entorno, y algo más, para preparar el uso de MS-DOS.

Cada aplicación era responsable de sí misma, así como de su configuración.

Obviamente ninguno de estos archivos sirve en Windows.

Windows 3.0 fue el primero que introdujo los archivos INI de configuración, que no eran sino simples archivos de texto con una o varias secciones y, en cada una, uno o varios valores de configuración. Uno de sus contras era carecer de jerarquía y además almacenar valores binarios era engorroso, aunque posible, y el almacenamiento de valores no tenía un estándar para tipos similares de configuración. Relación entre aplicaciones y el sistema operativo fatal y el caso es que cada aplicación tenía su propio INI.

En Windows 3.1 apareció el registro como una herramienta de almacenamiento de configuraciones OLE, mientras que Windows 95/NT 3.5 lo extendieron a una base de datos que al fin y al cabo, es la que Windows XP o Windows 2003 usan. A pesar de que los INI ya no son necesarios, las aplicaciones ahora tienen un camino mucho mejor donde almacenar su configuración, siempre encontraremos varios archivos INI desperdigados en cualquier equipo.

 

Tópicos

Aun con todos sus beneficios, el registro de Windows es una paradoja. Por una parte, un lugar centralizado para todos los datos de configuración de Windows. La piedra angular. De otra parte, el hecho de que el registro sea tan importante también hace que sea una de las debilidades del sistema operativo. Quita la piedra angular y el castillo se derrumba. Si el registro falla, el sistema falla. Afortunadamente un fallo total es menos probable a que me toque la lotería y un fallo parcial que impida el inicio del equipo es fácil de superar.

EL papel de piedra angular del registro es una de las razones de su cariz mítico. Microsoft no ha hablado mucho sobre él. No tenemos un editor en el menú de inicio, encontramos poca información en la ayuda, carecemos de documentos que nos enseñen sus secretos. Parece que sea mágico, y la verdad es que no deja de ser simplemente la configuración del equipo.

Las advertencias que nos encontramos a montones en los lugares donde se hallan instrucciones para editarlo son definitivamente exageradas. Hay poco daño que podamos causarle y que no pueda recuperarse tomando las mínimas precauciones (tener una copia en lugar seguro :-)).

 

A tener claro

Las cosas que deberíamos conocer para trabajar eficientemente con el registro, por ejemplo, familiarizarnos con la notación hexadecimal, conversión hexadecimal-binario y hexadecimal-decimal, GUIDs, Unicode contra ANSI, etc…

Identificadores de seguridad

Cuentas de equipo y usuarios, grupos y otros objetos relacionados con la seguridad son Objetos principales de seguridad. Los Identificadores de Seguridad o SID identifican inequívocamente a los objetos principales de seguridad. Cada vez que Windows y Directorio Activo crean un objeto principal de seguridad le generan un SID. LSA (Local Security Authority) genera los SID para objetos principales locales y entonces los almacena en su base de datos de seguridad local. Domain Security Authority genera los SID para los objetos principales de seguridad del dominio y los almacena en AD. Los SID son únicos dentro de su ámbito. Cada SID local es único en el equipo, como cada SID de dominio lo es dentro del dominio. Windows nunca reusa un SID, o sea, aunque se elimine un objeto principal. De hecho si borramos una cuenta y la volvemos a crear ésta tendrá un nuevo SID.

Es importante recordar que cada cuenta dispone de un SID. Es como tener un número de DNI que te identifica inequívocamente en tu país. Podemos referirnos a una cuenta por su nombre o por su SID, aunque en la práctica rara vez usamos el SID. En el registro veremos frecuentemente los SID de cuenta, por ello la necesidad de familiarizarse sobre ello.

Un SID de ejemplo S-1-5-21-224257856-4948505641-1666550967-500. Los SID siempre comienzan con s-. El número siguiente identifica la versión del SID (aquí versión 1). Luego un número indicando la autoridad de identificación y que normalmente es 5, NT Authority en es caso. La cadena de números siguiente hasta 500 es el identificador de dominio, el resto es un identificador relativo, que es la cuenta o grupo. Esto es una aproximación al formato del SID, cuya complejidad es superior a este breve ejemplo.

Algunos SID son más cortos que en el ejemplo, son los SID conocidos y son los mismos en cada equipo y dominio. Son interesantes porque aparecen una y otra vez tanto en el registro como en otras partes.

SID conocidos

Identificadores globales únicos

Los identificadores globales únicos, más conocidos como GUIDs, son números que identifican objetos inequívocamente como equipos, componentes de programa y dispositivos. Estos objetos a menudo tienen nombre, pero sus GUID permanecen de forma única aun si dos objetos tienen el mismo nombre o si se les cambia el nombre. En otras palabras, un GUID es similar a un SID. Hay muchos GUID en el registro.

Todos tienen el mismo formato. Son números hexadecimales en grupos de 8,4 ,4, 4 y 12 dígitos (del 0-9 y de la A-F). Un guión divide cada grupo de dígitos, y las llaves {}  engloban al número entero. Por ejemplo: {645FF040-5081-101B-9F08-00AA002F954E}, que representa el objeto de papelera que vemos en el escritorio.

Los desarrolladores usan Guidgen.exe para crear GUIDs, pero Windows los genera también. A pesar del origen, Windows garantiza que los GUID son globalmente únicos. No hay que preocuparse de cuantas veces se generan los GUID, el resultado es siempre único. Por eso los GUID son perfectos para identificar equipos y dispositivos.

Notación hexadecimal

El 99% de los datos que se ven en el registro están en notación hexadecimal. Los equipos usan notación hexadecimal más que la decimal por una buena razón, que se comprenderá rápidamente. Saber leer y convertir números hexadecimales es un buen elemento en nuestro trato diario con el registro.

Las notaciones decimales y binarias no se intercambian bien, de hecho nosotros hemos aprendido de pequeños la decimal sobre ‘todas las cosas’ ;-).

  1. El número 546 sería 5*10^2 + 4*10^1 + 6*10^0, es decir: 5*100+4*10+6*1. Esto es Base 10.

  2. El número 1011 sería 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0, es decir: 1*8+0*4+1*2+1*1 o 11 en Base 10, aunque el número, dígitos 0 y 1, está en Base 2.

  3. Convertir Base 2 en Base 10 es trabajoso.

Esto nos lleva a la notación hexadecimal, o Base 16, con sólo dividir 16/2 convertir a binario (base 2) es algo sencillo. De todas formas, tener una tabla a mano para conversiones siempre viene bien.

Base 2 Binario

Base 16 Hexadecimal

Base 10 Decimal

0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 8
1001 9 9
1010 A 10
1011 B 11
1100 C 12
1101 D 13
1110 E 14
1111 F 15

Pasar el número 11111111 a hexadecimal es tan fácil como que 1111=F, así que 11111111 = FF.

Una última cosa a tener en cuenta, para diferenciar el número 12 decimal del número 12 hexadecimal se añade al segundo el prefijo 0x, quedando entonces el 0x12 como hexadecimal y el 12 como decimal.

Un pequeño truco para las conversiones es usar la calculadora de Windows, donde introduciendo un número lo convertimos a otras Bases con un par de clics.

 

Little-Endian, Big-Endian

En un número hexadecimal como 0x0102, el 0x01 es el byte más significativo y el 0x02 el menos significativo.

Los programas almacenan números en memoria de dos maneras: big-endian o little-endian. Si usan la primera, almacenan los bytes más significantes en memoria primero, seguido de los menos significantes, por ejemplo: 0x01020304 es 0x01 0x02 0x03 0x04. Sin embargo los procesadores Intel usan la otra manera, que significa que almacenan los menos significantes primero, seguido de los más significantes; el mismo número en memoria es =x04 0x03 0x02 0x01.

Aunque las herramientas que usaremos muestran todos los números –little o big-endian- correctamente, hemos de prestar atención cuando miramos números en valores binarios, ya que las herramientas no revierten el orden de los bytes por nosotros. Si vemos el número 0x2F 0xAA en valor binario recordemos que para revertir el orden de los bytes cogeremos el resultado 0xAA2F.

Algo así.

Codificación ANSI y Unicode

El esquema de codificación de caracteres prominente (texto que representan los equipos) era el ASCII, y que aún permanece hoy en día. En esta codificación, cada carácter es de 8 bits, o de un byte. Ya que ASCII era para idiomas occidentales, su uso fue limitado en países europeos y regiones cuyos idiomas contienen caracteres no incluidos en los 256 soportados por ASCII. Para superar esta limitación, la ISO creó una codificación estándar denominada Latin-1, que incluye caracteres europeos fuera del conjunto ASCII. Microsoft mejoró el Latin-1 y lo llamó ANSI. Pero ANSI sigue siendo de 8-bits y puede representar sólo 256 caracteres. Muchos idiomas tienen cientos de símbolos, en particular los asiáticos como el chino, koreano o japonés.

Para superar las limitaciones de las codificaciones de 8-bits, Microsoft junto a compañías como Apple e IBM, crearon el consorcio sin ánimo de lucro Unicode Inc. para definir una codificación nueva para juegos de caracteres internacionales. El trabajo realizado junto al ya en progreso por ISO, dio como resultado el estándar Unicode, que no es sino una codificación estándar de 16-bits, con lo que proporciona 65536 caracteres –más que suficiente para representar todos los idiomas del mundo.

Unicode es la codificación nativa de Windows, aunque es compatible con ANSI. Internamente, el sistema representa los archivos, objetos, rutas, como caracteres de 16-bits. También es normal almacenar datos en el registro usando Unicode.

Cadenas nulas o vacías

El concepto nulo es conocidísimo para los desarrolladores de C, 0x00, o sea el carácter NULL. Windows siempre acaba las cadenas con el carácter NULL, así los programas saben donde finaliza la cadena.

En el registro, el concepto es similar, el valor que contiene datos nulos significa que no contiene datos. Eso es, VACÍO. Normalmente cuando vemos un valor NULL en el registro leemos ‘valor no establecido’. Esto cambia si lo que se contiene es una cadena vacía, o sea cero caracteres de longitud o "". No es lo mismo NULL <> que "".

Un comentario sobre “El alma de Windows: el registro”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *