Qué es realmente un CHM
Un .chm es un pequeño sistema de archivos. Microsoft lo llamó ITSS: una cabecera, un directorio de entradas y una o dos secciones de contenido —la sección 0 almacenada tal cual y la sección 1 comprimida con LZX—. Dentro hay páginas HTML corrientes, hojas de estilo e imágenes, más unos cuantos flujos de metadatos cuyos nombres empiezan por # o $.
Dos de esos flujos importan aquí. #SYSTEM guarda el título del archivo de ayuda y su tema predeterminado, la página que un visor debería abrir primero. Sin él, un lector tiene que adivinar, y adivinar por orden alfabético suele acabar en una hoja de estilos. El archivo .hhc es el árbol de contenidos, escrito como un mapa del sitio en HTML con <UL> y <LI> anidados y entradas <OBJECT type="text/sitemap"> dentro.
Los .hhc reales son célebres por su HTML mal formado —elementos de lista sin cerrar por todas partes—, así que se analizan con el propio analizador HTML del navegador, que se recupera de eso igual que hacía el visor de ayuda original. Un analizador XML simplemente rechazaría el archivo.
Leer una página
Las hojas de estilo y las imágenes de cada página se resuelven contra la ruta de esa misma página dentro del archivo de ayuda y se sustituyen por los bytes del propio CHM. Los enlaces entre temas funcionan: la página se muestra en un iframe del mismo origen pero sin allow-scripts, de modo que nada en ella puede ejecutarse, mientras que la herramienta sí puede interceptar un clic y navegar al tema enlazado. Un enlace que apunte a internet no se sigue, y una política inyectada de default-src 'none' impide que se descargue ni por accidente.
Sobre la compresión, con claridad
La herramienta informa de lo que usa el archivo: LZX con su tamaño de ventana y su número de bloques de reinicio, o nada en absoluto si todo está en la sección almacenada.
El decodificador LZX de aquí se escribió a partir de la especificación [MS-PATCH] y del lzxd.c de libmspack. Su lector de flujo de bits, su decodificación Huffman canónica, sus bloques sin comprimir y su filtro x86 tienen pruebas unitarias. Su decodificación de bloques verbatim y aligned nunca se ha ejecutado contra un archivo producido por el compresor de Microsoft, porque no había ningún corpus offline con el que probarla.
Así que si una página no se puede descomprimir, esta herramienta muestra el error concreto y se niega a renderizar nada. No pone en pantalla los bytes recuperados. Basura que parece una página es peor que un fallo honesto, porque no se distingue. Si un archivo de ayuda real falla aquí, merece la pena informarlo: el error es nuestro.
También disponible
Cada página con su tamaño y la sección en la que vive, el compilador que generó el archivo y los detalles del directorio ITSS. Para sacar los archivos en vez de leerlos, usa el Extractor CHM.
Privacidad
El archivo de ayuda se abre en tu navegador y nunca se sube.
Tiny Online Tools







