The following text is a rough guide to the file format of a Norton Guide
database. The information has been pieced together from other sources and
from my investigations while writing Norton Guide
readers. It isn't fully complete but it should be enough to get anyone
started.
If you are able to fill in any of the blanks please feel free to drop me a
line with any information you've got.
Introduction
A Norton Guide database consists of a header followed
by a series of encrypted records. There are three
record types, each of which have an associated ID:
Encryption
Short, long and menu entries are all encrypted.
The encryption is a simple XOR 26 scheme. Example C code to decrypt is:
unsigned char ng_decrypt( unsigned char b )
{
return( (unsigned char) ( b ^ 0x1A ) );
}
Compression
The text of short, long and menu entries uses a simple form of run-length encoding
for spaces. If, when reading text, you encounter a byte value of 255 you
should read the next byte and take that as a count of spaces.
The Header
Field | Size | Notes |
Magic value | short | 0x474E == Norton Guide database. 0x4845 == Expert Help database. |
Unknown | short | |
Unknown | short | |
Menu Count | short | Count of the number of main menus. |
Title | char[ 40 ] | The text is NUL terminated if the length is less than 40 bytes. |
Credit Line 1 | char[ 66 ] | The text is NUL terminated if the length is less than 66 bytes. |
Credit Line 2 | char[ 66 ] | The text is NUL terminated if the length is less than 66 bytes. |
Credit Line 3 | char[ 66 ] | The text is NUL terminated if the length is less than 66 bytes. |
Credit Line 4 | char[ 66 ] | The text is NUL terminated if the length is less than 66 bytes. |
Credit Line 5 | char[ 66 ] | The text is NUL terminated if the length is less than 66 bytes. |
The Short Entry
Field | Size | Notes |
ID | short | Value is always 0. |
Length | short | Length of the record in bytes. |
Count | short | Count of lines in the entry. |
Unknown | short | |
Parent Line | short | The number of the line in the parent entry that points here. |
Parent | long | File offset of the parent entry. |
Menu | short | Number of the menu that points to this entry. |
Prompt | short | Number of the menu prompt that points to this entry. |
Unknown | char[ 8 ] | |
Pointers | long[ Count ] | This is an array of file offsets, each offset points to the entry that each line jumps to. |
Lines | | Count lines of NUL terminated text. |
The Long Entry
Field | Size | Notes |
ID | short | Value is always 1. |
Length | short | Length of the record in bytes. |
Count | short | Count of lines in the entry. |
See Also Flag | short | Flag to indicate if there are any see also entries |
Parent Line | short | The number of the line in the parent entry that points here. |
Parent | long | File offset of the parent entry. |
Menu | short | Number of the menu that points to this entry. |
Prompt | short | Number of the menu prompt that points to this entry. |
Previous | long | File offset of the previous entry |
Next | long | File offset of the next entry |
Lines | | Count lines of NUL terminated text. |
If See Also Flag != 0 |
See Also Count | short | Count of see also entries |
Pointers | long[ See Also Count ] | This is an array of file offsets, each offset points to the associated see also. |
See Alsos | | See Also Count lines of NUL terminated text. |
The Menu Entry
Field | Size | Notes |
ID | short | Value is always 2. |
Length | short | Length of the record in bytes. |
Count | short | Count of lines in the entry. |
Unknown | char[ 20 ] | |
Pointers | long[ Count ] | This is an array of file offsets, each offset points to the entry that each prompt jumps to. |
Unknown | char[ 8 * Count ] | |
Title | | Menu title, NUL terminated string, maximum of 40 characters (although I have found guides with longer titles). |
Prompts | | Menu prompts. Count * NUL terminated strings, maximum of 50 characters each (although I have found guides with longer prompts). |